Отмена события в триггере

Запросы, планы, оптимизация запросов, ...

Модераторы: kdv, CyberMax

Ответить
inspirion
Сообщения: 33
Зарегистрирован: 23 фев 2005, 11:32

Отмена события в триггере

Сообщение inspirion » 12 окт 2005, 17:58

Здравствуйте.
Суть проблемы в следующем.

Код: Выделить всё

CREATE TRIGGER BRANDNAME_BU0 FOR BRANDNAME
ACTIVE BEFORE UPDATE POSITION 0
AS
declare variable id_brandname integer;
begin
  ID_BRANDNAME = 0;
  SELECT Count(ID_BRANDNAME)
  from BRANDNAME
  WHERE NAME = NEW.NAME
  INTO :ID_BRANDNAME;

  if (ID_BRANDNAME <> 0) then
    ///Если условие верно то надо отменить обновление.

end
Возможно ли это, и если да то какие есть способы реализации.
Спасибо за внимание.

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

Сообщение kdv » 12 окт 2005, 18:26

на форуме уже обсуждалось. в триггере отменить вставку можно только вызвав exception. Если сделать view с before триггерами, то тогда наоборот, в триггере не делать вставку при определенных условиях.

Возможно exception - в данном случае как раз то что нужно. Однако
лично я подобный триггер бы вообще не писал. Потому что из триггера невозможно понять, какой именно id_brandname был обнаружен с именем, который пытаются вставить. Так что, проверку подобного рода придется делать на клиенте, перед вставкой.

Merlin
Динозавр IB/FB
Сообщения: 1502
Зарегистрирован: 27 окт 2004, 11:44

Сообщение Merlin » 12 окт 2005, 18:38

kdv писал(а): Возможно exception - в данном случае как раз то что нужно.
Ага. Только не в триггере, а наложивши на Name Unique constraint. Потому что

а) в отличие от insert, отменить именно update в before триггере можно и молча (во все new значения покласть old) но это вломно и по меньшей мере некрасиво.
б) за проверку наличия записи count-ом бьют линейкой по пальцам, ибо на то есть гораздо более быстрый exists.
в) в многользовательском режиме проверка уникальности в контексте транзакции зевнёт дубликаты как два пальца об асфальт, так что за такие триггера пальцы уже принято отстригать тупыми кусачками.

Ответить