4.3.1 Использование триггеров для проверки допустимости вводимых данныхПредположим, у галереи (см. описание практического примера в гл. 1) есть правило, что ни одна работа не может быть продана менее, чем за 90% от запрошенной цены. Чтобы обеспечить выполнение этого правила, можно написать триггер обновления для таблицы TRANSACTION, сравнивающий значения AskingPrice и SalesPrice. Если правило нарушается, в столбец AskingPrice ставится исходное значение. Можно использовать две стратегии. Одна заключается в том, чтобы написать предваряющий триггер, который проверяет и переустанавливает, если необходимо, значение столбца SalesPrice до выполнения обновления. Вторая стратегия — написать завершающий триггер, проверяющий и переписывающий строку таблицы TRANSACTION после обновления. Листинг 4.1. CREATE OR REPLACE TRIGGER TRANS_SalesPriceCheck Листинг 4.1 соответствует второй стратегии, в котором опущены некоторые детали. Если есть необходимость в комментариях, то они помещаются в скобки вида /* */. Логика работы триггера очевидна. Если новая продажная цена составляет менее 90% от запрашиваемой цены, продажная цена устанавливается равной запрашиваемой цене. Обратите внимание, что новая продажная цена сравнивается со старой запрашиваемой ценой; в противном случае можно было бы, изменив обе цены, успешно совершить обновление, нарушающее данное ограничение. На тот случай, если именно так и произошло, столбец AskingPrice в операторе UPDATE устанавливается равным :old. AskingPrice. Также следует обратить внимание, что этот триггер будет вызываться рекурсивно. Оператор UPDATE в триггере вызовет обновление таблицы TRANSACTION, что, в свою очередь, приведет к повторному вызову триггера. На этот раз, однако, столбец SalesPrice будет равен :old.AskingPrice, поэтому новых обновлений произведено не будет и рекурсия остановится.
|