特定列更改时,SQL Server 2008会触发更新

时间:2017-11-13 21:33:43

标签: sql-server-2008 triggers

其他解决方案让我走到了这一步,但最终事情并不适合我。

我在tbl_activity中有一个名为abstract的列。 tbl_activity.abstract更改后,我想设置tbl_activity.flag = 0

我的2个版本的触发器会设置flag = 0,但是我不能将标志设置回1,因为更改该标志会导致它触发,并且它会一直设置flag = 0.我试过比较从旧到新值,删除到插入的值,然后尝试INSTEAD OF INSERT

有人可以检查一下这段代码并告诉我我错过了什么吗?

ALTER TRIGGER [dbo].[AbstractChange] --trigger name
ON [dbo].[cpy_activity] --table using the trigger
INSTEAD OF UPDATE, DELETE
AS 
     UPDATE a 
     SET a.flag = 0
     FROM tbl_activity a 
     INNER JOIN INSERTED i ON a.activityid = i.activityid
     INNER JOIN DELETED d ON d.activityid = i.activityid
     WHERE d.abstract NOT LIKE i.abstract

这导致" Command [s]成功完成" - 但当abstract以外的列发生更改时,触发器始终设置flag = 0。想法?

2 个答案:

答案 0 :(得分:1)

不确定val result = data.scanLeft((-1, Set[Int]())){ case ((_, acc), (time, value, true)) => (time, acc + value) case ((_, acc), (time, value, false)) => (time, acc - value) }.tail 数据类型是什么 - 但我有点猜测你的麻烦的原因是在触发器中使用abstract运算符 - 试试这个:

NOT LIKE

这会改变什么吗?

另外:为什么ALTER TRIGGER [dbo].[AbstractChange] --trigger name ON [dbo].[cpy_activity] --table using the trigger INSTEAD OF UPDATE, DELETE AS UPDATE a SET a.flag = 0 FROM tbl_activity a INNER JOIN INSERTED i ON a.activityid = i.activityid INNER JOIN DELETED d ON d.activityid = i.activityid WHERE d.abstract <> i.abstract -- use the usual *not equal* operator <> here 上的触发器,但在触发器内,您使用cpy_activity - 似乎有点奇怪,真的....

答案 1 :(得分:0)

因为我发布的代码问我的问题,包含错误使用INSTEAD OF - 我的回答&#34;在这一点上,我将我的tbl_activity.abstract字段从Text类型更改为类型Varchar(MAX)非null。原始问题之一是SQL触发器不允许使用文本字段。我会在另一篇文章中正确地发布这个问题。同时,这个代码可以在&#34; abstract&#34;字段是类型varchar:

ALTER TRIGGER [dbo].[AbstractChange] --trigger name
ON  [dbo].[tbl_activity] --table using the trigger
AFTER INSERT, UPDATE
AS UPDATE a 
set a.flag = 0 --target action when above table is changed
FROM tbl_activity a 
 INNER JOIN INSERTED i ON a.activityid = i.activityid
 INNER JOIN DELETED d ON d.activityid = i.activityid
WHERE d.abstract <> i.abstract