Читать в оригинале

<< Предыдущая Оглавление Следующая >>


4.3.1 Использование триггеров для проверки допустимости вводимых данных

Предположим, у галереи (см. описание практического примера в гл. 1) есть правило, что ни одна работа не может быть продана менее, чем за 90% от запрошенной цены. Чтобы обеспечить выполнение этого правила, можно написать триггер обновления для таблицы TRANSACTION, срав­нивающий значения AskingPrice и SalesPrice. Если правило нарушается, в столбец AskingPrice ставится исходное значение.

Можно использовать две стратегии. Одна заключается в том, чтобы написать предваряющий триггер, который проверяет и переустанавлива­ет, если необходимо, значение столбца SalesPrice до выполнения обновле­ния. Вторая стратегия — написать завершающий триггер, проверяющий и переписывающий строку таблицы TRANSACTION после обновления.

Листинг 4.1.

CREATE OR REPLACE TRIGGER TRANS_SalesPriceCheck
BEFORE UPDATE ON TRANSACTION
FOR EACH ROW
BEGIN
IF :new.SalesPrice < 0.9 * :old.AskingPrice THEN
UPDATE TRANSACTION
SET
SalesPrice = :old.AskingPrice,
AskingPrice = :old.AskingPrice;
END IF;
END;

Листинг 4.1 соответствует второй стратегии, в котором опущены неко­торые детали. Если есть необходимость в комментариях, то они помеща­ются в скобки вида /* */.

Логика работы триггера очевидна. Если новая продажная цена состав­ляет менее 90% от запрашиваемой цены, продажная цена устанавливается равной запрашиваемой цене. Обратите внимание, что новая продажная цена сравнивается со старой запрашиваемой ценой; в противном случае можно было бы, изменив обе цены, успешно совершить обновление, нару­шающее данное ограничение. На тот случай, если именно так и произо­шло, столбец AskingPrice в операторе UPDATE устанавливается равным :old. AskingPrice.

Также следует обратить внимание, что этот триггер будет вызываться рекурсивно. Оператор UPDATE в триггере вызовет обновление таблицы TRANSACTION, что, в свою очередь, приведет к повторному вызову триг­гера. На этот раз, однако, столбец SalesPrice будет равен :old.AskingPrice, поэтому новых обновлений произведено не будет и рекурсия остановится.

 



<< Предыдущая Оглавление Следующая >>