SQL Server触发器:重复条目

时间:2015-10-14 07:56:08

标签: sql 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;

1 个答案:

答案 0 :(得分:3)

您只需从InsertedDeleted表中进行选择 - 两者之间的加入条件!

无论如何,这种不良做法自从 1992 以来已经被SQL标准弃用 - 超过20年前。停止使用此功能 - 使用正确的ANSI / ISO JOIN 语法(INNER JOINLEFT 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行