Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

CREATE TRIGGER

Описание

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

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

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

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

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

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

  • Факультативный список локальных переменных и их типов данных.
  • Блок инструкций на языке процедур и триггеров InterBase, заключенный между ключевыми словами BEGIN и END. Эти инструкции выполняются, когда триггер fires. Блок может содержать в себе другой блок, так, чтобы могло быть много уровней вложений.

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

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

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

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

  • Триггер имеет привилегии для этого действия.
  • Пользователь имеет привилегии для этого действия.

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

  • Инструкции SQL манипулирования данными: INSERT, UPDATE, DELETE и singleton SELECT.
  • Операторы и выражения SQL, включая UDF's связанные с базой данных и генераторы.
  • Мощно расширяет SQL, включая инструкции присвоения, control-flow инструкции, контекстные переменные, even-posting инструкции, исключительные ситуации и инструкции обработки ошибок.

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

Инструкция Описание
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 

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

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

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

Оставить комментарий

Комментарий:
можно использовать BB-коды
Максимальная длина комментария - 4000 символов.
 
Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог