Триггер (базы данных)

Поделись знанием:
Перейти к: навигация, поиск

Три́ггер (англ. 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 string in table "district" has changed');
 END;

Напишите отзыв о статье "Триггер (базы данных)"

Отрывок, характеризующий Триггер (базы данных)

– Священную древнюю столицу России! – вдруг заговорил он, сердитым голосом повторяя слова Бенигсена и этим указывая на фальшивую ноту этих слов. – Позвольте вам сказать, ваше сиятельство, что вопрос этот не имеет смысла для русского человека. (Он перевалился вперед своим тяжелым телом.) Такой вопрос нельзя ставить, и такой вопрос не имеет смысла. Вопрос, для которого я просил собраться этих господ, это вопрос военный. Вопрос следующий: «Спасенье России в армии. Выгоднее ли рисковать потерею армии и Москвы, приняв сраженье, или отдать Москву без сражения? Вот на какой вопрос я желаю знать ваше мнение». (Он откачнулся назад на спинку кресла.)
Начались прения. Бенигсен не считал еще игру проигранною. Допуская мнение Барклая и других о невозможности принять оборонительное сражение под Филями, он, проникнувшись русским патриотизмом и любовью к Москве, предлагал перевести войска в ночи с правого на левый фланг и ударить на другой день на правое крыло французов. Мнения разделились, были споры в пользу и против этого мнения. Ермолов, Дохтуров и Раевский согласились с мнением Бенигсена. Руководимые ли чувством потребности жертвы пред оставлением столицы или другими личными соображениями, но эти генералы как бы не понимали того, что настоящий совет не мог изменить неизбежного хода дел и что Москва уже теперь оставлена. Остальные генералы понимали это и, оставляя в стороне вопрос о Москве, говорили о том направлении, которое в своем отступлении должно было принять войско. Малаша, которая, не спуская глаз, смотрела на то, что делалось перед ней, иначе понимала значение этого совета. Ей казалось, что дело было только в личной борьбе между «дедушкой» и «длиннополым», как она называла Бенигсена. Она видела, что они злились, когда говорили друг с другом, и в душе своей она держала сторону дедушки. В средине разговора она заметила быстрый лукавый взгляд, брошенный дедушкой на Бенигсена, и вслед за тем, к радости своей, заметила, что дедушка, сказав что то длиннополому, осадил его: Бенигсен вдруг покраснел и сердито прошелся по избе. Слова, так подействовавшие на Бенигсена, были спокойным и тихим голосом выраженное Кутузовым мнение о выгоде и невыгоде предложения Бенигсена: о переводе в ночи войск с правого на левый фланг для атаки правого крыла французов.
– Я, господа, – сказал Кутузов, – не могу одобрить плана графа. Передвижения войск в близком расстоянии от неприятеля всегда бывают опасны, и военная история подтверждает это соображение. Так, например… (Кутузов как будто задумался, приискивая пример и светлым, наивным взглядом глядя на Бенигсена.) Да вот хоть бы Фридландское сражение, которое, как я думаю, граф хорошо помнит, было… не вполне удачно только оттого, что войска наши перестроивались в слишком близком расстоянии от неприятеля… – Последовало, показавшееся всем очень продолжительным, минутное молчание.