SQLServerDML触发器之AFTER触发器

   根据DML触发器发生的时间、编写触发器所使用的语言,可以分为AFTER触发器、INSTEAD OF触发器和CLR触发器。AFTER触发器在执行INSERT、UPDATE或DELETE语句操作之后、INSTEAD OF触发器和约束之后激发。INSTEAD OF在处理约束前激发,因此可以在INSTEAD OF中使用其他语句来替代激发触发器的INSERT、UPDATE等语句。并且,还可为基于一个或多个基表的视图定义INSTEAD OF触发器,从而扩展视图可支持的更新类型。CLR触发器可以是AFTER触发器或INSTEAD OF触发器,并且也可以是DDL触发器。

  需要注意的是,在创建DML触发器时,不能使用下列语句:

  ALTER DATABASE CREATE DATABASE DROP DATABASE

  LOAD DATABASE LOAD LOG RECONFIGURE

  RESTORE DATABASE RESTORE LOG

  14.1.1 AFTER触发器

  一个表中可以具有多个AFTER触发器,只要它们的名称不相同即可。每个触发器只能应用于一个表,但是一个触发器可以同时应用于一个表的三个用户操作(UPDATE、INSERT和DELETE)。

  下面的语句创建了一个PriTrigger表和一个DetailTable,其中PriTrigger表用于存放销售订单的编号和金额,DetailTable表用于存放每笔订单中的产品信息。为PriTrigger表的DELETE操作创建了一个名为PriTrigger的触发器,当删除PriTrigger表中的订单信息时,该触发器将删除DetailTable表中该笔订单的产品信息。

  USE AdventureWorks;

  GO

  -- 创建主表,存放销售订单编号和金额

  CREATE TABLE PriTable

  (OrderID int IDENTITY(1,1), OrderTotal money);

  GO

  -- 创建明细表,存放每笔订单中的产品信息

  CREATE TABLE DetailTable

  (OrderID int, ProductID int, ProductCount int NOT NULL, Price money);

  GO

  -- 向主表中插入订单信息

  INSERT INTO PriTable VALUES (2100.00);

  INSERT INTO PriTable VALUES (1000.00);

  -- 向明细表中插入订单的产品信息

  INSERT INTO DetailTable VALUES (1,1,10,110.00);

  INSERT INTO DetailTable VALUES (1,2,10,100.00);

  INSERT INTO DetailTable VALUES (2,2,10,100.00);

  GO

  -- 为PriTrigger表创建触发器

  CREATE TRIGGER PriTrigger

  ON PriTable

  AFTER DELETE

  AS

  DELETE FROM DetailTable

  WHERE OrderID IN (SELECT OrderID

  FROM Deleted);

  PRINT N'已经删除了DetailTable表中的相关数据' -- 此句仅为演示需要,在触发器中不应当使用这样的信息语句

  在定义触发器时,触发器名称在CREATE TRIGGER关键字之后,ON子句指定要创建触发器的基表。AFTER子句(也可以使用FOR来代替AFTER关键字,二者功能相同)指定激活触发器的操作语句,可以同时指定多个操作语句。例如,“AFTER DELETE, INSERT”表示在对表执行DELETE、INSERT语句时激活触发器。AS关键字后指定触发器执行什么样的操作。

  注意WHERE条件中IN子句中的Deleted关键字。当从PriTrigger表中删除行时,被删除的行会被复制到一个名为Deleted的临时内存表中。如果为表指定了一个执行INSERT语句时的触发器,则在向表中插入行时,新行将同时被添加到一个名为Inserted的临时内存表中。如果为表指定了一个执行UPDATE语句时的触发器,由于更新事务类似于在删除操作之后执行插入操作。因此,旧行被复制到Deleted表中,然后,新行被复制到触发器表和Inserted表中。

  Deleted表和Inserted表都是由SQL Server自动创建和管理的,这些表的结构与定义触发器的基表的结构相同。

  执行下面的语句从PriTable表中删除OrderID为1的行,这时触发器会自动删除DetailTable表中的相关行,得到的结果和消息如图14-1所示。

  DELETE FROM PriTable WHERE OrderID = 1;

  SELECT * FROM PriTable;

  SELECT * FROM DetailTable;


  图14-1 删除PriTable表中OrderID为1的行时得到的结果和消息

  如果执行下面的语句,准备从PriTable表中删除OrderID为3的行。由于PriTable表中并不存在这样的行,所以并不会删除成功。虽然没有删除成功,但是在消息窗口中仍然可以看到由触发器的PRINT语句发回的信息。这说明即使语句没有影响到表中的行,也会激活触发器。在没有删除成功的情况下,Deleted表是一个空表。

  DELETE FROM PriTable WHERE OrderID = 3;

时间: 2024-11-01 09:35:53

SQLServerDML触发器之AFTER触发器的相关文章

Zabbix触发器之count使用例子详解

