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

Матеріал з Вікіпедії — вільної енциклопедії.
Перейти до: навігація, пошук

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