2013-07-16 114 views
0

我有一个触发器应该在更新Employees表时将新记录插入审计历史记录表(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 
+0

也许发布您的解决方案......作为*附加编辑*到您的原始文章.......所以其他人可以看到你最终做了什么。保持您的原始文本“完整”,以便清楚地看到原始问题。 – granadaCoder

回答

1

你基本上有一个 “交叉联接” 与此查询

inserted I, deleted D 

3×3

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

Use Northwind 
GO 

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

我得到“x squared”作为返回的行数,其中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平方行”......

+0

交叉连接是问题所在。 – user2425056