根据更新后的触发器插入更改日志

威尔·埃斯蒂斯

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

员工人数

EmployeeID INT (PK),
PayPerHour MONEY

变更日志

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

这是我整理的。没有错误,但是没有在ChangeLog中创建行。(我的印象是插入=新数据,已删除=旧数据)。理想情况下,EmpID将匹配,ChangedBy将是System用户,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;
约翰·S

您的代码中有几个问题:

  1. 触发器必须处理一组更新(而不是单个更新)
  2. 您的触发器执行UPDATE而不是对ChangeLog的INSERT

您的代码应类似于:

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!

而且您的变更日志的确保留了每个员工薪资水平每次更新的历史记录。

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

在MySQL中插入和更新后,如何创建触发器来更改状态?

来自分类Dev

如何扩展Liquibase以使用存储过程,函数和触发器生成更改日志?

来自分类Dev

插入触发器后更新同一表

来自分类Dev

插入触发器后更新同一表

来自分类Dev

PLSQL触发器在插入后更新记录

来自分类Dev

插入更新和删除后的 SQL Server 触发器

来自分类Dev

更改更新触发器以在 MySQL 中插入触发器

来自分类Dev

更改表后更新列的POSTGRESQL触发器

来自分类Dev

更新后如何创建触发器以更改记录?

来自分类Dev

插入或删除后Oracle触发器

来自分类Dev

插入后的MySQL触发器

来自分类Dev

创建“插入后”触发器

来自分类Dev

在oracle中使用触发器更改日期的问题

来自分类Dev

更新更新后的MySQL触发器

来自分类Dev

使用触发器更改插入的值

来自分类Dev

使用触发器更改插入的值

来自分类Dev

插入和更新后未触发SQL Server触发器

来自分类Dev

为什么在触发了代替触发器后无法插入或更新有效数据?

来自分类Dev

插入和更新后未触发SQL Server触发器

来自分类Dev

SQL触发器-更新/插入

来自分类Dev

如何编写插入,更新触发器

来自分类Dev

多表触发器更新/删除/插入

来自分类Dev

SQL AFTER插入更新触发器

来自分类Dev

在触发器上更新插入的记录

来自分类Dev

PL/SQL 触发器在更新或插入后更新同一个表

来自分类Dev

触发器(更新后)导致错误?

来自分类Dev

MySQL 更新后触发器

来自分类Dev

更新后触发器和串联

来自分类Dev

MySQL触发器根据插入和存储的值更新表