什么是触发器
触发器(trigger)是一种在数据库操作前或操作后运行的代码块。触发器通常与特定的表有关,当表上执行特定的 INSERT、UPDATE 或 DELETE 语句时,触发器会被自动执行。
触发器可以用于执行某项任务,例如检查插入的值是否有效,或在插入、更新或删除操作执行后自动更新其他表。触发器可以大大简化应用程序的工作,因为它们能自动处理某些事情。此外,触发器还可以帮助确保数据的完整性。
在MSSQL中,触发器是存储在数据库中,然后与相关的表关联。当特定的 INSERT、UPDATE 或 DELETE 语句在一个表上执行时,与该表关联的触发器将被自动执行。MSSQL支持两个类型的触发器:DML触发器和DDL触发器。
DML触发器
DML触发器响应 INSERT、UPDATE 或 DELETE 语句的引发。当这些语句在与触发器相关的表上执行时,触发器会被自动执行。
DML触发器的定义
定义一个DML触发器时,必须指定如下信息:
事件:是什么DML事件(例如 INSERT、UPDATE 或 DELETE)将触发触发器。
表:当出现一些特定事件时,应该在哪个表上运行触发器。
触发器代码:在相应事件发生时运行的代码。
DML触发器中的Inserted、Deleted
DML触发器在执行时,可以通过Inserted和Deleted表来获得有关更改的信息。
当插入新行时,Inserted表包含将插入的行。当删除行时,Deleted表包含将删除的行。更新操作包括Insert行和Delete行。更改后的行存在Inserted表中,删除前的行存在Deleted表中。
一个DML触发器的示例
以下是一个DML触发器的示例,此触发器响应在Orders表中进行的任何INSERT或UPDATE操作,并将OrderStatus设置为“PENDING”:
CREATE TRIGGER trgOrdersInsertUpdate
ON Orders
AFTER INSERT, UPDATE
AS
BEGIN
UPDATE Orders
SET OrderStatus = 'PENDING'
WHERE OrderId IN (SELECT OrderId FROM Inserted)
END
在此触发器中,使用IN子句和Inserted表的WHERE子句来限制UPDATE语句的作用范围。
DDL触发器
DDL触发器响应数据库架构更改的引发。它们可以在 ALTER 和 CREATE 语句上定义,例如 ALTER TABLE 或 CREATE INDEX。当创建、更改或删除特定的对象时,触发器将被自动执行。
DDL触发器示例
以下是一个DDL触发器的示例,此触发器响应任何ALTER或CREATE TABLE语句,并将消息写入事件日志:
CREATE TRIGGER trgAuditCreateAlterTable
ON DATABASE
FOR CREATE_TABLE, ALTER_TABLE
AS
BEGIN
DECLARE @message NVARCHAR(MAX)
SET @message = 'Table created or altered:'+ EVENTDATA().value('(/EVENT_INSTANCE/ObjectType)[1]','nvarchar(256)')+ ':'
+EVENTDATA().value('(/EVENT_INSTANCE/ObjectName)[1]','nvarchar(256)')
EXEC sp_write_syslog @message
END
此触发器使用EVENTDATA函数记录事件日志的详细信息。
在触发器中使用T-SQL代码的注意事项
触发器使用T-SQL代码编写,但在触发器中的操作不同于存储过程。由于触发器随任何INSERT、UPDATE 或 DELETE 语句自动执行,因此在编写触发器代码时有几个重要的注意事项:
应选择使用合理的代码,以避免查询效率低下。
应该遵循规范化准则并避免重复。
不要在触发器中执行大量的业务逻辑或数据处理,因为的这些处理将产生负面影响。
结论
触发器是一种自动在数据库操作前或操作后执行的代码块。MSSQL支持DML触发器和DDL触发器,它们可用于从简单的任务,如值验证,到触发复杂的业务逻辑。在创建触发器的过程中,需要注意合理、规范化处理、不执行过多业务逻辑等问题。以上是MSSQL数据库中触发器的介绍,希望对您有所帮助。