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

Синтаксис 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

Описание

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

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

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

Синтаксис

CREATE GENERATOR name;

Аргумент

Описание

name

Имя для генератора.

Примеры

Следующая инструкция создает генератор EMPNO_GEN и триггер CREATE_EMPNO. Триггер использует генератор для создания последовательных числовых ключей, с приращение 1, для столбца NEW.EMPNO:

CREATE GENERATOR EMPNO_GEN;

SET TERM !! ;

CREATE TRIGGER CREATE_EMPNO FOR EMPLOYEES

BEFORE INSERT

POSITION 0

AS BEGIN

NEW.EMPNO = GEN_ID(EMPNO_GEN, 1);

END

SET TERM ; !!

GEN_ID()

Описание

Функция GEN_ID():

  1. Увеличивает текущее значение определенного генератора на step.

  2. Возвращает текущее значение определенного генератора.

GEN_ID() полезно использовать для автоматического создания уникальных ключей, чтобы вставлять в столбцы UNIQUE или PYMARY KEY. Чтобы вставить сгенерированное число в столбец, напишите триггер, процедуру или инструкцию SQL, которые вызывают GEN_ID().

Обратите внимание: Генератор создан инструкцией CREATE CENERATOR. По умолчанию, значение генератора устанавливается в нуль. Оно может быть установлено в другое значение с помощью SET GENERATOR.

Синтаксис

GEN_ID (generator, step);

Аргумент

Описание

generator

Имя существующего генератора.

step

Целое или выражение, определяющее увеличение или уменьшение текущего значения генератора. Значения могут быть в диапазоне от -231 до 231 - 1.

Примеры

Следующее определение триггера включает обращение к GEN_ID():

SET TERM !! ;

CREATE TRIGGER CREATE_EMPNO FOR EMPLOYEES

BEFORE INSERT

POSITION 0

AS BEGIN

NEW.EMPNO = GEN_ID (EMPNO_GEN, 1);

END

SET TERM ; !!

В первый раз, при выполнении триггера, NEW.EMPNO устанавливается к 1. В следующий раз, оно будет установлено к 2, и т. д.

SET GENERATOR

Описание

SET GENERATOR инициализирует начальное значение вновь созданного генератора или переустанавливает значение существующего генератора. Генератор обеспечивает уникальное, последовательное числовое значения с помощью функции GET_ID(). Если новый генератор не инициализирован с помощью SET GENERATOR, его начальное значение, по умолчанию, ноль.

Обратите внимание: Чтобы установить первое вставленное значение генератора в 1, используйте SET GENERATOR, чтобы определить начальное значение 0 и установите значение шага в функции GEN_ID() в 1.

Важно: Когда переустанавливаете генератор, который обеспечивает значения для столбцов определенных, как PRIMARY KEY или UNIQUE ограничение целостности, будете осторожны, что бы новые значения не позволяли дублирования существующих значений столбцов, иначе все последующие вставки и модификации будут терпеть неудачу.

Синтаксис

SET GENERATOR name TO int;

Аргумент

Описание

name

Имя существующего генератора.

int

Значение, чтобы установить генератор, целое значение от -231 до 231 - 1.

Примеры

Следующая инструкция устанавливает генератор к значению 1 000:

SET GENERATOR CUST_NO_GEN TO 1000;

Если GEN_ID() сейчас обратится к генератору со значением шага 1, первое число возвращенное ей будет 1 001.

Пример:

CREATE GENERATOR GEN_ACCESSORIES_ID_ACCESSORIES;

SET GENERATOR GEN_ACCESSORIES_ID_ACCESSORIES TO 10;

CREATE PROCEDURE GET_ID_ACCESSORIES_ACCESSORIES

RETURNS (ID INTEGER)

AS

BEGIN

ID = GEN_ID(GEN_ACCESSORIES_ID_ACCESSORIES, 1);

END;

GRANT EXECUTE ON PROCEDURE GET_ID_ACCESSORIES_ACCESSORIES TO ACCOUNTANT, MANAGER;

SET TERM

Описание

SET TERM определяет, какой символ или строка символов завершает команду.

По умолчанию, isql команды должны быть завершены точкой с запятой (;). Используйте SET TERM, чтобы изменить символ завершения.

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

Текстовый файл, содержащий определение CREATE PROCEDURE или CREATE TRIGGER, должен включать одну команду SET TERM перед определением, и соответственно после определения. Начальный SET TERM определяет новый завершающий символ; конечный SET TERM восстанавливает точку с запятой (;), как по умолчанию.

Использование SET TERM изнутри isql сессии имеет тот же эффект, как использование терминатора из командной строки.

Синтаксис

SET TERM string;

Аргумент

Описание

string

Определяет символ или символы, чтобы использовать для завершения инструкции. По умолчанию: точка с запятой (;).

Примеры

Следующий пример показывает текстовый файл, который использует SET TERM при создании процедуры. Первый SET TERM определяет ##, как завершающие символы; соответствующий SET TERM восстанавливает точку с запятой (;), как завершающий символ.

SET TERM ## ;

CREATE PROCEDURE ADD_EMP_PROJ (EMP_NO SMALLINT, PROJ_ID CHAR(5))

AS

BEGIN

BEGIN

INSERT INTO employee_project (emp_no, proj_id)

VALUES (:emp_no, :proj_id);

WHEN SQLCODE -530 DO

EXCEPTION unknown_emp_id;

END

RETURN;

END ##

SET TERM ; ##