update trigger

User avatar
Sabina
Уже с Приветом
Posts: 5669
Joined: 13 Oct 2000 09:01
Location: East Bay, CA

update trigger

Post by Sabina »

Вот такой дурацкий вопрос...

Если триггер написан вот так с серией if для каждого аттрибута, то это ведь все равно означает, что обновляется весь рекорд и как бы триггер срабатывает сразу на все аттрибуты из этого рекорда?

Code: Select all

CREATE TRIGGER dbo.tru_Equipment
ON Equipment
AFTER update
AS
......

if UPDATE(type)
    BEGIN
      SELECT @oldval=COALESCE(type,' ') FROM deleted
      SELECT @newval=type FROM inserted
if(@oldval != @newval)
      INSERT INTO AUD_trackingDetail VALUES
(@transID,'type',@oldval,@newval,'Equipment Type')
    END



Моя проблема вот в чем:

Я вставила сюда coalesce, чтобы избежать сравнения с NULL, поскольку это стринг.

Есть еще insert trigger для тех же таблиц, где никаких coalesce нет. Если новое значение не NULL, то insert trigger срабатывает.

Code: Select all

    SELECT @newval=type FROM inserted
IF ((@newval IS NOT NULL) AND (LEN(@newval)  >  0))
      INSERT INTO AUD_trackingDetail VALUES
(@transID,'type',NULL,@newval,'Equipment Type')


в последней строке в аудитную таблицу пишутся:
транзID, название аттрибута, старое значение, новое значение, полное название аттрибута (надо для печати).

В результате работы триггеров в таблице появляются записи типа:
old value - пусто (blank space?)
new value - NULL.
А их вообще быть не должно таких записей.

Я это могу только одним объяснить. Что в случае, если только одно значение в рекорде обновляется, апдейт триггер срабатывает на весь рекорд и тогда все мои нули превращаются update trigger-ом в blank space (из-за coalesce).

В последствии когда он(update trigger) срабатывает еще раз, и для данного аттрибута значение так и не появляется, то есть blank space меняется на NULL. То есть значения разные и триггер срабатывает.

Или я тут мудрю лишнего? :pain1:

Сабина
User avatar
Dmitry67
Уже с Приветом
Posts: 28294
Joined: 29 Aug 2000 09:01
Location: SPB --> Gloucester, MA, US --> SPB --> Paris

Post by Dmitry67 »

Вообще то в deleted может быть много записей
Триггер ведь не на записы вызывается а сразу для всех измененных записей
Зарегистрированный нацпредатель, удостоверение N 19719876044787 от 22.09.2014

Return to “Вопросы и новости IT”