Книга: Firebird РУКОВОДСТВО РАЗРАБОТЧИКА БАЗ ДАННЫХ

Исключения в триггерах

Исключения в триггерах

Пользовательские исключения в триггерах способны поддерживать бизнес-правила. В примере базы данных EMPLOYEE есть правило, по которому покупатели, которым отказано в доверии, отмечаются в столбце ON_HOLD, который ограничен значениями NULL или "*". Когда добавляется запись в SALES или изменяется существующая запись с неотправленным товаром для такого покупателя, то такой заказ отклоняется, если флаг ON_HOLD не имеет значения NULL. Другое правило гласит, что заказ, который уже был отправлен, не может изменяться.

При добавлении или изменении записей заказов мы можем написать триггеры BEFORE, которые при нарушении этих правил выдают исключения и блокируют операцию.

Для любой версии Firebird мы можем написать два триггера для осуществления этих правил: BEFORE INSERT и BEFORE UPDATE.

Создадим исключения для двух условий:

CREATE EXECPTION E_CANT_ACCEPT

'Operation refused. REASON: Customer is on hold.' ^

/* Операция отклоняется. Причина: деятельность покупателя приостановлена */

CREATE EXCEPTION E_CANT_EXTEND

'Operation refused. REASON: Order already shipped.' ^

/* Операция отклоняется. Причина: заказ уже отправлен */

COMMIT ^

Триггеры для версии 1.0.x:

CREATE TRIGGER BI_SALES0 FOR SALES

ACTIVE BEFORE INSERT POSITION 0 AS

BEGIN

IF (EXISTS (SELECT 1 FROM CUSTOMER

WHERE CUST_NO = NEW.CUST_NO

AND ON_HOLD IS NOT NULL)) THEN

EXCEPTION E_CANT_ACCEPT;

END ^

/* */

CREATE TRIGGER BU_SALES0 FOR SALES

ACTIVE BEFORE UPDATE POSITION 0 AS

BEGIN

IF (OLD.ORDER_STATOS = 'shipped') THEN

EXCEPTION E_CANT_EXTEND; ELSE

IF (EXISTS (SELECT 1 FROM CUSTOMER

WHERE CUST_NO = NEW.CUST_NO

AND ON_HOLD IS NOT NULL) ) THEN

EXCEPTION E_CANT_ACCEPT;

END ^

Оглавление книги


Генерация: 1.776. Запросов К БД/Cache: 3 / 0
поделиться
Вверх Вниз