根据DML触发器发生的时间、编写触发器所使用的语言,可以分为AFTER触发器、INSTEAD OF触发器和CLR触发器。AFTER触发器在执行INSERT、UPDATE或DELETE语句操作之后、INSTEAD OF触发器和约束之后激发。INSTEAD OF在处理约束前激发,因此可以在INSTEAD OF中使用
根据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;

如何在 PowerPoint 中的任何点击之前隐藏文本如果您希望在单击 PowerPoint 幻灯片上的任意位置时显示文本,那么设置起来既快速又容易。要在 PowerPoint 中单击任何按钮之前隐藏文本:打开您的 PowerPoint 文档,然后单击“插入 ”菜单。单击新幻灯片。选择空白或其他预设之一。仍然在插入菜单中,单击文本框。在幻灯片上拖出一个文本框。单击文本框并输入您

在Oracle数据库中,您可以使用CREATE TRIGGER语句来添加触发器。触发器是一种数据库对象,它可以在数据库表上定义一个或多个事件,并在事件发生时自动执行相应的操作。

如何在MySQL中使用PHP编写触发器MySQL是一种常用的关系型数据库管理系统,而PHP是一种流行的服务器端脚本语言。在MySQL中使用PHP编写触发器可以帮助我们实现自动化的数据库操作。本文将介绍如何使用PHP来编写MySQL触发器,并提供具体的代码示例。在开始之前,确保已经安装了MySQL和PHP,并且已经建立了相应的数据库表。一、创建PHP文件和数据

mysql的触发器是行级的。按照SQL标准,触发器可以分为两种:1、行级触发器,对于修改的每一行数据都会激活一次,如果一个语句插入了100行数据,将会调用触发器100次;2、语句级触发器,针对每个语句激活一次,一个插入100行数据的语句只会调用一次触发器。而MySQL中只支持行级触发器,不支持预语句级触发器。

如何在MySQL中使用PHP编写自定义触发器和存储过程引言:在开发应用程序时,我们经常需要在数据库层面进行一些操作,如插入、更新或删除数据。MySQL是一个广泛使用的关系型数据库管理系统,而PHP是一种流行的服务器端脚本语言。本文将介绍如何在MySQL中使用PHP编写自定义触发器和存储过程,并提供具体的代码示例。一、什么是触发器和存储过程触发器(Trigg

如何在MySQL中使用Python编写自定义触发器触发器是MySQL中的一种强大的功能,它可以在数据库中的表上定义一些自动执行的操作。而Python则是一种简洁而强大的编程语言,能够方便地与MySQL进行交互。本文将介绍如何使用Python编写自定义触发器,并提供具体的代码示例。首先,我们需要安装并导入PyMySQL库,它是Python与MySQL数据库进行

如何使用MySQL的触发器实现数据的自动归档引言:在现代数据管理领域,数据的自动归档和清理是一个重要而又常见的需求。随着数据量的增加,保留完整的历史数据会占用过多的存储资源,并且会降低查询性能。MySQL的触发器提供了实现这一需求的有效方法。本文将介绍如何使用MySQL的触发器来实现数据的自动归档。一、什么是MySQL的触发器MySQL的触发器是一种特殊的存

MySQL触发器是一种在数据库管理系统中用于监控特定表的操作,并根据预定义的条件执行相应操作的特殊程序。在创建MySQL触发器时,我们可以使用参数来灵活地传递数据和信息,让触发器更具通用性和适用性。在MySQL中,触发器可以在特定表的INSERT、UPDATE、DELETE操作前或者后触发执行相应的逻辑。使用参数可以使得触发器更具灵活性,可以根据需要传递需要


热AI工具

Undresser.AI Undress
人工智能驱动的应用程序,用于创建逼真的裸体照片

AI Clothes Remover
用于从照片中去除衣服的在线人工智能工具。

Undress AI Tool
免费脱衣服图片

Clothoff.io
AI脱衣机

AI Hentai Generator
免费生成ai无尽的。

热门文章

热工具

Dreamweaver CS6
视觉化网页开发工具

螳螂BT
Mantis是一个易于部署的基于Web的缺陷跟踪工具,用于帮助产品缺陷跟踪。它需要PHP、MySQL和一个Web服务器。请查看我们的演示和托管服务。

ZendStudio 13.5.1 Mac
功能强大的PHP集成开发环境

记事本++7.3.1
好用且免费的代码编辑器

DVWA
Damn Vulnerable Web App (DVWA) 是一个PHP/MySQL的Web应用程序,非常容易受到攻击。它的主要目标是成为安全专业人员在合法环境中测试自己的技能和工具的辅助工具,帮助Web开发人员更好地理解保护Web应用程序的过程,并帮助教师/学生在课堂环境中教授/学习Web应用程序安全。DVWA的目标是通过简单直接的界面练习一些最常见的Web漏洞,难度各不相同。请注意,该软件中