2014-04-14 56 views
0

我創建了一個觸發如下:觸發防止柱被更新

CREATE TRIGGER InsertUpdateATLastViewedMatch 
    ON dbo.AT_LastViewedMatch 
    FOR INSERT,UPDATE 
AS 
BEGIN 
    SET NOCOUNT ON; 

    -- update statements for trigger here 

    declare @id1 int, @matchFK int; 

    select @id1 = i.id from inserted i; 
    select @matchFK=i.AT_MatchFk from inserted i; 
    update dbo.AT_LastViewedMatch set matchId = @matchFK where id = @id1; 

END 
GO 

雖然這觸發工程─我不能夠直接從SQLManager更新matchId列的值:

如果我執行

UPDATE AT_LastViewedMatch set matchId='1179619' where id=5762 

例如,我仍然看到matchId的舊值。我認爲這個問題與上面的觸發器有關(因爲如果我放棄觸發器,它會起作用)。有沒有辦法讓這個過去?

+0

您是否希望能夠更新該值?當SSMS是客戶端時,您不能運行觸發器*僅* * – Blorgbeard

+0

您的**主要缺陷**是您似乎認爲觸發器每行調用**一次** - 這是** NOT ** SQL Server的情況。如果您的INSERT或UPDATE影響多行,則觸發器將在每個語句**中調用一次**,並且僞表「Inserted」和「Deleted」可以包含多行。那麼當你從插入的i中選擇@ id1 = i.id時,你選擇了哪些行?它沒有被定義 - 你得到**一個,任意**行和所有其他被忽略....你需要重新編寫你的觸發器來處理**多行**在'插入'和'刪除'! –

+0

感謝您的回答。我修復了觸發器以解決更新的多行問題。 實際上,我只是希望在更新AT_matchFk列而不是matchId列時激發觸發器。 同時,我想更新獨立於AT_matchFk列的matchId列(我不希望觸發器觸發)。這是可能的 –

回答

0

從下面的觸發器定義,你已經創造了它的insert and update

CREATE TRIGGER InsertUpdateATLastViewedMatch 
    ON dbo.AT_LastViewedMatch 
    FOR INSERT,UPDATE <-- Here 

所以基本上,只要您運行從SSMS

UPDATE AT_LastViewedMatch set matchId='1179619' where id=5762 

更新語句,您的觸發執行下面的線和設置它到舊值

update dbo.AT_LastViewedMatch set matchId = @matchFK where id = @id1; 

你需要t o從您的觸發定義中刪除update

CREATE TRIGGER InsertUpdateATLastViewedMatch 
    ON dbo.AT_LastViewedMatch 
    FOR INSERT 
+0

感謝您的答案。首先,我改變了我的觸發如下考慮觸發器被稱爲多timesCREATE TRIGGER InsertUpdateATLastViewedMatchBulk \t ON dbo.AT_LastViewedMatch \t FOR INSERT,UPDATE AS BEGIN SET NOCOUNT ON; 更新AT_LastViewedMatch 組matchId = inserted.matchFK 從插入 內部聯接AT_LastViewedMatch上AT_LastViewedMatch.id = inserted.id END GO –

相關問題