double arrow

Описание. CREATE TRIGGER name FOR table

CREATE GENERATOR

Примеры

Синтаксис CREATE TRIGGER

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)]}

Следующий триггер, 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 определяет firing order триггера:

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;

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

  1. Триггер B fires.
  2. Триггер A fires.
  3. Происходит модификация.
  4. Триггер D fires.
  5. Триггер C fires.

CREATE GENERATOR объявляет генератор для базы данных и устанавливает его начальное значение в нуль. Генератор это последовательный номер, который может быть вставлен в столбец с помощью функции GEN_ID(). Генератор часто используется, чтобы гарантировать уникальное значение в PRIMARY KEY, такой как номер счета, который должен уникально идентифицировать ассоциированную строку.

База данных может содержать любое количество генераторов. Генераторы глобальны для базы данных, и могут быть использованы и обновлены в любой транзакции. InterBase не назначает повторяющиеся значение генератора через транзакции.

Когда генератор создан, SET GENERATOR может установить или изменить его текущее значение. Генератор может быть использован для триггера, процедуры или SQL инструкции, которая вызывает GEN_ID().


Сейчас читают про: