首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >SQL Server Changelog创建、标识语法和无效的COlumns

SQL Server Changelog创建、标识语法和无效的COlumns
EN

Stack Overflow用户
提问于 2013-02-19 08:08:03
回答 1查看 327关注 0票数 1

我目前正在创建一个SQL Server触发器,在更新之后,它应该填充一个更改日志,其中包含所做的任何工资更改,以及由哪个用户进行的更改。

我创建的应该接收更新的changelog表可以在这里看到:

代码语言:javascript
运行
复制
CREATE TABLE ChangeLog
(
ChangeID int identity(1,1) primary key,
EmpID int,
[User] nvarchar(30),
[Date] smalldatetime,
OldRate money,
NewRate money
)

据我所知,table一切正常,但是当我开始创建触发器时,我开始收到一些错误(以及大量的混乱)。我已经尝试了几种触发器的方法,用新行更新不同的表,据我所知,它的结构是正确的,但是我不确定我是如何弄乱了内容的。

代码语言:javascript
运行
复制
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语句的values部分,尽管我在创建表时使用了完全相同的方式,但identity声称语法不正确。

有没有人知道这个触发器的问题是什么?我们将非常感谢您的任何意见。

编辑:

在下面建议的更改之后,我将ChangeID (主键)重新添加到触发器,但是现在IDENTITY给了我一个不正确的语法错误:

代码语言:javascript
运行
复制
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:为感兴趣的人添加最终结果:

代码语言:javascript
运行
复制
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
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2013-02-19 08:12:34

Ommit identity列,它将自动填充

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

你可以连接删除的和插入的伪表,我假设EmployeeID是关键字?

尝尝这个

代码语言:javascript
运行
复制
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
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/14947617

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档