2015-10-14 100 views
1

我有以下兩個表:SQL Server的觸發器:重複條目

CREATE TABLE dbo.ExampleForTrig 
(
    var1 int NOT NULL, 
    var2 varchar(255) NOT NULL, 
    var3 varchar(255) NOT NULL, 
    var4 decimal(12,2) NOT NULL, 
); 

CREATE TABLE dbo.amended 
(
    var1 int NOT NULL, 
    var2 varchar(255) NOT NULL, 
    var3 varchar(255) NOT NULL, 
    var4 decimal(12,2) NOT NULL, 
    vara int NOT NULL, 
    varb varchar(255) NOT NULL, 
    varc varchar(255) NOT NULL, 
    vard decimal(12,2) NOT NULL, 
); 

與前一些隨機信息。

INSERT INTO dbo.ExampleForTrig (var1, var2, var3, var4) 
VALUES ('9', 'Geoff', 'D', '11.23'); 
INSERT INTO dbo.ExampleForTrig (var1, var2, var3, var4) 
VALUES ('9', 'Bill', 'E', '11.23'); 
INSERT INTO dbo.ExampleForTrig (var1, var2, var3, var4) 
VALUES ('9', 'John', 'H', '11.23'); 

第一個表有一個AFTER UPDATE觸發入射沿着新的信息到表dbo.amended經修正的信息。

但是,在觸發器內,存在重複條目的問題。

有時,對於一次更新,觸發器將使用兩個相同的條目填充dbo.amended。我需要幫助確定錯誤。

CREATE TRIGGER dbo.my_trig 
ON dbo.ExampleForTrig 
AFTER UPDATE 
AS 
BEGIN 
    SET NOCOUNT ON; 

    INSERT INTO dbo.amended (var1, var2, var3, var4, vara, varb, varc, vard) 
     SELECT 
      del.var1, del.var2, del.var3, del.var4, 
      ins.var1, ins.var2, ins.var3, ins.var4 
     FROM 
      (SELECT 
       var1, var2, var3, var4 
      FROM 
       deleted) AS del, 
      (SELECT 
       var1, var2, var3, var4 
      FROM 
       inserted) AS ins; 
END; 

回答

3

你只是從兩個InsertedDeleted表中選擇 - 與沒有 JOIN兩者之間的條件!

無論如何這都是不好的做法,並且從SQL標準已經廢棄,因爲 - 超過20年前。停止使用 - 使用正確的ANSI/ISO JOIN語法(INNER JOIN,LEFT OUTER JOIN)而不是連接條件。

您需要定義他們加入的內容 - 通常是主鍵(我沒有看到您的案例中真正的PK是什麼)。

INSERT INTO dbo.amended (var1, var2, var3, var4, vara, varb, varc, vard) 
    SELECT 
     del.var1, del.var2, del.var3, del.var4, 
     ins.var1, ins.var2, ins.var3, ins.var4 
    FROM 
     inserted AS ins 
    INNER JOIN 
     deleted AS del ON ins.PrimaryKey = del.PrimaryKey; 

否則,你要創建從Inserted表從Deleted表的每一行結合各行的笛卡爾積。如果你更新了3行,你會得到9行插入!

+0

謝謝你的幫助。非常感激。 – AMorton1989