sql-server - 根据更新后触发器插入更改日志

标签 sql-server triggers sql-server-2012

我需要编写一个 AFTER UPDATE 触发器。当员工表的工资率被修改时。它需要获取该信息并在 ChangeLog 表中创建一行。我的表格如下:

员工:

EmployeeID INT (PK),
PayPerHour MONEY

变更日志:

ChangeID INT (PK),
EmpID (FK to EmployeeID),
ChangedBy NVARCHAR(30),
DateChanged SMALLDATETIME,
OldRate MONEY,
NewRate MONEY

这是我整理的内容。没有错误,但它没有在变更日志中创建行。 (我的印象是插入=新数据,删除=旧数据)。理想情况下,EmpID 将匹配,ChangedBy 将是系统用户,DateChanged 将是时间戳,OldRate 将是更新前的速率,NewRate 将是更新后的速率。

CREATE TRIGGER PayRate_UPDATE
ON Employees
AFTER UPDATE
AS
BEGIN
DECLARE @EmpID INT
SELECT @EmpID = EmployeeID
FROM inserted

DECLARE @OldRate MONEY
SELECT @OldRate = PayPerHour
FROM deleted

DECLARE @DateChanged SMALLDATETIME
SELECT @DateChanged = GETDATE()

DECLARE @ChangedBy NVARCHAR(128)
SELECT @ChangedBy = suser_sname()

DECLARE @NewRate MONEY
SELECT @NewRate = PayPerHour
FROM inserted

IF UPDATE(PayPerHour)
    UPDATE ChangeLog
        SET EmpID = @EmpID,
            ChangedBy = @ChangedBy,
            DateChanged = @DateChanged,
            OldRate = @OldRate,
            NewRate = @NewRate
END;

最佳答案

您的代码中存在一些问题:

  1. 触发器必须处理一组更新(而不是单个更新)
  2. 您的触发器对您的变更日志进行更新而不是插入

您的代码应该看起来更像:

CREATE TRIGGER PayRate_UPDATE ON Employees
AFTER UPDATE
AS
 BEGIN

    DECLARE @DateChanged SMALLDATETIME
    SELECT  @DateChanged = GETDATE()

    DECLARE @ChangedBy NVARCHAR(128)
    SELECT  @ChangedBy = SUSER_SNAME()

  IF UPDATE(PayPerHour) 
  INSERT  [ChangeLog]
          (
            EmpID,
            ChangedBy,
            DateChanged,
            OldRate,
            NewRate
          )
          SELECT
            i.EmployeeID,
            @ChangedBy,
            @DateChanged,
            d.PayPerHour,
            i.PayPerHour
          FROM
            INSERTED i
            LEFT JOIN DELETED d
              ON i.EmployeeID = d.EmployeeID

  END;

所以,修改后的触发器现在可以处理每个人都加薪的情况,例如

UPDATE Employees SET PayPerHour = PayPerHour  * 1.1 -- everyone gets a 10% payrise YAY!

您的变更日志确实保留了每个员工工资率的每次更新的历史记录。

关于sql-server - 根据更新后触发器插入更改日志,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30721046/

相关文章:

mysql - 如何在表上创建插入触发器?

用于生成列值的 SQL 语句

sql - 批量创建多个 UDF - SQL Server

sql - 没有聚集索引的表算堆表吗?

mysql - UDF 触发器不起作用 MySQL 错误 1064 (42000)

插入后和更新触发器后的 MySQL

c# - SQL Server 原子增量

sql-server - 在 SQL Server 2012 的存储过程中执行多条语句和 CTE?

database-design - 外键是邪恶的?

sql - 计算递归 SQL Server CTE 中的运行平均值