2015-10-14 2 views
1

У меня есть следующие две таблицы:SQL триггер сервера: Дубликат запись

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

Вы просто выбрать из обеих таблиц Inserted и Deleted - с не присоединитесь состояние между ними!

Это плохая практика в любом случае и устарела со стандарта SQL с - более 20 лет назад. Прекратите использовать это - используйте правильный ANSI/ISO JOIN синтаксис (INNER JOIN, LEFT OUTER JOIN) с условием объединения.

Вам необходимо определить, с чем они соединены - обычно первичный ключ таблицы (что я не вижу, что действительно представляет собой ПК в вашем случае).

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