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

21.4.2. Синтаксис определения триггеров и типы триггеров

Для более подробного обсуждения механизма триггеров в SQL:1999 необходимо ввести набор синтаксических правил:

trigger_definition ::=

CREATE TRIGGER trigger_name

{ BEFORE | AFTER }

{ INSERT | DELETE | UPDATE [ OF column_commalist ] }

ON table_name [ REFERENCING

old_or_new_values_alias_list ]

triggered_action

triggered_action ::=

[ FOR EACH { ROW | STATEMENT } ]

[ WHEN left_paren conditional_expression right_paren ]

triggered_SQL_statement

triggered_SQL_statement ::= SQL_procedure_statement

| BEGIN ATOMIC

SQL_procedure_statement_semicolonlist

END

old_or_new_values_alias ::= OLD [ ROW ] [ AS ] correlation_name

| NEW [ ROW ] [ AS ] correlation_name

| OLD TABLE [ AS ] identifier

| NEW TABLE [ AS ] identifier

161 Непонятно, откуда происходит это ограничение. Скорее всего, в будущих версиях стандарта оно будет снято.

162 В примерах этой лекции мы будем считать, что в столбце DEPT_TOTAL_SAL таблицы DEPT хранится суммарное значение заработной платы служащих соответствующего отдела.

Естественно, в языке имеется и конструкция, отменяющая определение триггера:

DROP TRIGGER trigger_name.

(Конструкция ALTER TRIGGERв языке SQL не поддерживается.)

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

Триггеры before и after

Если в определении триггера указано ключевое слово BEFORE, то триггер будет срабатывать непосредственно до выполнения операции обновления базовой таблицы соответствующим инициирующим оператором SQL. При задании ключевого словаAFTERтриггер будет вызываться немедленно после выполнения инициирующего оператора.

Триггеры insert, update и delete

Выбор одного из этих ключевых слов при определении триггера указывает на природу события, которое должно приводить к срабатыванию триггера. При задании ключевого слова INSERTк срабатыванию триггера может привести только выполнение операции вставки строк в предметную таблицу. Если указываются ключевые словаUPDATEилиDELETE, то число возможных событий, приводящих к срабатыванию триггера, возрастает. Кроме явных операций модификации строк предметной таблицы или удаления из нее строк к срабатыванию триггера могут привести ссылочные действия (см. раздел16.2. Средства определения, изменения и ликвидации базовых таблицлекции 16).

Заметим, что в стандарте SQL:1999 отсутствует возможность определения триггеров, для которых событием было бы выполнение операции выборки из предметной таблицы. Разработчики стандарта сочли, что область применения триггеров такого рода чересчур узка (трудно придумать какое-либо применение, кроме как для журнализации и аудита).

Триггеры row и statement

Если в определении триггера присутствует конструкция FOR EACH ROW, то триггер будет вызываться для каждой строки предметной таблицы, обновляемой инициирующим SQL-оператором. Если же заданоFOR EACH STATEMENT(или явная спецификацияFOR EACHотсутствует), то триггер сработает один раз на всем протяжении процесса выполнения инициирующего SQL-оператора.

Раздел when

Включение в определение триггера раздела WHENс соответствующим условным выражением позволяет более точно специфицировать условие применимости триггера. Вычисление условного выражения производится над строками предметной таблицы, и триггер срабатывает только в том случае, когда значением условного выражения являетсяtrue. Понятно, что виды и интерпретация логических выражений, допускаемых в разделеWHEN, различаются у триггеров сFOR EACH ROWи у триггеров сFOR EACH STATEMENT. В первом случае условное выражение вычисляется для одной строки, которая должна быть обновлена инициирующим SQL-оператором. Во втором – условное выражение вычисляется для всей предметной таблицы целиком и, по всей видимости, должно базироваться на «кванторных» предикатах. Следует также понимать, что вычисление условия разделаWHENданного триггера производится только в том случае, если произошло событие срабатывания триггера.