0

トリガーがオンに設定されているテーブルEmployeeSalaryHistoryの更新時に、監査履歴テーブル ( ) に新しいレコードを挿入することになっているトリガーがあります。Employees

テーブル内のすべての行が更新される場所で実行すると、更新される行の数よりも多くの回数トリガーが呼び出されますUPDATEEmployees

たとえば、Employeesテーブルに3 つの行がある場合、 INSERT9 回発生します。

/*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 2 乗」を取得しました。ここで、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 に答える