在 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 编辑过