Запросы, планы, оптимизация запросов, ...
Модераторы: 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.
в) в многользовательском режиме проверка уникальности в контексте транзакции зевнёт дубликаты как два пальца об асфальт, так что за такие триггера пальцы уже принято отстригать тупыми кусачками.