关于“替代触发器”一个小疑问

Aaron_Chan 2012-05-07 05:04:04

--------delete 触发器
if exists(select * from sysobjects where name='tri_delCardInfo' and type='TR')
drop trigger tri_delCardInfo
go
create trigger tri_delCardInfo
on card
instead of delete
as
begin
delete from transInfo where cardNo in (select cardNo from deleted)
delete from card where cardNo in (select cardNo from deleted)
end
-------------------------------------------------------------------------
---当执行一下操作时候:
--delete from card where cardNO in ('100019','100009')
-----------------------------------------------------------------------
--返回如下结果:
-----------------------------------------------------------------------
(5 行受影响)------5行受影响可以明白,是删除了transInfo 表中CardNO为‘09’与‘19’的数据。

我的问题是:下面为什么有2个(2行受影响)???其中肯定有一个是删除了Card表的2行,另一个勒?
------------------
(2 行受影响)

(2 行受影响)
...全文
125 6 打赏 收藏 转发到动态 举报
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
Aaron_Chan 2012-05-07
  • 打赏
  • 举报
回复


begin
--SET NOCOUNT ON
delete from transInfo where cardNo in (select cardNo from deleted)
--delete from card where cardNo in (select cardNo from deleted)
end

-----------------
如果我改成上面的就只会修改1个表中的数据就是transinfo表。
虽然执行了:delete from card where cardNO in ('100019','100009')
但是:card表是不会被删除的。
为什么结果:
还是这样勒:
--------------------------------
5行受影响
2行受影响???是不是输入:card表没有删除物理数据,但是他想deleted表中写入了2条??

如果是这样那为什么inserted表中写入的时候不是这样勒?

请大牛帮忙
昵称被占用了 2012-05-07
  • 打赏
  • 举报
回复
一个+
一个

不是两个吗,确认真的看明白了?
孤独加百列 2012-05-07
  • 打赏
  • 举报
回复
触发器默认情况下是不能嵌套执行的,需要设置sp_configure 下nest trigger选项为true才可以,但是也只能嵌套32层
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 的回复:]

一个是触发器中真正删除card 两条记录
一个是delete from card where cardNO in ('100019','100009')语句删除两条记录(虽然被触发器代替了)

在触发器增加SET NOCOUNT ON可以避免这类误解

--------delete 触发器
if exists(select * from sysobjects where name='……
[/Quote]

DBA专家的解释,学习学习
Aaron_Chan 2012-05-07
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 的回复:]
一个是触发器中真正删除card 两条记录
一个是delete from card where cardNO in ('100019','100009')语句删除两条记录(虽然被触发器代替了)

在触发器增加SET NOCOUNT ON可以避免这类误解

--------delete 触发器
if exists(select * from sysobjects where name='t……
[/Quote]

这个我知道,问题是有2个(2行受影响)啊???为什么会又2个勒??
昵称被占用了 2012-05-07
  • 打赏
  • 举报
回复
一个是触发器中真正删除card 两条记录
一个是delete from card where cardNO in ('100019','100009')语句删除两条记录(虽然被触发器代替了)

在触发器增加SET NOCOUNT ON可以避免这类误解

--------delete 触发器
if exists(select * from sysobjects where name='tri_delCardInfo' and type='TR')
drop trigger tri_delCardInfo
go
create trigger tri_delCardInfo
on card
instead of delete
as
begin
SET NOCOUNT ON;
delete from transInfo where cardNo in (select cardNo from deleted)
delete from card where cardNo in (select cardNo from deleted)
end
GO
-------------------------------------------------------------------------
---当执行一下操作时候:
--delete from card where cardNO in ('100019','100009')
-----------------------------------------------------------------------
--返回如下结果:
(2 行受影响)

27,579

社区成员

发帖
与我相关
我的任务
社区描述
MS-SQL Server 应用实例
社区管理员
  • 应用实例社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