Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/sql-server-2008/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql server 2008 SQL Server 2008在特定列更改时触发更新_Sql Server 2008_Triggers - Fatal编程技术网

Sql server 2008 SQL Server 2008在特定列更改时触发更新

Sql server 2008 SQL Server 2008在特定列更改时触发更新,sql-server-2008,triggers,Sql Server 2008,Triggers,其他的解决方案让我走到了这一步,但最终事情对我不起作用 我在tbl\u activity中有一个列,名为abstract。当tbl\u activity.abstract更改时,我想设置tbl\u activity.flag=0 我的两个版本的触发器将设置flag=0,但是我不能将flag设置回1,因为更改该flag会导致触发器触发,并且会一直将flag=0。我尝试将旧值与新值进行比较,将删除值与插入值进行比较,并尝试使用代替插入值 有人能检查一下这个代码并告诉我我遗漏了什么吗 ALTER TR

其他的解决方案让我走到了这一步,但最终事情对我不起作用

我在
tbl\u activity
中有一个列,名为
abstract
。当
tbl\u activity.abstract
更改时,我想设置
tbl\u activity.flag=0

我的两个版本的触发器将设置flag=0,但是我不能将flag设置回1,因为更改该flag会导致触发器触发,并且会一直将flag=0。我尝试将旧值与新值进行比较,将删除值与插入值进行比较,并尝试使用
代替插入值

有人能检查一下这个代码并告诉我我遗漏了什么吗

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

这将导致“命令成功完成”-但当
摘要
以外的列发生更改时,触发器始终设置
标志=0
。想法?

不确定
抽象
数据类型是什么-但我猜问题的原因是在触发器中使用了
不象
运算符-请尝试以下方法:

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 
ALTER TRIGGER[dbo].[AbstractChange]--触发器名称
在[dbo].[cpy_活动]--使用触发器的表上
删除而不是更新
作为
更新
设置a.flag=0
来自tbl_活动a
在a.activityid=i.activityid上插入的内部联接i
d.activityid=i.activityid上的内部联接已删除d
其中d.abstract i.abstract——在这里使用常用的*not equal*运算符
这会改变什么吗


另外:为什么
cpy_活动的触发器
,但在触发器内部,您使用的是
tbl_活动
-看起来有点奇怪,真的….

因为我发布的询问我问题的代码包含了错误的使用而不是-my“答案”此时,我将tbl_activity.abstract字段从Text类型更改为Varchar(MAX)notnull类型。最初的问题之一是SQL触发器不允许使用文本字段。我将在另一个帖子上适当地发布这个问题。同时,此代码在“abstract”字段为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
ALTER TRIGGER[dbo].[AbstractChange]--触发器名称
在[dbo].[tbl_活动]--使用触发器的表上
插入后,更新
作为更新
set a.flag=0——更改上表时的目标操作
来自tbl_活动a
在a.activityid=i.activityid上插入的内部联接i
d.activityid=i.activityid上的内部联接已删除d
其中d.abstract i.abstract

那是什么数据类型的
摘要
列???thx,marc-我的打字错误[从工作环境中清除代码]-我应该保留它们所有的“tbl_活动”。另外:就我而言,“代替”只是执行设置a.flag=0,而不是执行它应该执行的操作。所以-我放弃了而不是,我能找到的唯一方法是很遗憾地更改抽象的var类型[信息字段,仅文本,包括html标记等]。嗨,Marc顺便说一句,这很有帮助,谢谢。回过头来看,我想进一步阐明两件事:触发器“未更改”目标字段的原始错误是因为在其他地方,当目标字段直接更改为1时,它触发触发器,然后作出反应并将其重置为0。因此,我添加了一个子句“AND(d.targetfield=i.targetfield和d.targetfield=1)”,从而检查进入触发器的字段是否没有外部更改,此外,只有当它以1开头时,然后才将其重置为0。此外,我得到的原始硬错误是,无法在“插入”和“删除”表中使用文本、ntext或图像列。原始tbl_activity.abstract字段为文本。我们现在正在使用varchar(max),看看text、ntext和images列名是如何被弃用的。再次感谢您的帮助!!嘿,马克,我很抱歉没有早点检查答案!我当然想感谢你和其他人的帮助。这是一个很棒的stackoverflow站点!!