IBX, FIBPlus, UIB, ADO, .Net и прочее-прочее-прочее, в общем все, что относится к созданию приложений, работающих с InterBase, Firebird и Yaffil - клиент-серверных, трехзвенных, консольных и т.п.
Модератор: kdv
-
SSK
- Сообщения: 2
- Зарегистрирован: 25 дек 2005, 07:27
Сообщение
SSK » 25 дек 2005, 07:32
Хочу добиться следующего: при возможных коллизиях при в ставке записи, когда в таблицу пытаются вставить запись с уже существующим ключом OrderIndex, должно выдаваться сообщение о невозможности вставки. Для чего написал соответствующее исключение:
CREATE EXCEPTION CANNOT_INSERT 'Cannot insert record: dataset was updated. reload the database.';
И триггер:
Код: Выделить всё
CREATE TRIGGER ORDER_INS_TEST FOR ORDERS
BEFORE INSERT POSITION 0 AS
DECLARE VARIABLE SameNumber INTEGER;
BEGIN
SELECT COUNT(*) FROM ORDERS
WHERE ORDERS.ORDERINDEX = NEW.ORDERINDEX
INTO :SameNumber;
IF (SameNumber > 0) THEN
EXCEPTION CANNOT_INSERT;
END !!
Триггер не срабатывает и позволяет вставлять хоть сколько записей с одинаковым ключом. Что характерно, если вместо SameNumber > 0 поставить ">=0" - все работает как ожидается и не дает вставить ни одной записи. Тот же эффект - если из BEFORE INSERT сделать AFTER INSERT. А как надо - не работает. В чем проблема, может кто знает?
-
SSK
- Сообщения: 2
- Зарегистрирован: 25 дек 2005, 07:27
Сообщение
SSK » 25 дек 2005, 11:36
Причем, судя по всему, происходит так потому, что сама база данных не замечает обновления: триггер проводит поиск по еще не обновленной таблице и не находит записей с новым ключом