活泼的棒棒糖 · 我院与国际传媒教育学院赴北京工业大学北京-都 ...· 1 月前 · |
飘逸的鞭炮 · 购买 MacBook Pro - 教育 - ...· 1 月前 · |
腹黑的足球 · PS Beta ...· 5 月前 · |
谦逊的墨镜 · 新能源汽车出海,狂卷欧洲东南亚 ...· 1 年前 · |
飘逸的煎饼果子 · 怀孕三个月�%8 - 搜狗图片搜索· 1 年前 · |
我目前正在创建一个SQL Server触发器,在更新之后,它应该填充一个更改日志,其中包含所做的任何工资更改,以及由哪个用户进行的更改。
我创建的应该接收更新的changelog表可以在这里看到:
CREATE TABLE ChangeLog
ChangeID int identity(1,1) primary key,
EmpID int,
[User] nvarchar(30),
[Date] smalldatetime,
OldRate money,
NewRate money
)
据我所知,table一切正常,但是当我开始创建触发器时,我开始收到一些错误(以及大量的混乱)。我已经尝试了几种触发器的方法,用新行更新不同的表,据我所知,它的结构是正确的,但是我不确定我是如何弄乱了内容的。
CREATE TRIGGER payrate_change ON Employees FOR UPDATE
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给了我一个不正确的语法错误:
CREATE TRIGGER payrate_change ON Employees FOR UPDATE
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
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
发布于 2013-02-19 08:12:34
Ommit identity列,它将自动填充
您的触发器不处理多行更新,请看一下 Best Practice: Coding SQL Server triggers for multi-row operations
你可以连接删除的和插入的伪表,我假设EmployeeID是关键字?
尝尝这个
CREATE TRIGGER payrate_change ON Employees FOR UPDATE
If UPDATE (PayRate)
BEGIN
INSERT INTO [dbo].[ChangeLog]
(EmpID, [User], [Date], OldRate, NewRate)
select
i.EmployeeID,
SUSER_SNAME(),
飘逸的煎饼果子 · 怀孕三个月�%8 - 搜狗图片搜索 1 年前 |