我已经在SQL Server中创建了一个触发器:
ALTER trigger [dbo].[TIME_PersonalTagUpdIns] on [dbo].[TIME_PersonalTag] for INSERT,UPDATE as
if not UPDATE(SyncToTimeTac)
BEGIN
update a
set a.SyncToTimeTac=0x31
from TIME_PersonalTag a inner join inserted b on a.Ident=b.Ident
where a.Erledigt = 0x31
END
现在,当我执行
update TIME_PersonalTag set SyncToTimeTac = 0x30
目标是不执行触发器中的逻辑。为此,我在开头if not UPDATE(SyncToTimeTac)
处进行检查-但是,当我运行上述语句时,触发器逻辑仍将执行。
我不明白为什么会这样。
答案 0 :(得分:0)
即使您专门更新了SyncToTimeTac
,我也不知道为什么触发逻辑会被执行,但是我可以提供UPDATE()
函数的替代方法,它更可靠-因为{{ 1}}函数即使更新失败也会返回true:
UPDATE
现在,仅当该列的值未更改时,才应将ALTER trigger [dbo].[TIME_PersonalTagUpdIns] on [dbo].[TIME_PersonalTag]
FOR INSERT,UPDATE
AS
UPDATE a
SET a.SyncToTimeTac = 0x31
FROM TIME_PersonalTag AS a
INNER JOIN inserted AS i
ON a.Ident = i.Ident
INNER JOIN deleted AS d
ON d.Ident = i.Ident
WHERE a.Erledigt = 0x31
AND ISNULL(i.SyncToTimeTac, 0x31) = ISNULL(d.SyncToTimeTac, 0x31)
END
设置为SyncToTimeTac
。