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 в следующем порядке:
- Триггер B fires.
- Триггер A fires.
- Происходит модификация.
- Триггер D fires.
- Триггер C fires.
CREATE GENERATOR объявляет генератор для базы данных и устанавливает его начальное значение в нуль. Генератор это последовательный номер, который может быть вставлен в столбец с помощью функции GEN_ID(). Генератор часто используется, чтобы гарантировать уникальное значение в PRIMARY KEY, такой как номер счета, который должен уникально идентифицировать ассоциированную строку.
База данных может содержать любое количество генераторов. Генераторы глобальны для базы данных, и могут быть использованы и обновлены в любой транзакции. InterBase не назначает повторяющиеся значение генератора через транзакции.
Когда генератор создан, SET GENERATOR может установить или изменить его текущее значение. Генератор может быть использован для триггера, процедуры или SQL инструкции, которая вызывает GEN_ID().