2016-03-02 62 views
0

我試圖在'CabecDoc'表中創建一個觸發器,以便它向'測試'表(該字段是'Artigo')添加一個字段。SQL Management Studio中的觸發器不能正常工作

我認爲這個觸發器會做的伎倆,但它不!它什麼也沒做!它不會在我的'Test'表上創建任何記錄。你能幫我嗎?

USE [PRICLONEPRJ] 
GO 
SET ANSI_NULLS ON 
GO 
SET QUOTED_IDENTIFIER ON 
GO 

CREATE TRIGGER [dbo].[CriarContrato] 
    ON [dbo].[CabecDoc] 
    AFTER INSERT 
AS 
BEGIN 
    -- SET NOCOUNT ON added to prevent extra result sets from 
    -- interfering with SELECT statements. 
    set ansi_warnings on 
    set ansi_nulls on 
    SET NOCOUNT ON; 

    INSERT INTO Test (Artigo) 
    select LinhasDoc.Artigo 
    from inserted INNER JOIN 
        LinhasDoc ON inserted.Id = LinhasDoc.IdCabecDoc 

END 
+0

JOIN可能與'LinhasDoc'的任何行不匹配? – Lucero

+0

我不這麼認爲。我做了一個簡單的測試,在其中創建了一個包含單個記錄的表,以模擬「插入」表應該包含的內容,然後在查詢窗口中測試了這些代碼,它似乎可行。結果是一個單一的值...有沒有什麼辦法可以在SMSS中調試此代碼? –

回答

2

有什麼辦法來調試中SMSS這個代碼?

嘗試插入該行

EXEC xp_logevent 60000, 'CriarContrato works', informational; 

在觸發體的開頭。然後你會看到這篇日誌在SSMS - 對象資源管理器 - 管理 - SQL服務器日誌 - 當前

如果一切正常,你可以插入後補充一點:

declare @log varchar(2048) = CONCAT('CriarContrato inserted ', @@ROWCOUNT, ' rows'); 
EXEC xp_logevent 60000, @log, informational; 

或別的東西。

+0

謝謝!它確實有效......我確實得到了「CriarContrato作品」的消息......很高興知道!我現在想知道......因爲我需要從另一個表(LinhasDoc)獲取信息,這不是我爲(CabecDoc)創建記錄的表,有可能在觸發器觸發時,LinhasDoc表尚未更新? –

+0

@Rui Barreiros - 是否有可能在觸發器觸發時LinhasDoc表尚未更新? 是的,當然。在CabecDoc中插入你的代碼並更新LinhasDoc –

+0

謝謝Ruslan K.!當我嘗試更新觸發器時,我在'+'消息附近收到錯誤的語法...我是否在錯誤的位置添加了此語句?我把它放在END –