SQLServerDML触发器之AFTER触发器

  次阅读 作者:智能小宝 来源:互联网 2016-02-17 13:50 我要评论(0)

根据DML触发器发生的时间、编写触发器所使用的语言,可以分为AFTER触发器、INSTEADOF触发器和CLR触发器。AFTER触发器在执行INSERT、UPDATE或DELETE语句操作之后、INSTEAD OF触发器和约束之后激发。INSTEADOF在处理约束前激发,因此可以在INSTEADOF中使用其他语句来替代激发触发器的INSERT、UPDATE等语句。并且,还可为基于一个或多个基表的视图定义INSTEADOF触发器,从而扩展视图可支持的更新类型。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表中的相关数据' -- 此句仅为演示需要,在触发器中不应当使用这样的信息语句

在定义触发器时,触发器名称在CREATETRIGGER关键字之后,ON子句指定要创建触发器的基表。AFTER子句(也可以使用FOR来代替AFTER关键字,二者功能相同)指定激活触发器的操作语句,可以同时指定多个操作语句。例如,“AFTERDELETE, 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;

本站文章信息来源于网络以及网友投稿,本站只负责对文章进行整理、排版、编辑,是出于传递更多信息之目的,并不意味着赞同其观点或证实其内容的真实性。如果您有什么意见或建议,请联系QQ28-1688-302!

人工智能实验室
相关文章相关文章
  • 未来两年人工智能要怎么走?看这篇就够了

    未来两年人工智能要怎么走?看这篇就够了

  • 英国研发“杀生”机器人 通过生命体获取能量

    英国研发“杀生”机器人 通过生命体获取能量

  • 韩春雨称已能重复实验结果 近期将有消息公布

    韩春雨称已能重复实验结果 近期将有消息公布

  • 无人驾驶汽车如何改变城市生活?听听他们怎么说

    无人驾驶汽车如何改变城市生活?听听他们怎么说

网友点评网友点评
阅读推荐阅读推荐

据国外媒体报道,在过去两年内,聊天机器人(chatbot)、人工智能以及机器学习的研发和采用取得了巨大进展。许多初创公司正利用人工智能和...

霍金 视觉中国 图 英国著名物理学家霍金(Stephen Hawking)再次就人工智能(AI)发声,他认为:对于人类来说,强大AI的出现可能是最美妙的...

文|郑娟娟 今年,人工智能(AI) 60岁了。在AI60岁的时候,笔者想要介绍一下AI100,一个刚刚2岁的研究项目,但它的预设寿命是100年,甚至更长...

AlphaGo与李世石的人机大战,为大众迅速普及了人工智能的概念。 但对谷歌而言,除了下围棋,现在的人工智能进展到哪一步了?未来,人工智能...