Сегментирование (базы данных)
- 1 year ago
- 0
- 0
Три́ггер
(
англ.
trigger
) —
хранимая процедура
особого типа, которую пользователь не вызывает непосредственно, а исполнение которой обусловлено действием по модификации данных: добавлением
INSERT
, удалением
DELETE
строки в заданной таблице, или изменением
UPDATE
данных в определённом столбце заданной таблицы
реляционной базы данных
.
Триггеры применяются для обеспечения целостности данных и реализации сложной бизнес-логики . Триггер запускается сервером автоматически при попытке изменения данных в таблице, с которой он связан. Все производимые им модификации данных рассматриваются как выполняемые в транзакции , в которой выполнено действие, вызвавшее срабатывание триггера. Соответственно, в случае обнаружения ошибки или нарушения целостности данных может произойти откат этой транзакции.
Момент запуска триггера определяется с помощью ключевых слов
BEFORE
(триггер запускается до выполнения связанного с ним события; например, до добавления записи) или
AFTER
(после события). В случае, если триггер вызывается до события, он может внести изменения в модифицируемую событием запись (конечно, при условии, что событие — не удаление записи). Некоторые СУБД накладывают ограничения на
операторы
, которые могут быть использованы в триггере (например, может быть запрещено вносить изменения в таблицу, на которой «висит» триггер, и т. п.).
Кроме того, триггеры могут быть привязаны не к таблице, а к
представлению
(VIEW). В этом случае с их помощью реализуется механизм «обновляемого представления». В этом случае ключевые слова
BEFORE
и
AFTER
влияют лишь на последовательность вызова триггеров, так как собственно событие (удаление, вставка или обновление) не происходит.
В некоторых серверах триггеры могут вызываться не для каждой модифицируемой записи, а один раз на изменение таблицы. Такие триггеры называются табличными.
Пример ( Oracle Database ):
/* Триггер на уровне таблицы */
CREATE OR REPLACE TRIGGER DistrictUpdatedTrigger
AFTER UPDATE ON district
BEGIN
insert into info values ('table "district" has changed');
END;
В этом случае для отличия табличных триггеров от строчных вводится дополнительные ключевые слова при описании строчных триггеров. В Oracle это словосочетание
FOR EACH ROW
.
Пример:
/* Триггер на уровне строки */
CREATE OR REPLACE TRIGGER DistrictUpdatedTrigger
AFTER UPDATE ON district FOR EACH ROW
BEGIN
insert into info values ('one row in table "district" has changed');
END;