关于在触发器中一个很菜的问题

时间:2021-09-25 10:58:07
第一段代码#####################
CREATE TRIGGER cfq2 ON mytable
FOR DELETE
AS
declare @aa int
select @aa=ID from deleted

第二段代码#####################
CREATE TRIGGER cfq2 ON mytable
FOR UPDATE
AS
declare @aa int
select @aa=ID from updated

请问为什么在第一段代码中就可以成功获得刚刚要删除的那条记录的ID,
而在第二段代码中执行就会报错,说 updated 是无效的表。请问我该如何
修改代码能使在FOR UPDATE操作中也达到第一段代码那样的效果?
就是如何取得被操作的那些记录。

7 个解决方案

#1


你的第二段代码是错误的,这说明你不明白触发器的执行原理;
触发器需要用三个动作来激活触发器,即insert,update,delete
在激活触发器的同时,系统会自动生成三个相关的表。
即insert动作时,会生成inserted表
update动作时,会生成inserted和deleted表,
delete动作时,会成生deleted表

所以你的第二段代码的updated这个表是无效的,根本没有这个表的存在。
如果你要查看被删除的那条记录代码如下:
修改为:
CREATE TRIGGER cfq2 ON mytable
FOR UPDATE
AS
declare @aa int
select @aa=ID from deleted
---如果你要查看新插入的那条记录可以这样:
select @aa=id from inserted 
这样就可以啦

#2


补充一下:
你也可以这样写,
CREATE TRIGGER cfq2 ON mytable
FOR UPDATE
AS
select * from inserted
select * from deleted

#3


有updated这个术语吗? 好象没有吧, update一条纪录以后,会把原来的纪录放到deleted里面,然后把要更新的纪录放到inserted里面。

当提交到数据库的时候,是如下过程:  根据deleted里面的数据定位到数据源中的纪录,然后把定位到的纪录用inserted中的数据替换之, 这就是update更新的过程

#4


xiaonvjing(飞扬) 说得很全面

#5


同意一楼说的。

#6


updated那有这个东东看看触发器的格式。

#7


其实我也知道没有updated这张表,但为了说清楚我的问题的意思,而引用了这样的一个表。
因为这样问你们会很清楚我问这个问题的意图。

感谢各位热心大虾回答,谢谢你们了。

#1


你的第二段代码是错误的,这说明你不明白触发器的执行原理;
触发器需要用三个动作来激活触发器,即insert,update,delete
在激活触发器的同时,系统会自动生成三个相关的表。
即insert动作时,会生成inserted表
update动作时,会生成inserted和deleted表,
delete动作时,会成生deleted表

所以你的第二段代码的updated这个表是无效的,根本没有这个表的存在。
如果你要查看被删除的那条记录代码如下:
修改为:
CREATE TRIGGER cfq2 ON mytable
FOR UPDATE
AS
declare @aa int
select @aa=ID from deleted
---如果你要查看新插入的那条记录可以这样:
select @aa=id from inserted 
这样就可以啦

#2


补充一下:
你也可以这样写,
CREATE TRIGGER cfq2 ON mytable
FOR UPDATE
AS
select * from inserted
select * from deleted

#3


有updated这个术语吗? 好象没有吧, update一条纪录以后,会把原来的纪录放到deleted里面,然后把要更新的纪录放到inserted里面。

当提交到数据库的时候,是如下过程:  根据deleted里面的数据定位到数据源中的纪录,然后把定位到的纪录用inserted中的数据替换之, 这就是update更新的过程

#4


xiaonvjing(飞扬) 说得很全面

#5


同意一楼说的。

#6


updated那有这个东东看看触发器的格式。

#7


其实我也知道没有updated这张表,但为了说清楚我的问题的意思,而引用了这样的一个表。
因为这样问你们会很清楚我问这个问题的意图。

感谢各位热心大虾回答,谢谢你们了。