Триггер (базы данных) | это... Что такое Триггер (базы данных)? (original) (raw)

Три́ггер (англ. trigger) — это хранимая процедура особого типа, которую пользователь не вызывает непосредственно, а исполнение которой обусловлено действием по модификации данных: добавлением INSERT, удалением DELETE строки в заданной таблице, или изменением UPDATE данных в определенном столбце заданной таблицы реляционной базы данных. Триггеры применяются для обеспечения целостности данных и реализации сложной бизнес-логики. Триггер запускается сервером автоматически при попытке изменения данных в таблице, с которой он связан. Все производимые им модификации данных рассматриваются как выполняемые в транзакции, в которой выполнено действие, вызвавшее срабатывание триггера. Соответственно, в случае обнаружения ошибки или нарушения целостности данных может произойти откат этой транзакции.

Момент запуска триггера определяется с помощью ключевых слов BEFORE (триггер запускается до выполнения связанного с ним события; например, до добавления записи) или AFTER (после события). В случае, если триггер вызывается до события, он может внести изменения в модифицируемую событием запись (конечно, при условии, что событие — не удаление записи). Некоторые СУБД накладывают ограничения на операторы, которые могут быть использованы в триггере (например, может быть запрещено вносить изменения в таблицу, на которой «висит» триггер, и т. п.)

Кроме того, триггеры могут быть привязаны не к таблице, а к представлению (VIEW). В этом случае с их помощью реализуется механизм «обновляемого представления». В этом случае ключевые слова BEFORE и AFTER влияют лишь на последовательность вызова триггеров, так как собственно событие (удаление, вставка или обновление) не происходит.

В некоторых серверах триггеры могут вызываться не для каждой модифицируемой записи, а один раз на изменение таблицы. Такие триггеры называются табличными.

Пример (Oracle):

/* Триггер на уровне таблицы */ 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;

Просмотр этого шаблона Базы данных
Концепции Модель данных • Реляционная (модельалгебраНормальная формаСсылочная целостностьБДСУБД) • Иерархическая модель • Сетевая (модельСУБД) • Объектно-ориентированная (БДСУБД) • ТранзакцияЖурнализацияСекционирование
Объекты Отношение (таблица)ПредставлениеХранимая процедураТриггерКурсорИндекс
Ключи ПотенциальныйПервичныйВнешнийЕстественныйСуррогатный (искусственный) • Суперключ
SQL SELECTINSERTUPDATEMERGEDELETETRUNCATEJOINUNIONINTERSECT • EXCEPT • CREATE • ALTER • DROP • GRANT • COMMITROLLBACK
СУБД IMSDB2InformixOracle DatabaseMicrosoft SQL ServerAdaptive Server EnterpriseTeradata DatabaseFirebirdPostgreSQLMySQLSQLiteMicrosoft AccessVisual FoxProЛИНТЕРCouchDBMongoDB
Компоненты Язык запросовОптимизатор запросовПлан выполнения запросаODBCADOADO.NETJDBC