mssql数据库表触发器介绍

什么是触发器

触发器(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数据库中触发器的介绍,希望对您有所帮助。

数据库标签