Выбрать главу

как триггер уровня строки), или один раз для всех задействованных

строк (триггер уровня оператора). Например, если есть оператор

UPDATE, который оказывает воздействие на 10 строк таблицы, и создан

триггер уровня строки, срабатывающий при выполнении этого оператора

UPDATE, то это триггер сработает 10 раз - по одному разу для каждой строки.

Если же создан триггер уровня оператора, то для оператора UPDATE он

сработает всего один раз, независимо от числа изменённых строк.

Существует ещё одно различие между триггером уровня строки и триггером

уровня оператора: когда триггер срабатывает в результате выполнения

оператора UPDATE для определенного столбца, триггер уровня строки

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

триггера уровня строки можно ограничить, используя условие триггера,

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

Создание примера триггера

Триггеры оказываются полезны при выполнении таких вещей, как расширенный

аудит изменений, вносимых в значения столбцов таблиц. В следующем

разделе показан триггер, который записывает каждое снижение цены

товара более чем на 25%. Когда происходит такое событие, триггер добавляет

еще одну строку в таблицу product_price_audit, которая в сценарии

store_schema.sql создается с помощью оператора CREATE TABLE:

□ CREATE TABLE product_price_audit (

product_id INTEGER

CONSTRAINT price_audit_fk_products

REFERENCES products(product_id),

old_price NUMBER(5, 2) ,

new_Drice NUMBER(5, 2)

);

Столбец product_id таблицы product_price_audit является внешним

ключом для столбца product_id таблицы products. Столбец old_price будет

использован для хранения старой цены товара (до обновления), а столбец

new_price - для хранения цены после обновления.

Создание триггера

Для создания триггера можно использовать оператор CREATE TRIGGER.

Упрощенный синтаксис оператора CREATE TRIGGER выглядит следующим

образом:

386 Глава 11

П CREATE [OR REPLACE] TRIGGER имя_ триг гер а

{BEFORE | AFTER | INSTEAD OF | FOR} с о быти е _ тр и г ге р а

ON имя_таблицы

[FOR EACH ROW]

[ { FORWARD | REVERSE } CROSSEDITION]

[ { FOLLOWS | PRECEDES } s ch ema .д р у г о й _ т р и г г е р ]

[ { ENABLE | DISABLE } ]

[WHEN у с л о в и е _ т р и г г е р а ] ]

BEGIN

т е л о _ т р и г г е р а

END имя_триг гера;

где

■ OR REPLACE определяет, что триггер должен заменить уже существующий

триггер, если такой существует;

■ имя _ три г ге р а определяет имя триггера;

■ BEFORE указывает, что триггер срабатывает перед выполнением запускающего

события. AFTER указывает на то, что триггер срабатывает

после выполнения запускающего события. INSTEAD OF указывает,

что триггер срабатывает вместо выполнения запускающего события.

FOR, который появился в Oracle l lg , позволяет создавать составной

триггер, состоящий из нескольких секций (до четырёх),

■ со быти е _ тр и г гер а определяет событие, вызывающее срабатывание

триггера;

■ имя_таблицы определяет имя таблицы, на которую ссылается триггер,

■ FOR EACH ROW указывает, что триггер является триггером уровня строки.

Это означает, что код, содержащийся в теле триггера, при срабатывании

триггера будет выполнен для каждой строки. Если опустить

фразу FOR EACH ROW, триггер будет триггером уровня оператора. Что,

в свою очередь, означает, что код в параметре тело_триггера будет

при срабатывании триггера выполнен всего один раз, независимо от

числа строк, на которые оказал воздействие оператор DML;

■ { FORWARD | REVERSE } CROSSEDITION является нововведением Oracle

l l g и обычно будет использоваться администраторами базы данных

или администраторами приложения. Прямой (FORWARD) триггер пере-

крёстного редактирования предназначен для генерации в момент,

когда DML выражение производит изменение в базе данных, в то

время как онлайн-приложение, осуществляющее доступ к базе данных

в настоящий момент, подвергается обновлению или установке

заплаток (FORWARD является значением по умолчанию); код в теле

триггера должен быть создан для обработки изменений DML, когда

процесс установки заплаток или обновлений приложения завершён.

Обратный (REVERSE) триггер перекрёстного редактирования аналогичен

прямому, с той лишь разницей, что он предназначен для запус-

ка и обработки DML изменений, выполненных после того, как был

завершён процесс установки заплаток или обновлений приложения;

Знакомство с программированием на PL/SQL 387

■ { FOLLOWS | PRECEDES } schema. другой_триггер является нововведением

Oracle l l g и указывает, что запуск триггера должен предшествовать