Тригери в SQL

Часто виникає необхідність автоматично виконувати деякі типові процедури обробки даних при настанні деякої події в  базі даних. Для цього в СУБД Intebase передбачений механізм тригерів. По суті справи, тригери — це збережені процедури, які автоматично запускаються при настанні однієї з нижче перерахованих подій:

  1. BEFORE INSERT  - подія, яка виникає перед добпвлення нового запису до таблиці БД.
  2. BEFORE DELETE - подія, яка виникає перед видаленням запису з таблиці БД.
  3. BEFORE UPDATE - подія, яка виникає перед редагуванням запису в таблиці БД.
  4. AFTER INSERT - подія, яка виникає після добпвлення нового запису до таблиці БД.
  5. AFTER DELETE - подія, яка виникає після видаленням запису з таблиці БД.
  6. AFTER UPDATE - подія, яка виникає після редагуванням запису в таблиці БД.

На відміну від збережуваних процедур, тригер завжди прив'язаний до деякої таблиці БД. Тригер не має вхідних або вихідних параметрів.

Приклад: для таблиці Cars створимо тригер tcar_id, за допомогою якого в поле Kod вставляється значення генератора car_id.

CREATE TRIGGER tcar_id FOR Cars
ACTIVE BEFORE INSERT POSITION 0
AS
BEGIN
IF (NEW.kod IS NULL) THEN
NEW.kod = GEN_ID(car_id, 1);
END;

Зверніть увагу на використання службового слова NEW. Воно записується перед одним з полів таблиці, для якої визначається тригер, і вказує, що після того, як ми вставилий новий запис в таблицю (SQL команда INSERT) Cars, нове значення поля Kod буде рівним значенню з генератора.

Крім слова NEW також використовується слово OLD — старе значення поля. Розгялнемо приклад створення тригера в якому використовується ключове слово OLD.

Приклад: уявімо ситуацію, що БД складається з двох таблиць Cars (список автомобілів виставлених на продаж) і Vendors (список продавців даних автомобілів). Вони повязані між собою по полю v_id. Тоді при видаленні запису про продавця (SQL команда DELETE) з таблиці Vendors слід видалити і автомобілі, які він продає. Очевидно, що дану дію потрібно робити перед видаленням продавця. Для цього створимо наступний тригер.

CREATE TRIGGER Vendor_delete FOR Vendors
ACTIVE BEFORE DELETE POSITION 0
AS
BEGIN
DELETE FROM Cars WHERE v_id=OLD.v_id
END;

Легко зрозуміти, що в тригерах BEFORE DELETE і AFTER DELETE можна використовувати тільки OLD, в тригерах BEFORE INSERT і AFTER INSERT — тільки NEW, а от у тригерах BEFORE UPDATE і AFTER UPDATE можна зустріти і OLD і NEW.

Загальний синтаксис команди створення  тригера:

CREATE TRIGGER <ім'я_тригера> FOR <ім'я_таблиці>
[ACTIVE | INACTIVE] {BEFORE | AFTER} {DELETE | INSERT | UPDATE} [POSITION <номер>]
AS
[<список_локальних_змінних>]
BEGIN
<команди>
END;

Зауваження: фігурні дужки {} позначають обов'язковий елемент, який повинен бути вибраний з запропонованих варіантів, розділених вертикальною рискою, а квадратні дужки [] позначають необов'язковий елемент.

Необов'язковий параметр POSITION потрібен, коли для однієї і тої ж події в одній і тій же таблиці оголошені кілька тригерів. Тоді для кожного з цих тригерів номер, записаний після службового слова POSITION вказує, яким за рахунком буде виконуватися даний тригер. Кожна локальна змінна оголошується з допомогою DECLARE VARIABLE <ім'я_змінної> <тіп_змінної>; (крапка з комою обов'язкова). В іншому синтаксис тригерів аналогічгий синтаксису збережуваних процедур.

Матеріал був корисним, поділись в соціальних мережах:

Якщо тобі сподобалась дана тема, залиш свій коментар