или следовать за запуском другого триггера, указанного в 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) Условие триггера, ограничивающее число выполнений