2012-05-09 54 views
1

我有一個觸發器,它是如下:TSQL觸發行爲異常

ALTER TRIGGER [trigger_CATEGORY_VALUE_ID] ON [dbo].[tblA] 
FOR UPDATE 
AS 
SET NOCOUNT ON 
IF (UPDATE([CATEGORY_VALUE_ID])) 
BEGIN 
    INSERT INTO [dbo].[htblB] 
    (ID 
    , CATEGORY_VALUE_ID 
    , STATUS_END_DATE 
    , STATUS_END_DATE_SOURCE) 
    SELECT 
    t.ID 
    , t.CATEGORY_VALUE_ID 
    , GETDATE() 
    , t.UPDATE_SOURCE 
    FROM [dbo].[tblCAPITATION] t 
    INNER JOIN inserted ins 
    ON t.CATEGORY_VALUE_ID = ins.CATEGORY_VALUE_ID 
END 

它所需要做的是在htblB插入新行,當列CATEGORY_VALUE_ID被更新。如果只更新一行,它工作正常。但是如果它有多個行更新,那麼將2個更新的行數更新的行插入到htblB中。

UPDATE dbo.tblCAPITATION 
SET CAPITATION_STATUS_CATEGORY_VALUE_ID = '80574', UPDATE_SOURCE = 'TEST3' 
WHERE CAPITATION_ID = 2 OR CAPITATION_ID = 3 

本聲明將插入4個新行htblB而不是2

可能請你能夠解釋爲什麼這是hapening以及如何防止它一些輕?

謝謝!

回答

2

我要去假設ID是主鍵,如果是這樣,那麼你應該能夠加盟插在ID不category_value_id

ALTER TRIGGER [trigger_CATEGORY_VALUE_ID] ON [dbo].[tblA] 
FOR UPDATE 
AS 
SET NOCOUNT ON 
IF (UPDATE([CATEGORY_VALUE_ID])) 
BEGIN 
    INSERT INTO [dbo].[htblB] 
    (ID 
    , CATEGORY_VALUE_ID 
    , STATUS_END_DATE 
    , STATUS_END_DATE_SOURCE) 
    SELECT 
    t.ID 
    , t.CATEGORY_VALUE_ID 
    , GETDATE() 
    , t.UPDATE_SOURCE 
    FROM [dbo].[tblCAPITATION] t 
    INNER JOIN inserted ins 
    ON t.ID = ins.ID 
END 
+0

可以請你幫我明白了,爲什麼這個工作? 謝謝! – OBL

+0

我想我明白了。因爲兩者的值相同。我愚蠢。 – OBL

+0

插入的表格爲您提供剛剛更新的行,您需要將它們連接回基表。你可以在主鍵上進行連接,否則你將看不到正確的行。您取得了在category_value_id上​​匹配的所有行的組合 – Gratzy