0

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

如果我UPDATEEmployees表中所有行的更新位置进行操作,则触发器被调用的次数多于正在更新的行数。

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
4

1 回答 1

1

你基本上有这个查询的“交叉连接”

inserted I, deleted D

3×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 平方行”......

于 2013-07-16T19:06:11.767 回答