在 SQL Server 中,触发器是一种特殊类型的存储过程,它会在满足特定条件时自动执行。触发器可以用于维护数据的完整性、执行业务规则、记录数据变更等。
触发器分为两大类:DML 触发器(包括 INSERT、UPDATE 和 DELETE)和 DDL 触发器(例如 CREATE、ALTER 和 DROP)。
实例数据表:AuditLog
假设我们有一个 AuditLog 表,用于记录 Employees 表中数据的变更情况。
| LogID | EmployeeID | Operation | ChangeDate |
|---|
| 1 | 2 | INSERT | 2023-01-01T12:00:00Z |
| 2 | 3 | UPDATE | 2023-01-02T15:30:00Z |
-- 创建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');

实例数据表:Employees
我们还有一个 Employees 表,用于存储员工信息。
| EmployeeID | FirstName | LastName | Position |
|---|
| 1 | Jane | Doe | Manager |
| 2 | John | Smith | Developer |
| 3 | Alice | Johnson | Developer |
-- 创建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 表中记录这个操作。
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

在上面的触发器中,inserted 是一个特殊的表,它在 INSERT 操作期间存储了新插入的行。
示例脚本 2:执行 INSERT 操作
INSERT INTO Employees (FirstName, LastName, Position)
VALUES ('Emily', 'Clark', 'HR');
GO

执行这个 INSERT 操作后,触发器 tr_Employees_AuditLog_Insert 会自动执行,并在 AuditLog 表中插入一条新记录。
示例脚本 3:创建 UPDATE 触发器
创建一个触发器,每当 Employees 表的记录被更新时,在 AuditLog 表中记录这个操作。
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 操作
UPDATE Employees
SET Position = 'Senior Developer'
WHERE EmployeeID = 2;
GO
执行这个 UPDATE 操作后,触发器 tr_Employees_AuditLog_Update 会自动执行,并在 AuditLog 表中插入一条新记录。
示例脚本 5:创建 DELETE 触发器
创建一个触发器,每当从 Employees 表中删除记录时,在 AuditLog 表中记录这个操作。
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 操作
DELETE FROM EmployeesWHERE EmployeeID = 3;GO
执行这个 DELETE 操作后,触发器 tr_Employees_AuditLog_Delete 会自动执行,并在 AuditLog 表中插入一条新记录。
触发器的注意事项
触发器可以带来额外的开销,因此在设计时要考虑性能影响。
触发器可以嵌套和递归,需要谨慎使用以避免复杂的依赖和难以追踪的错误。
在事务中使用触发器时,触发器的操作会成为事务的一部分,如果触发器失败,整个事务可能会回滚。
总结
触发器是 SQL Server 中强大的工具,能够自动化和强化数据完整性、审计和业务逻辑的实施。正确地使用触发器可以帮助维护数据的一致性和可追溯性,但也要注意它们可能带来的性能和复杂性问题。设计触发器时,务必充分测试以确保它们的行为符合预期,并且不会对系统性能造成不利影响。
该文章在 2024/2/21 12:21:34 编辑过