проблема с триггером в MS SQL Server? - PullRequest
1 голос
/ 28 марта 2012
IF EXISTS (SELECT name FROM sysobjects WHERE name = 'myTrigger' AND type = 'TR')
BEGIN
    DROP TRIGGER myTrigger
END
GO
go
create trigger myTrigger
on mytable_backup
instead of insert
as
begin
  declare @seq int
  select @seq = seq from inserted 
  if exists (select * from mytable_backup where seq= @seq) begin
      delete from mytable_backup where seq=@seq
  end
  insert into mytable_backup
  select * from inserted
end
go

Я написал этот триггер для проверки, вставляя, если столбец seq повторяется, затем обновите предыдущую строку с тем же seq, если seq не выходит, вставьте его с новым seq.

В пакете ssis я использую таблицу OLEDB (Mytable) в качестве источника, который содержит.

Name,Age,Seq
Gauraw,30,1
Gauraw,31,1
Kiran,28,3
Kiran,29,3
kiran,28,3
Venkatesh,,4
Venkatesh,28,4

Теперь я загружаю эту таблицу в пункт назначения OLEDB (Mytable_backup) какместо назначения.Я предполагаю получить вывод как.

Gauraw,31,1
kiran,28,3
Venkatesh,28,4

Но я получаю все записи из Mytable в Mytable_backup.

что-то не так с моим триггером?

Ответы [ 2 ]

1 голос
/ 28 марта 2012

Ваш исходный код имеет два недостатка:

  1. Предполагается, что одновременно вставляется только одна запись.

  2. Ваша вставка в mytable_backup происходит вне условия if. Эта вставка будет выполняться каждый раз.

1 голос
/ 28 марта 2012

Я думаю, что этот триггер просто возьмет первый ряд и сравнит его с существующим. Если я понимаю, что вы хотите сделать, вы можете легко бросить:

IF EXISTS (SELECT name FROM sysobjects WHERE name = 'myTrigger' AND type = 'TR')
BEGIN
    DROP TRIGGER myTrigger
END
GO
go
create trigger myTrigger
on mytable_backup
instead of insert
as
begin
insert into mytable_backup
select 
    * 
from 
    inserted
WHERE NOT EXISTS
    (
        SELECT
            NULL
        FROM
            mytable_backup AS mytable
        WHERE
            inserted.seq=mytable.seq
    )
end
go

EDIT

Итак, я узнал, что происходит. Если вы вставляете все строки за один раз, inserted содержит все строки. Извините, моя ошибка. Если в ваших данных есть дубликаты, ваш пример не показывает, какой из них выбрать. Я выбрал ту, которая имеет максимальный возраст (не знаю, каковы ваши требования). Вот обновление с полным примером

Структура таблицы

CREATE TABLE mytable_backup
(
    Name VARCHAR(100),
    Age INT,
    Seq INT
)
GO

Trigger

create trigger myTrigger
on mytable_backup
instead of insert
as
begin
;WITH CTE
AS
(
    SELECT
        ROW_NUMBER() OVER(PARTITION BY inserted.Seq ORDER BY Age) AS RowNbr,
        inserted.*
    FROM
        inserted
    WHERE NOT EXISTS
    (
        SELECT
            NULL
        FROM
            mytable_backup
        WHERE
            mytable_backup.Seq=inserted.Seq
    )
)
insert into mytable_backup(Age,Name,Seq)
SELECT
    CTE.Age,
    CTE.Name,
    cte.Seq
FROM
    CTE
WHERE
    CTE.RowNbr=1
end
GO

Вставка данных испытаний

INSERT INTO mytable_backup
VALUES
    ('Gauraw',30,1),
    ('Gauraw',31,1),
    ('Kiran',28,3),
    ('Kiran',29,3),
    ('kiran',28,3),
    ('Venkatesh',20,4),
    ('Venkatesh',28,4)

SELECT * FROM mytable_backup

Удаление объектов базы данных

DROP TRIGGER myTrigger
DROP TABLE mytable_backup
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...