
Синтаксис
CREATE TRIGGER name FOR table
[ACTIVE | INACTIVE]
{BEFORE | AFTER}
{DELETE | INSERT | UPDATE}
[POSITION number]
AS <trigger_body> terminator
<trigger_body> =
[<variable_declaration_list>] <block>
<variable_declaration_list> =
DECLARE VARIABLE variable <datatype>;
[DECLARE VARIABLE variable <datatype>; ...]
<block> =
BEGIN
<compound_statement>
[<compound_statement> ...]
END
<compound_statement> = {<block> | statement;}
<datatype> = {
{SMALLINT | INTEGER | FLOAT | DOUBLE PRECISION}
| {DECIMAL | NUMERIC} [(precision [, scale])]
| DATE
| {CHAR | CHARACTER | CHARACTER VARYING | VARCHAR}
[(1...32767)] [CHARACTER SET charname]
| {NCHAR | NATIONAL CHARACTER | NATIONAL CHAR}
[VARYING] [(1...32767)]}
name |
Имя триггера, должно быть уникальным в пределах БД |
table |
Имя таблицы, к которой прикрепляется триггер |
BEFORE|AFTER |
Определяет в какой момент времени срабатывает триггер. Before – перед соответствующей операцией After – после соответствующей операции |
DELETE|INSERT|UPDATE |
Определяет операцию, которая провоцирует запуск триггера |
POSITION number |
Определяет порядок, в котором запускаются триггеры. Чем меньше число, тем раньше запускается триггер. 0 – запускается самый первый. |
Terminator |
Символ или последовательность символов, которая завершает тело триггера. Последовательность символов задается с помощью конструкции SET TERM. |
NEW.column |
Переменная NEW указывает на новую строку таблицы в операциях INSERT и UPDATE. Column – имя колонки в таблице. NEW.Column – предоставляет доступ к значению в соответствующей колонке новой строки |
OLD.column |
Переменная OLD указывает на старую строку таблицы в операциях BEFORE UPDATE или DELETE . Column – имя колонки в таблице. OLD.Column – предоставляет доступ к значению в соответствующей колонке старой строки |
Примеры
Следующий триггер, SAVE_SALARY_CHANGE, делает корректирующие модификации таблицы SALARY_HISTORY, когда происходят изменения жалования служащего в таблице EMPLOYEE:
SET TERM !! ;
CREATE TRIGGER SAVE_SALARY_CHANGE FOR EMPLOYEE
AFTER UPDATE AS
BEGIN
IF (OLD.SALARY <> NEW.SALARY) THEN
INSERT INTO SALARY_HISTORY
(EMP_NO, CHANGE_DATE, UPDATER_ID, OLD_SALARY, PERCENT_CHANGE)
VALUES (OLD.EMP_NO, "now", USER, OLD.SALARY,
(NEW.SALARY - OLD.SALARY) * 100 / OLD.SALARY);
END !!
SET TERM ; !!
Следующий триггер, SET_CUST_NO, использует генератор, чтобы создать уникальный номер заказчика, когда новая строка заказчика добавлена в таблицу CUSTOMER:
SET TERM !! ;
CREATE TRIGGER SET_CUST_NO FOR CUSTOMER
BEFORE INSERT AS
BEGIN
NEW.CUST_NO = GEN_ID(cust_no_gen, 1);
END !!
SET TERM ; !!
Следующий триггер, POST_NEW_ORDER, отправляет событие "new_order", всякий раз, когда втавлена новая запись в таблицу SALES:
SET TERM !! ;
CREATE TRIGGER POST_NEW_ORDER FOR SALES
AFTER INSERT AS
BEGIN
POST_EVENT "new_order";
END !!
SET TERM ; !!
Следующие четыре фрагмента заголовков триггеров демонстрируют, как опция POSITION определяет порядок запуска триггера:
CREATE TRIGGER A FOR accounts
BEFORE UPDATE
POSITION 5 . . . /*Trigger body follows*/
CREATE TRIGGER B FOR accounts
BEFORE UPDATE
POSITION 0 . . . /*Trigger body follows*/
CREATE TRIGGER C FOR accounts
AFTER UPDATE
POSITION 5 . . . /*Trigger body follows*/
CREATE TRIGGER D FOR accounts
AFTER UPDATE
POSITION 3 . . . /*Trigger body follows*/
Когда имеет место модификация:
UPDATE accounts SET account_status = "on_hold"
WHERE account_balance < 0;
Триггеры запускаются в следующем порядке:
Запускается триггер B.
Запускается триггер A.
Происходит модификация.
Запускается триггер D.
Запускается триггер C.
ALTER DOMAIN