Если триггер написан вот так с серией 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. То есть значения разные и триггер срабатывает.
Или я тут мудрю лишнего?
Сабина