2025-11-05
SQLSERVER
00

目录

实例数据表:AuditLog
实例数据表:Employees
示例脚本 1:创建 INSERT 触发器
示例脚本 2:执行 INSERT 操作
示例脚本 3:创建 UPDATE 触发器
示例脚本 4:执行 UPDATE 操作
示例脚本 5:创建 DELETE 触发器
示例脚本 6:执行 DELETE 操作
触发器的注意事项
总结

在 SQL Server 中,触发器是一种特殊类型的存储过程,它会在满足特定条件时自动执行。触发器可以用于维护数据的完整性、执行业务规则、记录数据变更等。

触发器分为两大类:DML 触发器(包括 INSERT、UPDATE 和 DELETE)和 DDL 触发器(例如 CREATE、ALTER 和 DROP)。

实例数据表:AuditLog

假设我们有一个 AuditLog 表,用于记录 Employees 表中数据的变更情况。

LogIDEmployeeIDOperationChangeDate
12INSERT2023-01-01T12:00:00Z
23UPDATE2023-01-02T15:30:00Z
SQL
-- 创建AuditLog表 CREATE TABLE AuditLog ( LogID INT IDENTITY(1,1) PRIMARY KEY, EmployeeID INT, Operation VARCHAR(100), ChangeDate DATETIME ); -- 插入AuditLog表数据 INSERT INTO AuditLog (EmployeeID, Operation, ChangeDate) VALUES (2, 'INSERT', '2023-01-01T12:00:00Z'), (3, 'UPDATE', '2023-01-02T15:30:00Z');

image.png

实例数据表:Employees

我们还有一个 Employees 表,用于存储员工信息。

EmployeeIDFirstNameLastNamePosition
1JaneDoeManager
2JohnSmithDeveloper
3AliceJohnsonDeveloper
SQL
-- 创建Employees表 CREATE TABLE Employees ( EmployeeID INT IDENTITY(1,1) PRIMARY KEY, FirstName VARCHAR(100), LastName VARCHAR(100), Position VARCHAR(100), ); -- 插入Employees表数据 INSERT INTO Employees (FirstName, LastName, Position) VALUES ('Jane', 'Doe', 'Manager'), ('John', 'Smith', 'Developer'), ('Alice', 'Johnson', 'Developer');

示例脚本 1:创建 INSERT 触发器

创建一个触发器,每当有新员工添加到 Employees 表时,就在 AuditLog 表中记录这个操作。

SQL
CREATE TRIGGER tr_Employees_AuditLog_Insert ON Employees AFTER INSERT AS BEGIN INSERT INTO AuditLog (EmployeeID, Operation, ChangeDate) SELECT i.EmployeeID, 'INSERT', GETUTCDATE() FROM inserted i; END; GO

image.png

在上面的触发器中,inserted 是一个特殊的表,它在 INSERT 操作期间存储了新插入的行。

示例脚本 2:执行 INSERT 操作

SQL
INSERT INTO Employees (FirstName, LastName, Position) VALUES ('Emily', 'Clark', 'HR'); GO

image.png

执行这个 INSERT 操作后,触发器 tr_Employees_AuditLog_Insert 会自动执行,并在 AuditLog 表中插入一条新记录。

示例脚本 3:创建 UPDATE 触发器

创建一个触发器,每当 Employees 表的记录被更新时,在 AuditLog 表中记录这个操作。

SQL
CREATE TRIGGER tr_Employees_AuditLog_Update ON Employees AFTER UPDATE AS BEGIN INSERT INTO AuditLog (EmployeeID, Operation, ChangeDate) SELECT i.EmployeeID, 'UPDATE', GETUTCDATE() FROM inserted i; END; GO

在这个触发器中,inserted 表存储了更新操作后的新值。

示例脚本 4:执行 UPDATE 操作

SQL
UPDATE Employees SET Position = 'Senior Developer' WHERE EmployeeID = 2; GO

执行这个 UPDATE 操作后,触发器 tr_Employees_AuditLog_Update 会自动执行,并在 AuditLog 表中插入一条新记录。

示例脚本 5:创建 DELETE 触发器

创建一个触发器,每当从 Employees 表中删除记录时,在 AuditLog 表中记录这个操作。

SQL
CREATE TRIGGER tr_Employees_AuditLog_Delete ON Employees AFTER DELETE AS BEGIN INSERT INTO AuditLog (EmployeeID, Operation, ChangeDate) SELECT d.EmployeeID, 'DELETE', GETUTCDATE() FROM deleted d; END; GO

在这个触发器中,deleted 表存储了被删除的行。

示例脚本 6:执行 DELETE 操作

SQL
DELETE FROM Employees WHERE EmployeeID = 3; GO

执行这个 DELETE 操作后,触发器 tr_Employees_AuditLog_Delete 会自动执行,并在 AuditLog 表中插入一条新记录。

触发器的注意事项

  • 触发器可以带来额外的开销,因此在设计时要考虑性能影响。
  • 触发器可以嵌套和递归,需要谨慎使用以避免复杂的依赖和难以追踪的错误。
  • 在事务中使用触发器时,触发器的操作会成为事务的一部分,如果触发器失败,整个事务可能会回滚。

总结

触发器是 SQL Server 中强大的工具,能够自动化和强化数据完整性、审计和业务逻辑的实施。正确地使用触发器可以帮助维护数据的一致性和可追溯性,但也要注意它们可能带来的性能和复杂性问题。设计触发器时,务必充分测试以确保它们的行为符合预期,并且不会对系统性能造成不利影响。

本文作者:技术老小子

本文链接:

版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!