繁体   English   中英

触发表更新时触发的次数超过了更新的行数

[英]Trigger on table update is firing for more than the number of rows updated

我有一个触发器,应该在更新Employees表并将触发器设置为ON时将新记录插入审核历史记录表( EmployeeSalaryHistory )中。

如果我对Employees执行UPDATE ,其中表中的所有行均已更新,则调用触发器的次数要比正在更新的行数多。

例如,如果Employees表中有三行,则INSERT发生9次。

/*This UPDATE will cause the trigger to fire more than the number of rows in the Employees table.*/
UPDATE Employees SET Salary = Salary * 2 

/* supposed to be fired whenever the salary of an employee is updated */
CREATE TRIGGER [dbo].[EmployeesUpdateSalary] ON [dbo].[Employees]
AFTER UPDATE
NOT FOR REPLICATION
AS
BEGIN

INSERT INTO EmployeeSalaryHistory(EmployeeID, NewSalary, OldSalary)
SELECT I.EmployeeID, I.Salary, D.Salary
From inserted I, deleted D
WHERE I.Salary <> D.Salary

END

本质上,此查询具有“交叉联接”

inserted I, deleted D

3 x 3

请注意,如果我运行此查询...

Use Northwind
GO

Select * from
[dbo].[Categories] c1 , [dbo].[Categories] c2

我得到“ x平方”作为返回的行数,其中x是[dbo]。[Categories]表中的行数。

编辑

尝试这个

INSERT INTO EmployeeSalaryHistory(EmployeeID, NewSalary, OldSalary)
SELECT I.EmployeeID, I.Salary, D.Salary
From inserted I, deleted D
where I.EmployeeID = D.EmployeeID /* relationship */
and
I.Salary <> D.Salary /* filter */

要么

INSERT INTO EmployeeSalaryHistory(EmployeeID, NewSalary, OldSalary)
SELECT I.EmployeeID, I.Salary, D.Salary
From inserted I join deleted D on I.EmployeeID = D.EmployeeID /* relationship */
Where
I.Salary <> D.Salary /* filter */

让我们回到通用示例:

    Use Northwind
    GO
Select * from
[dbo].[Categories] c1 , [dbo].[Categories] c2
Where c1.CategoryID = c2.CategoryID

将具有“ x行”,而不是“ x平方行” ......

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM