【发布时间】:2013-02-19 00:08:02
【问题描述】:
我目前正在创建一个 SQL Server 触发器,该触发器在更新后应该填充一个更改日志,其中包含所做的任何薪水更改以及由哪个用户更改。
我制作的更新日志表可以在这里看到:
CREATE TABLE ChangeLog
(
ChangeID int identity(1,1) primary key,
EmpID int,
[User] nvarchar(30),
[Date] smalldatetime,
OldRate money,
NewRate money
)
据我所知,表的一切都很好,但是当我去创建触发器时,我开始收到一些错误(以及一大堆混乱。)我已经尝试研究几种方法一个用新行更新不同表的触发器,据我所知,它的结构是正确的,但是我不确定我是如何弄乱内容的。
CREATE TRIGGER payrate_change ON Employees FOR UPDATE
As
DECLARE @originalPay VARCHAR(100)
DECLARE @newPay VARCHAR(100)
If UPDATE (PayRate)
BEGIN
SELECT @originalPay = (SELECT PayRate FROM deleted)
SELECT @newPay = (SELECT PayRate FROM inserted)
INSERT INTO [dbo].[ChangeLog]
(ChangeID, EmpID, [User], [Date], OldRate, NewRate)
VALUES
identity(1,1),
Employees.EmployeeID,
SUSER_SNAME(),
SYSDATETIME(),
@originalPay,
@newPay
FROM inserted
END
两个 select 语句的 payrate 部分给出了一个错误,指出它们是无效的列,即使它上面的两行调用 PayRate 就好了。然后对于 Insert Into 语句的值部分,identity 声称语法不正确,尽管我在创建表时以完全相同的方式使用它。
有人对此触发器可能存在什么问题有任何想法吗?任何意见将不胜感激。
编辑:
在下面建议的更改之后,我将 ChangeID(主键)重新添加到触发器中,但是现在 IDENTITY 给了我一个不正确的语法错误:
CREATE TRIGGER payrate_change ON Employees FOR UPDATE
As
If UPDATE (PayRate)
BEGIN
INSERT INTO [dbo].[ChangeLog]
(ChangeID, EmpID, [User], [Date], OldRate, NewRate)
select
IDENTITY(1,1),
i.EmployeeID,
SUSER_SNAME(),
SYSDATETIME(),
d.PayRate,
i.PayRate
FROM inserted i
JOIN deleted d on i.EmployeeID = d.deleted
END
EDIT2:为感兴趣的人添加最终结果:
CREATE TRIGGER payrate_change2 ON Employees FOR UPDATE
AS
If UPDATE (Pay)
BEGIN
INSERT INTO [dbo].[ChangeLog]
(EmpID, [User], [Date], OldRate, NewRate)
select
i.EmployeeID,
SUSER_SNAME(),
SYSDATETIME(),
d.Pay,
i.Pay
FROM inserted i
JOIN deleted d on i.EmployeeID = d.EmployeeID
END
【问题讨论】:
标签: sql sql-server tsql database-design triggers