SQL Server更改日志创建,标识语法和无效的COlumns

时间:2013-02-19 00:08:03

标签: sql sql-server tsql database-design triggers

我目前正在创建一个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语句的值部分,尽管我在创建表时使用完全相同的方式,但身份声明声明的语法不正确。

有没有人对此触发器可能出现的问题有任何想法?任何意见都将不胜感激。

编辑:

在下面的建议更改后,我重新将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

1 个答案:

答案 0 :(得分:0)

省略标识栏,它将自行填充

您的触发器无法处理多行更新,请查看Best Practice: Coding SQL Server triggers for multi-row operations

你可以加入已删除和插入的伪表,我假设EmployeeID是关键吗?

试试这个

CREATE TRIGGER payrate_change ON Employees FOR UPDATE
As

If UPDATE (PayRate)
BEGIN

INSERT INTO [dbo].[ChangeLog]
        (EmpID, [User], [Date], OldRate, NewRate)
    select
        i.EmployeeID, 
        SUSER_SNAME(), 
        SYSDATETIME(), 
        d.PayRate, 
        i.PayRate
    FROM inserted i
    JOIN deleted d on i.EmployeeID = d.deleted
END

另请注意,即使您执行If UPDATE (PayRate)之类的操作,SET PayRate = PayRate也会触发。因此您可能想要检查该值是否实际已更改,您可以在插入和删除之间的JOIN中添加该值还要确保检查NULLS