OUTPUT子句与触发器

OUTPUT 子句与触发器



OUTPUT 子句是SQL SERVER2005 新加入的,它返回受INSERT 、UPDATE 或DELETE 语句影响的每行的信息,或者返回基于上述每行的表达式或查询子表。这些结果可以返回到处理应用程序,以供在确认消息、存档以及其他类似的应用程序要求中使用。此外,也可以将结果插入表或表变量。

和触发器的联系和区别:
我们可以认为 OUTPUT 子句可以实现简单的触发器的功能,注意是简单功能 的触发器。

1. OUTPUT 子句和 INSERT 、 UPDATE 和 DELETE 语句是一个事务中,若 OUTPUT 子句出错(比如插入的表会关键字重复),则整个事务会回滚。这点和触发器一样,在 AFTER 触发器中,若发生错误,或者直接调用 ROLLBACK TRAN 则会回滚整个事务。
2. OUTPUT 子句和触发器中都可以使用 INSERTED 和 DELETED 两个表,各表的含义也一致。唯一不同的是 在INSERT 语句中不能使用 DELETED 表,在 DELETE 语句中不能使用 INSERTED 表 ;而触发器却没有这个限制,只是在 INSERT 触发器中 DELETED 为空,而 DELETE 触发器中 INSERTED 为空而已。触发器可以根据这两个表是否为空来判断触发条件:

3. OUTPUT 子句中只能将数据插入表或表变量或者返回给用户 ( 或显示 ) 。而触发器可以实现很多功能。其实这也是我上面说的 OUTPUT 是简单功能的触发器的原因。
4. 当使用 OUTPUT 子句把输出保存到一个表时,不会激活该表的触发器或 CHECK 约束,也不会参与任何一侧的外键约束。如果这时需要激活目标表的触发器或 CHECK 约束,你可以把输出保存到临时表或表变量,然后再复制到目标表。

5.作表的审计时,我们需要将记录UPDATE前后的值一一对应地写到审计表中。
因为OUTPUT子句中每条INSERTED记录和每条DELETED记录是“天然的”一一对应的,所以OUTPUT对审计表是没有任何问题的。
一般情况下,触发器也能轻松应付:DELETED表和INSERTED表可以通过关键字先连接(JOIN)起来,然后插入到审计表中。
但是若UPDATE修改表的关键字,则连接是没有办法了,但是若仅仅修改一条数据则可以直接从INSERTED表和DELETED表中取数据插入实现;而若修改了多条记录,触发器就无能为力了,此时请不要相信DELETED表和INSERTED表的“天然”缺省排序一致的说法,没人敢保证它。

参考书籍:
1. Microsoft SQL Server2005技术内幕:T-SQL查询
2.Order of rows in the inserted and deleted psuedo tables
(http://social.msdn.microsoft.com/Forums/en/sqldatabaseengine/thread/57c88f86-b3d0-467b-8c1a-b6fefa5ab2b8 )

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值