2009-12-03 68 views
1

我需要根據tableB中的插入更新我的tableA。我創建了一個觸發器,當一行被插入tableB時觸發,並簡單地將它複製到tableA(這正是我想要的)。但是,當我更新tableB中的現有記錄時,問題就出現了,tableA中的行已經存在,並且具有相同的主鍵。用觸發器更新多個表 - SQL Server

要處理它,我試圖刪除tableA中的主鍵與更新的行相匹配的現有行,然後插入「插入」表中的行。但是,tsql根本不讓我從觸發器中刪除我,並給出了一個錯誤,指出「多部分標識符」INSERTED.Id「無法綁定」。

這裏就是我試圖完成代碼明智:

delete from dbo.CurrentItems where dbo.CurrentItems.CurrentItemId = INSERTED.Id 
INSERT INTO CurrentItems 
SELECT * FROM INSERTED 
WHERE IsActive = 1 

任何想法的傢伙?

回答

3

在DELETE FROM語句,你要插入的假表添加到你的工作(在FROM子句)的表,像這樣:

DELETE dbo.CurrentItems 
    FROM dbo.CurrentItems 
    , INSERTED 
WHERE dbo.CurrentItems.CurrentItemId = INSERTED.Id 

INSERT INTO CurrentItems 
SELECT * FROM INSERTED 
WHERE IsActive = 1 

或者,你可以使用INNER JOIN:

DELETE dbo.CurrentItems 
    FROM dbo.CurrentItems CI 
     INNER JOIN INSERTED I ON CI.CurrentItemId = I.Id 
+0

非常感謝................ – Xience 2009-12-03 17:44:06

+1

獨立觸發 - 一個用於插入,一個更新(和怎麼樣刪除?) - 可能會表現更好。 – 2009-12-03 17:51:50

+0

@Ifanfan:不客氣。 @Phillip Kelley,我不能不同意你的意見,但現在這就是海報的要求。他想知道爲什麼他的DELETE聲明不起作用。 – 2009-12-03 18:50:33

3

爲什麼在TableB中的行更新時,爲什麼不能簡單地更新TableA中的現有行? UPDATE而不是DELETE/INSERT。

你可以有一個AFTER INSERT觸發器這確實你現在想要什麼,再加上一個AFTER UPDATE觸發器這將是更新TableA中的行(而不是插入新的)。

0

你說你有一個觸發器,當「一行插入到tableB」時觸發。所以你有觸發器來觸發插入。這聽起來像你也有觸發器觸發更新以及。你是否想讓觸發器觸發更新?如果沒有,請從觸發器定義中刪除「更新」。

蘭迪