SQL Server中的DML触发器详解

SQL Server是微软开发和维护的关系数据库管理系统(RDBMS)。在SQL Server中,触发器是一种特殊的存储过程,用于响应数据库服务器中的事件。当数据库服务器中发生特定事件时,触发器会自动触发。SQL Server中的触发器主要分为三类:登录触发器、数据定义语言(DDL)触发器和数据操作语言(DML)触发器。本文将重点探讨DML触发器的相关知识。

DML触发器简介

数据操作语言(DML)触发器在数据库中对视图或表执行DML事件时被执行。在实际应用场景中,DML触发器可用于查询其他表、强制执行数据完整性和业务规则等。创建DML触发器的基本语法如下:

CREATE/ALTER TRIGGER TriggerName ON TableName/ViewName [WITH TriggerAttributes] Instead Of / AFTER/ FOR [Insert, Update, Delete] AS BEGIN TRIGGER Body END

其中,TableName/ViewName用于指定触发器定义的视图或表名。For/After选项用于指定触发器仅在SQL语句的动作之后执行。Instead Of选项用于指示数据库引擎执行触发器而不是执行语句。至少使用这三个SQL语句中的一个,或者它们的组合也是可以接受的。

DML触发器的示例

以下是一个创建DML触发器的示例,该触发器在对Student表执行INSERT操作后执行,用于回滚插入语句:

CREATE TRIGGER trForInsertStudent ON Student FOR INSERT AS BEGIN PRINT 'YOU CANNOT PERFORM INSERT OPERATION ON STUDENT TABLE' ROLLBACK TRANSACTION END

如果尝试向学生表中插入以下记录:

INSERT INTO STUDENT VALUES ('Rahul','MAths',79);

将得到以下输出。首先执行INSERT语句,然后触发trForInsertStudent触发器,在触发器内部打印消息并回滚INSERT操作。

DML触发器的类型

现在,将详细学习DML触发器,并了解不同类型的DML触发器。

After触发器在执行DELETE、INSERT、UPDATE或MERGE DML语句的操作后触发。如果发生任何违反约束的情况,则After触发器将不会被执行。因此,对于可能防止违反约束的处理,不能使用此触发器。对于MERGE语句中提供的每个INSERT、UPDATE或DELETE SQL语句,相应的触发器将为每个DML操作触发。创建After DML触发器的语法如下:

CREATE/ALTER TRIGGER TriggerName ON TableName/ViewName [WITH TriggerAttributes] AFTER [Insert, Update, Delete] AS BEGIN TRIGGER Body END

以下是一个创建After DML触发器的示例,该触发器在对Student表执行Update操作后执行,并在另一个名为STUDENTSTATUS的表中更新学生状态:

CREATE TRIGGER trForUpdateStudent ON STUDENT FOR Update AS BEGIN IF NOT EXISTS (SELECT * FROM sysobjects WHERE name='STUDENTSTATUS') CREATE TABLE STUDENTSTATUS(student_status varchar(250)); INSERT INTO STUDENTSTATUS VALUES('Updated') PRINT 'YOU HAVE PERFORM UPDATE OPERATION ON STUDENT TABLE' PRINT 'STUDENT STATUS IS UPDATED IN THE STUDENTSTATUS TABLE ' END

如果尝试使用以下查询更新学生表中的一条记录:

UPDATE STUDENT SET tot_marks=95 WHERE std_name='Chaitanya'

将得到以下输出。首先执行UPDATE语句,然后触发trForUpdateStudent触发器,在触发器内部将学生状态更新消息插入STUDENTSTATUS表,并打印消息。

在Instead Of触发器中,触发语句的标准操作被覆盖。在实际应用场景中,Instead Of触发器可用于对一个或多个表列执行错误处理,并在插入、更新或删除表或视图中的行之前执行额外的操作。创建Instead Of DML触发器的语法如下:

CREATE/ALTER TRIGGER TriggerName ON TableName/ViewName [WITH TriggerAttributes] Instead Of [Insert, Update, Delete] AS BEGIN TRIGGER Body END

以下是一个创建Instead Of DML触发器的示例,该触发器在执行Insert、Update或Delete操作时执行,用于在周日回滚对Student表应用的SQL操作:

CREATE TRIGGER trForAllDMLOperations ON STUDENT INSTEAD OF INSERT, UPDATE, DELETE AS BEGIN IF DATEPART(DW,GETDATE())= 1 BEGIN PRINT 'DML OPERATIONS ARE RESTRICTED ON SUNDAY' ROLLBACK TRANSACTION END ELSE PRINT 'DML OPERATIONS IS PERFORMED' END DELETE STUDENT WHERE std_name='Chaitanya'
沪ICP备2024098111号-1
上海秋旦网络科技中心:上海市奉贤区金大公路8218号1幢 联系电话:17898875485