更新后根据触发器插入更改日志
Insert into Change Log based on Trigger After Update
我需要编写一个 AFTER UPDATE 触发器。修改员工的工资率 table 时。它需要获取该信息并在 ChangeLog table 中创建一行。我的 table 如下:
员工:
EmployeeID INT (PK),
PayPerHour MONEY
ChangeLog:
ChangeID INT (PK),
EmpID (FK to EmployeeID),
ChangedBy NVARCHAR(30),
DateChanged SMALLDATETIME,
OldRate MONEY,
NewRate MONEY
这是我整理的。没有错误,但它没有在 ChangeLog 中创建行。 (我的印象是插入 = 新数据,删除 = 旧数据)。理想情况下,EmpID 将匹配,ChangedBy 将是系统用户,DateChanged 将是一个时间戳,OldRate 将是更新前的速率,NewRate 将是 post 更新后的速率。
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;
您的代码中有几个问题:
- 触发器必须处理一组更新(而不是单个更新)
- 您的触发器对您的 ChangeLog 执行更新而不是插入
您的代码应该更像:
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!
并且您的变更日志确实保留了每个员工工资率的每次更新的历史记录。
我需要编写一个 AFTER UPDATE 触发器。修改员工的工资率 table 时。它需要获取该信息并在 ChangeLog table 中创建一行。我的 table 如下:
员工:
EmployeeID INT (PK),
PayPerHour MONEY
ChangeLog:
ChangeID INT (PK),
EmpID (FK to EmployeeID),
ChangedBy NVARCHAR(30),
DateChanged SMALLDATETIME,
OldRate MONEY,
NewRate MONEY
这是我整理的。没有错误,但它没有在 ChangeLog 中创建行。 (我的印象是插入 = 新数据,删除 = 旧数据)。理想情况下,EmpID 将匹配,ChangedBy 将是系统用户,DateChanged 将是一个时间戳,OldRate 将是更新前的速率,NewRate 将是 post 更新后的速率。
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;
您的代码中有几个问题:
- 触发器必须处理一组更新(而不是单个更新)
- 您的触发器对您的 ChangeLog 执行更新而不是插入
您的代码应该更像:
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!
并且您的变更日志确实保留了每个员工工资率的每次更新的历史记录。