Страница 1 из 1

Триггеры в InterBase 6.5

Добавлено: 25 дек 2005, 07:32
SSK
Хочу добиться следующего: при возможных коллизиях при в ставке записи, когда в таблицу пытаются вставить запись с уже существующим ключом 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. А как надо - не работает. В чем проблема, может кто знает?

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

Добавлено: 25 дек 2005, 13:49
kdv
такие вещи обычно триггером не делают. Почитай www.ibase.ru/devinfo/generator.htm

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