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

или следовать за запуском другого триггера, указанного в schema.

другой_триггер. Вы можете создавать последовательности триггеров,

которые будут срабатывать в определённом порядке;

■ { ENABLE | DISABLE } является нововведением Oracle l l g и показывает,

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

после создания (по умолчанию ENABLED). Вы можете активировать неактивный

триггер при помощи выражения ALTER TRIGGER имя_тригге-

ра ENABLE, или путём активации всех триггеров для таблицы при помощи

ALTER TABLE table_name ENABLE ALL TRIGGERS;

■ условие_триггера определяет логическое условие, ограничивающее

число фактических выполнений кода триггера;

■ тело_триггера содержит код триггера.

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

перед обновлением столбца price из таблицы products, поэтому он назван

триггером before_product_price_update. Кроме того, поскольку я хочу использовать

значения столбца price до и после того, как любой оператор

UPDATE модифицирует это значение, я должен использовать триггер уровня

строки. И, наконец, так как я желаю отслеживать только те случаи, когда

уменьшение цены составляет более 25% от старого ее значения, нужно

задать условие триггера. Ниже приведен оператор, создающий триггер

before_product_price_update:

□ CREATE TRIGGER before_product_price_update

BEFORE UPDATE OF pr ice

ON products

FOR EACH ROW WHEN (new.price < o ld .p r i c e * 0.75)

BEGIN

dbms_output.put_line(' product_id = ' || :old_ produc t .id) ;

dbms_output.put_line(‘ Old p r ic e = ‘ || :o ld . pr ice ) ;

dbms_output.put_line(‘ New p r ic e = ‘ jj :new.price);

dbms_output.put_line(‘ The p r ic e reduction i s more than 25%’ );

- - вставить строку в таблицу product_price_audit

INSERT INTO. product_price_audit (

product_id, old _ p rice , new_price

) VALUES (

:old.produc t_id, :o ld .p r ic e , :new.price

);

END before_product_price_update;

Про этот оператор следует знать пять важных фактов.

■ Фраза BEFORE UPDATE OF p r ice указывает, что триггер должен срабатывать

перед обновлением столбца price.

■ Фраза FOR EACH ROW идентифицирует его как триггер уровня строки. Это

значит, что код триггера, содержащийся между ключевыми словами

BEGIN и END, должен выполняться по одному разу для каждой строки.

388 Гпава 11

■ Условие триггера имеет вид (new.price < old.price * 0.75). Это означает,

что код триггера будет выполняться только в тех случаях, когда

новая цена составляет менее 75% от старой цены - т. е. если старая

цена уменьшилась более чем на 25%.

■ Доступ к старому и новому значениям столбца в триггере возможен с

помощью псевдонимов :old и :new.

■ Код триггера выводит идентификатор продукта, старую и новую цены,

а также сообщение, извещающее о том, что уменьшение цены

составило более 25%. Затем код триггера добавляет в таблицу

product_price_audit строку, содержащую идентификатор продукта и

старую и новую цены.

Срабатывание триггера

Чтобы увидеть результат работы триггера, нужно выполнить команду SET

SERVEROUTPUT ON:

П SET SERVEROUTPUT ON

Ниже показан пример'выполнения оператора UPDATE для уменьшения

цены товаров № 5 и № 10 на 30% (это достигается умножением столбца

price на 0.7). Этот оператор вызовет срабатывание триггера before_

product_price_update:

□ UPDATE products

SET p r ic e = p r ic e * .7

WHERE product_id IN (5, 10);

product_id = 10

Old p r ic e = 15.99

New p r ic e = 11.19

The p r ic e reduction i s more than 25%

product_id = 5

Old p r ic e = 49.99

New p r ic e = 34.99

The p r ic e reduction i s more than 25%

2 rows updated.

Триггер сработал для товаров № 10 и № 5. Убедиться в том, что триггер

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

содержащие идентификатор товара, а также его старую и новую цены,

можно, задав следующий запрос:

□ SELECT *

FROM product_price_audit;

PR0DUCT_ID 0LD_PRICE NEW_PRICE

10 15.99 11.19

5 49.99 34.99

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

Получение информации о триггерах

Информацию о триггерах можно получить из представления user_triggers.

В таблице 11.3 перечислены некоторые столбцы user_triggers.

Таблица 11.3. Некоторые столбцы из userjriggers

Столбец Тип Описание

TRIGGER_NAME VARCHAR2(30) Имя триггера.

TRIGGER_TYPE VARCHAR2( 16) Тип триггера.

TRIGGERING_EVENT VARCHAR2(227) Событие, вызывающее срабатывание триггера.

TABLE_OWNER VARCHAR2(30) Пользователь, владеющий таблицей, на которую

ссылается триггер.

BASE_OBJECT_TYPE VARCHAR2(16) Тип объекта, на который ссылается триггер.

TABLE_NAME VARCHAR 2 (30) Имя таблицы, на которую ссылается триггер.

COLUMN_NAME VARCHAR2(4000) Имя столбца, упоминающееся в триггере.

REFERENCING_NAMES VARCHAR2(128) Имена новых и старых псевдонимов.

WHEN_CLAUSE VARCHAR2(4000) Условие триггера, ограничивающее число выполнений