I. count 定义的一段时间内值的数量. 字段:(sec|#num,,,<time_shift>) II. sec,num 1.sec,num (秒,#值)-->(sec|#num, 评估期间以秒为单位或以最新收集的值(按#号开头) 2, :(可选) - 需要的图案(整数项目 - 精确匹配;浮法项目 - 内0.000001匹配) 3,operator (optional)可选的 III. 2.支持的选项(区分大小写) eq 等于 ne不等于 gt 更大 ge 大于或等于 lt 少 勒

Sql 触发器

        触发器是一种特殊的存储过程﹐它不能被显式地调用﹐而是在往表中插入记录﹑更新记录或者删除记录时被自动地激活.所以触发器可以用来实现对表实施复杂的完整性约束.          触发器在数据库里以独立的对象存储,与存储过程不同的是,存储过程通过其他程序来启动运行,而触发器是由一个事件来启动运行.即当某个事件发生时,触发器自动地隐式运行.并且,触发器不能接收参数.         触发器对象定义了触发器的特征和被调用时采取的行动.而这些动作是通过一个或多个SQL语句来实现的.SQL支持

SQL触发器在保持数据库完整性中的实际应用

触发器是SQL Server数据库应用中一个重要工具,是一种特殊类型的存储过程,应用非常广泛.一般存储过程主要通过存储过程名而被直接调用,触发器则是通过事件触发执行.触发器基于一个表来创建并和一个或多个数据修改操作(插入.更新或删除)相关联,可视作表的一部分.触发器与数据库中的表紧密相关,比如当对表执行INSERT.UPDATE或DELETE操作时,触发器就会自动执行. SQL Server 包括两大类触发器:DML 触发器和 DDL 触发器.其中DDL 触发器是 SQL Server 2005

触发器的高级应用

  在触发器的应用中,常会遇到这种情况,即被触发的触发器试图更新与其相关联的原始的目标表,从而使触发器被无限循环地触发.对于该种情况,不同的数据库产品提供了不同的解决方案有些DBMS 对一个触发器的执行过程采取的动作强加了限制,有些DBMS 提供了内嵌功能,允许一个触发器主体对正在进行的触发器所处的嵌套级别,另一些DBMS 提供了一种系统设置,控制是否允许串联的触发器处理,最后一些DBMS 对可能触发的嵌套触发器级别的数目进行限制.在MS SQL Server 中,这种能触发自身的触发器被称为递

触发器的应用

 在以上部分我们讨论了触发器的优缺点.工作原理以及创建触发器的具体方法.接下来我们将阐述各种不同复杂程度的触发器的应用. 12.9.1 插入型触发器的应用 12.9.1 插入型触发器的应用     更新型触发器有两种类型:通常意义上的更新型触发器和用于检查列改变的更新型触发器,这主要是因为更新操作可以涉及到数据项.通常意义上的更新型触发器:在前面我们已经提到更新操作包括两个部分,先将需更新的内容从表中删除掉,然后插入新值.因此,更新型触发器同时涉及到删除表.和插入表下面结合具体例子来对其进行讨论

创建触发器

  上面介绍了有关触发器的概念.作用和一些基本问题,下面我们将分别介绍在MS SQLServer 中如何用SQL Server 管理工具Enterprise Manager 和Transaction_SQL 来创建触发器.在创建触发器以前必须考虑到以下几个方面: CREATE TRIGGER 语句必须是批处理的第一个语句: 表的所有者具有创建触发器的缺省权限,表的所有者不能把该权限传给其它用户: 触发器是数据库对象,所以其命名必须符合命名规则: 尽管在触发器的SQL 语句中可以参照其它数据库中的

触发器设计技巧与实例

触发器|技巧|设计                             触发器设计技巧与实例 在数据库设计中,有两种方法可设定自动化的资料处理规则,一种是条件约束,一种是触发器,一般而言,条件约束比触发器较容易设定及维护,且执行效率较好,但条件约束只能对资料进行简单的栏位检核,当涉及到多表操作等复杂操作时,就要用到触发器了.      一个数据库系统中有两个虚拟表用于存储在表中记录改动的信息,分别 是:                 虚拟表Inserted                 

在SQLSERVER企业管理器中如何创建触发器

server|sqlserver|触发器|创建 下面将分别介绍在MS SQLServer 中如何用SQL Server 管理工具Enterprise Manager 和Transaction_SQL 来创建触发器.在创建触发器以前必须考虑到以下几个方面: CREATE TRIGGER 语句必须是批处理的第一个语句: 表的所有者具有创建触发器的缺省权限,表的所有者不能把该权限传给其它用户: 触发器是数据库对象,所以其命名必须符合命名规则: 尽管在触发器的SQL 语句中可以参照其它数据库中的对象,但

MS SQL基础教程:触发器的高级应用

在触发器的应用中,常会遇到这种情况,即被触发的触发器试图更新与其相关联的原始的目标表,从而使触发器被无限循环地触发.对于该种情况,不同的数据库产品提供了不同的解决方案有些DBMS 对一个触发器的执行过程采取的动作强加了限制,有些DBMS 提供了内嵌功能,允许一个触发器主体对正在进行的触发器所处的嵌套级别,另一些DBMS 提供了一种系统设置,控制是否允许串联的触发器处理,最后一些DBMS 对可能触发的嵌套触发器级别的数目进行限制.在MS SQL Server 中,这种能触发自身的触发器被称为递归触