一、
在 SQL Server 中,触发器是一种特殊类型的存储过程,当某个数据修改事件(如 INSERT、UPDATE 或 DELETE)发生时自动执行。在触发器的内部,可以使用两个特殊的表:inserted
和 deleted
,这两个表是虚拟表,用于保存触发器所基于的表中受影响的行的数据。
-
inserted
表:该表包含由插入或更新操作影响的行的副本。对于 INSERT 操作,inserted
表将包含新插入的行;对于 UPDATE 操作,inserted
表将包含更新后的行。 -
deleted
表:该表包含由删除或更新操作影响的行的副本。对于 DELETE 操作,deleted
表将包含已删除的行;对于 UPDATE 操作,deleted
表将包含更新前的行。
通过使用 inserted
和 deleted
表,可以在触发器中访问受影响的行的数据,并根据需要执行逻辑。
例如,假设有一个名为 Employees
的表,其中包含员工的姓名和薪水信息。如果希望在每次更新员工的薪水时记录更改的详细信息,可以创建一个触发器,如下所示:
CREATE TRIGGER trg_UpdateSalary
ON Employees
AFTER UPDATE
AS
BEGIN
-- 检查是否更新了 Salary 列
IF UPDATE(Salary)
BEGIN
-- 获取更新前后的 Salary 值
DECLARE @OldSalary MONEY, @NewSalary MONEY;
SELECT @OldSalary = Salary FROM deleted;
SELECT @NewSalary = Salary FROM inserted;
-- 执行自定义的逻辑,例如将更改记录到日志表中
INSERT INTO SalaryChangeLog (EmployeeID, OldSalary, NewSalary, ChangeDate)
SELECT EmployeeID, @OldSalary, @NewSalary, GETDATE() FROM inserted;
END
END;
在这个示例中,当 Employees
表中的 Salary
列被更新时,触发器 trg_UpdateSalary
将自动执行。通过访问 deleted
表(包含更新前的薪水)和 inserted
表(包含更新后的薪水),触发器可以将更改记录到另一个名为 SalaryChangeLog
的日志表中。