SQL Server 触发器:更新查询新旧数据

Posted

技术标签:

【中文标题】SQL Server 触发器:更新查询新旧数据【英文标题】:SQL Server trigger : update query new vs old data 【发布时间】:2016-02-12 12:58:17 【问题描述】:

我有两张桌子。其中一个有员工信息。另一个我想根据这个员工表添加记录。

我想要发生的是,每当对员工表进行工资调整(通过 UDPATE 查询)时,额外的表将添加一行,其中包含新的事件 ID 和调整工资的金额(所以如果5个人的工资增加了1000英镑,那么该行将调整为5000英镑)。

我已经创建了触发器,它会在每次更新时添加行。然而,它没有做的只是带来额外的薪水。我想不出该怎么做。到目前为止我有这个代码;

Create trigger Salaryupdate
On TBL_Employees 
For update
As
    Insert TBL_audit (notes,Delta,AdjDate)
        Select 'Salary update', sum(salary), getdate()
        From TBL_Employees 

我知道sum 位是错误的,因为我只想要工资值的变化,而不是总和。

如何找到更改的行(或其他方法)的新旧值之间的差异?

我使用的是 SQL Server 2008。

【问题讨论】:

【参考方案1】:

您应该在触发器中使用deletedinserted 表。所以,我认为:

Create trigger Salaryupdate
On TBL_Employees 
For update
As
    Insert TBL_audit(notes, Delta, AdjDate)
        Select 'Salary update',
               coalesce(newsalary, 0) - coalesce(oldsalary, 0),
               getdate()
        From (select sum(salary) as newsalary from inserted) i cross join
             (select sum(salary) as oldsalary from deleted) d;

此外,在 SQL Server 中,您可以将 AdjDate 设置为默认值 getdate() - 这样,当您插入另一行时,数据库会负责设置该值。

【讨论】:

以上是关于SQL Server 触发器:更新查询新旧数据的主要内容,如果未能解决你的问题,请参考以下文章

使用 MSSQL 中的触发器跟踪和存储新旧值

sql 检测更新触发器中修改的字段(sql server 2005)?

插入后使用触发器更新多行(sql server)

SQL Server 触发器:子查询返回超过 1 个值

sql server 数据库里设置了当插入数据时,便触发器插入更新时间,但我导入数据时,触发器却没有工作。

更新触发器 SQL Server 2008