SQL Server触发器和事件是用于在数据库中自动执行一系列操作的特殊数据库对象。触发器与数据库表相关联,并在表中的数据插入、更新或删除时触发操作。触发器可以在数据更改前或更改后执行,并且它们可以在所有行上执行操作或只在特定行上执行操作。


一、触发器分类


  1. 行级触发器(Row Level Trigger)
    行级触发器是针对表中的每一行数据的触发器,它与每一行数据的插入、更新或删除相关联。行级触发器可以在数据更改前或更改后执行。
  2. 语句级触发器(Statement Level Trigger)
    语句级触发器是针对整个SQL语句的执行结果相关联的触发器。它在SQL语句执行前或执行后触发,而不是在每一行数据更改时触发。


二、触发器参数介绍


触发器有两个主要参数:inserted和deleted。这些参数是内置的表,用于访问触发器中发生的操作所影响的行的数据。


  1. inserted表参数:
    inserted表参数包含在触发器中插入或更新的行的副本。对于插入操作,该表包含插入的新行。对于更新操作,该表包含更新操作之前的行。
  2. deleted表参数:
    deleted表参数包含在触发器中删除或更新前的行的副本。对于删除操作,该表包含被删除的行。对于更新操作,该表包含更新操作之前的行。


三、操作案例


下面是一个触发器的案例,通过触发器记录员工表的更新操作。

sql server触发器执行存储过程_oracle


-- 创建触发器
CREATE TRIGGER trgUpdateEmployee
ON dbo.Employee
AFTER UPDATE
AS
BEGIN
SET NOCOUNT ON;

INSERT INTO dbo.EmployeeAudit (EmployeeID, OldSalary, NewSalary, UpdatedDate)
SELECT EmployeeID, Salary, inserted.Salary, GETDATE()
FROM inserted
JOIN deleted ON inserted.EmployeeID = deleted.EmployeeID
WHERE inserted.Salary <> deleted.Salary;
END;

以上代码创建了一个名为trgUpdateEmployee的触发器,它与dbo.Employee表的UPDATE操作相关联。每次更新dbo.Employee表时,该触发器将在更新后执行操作。操作将更新前的员工工资、更新后的员工工资以及更新日期插入dbo.EmployeeAudit表中。

在上述代码中,inserteddeleted表参数被用于获取更新操作之前的工资(deleted.Salary)和更新操作之后的工资(inserted.Salary)。然后,WHERE inserted.Salary <> deleted.Salary条件用于仅选择工资发生变化的行。最后,使用GETDATE()函数获取当前日期作为更新日期,并插入到dbo.EmployeeAudit表中。

触发器是将自动化操作添加到数据库中的强大工具。当表中的数据发生变化时,可以使用触发器来执行各种操作,例如记录数据更改日志、更新相关数据或执行业务逻辑。