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

我们还有一个 Employees 表,用于存储员工信息。
| EmployeeID | FirstName | LastName | Position |
|---|---|---|---|
| 1 | Jane | Doe | Manager |
| 2 | John | Smith | Developer |
| 3 | Alice | Johnson | Developer |
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');
创建一个触发器,每当有新员工添加到 Employees 表时,就在 AuditLog 表中记录这个操作。
SQLCREATE 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 操作期间存储了新插入的行。
SQLINSERT INTO Employees (FirstName, LastName, Position)
VALUES ('Emily', 'Clark', 'HR');
GO

执行这个 INSERT 操作后,触发器 tr_Employees_AuditLog_Insert 会自动执行,并在 AuditLog 表中插入一条新记录。
创建一个触发器,每当 Employees 表的记录被更新时,在 AuditLog 表中记录这个操作。
SQLCREATE 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 表存储了更新操作后的新值。
SQLUPDATE Employees
SET Position = 'Senior Developer'
WHERE EmployeeID = 2;
GO
执行这个 UPDATE 操作后,触发器 tr_Employees_AuditLog_Update 会自动执行,并在 AuditLog 表中插入一条新记录。
创建一个触发器,每当从 Employees 表中删除记录时,在 AuditLog 表中记录这个操作。
SQLCREATE 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 表存储了被删除的行。
SQLDELETE FROM Employees
WHERE EmployeeID = 3;
GO
执行这个 DELETE 操作后,触发器 tr_Employees_AuditLog_Delete 会自动执行,并在 AuditLog 表中插入一条新记录。
触发器是 SQL Server 中强大的工具,能够自动化和强化数据完整性、审计和业务逻辑的实施。正确地使用触发器可以帮助维护数据的一致性和可追溯性,但也要注意它们可能带来的性能和复杂性问题。设计触发器时,务必充分测试以确保它们的行为符合预期,并且不会对系统性能造成不利影响。
本文作者:技术老小子
本文链接:
版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!