Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
sql.doc
Скачиваний:
0
Добавлен:
01.05.2025
Размер:
166.4 Кб
Скачать

Синтаксис

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;

Триггеры запускаются в следующем порядке:

  1. Запускается триггер B.

  2. Запускается триггер A.

  3. Происходит модификация.

  4. Запускается триггер D.

  5. Запускается триггер C.

ALTER DOMAIN

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]