`
jinghuainfo
  • 浏览: 1525684 次
  • 性别: Icon_minigender_2
  • 来自: 北京
文章分类
社区版块
存档分类
最新评论

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 )

分享到:
评论

相关推荐

    oracle实验报告

    (6)在一个单独的表上,最多只能创建三个触发器与之关联,一个INSERT触发器,一个DELETE触发器和一个UPDATE触发器。 1. 实例讲解Oracle数据库自带的几个触发器 Oracle数据库自带的几个触发器(最简单触发器格式)...

    SQL Server 2008编程入门经典(第3版)

    7.6.2 OUTPUT子句 7.7 性能方面的考虑 7.8 本章小结 7.9 练习 第8章 规范化和其他基本设计问题 8.1 表 8.2 保持数据“规范 8.2.1 准备工作 8.2.2 第一范式 8.2.3 第二范式 8.2.4 第三范式 8.2.5 其他范式 8.3 关系 ...

    sql总结.doc

    2.能过实现比check更严格的约束,与CHECK 约束不同,触发器可以引用其它表中的数据。通过其他表中的数据的变化来设置更加复杂的约束。 缺点:滥用触发器会造成数据库及应用程序的维护困难。 (5)触发器的两种形式...

    Microsoft SQL Server 2008技术内幕:T-SQL查询(第二卷)

    10.5 OUTPUT子句 10.6 总结 第11章 查询分区表 11.1 在SQL Server中进行分区 11.1.1 分区视图 11.1.2 分区表 11.2 总结 第12章 图、树、层次结构和递归查询 12.1 术语 12.1.1 图 12.1.2 树 12.1.3 层次...

    SQLServer2008技术内幕T-SQL查询包含源代码及附录A

    10.5 OUTPUT子句475 10.6 总结482 第11章 查询分区表483 11.1 在SQL Server中进行分区483 11.1.1 分区视图483 11.1.2 分区表484 11.2 总结496 第12章 图、树、层次结构和递归查询497 12.1 术语497 12.1.1 图497 ...

    SQL.Server.2008编程入门经典(第3版).part1.rar

    7.6.2 OUTPUT子句 7.7 性能方面的考虑 7.8 本章小结 7.9 练习 第8章 规范化和其他基本设计问题 8.1 表 8.2 保持数据“规范 8.2.1 准备工作 8.2.2 第一范式 8.2.3 第二范式 8.2.4 第三范式 8.2.5 其他范式 8.3 关系 ...

    SQL.Server.2008编程入门经典(第3版).part2.rar

    7.6.2 OUTPUT子句 7.7 性能方面的考虑 7.8 本章小结 7.9 练习 第8章 规范化和其他基本设计问题 8.1 表 8.2 保持数据“规范 8.2.1 准备工作 8.2.2 第一范式 8.2.3 第二范式 8.2.4 第三范式 8.2.5 其他范式 8.3 关系 ...

    Visual C++ 数据库系统开发完全手册.part2

    第13章 存储过程、触发器与视图 13.1 存储过程概述 13.2 存储过程的应用 13.2.1 新建存储过程 13.2.2 修改存储过程 13.2.3 删除存储过程 13.2.4 获取数据库中存储过程 13.2.5 获取指定存储过程语句 13.2.6 存储过程...

    Microsoft+SQL+Server+2008技术内幕:T-SQL查询_源代码及附录 中文版

    10.5 OUTPUT子句475 10.6 总结482 第11章 查询分区表483 11.1 在SQL Server中进行分区483 11.1.1 分区视图483 11.1.2 分区表484 11.2 总结496 第12章 图、树、层次结构和递归查询497 12.1 术语497 12.1.1 ...

    Visual C++ 数据库系统开发完全手册.part1

    第13章 存储过程、触发器与视图 13.1 存储过程概述 13.2 存储过程的应用 13.2.1 新建存储过程 13.2.2 修改存储过程 13.2.3 删除存储过程 13.2.4 获取数据库中存储过程 13.2.5 获取指定存储过程语句 13.2.6 存储过程...

    精通Oracle.10g.PLSQL编程

    开发触发器 13.1 触发器简介 13.2 建立DML触发器 13.2.1 语句触发器 13.2.2 行触发器 13.2.3 使用DML触发器 13.3 建立INSTEADOF触发器 13.4 建立系统事件触发器 13.5 管理触发器...

    数据库基础

    §2.4.1 用 ORDER BY 子句来对结果进行排序 76 §2.4.2 用 BREAK 命令 来对结果进行排列 76 §2.4.3 用 COMPUTE 命令对结果进行格式化 79 §2.5 配置会话环境 82 §2.5.1 ARRAYSIZE(取回的行数) 82 §2.5.2 ...

    Oracle8i_9i数据库基础

    §2.4.1 用 ORDER BY 子句来对结果进行排序 76 §2.4.2 用 BREAK 命令 来对结果进行排列 76 §2.4.3 用 COMPUTE 命令对结果进行格式化 79 §2.5 配置会话环境 82 §2.5.1 ARRAYSIZE(取回的行数) 82 §2.5.2 ...

    PLSQLDeveloper下载

    对象浏览器——可配置的树形浏览能够显示同PL/SQL开发相关的全部信息,使用该浏览器可以获取对象描述、浏览对象定义、创建测试脚本以便调试、使能或禁止触发器或约束条件、重新编译不合法对象、查询或编辑表格、...

    PL/SQL Developer8.04官网程序_keygen_汉化

     可配置的树形浏览能够显示同PL/SQL开发相关的全部信息,使用该浏览器可以获取对象描述、浏览对象定义、创建测试脚本以便调试、使能或禁止触发器或约束条件、重新编译不合法对象、查询或编辑表格、浏览数据、在对象...

    Toad 使用快速入门

     可以执行匿名块,存储过程,从下方的窗口看到DBMS_OUTPUT的结果,如: 3. Stored Procedure Editor a) 打开存储过程编写器的几个途径: 单击总菜单栏上的第三个按钮:   点击Database - > Procedure ...

Global site tag (gtag.js) - Google Analytics