Оглавление  | Назад  | Вперед

Справочник по инструкциям и функциям InterBase SQL

CREATE TRIGGER

Описание
Синтаксис
Примеры
Смотри так же

Описание

CREATE TRIGGER определяет новый триггер в базе данных. Триггер это отдельная программа ассоциированная с таблицей или видом, которая автоматически выполняет действия, когда строка в таблице или виде вставлена, модифицирована или удалена.

Триггер никогда не вызывается непосредственно. Наоборот, когда приложение или пользователь пытаются выполнить инструкцию INSERT, UPDATE или DELETE над строкой в таблице, любые триггеры связанные с этой таблицей и операцией автоматически выполняются, or fier. Триггер, определенный для UPDATE на не модифицируемых видах fire, даже если никакая модификация не происходит.

Триггеры состоят из заголовка и тела.

Заголовок триггера содержит:

Тело триггера содержит:

Важно: Так как каждая инструкция в теле сохраненной процедуры должна завершатся точкой с запятой, вы должны определить отличный символ для завершения инструкции CREATE TRIGGER в ISQL. Используйте SET TERM пред CREATE PROCEDURE чтобы определить терминатор отличный от точки с запятой. После инструкции CREATE TRIGGER, включите SET TERM, что бы изменить терминатор обратно к точке с запятой.

Триггер связан с таблицей. Владелец таблицы и любой пользователь, наделенный привилегиями на таблицу, автоматически имеют права выполнять связанные с ней триггеры.

Триггеры могут быть наделены привилегиями на таблицу, точно так же, как пользователи или процедуры могут быть наделены привилегиями. Используйте инструкцию GRANT, но вместо использования TO username, используйте TO TRIGGER trigger_name. Привилегии триггеров могут быть отменены аналогичным использованием REVOKE.

Когда пользователь выполняет действия, которые fires триггер, триггер будет иметь привилегии на выполнение этих действий, если одно из следующих условий истино:

Язык процедур и триггеров InterBase это полный язык программирования для сохраненных процедур и триггеров. Он включает:

Следующая таблица суммирует расширения языка для триггеров:

Инструкция Описание
BEGIN ... END Определяет блок инструкций, которые выполняются как одно. Ключевое слово BEGIN начинает блок; ключевое слово END завершает блок. Не должен сопровождаться точкой с запятой.
variable = expression Инструкция присвоения, которая присваивает значение выражения переменной, локальной переменной, входному параметру или выходному параметру.
/* comment_text */ Комментарий к программе, где comment_text может быть текстом содержащим любое количество сток.
EXCEPTION exception_name Поднимает именованную исключительную ситуацию. Исключительная ситуация - определенная пользователем ошибка, которая может быть обработана инструкцией WHEH.
EXECUTE PROCEDURE
proc_name [var [,var ...]]
[RETUNING_VALUES var [,var ...]]
Выполняет сохраненную процедуру proc_name с входными аргументами следующими за именем процедуры, возвращаемыми значениями в выходных аргументах перечисленных следом за RETURNING_VALUES.
EXIT Переходы к завершающей инструкции END в процедуре.
FOR <select_statement>
DO <compound_statement>
Повторение инструкции или блока, который следует за DO, для каждой допустимой строки возращенной <select_statement>.
  • <select_statement>: нормальная инструкция SELECT, за исключением, INTO предложение требуется и должно быть последним.
  • <compound_statement>: или одиночная инструкция на языке процедур и триггеров или блок инструкций заключенный в BEGIN и END.
IF (<condition>)
THEN <compound_statement>
[ELSE <compound_statement>]
Проверяет <condition>, и если оно TRUE, выполняет инструкцию или блок, следующий за THEN; иначе, выполняет инструкцию или блок следующий за ELSE, если он существует.
  • <condition>: булево выражение (TRUE, FALSE или UNKNOWN), в основном, это два выражения, используемые как операнды оператора сравнения.
NEW.column Новая контекстная переменная, которая указывает новое значение столбца в операциях INSERT и UPDATE.
OLD.column Старая контекстная переменная, которая указывает значение столбца пред операциями INSERT и UPDATE.
POST_EVENT event_name Отправляет сообщение event_name.
WHILE (<condition>)
DO <compound_statement>
Пока <condition> TRUE, выполняется <compound_statement> Первое <condition> проверяется и если оно TRUE, то выполняется <compound_statement>. Эта последовательность повторяется пока <condition> не перестанет быть TRUE.
WHEN
{<error> [, <error> ...] | ANY}
DO <compound_statement>

<error> = {EXEPTION exeption_name
  | SQLCODE errcode
  | GDSCODE number}
Инструкция обработки ошибок. Когда одна из определенных ошибок происходит, выполняется <compound_statement>. Инструкция WHEN, если присутствует, должна находится в конце блока, непосредственно перед END.
  • <error>: ошибка определенного вида.
  • ANY: обрабатываются все типы ошибок.

К началу страницы...

Синтаксис

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 <datatype> Имя таблицы или вида, который вызывает триггер to fire, когда определенная операция производится над таблицей или видом.
ACTIVE (По умолчанию). Optionally specifies that trigger action takes effect when fired.
INACTIVE Optionally specifies that trigger action does not take effect.
BEFORE Определяет, что триггер fires перед ассоциированной операцией.
BEFORE Определяет, что триггер fires после ассоциированной операцией.
DELETE | INSERT | UPDATE Определяет операцию над таблицей, которая вызывает триггер to fire.
POSITION number Определяет firing order для триггера перед тем же действием или после того же действия. number должен быть целым от 0...32767. Триггер с меньшим номером fire раньше. По умолчанию: 0 = первый триггер to fire.

Номера триггеров не должны быть последовательны. Триггеры для одного и того же действия с тем же самым позиционным номером будут fire в случайном порядке.

DECLARE VARIABLE var <datatype> Объявляет локальные переменные используемые только в триггере. Каждому объявлению должно предшествовать DECLARE VARIABLE и должно завершатся точкой с запятой (;).
  • param: Имя локальной переменной, уникально для переменных внутри триггера.
  • <datatype>: Любой тип данных InterBase.
statement Любая одиночная инструкция в языке процедур и триггеров InterBase. Каждая инструкция (исключая BEGIN и END) должна завершатся точкой с запятой (;).
terminator Терминатор определенный SET TERM, который указывает завершение тела триггера. Используется только в ISQL

К началу страницы...

Примеры

Следующий триггер, 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.

К началу страницы...

Смотри так же:

К началу страницы...


Оглавление  | Назад  | Вперед