Триггеры в InterBase 6.5

IBX, FIBPlus, UIB, ADO, .Net и прочее-прочее-прочее, в общем все, что относится к созданию приложений, работающих с InterBase, Firebird и Yaffil - клиент-серверных, трехзвенных, консольных и т.п.

Модератор: kdv

Ответить
SSK
Сообщения: 2
Зарегистрирован: 25 дек 2005, 07:27

Триггеры в InterBase 6.5

Сообщение 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

Причем, судя по всему, происходит так потому, что сама база данных не замечает обновления: триггер проводит поиск по еще не обновленной таблице и не находит записей с новым ключом

kdv
Forum Admin
Сообщения: 6595
Зарегистрирован: 25 окт 2004, 18:07

Сообщение kdv » 25 дек 2005, 13:49

такие вещи обычно триггером не делают. Почитай www.ibase.ru/devinfo/generator.htm

и вообще про pk и unique ключи.

Ответить