Тригер (бази даних)
Три́гер (англ. 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;