2012-03-28 70 views
1
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 [email protected] 
    end 
    insert into mytable_backup 
    select * from inserted 
end 
go 

我寫這個觸發器來檢查,同時插入如果重複seq柱,然後用同樣的seq如果seq不退出新seq插入更新上一行。ms sql server中觸發問題?

在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

我的觸發器有什麼問題嗎?

+7

與大多數SQL操作一樣,觸發器在集上操作。你們假設一次只插入一行。這並不是一個好兆頭。 – HABO 2012-03-28 12:19:23

回答

1

我認爲這個觸發器會把第一行和現有的比較。如果我理解你想做的事,你可以退出什麼容易做到這一點:

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 

編輯

於是我發現了事情的原委。如果您一次插入所有行,則inserted包含所有行。對不起,我的錯誤。如果數據中有重複,則示例不會顯示要選擇的內容。我選擇了年齡最大者(不知道你的要求是什麼)。下面是測試數據的完整的例子

表結構

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

觸發

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 
+0

我試過這個不行。 – 2012-03-28 12:09:28

+0

好的。問題是什麼? – Arion 2012-03-28 12:10:34

+0

仍將所有行從'mytable'變爲'mytable_backup' – 2012-03-28 12:12:42

1

你原來的代碼有兩個缺陷:

  1. 它假定只有一條記錄被插入的時間。

  2. 您插入mytable_backup發生在if條件之外。該插入將每次執行。