Sql server 触发表更新触发器的时间超过更新的行数

Sql server 触发表更新触发器的时间超过更新的行数,sql-server,triggers,sql-server-2012-express,Sql Server,Triggers,Sql Server 2012 Express,我有一个触发器,它应该在更新触发器设置为打开的EmployeesSalaryHistory表时,将一条新记录插入审计历史记录表EmployeesSalaryHistory 如果我对更新表中所有行的员工执行更新,则调用触发器的次数将超过正在更新的行数 e、 g.如果Employees表中有三行,则插入将发生9次 /*This UPDATE will cause the trigger to fire more than the number of rows in the Employees tab

我有一个触发器,它应该在更新触发器设置为打开的EmployeesSalaryHistory表时,将一条新记录插入审计历史记录表EmployeesSalaryHistory

如果我对更新表中所有行的员工执行更新,则调用触发器的次数将超过正在更新的行数

e、 g.如果Employees表中有三行,则插入将发生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 */

将有x行,而不是x平方行……

可能会将您的解决方案……作为原始帖子的附加编辑发布……这样其他人就可以看到您最终做了什么。保持原始文本的机智,以便清楚地看到原始问题。交叉连接是问题所在。
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