2013-04-24 127 views
1

我創建了一個觸發器,當在表T1中插入或更新記錄時,他在表T2中反映了這一點(遵循一些條件)。觸發只能工作一次/調試

在T1的第一條語句(插入)中,觸發器工作正常(將T1中的所有內容複製到T2)。但是在第一個之後,觸發器將不再運行(使用插入或更新子句)。

代碼:

ALTER TRIGGER [dbo].[Replicacao] 
    ON [dbo].[ImportacaoXML] 
    AFTER UPDATE, INSERT 
AS 
BEGIN 
    IF EXISTS (SELECT ProgramacaoBarcas.ViagemID, ProgramacaoBarcas.Data 
       FROM ProgramacaoBarcas, inserted 
       WHERE ProgramacaoBarcas.ViagemID = inserted.ViagemID 
       AND ProgramacaoBarcas.Data = inserted.Data)   
    BEGIN 
     UPDATE ProgramacaoBarcas 
     SET ViagemID = inserted.ViagemID, Data = inserted.Data, 
      Extra = inserted.Extra, Modalidade = inserted.Modalidade, 
      FleetID = inserted.FleetID, Partida = inserted.Partida, 
      Chegada = inserted.Chegada, Capacidade = inserted.Capacidade, 
      LocationID = inserted.LocationID, DestinoID = inserted.DestinoID, 
      CodLinha = inserted.CodLinha 
     FROM inserted 
     WHERE ProgramacaoBarcas.ViagemID = inserted.ViagemID 
     AND ProgramacaoBarcas.Data = inserted.Data 
     AND ProgramacaoBarcas.Bloqueada = 0 
    END 
    ELSE 
    BEGIN 
     INSERT INTO ProgramacaoBarcas (ViagemID, Data, Extra, Modalidade, FleetID, Partida, Chegada, Capacidade, LocationID, DestinoID, CodLinha, Bloqueada) 
     SELECT 
      ViagemID, Data, Extra, Modalidade, FleetID, Partida, Chegada, 
      Capacidade, LocationID, DestinoID, CodLinha, 0 
     FROM inserted  
    END 
END 

任何人有任何線索?我搜索了日誌,但什麼都沒發現。有什麼方法可以調試觸發器嗎?

(新手在這裏,請耐心等待)

觀測數據:我找到了解決辦法。代碼現在是正確的。

+0

會發生什麼同步兩個表,如果在T1表中刪除記錄? – 2013-04-24 19:50:13

+0

什麼都沒有。現在它「不重要」。 – Juliano 2013-04-24 19:59:14

回答

2

好的,你的問題在開始的時候是正確的,當你檢查ProgramacaoBarcas表上的數據是否存在。所以,你這樣做是:

IF EXISTS (SELECT ProgramacaoBarcas.ViagemID, ProgramacaoBarcas.Data 
      FROM ProgramacaoBarcas 
      WHERE ProgramacaoBarcas.ViagemID = ViagemID 
      AND ProgramacaoBarcas.Data = Data)  

WHERE條件?您比較兩列用自己:ProgramacaoBarcas.ViagemID = ViagemIDProgramacaoBarcas.Data = Data。所以基本上你在做SELECT而沒有WHERE(不完全正確,因爲NULL等於沒有,但你明白了)。因此,在第一次執行時,表格是空的,然後轉到觸發器的INSERT部分,然後填充一些數據。由於現在有該表上的數據,因此觸發器的所有其他執行都是觸發器的UPDATE部分。因此,如果觸發器因爲插入數據而被調用,那麼這些數據將不會被插入到第二個表中,並且如果不在第二個表上的新數據已經被更新,觸發器看起來似乎沒有任何作用,因爲它不能存在UPDATE數據。希望這可以爲你澄清事情。

+0

我雖然在這個語句中使用了_ViagemID_,例如,「ProgramacaoBarcas.ViagemID = ViagemID」將來自表'ImportacaoXML.ViagemID',而不是來自'ProgramacaoBarcas'。但是,如果我編寫'ProgramacaoBarcas.Data = ImportacaoXML.Data',SQL會給我_「多部分標識符ImportacaoXML.ViagemID無法關聯」_。我怎樣才能實現這種比較?我只需要檢查,如果存在'ProgramacaoBarcas',更新,如果沒有,插入'ProgramacaoBarcas' – Juliano 2013-04-24 19:38:50

+0

@Juliano你沒有在該語句中使用任何其他表。看到'FROM ProgramacaoBarcas',爲什麼觸發器會認爲'ViagemID'應該來自'ImportacaoXML'表?而且,由於您沒有使用任何其他表格,因此您無法說'ImportacaoXML.ViagemID',因爲它沒有在您的查詢中定義。你應該在那裏使用'JOIN'。但是,實際上,當更新或插入多條記錄時,應該將您的邏輯更改爲帳戶。 – Lamak 2013-04-24 19:43:45

+0

我明白了。在where語句中,我使用插入的表更改了要比較的地方。所以,'ProgramacaoBarcas.ViagemID = inserted.ViagemID'。謝謝@拉馬克。 – Juliano 2013-04-24 20:20:56

2

您可以通過使用MERGE聲明

CREATE TRIGGER [dbo].[Replicacao] ON [dbo].[ImportacaoXML] 
FOR UPDATE, INSERT 
AS 
BEGIN 
    MERGE ProgramacaoBarcas AS target 
    USING inserted AS source 
    ON target.ViagemID = source.ViagemID 
     AND target.Data = source.Data  
    WHEN MATCHED AND ProgramacaoBarcas.Bloqueada = 0 THEN 
    UPDATE SET ViagemID = source.ViagemID, Data = source.Data, 
       Extra = source.Extra, Modalidade = source.Modalidade, 
       FleetID = source.FleetID, Partida = source.Partida, 
       Chegada = source.Chegada, Capacidade = source.Capacidade, 
       LocationID = source.LocationID, DestinoID = source.DestinoID, 
       CodLinha = source.CodLinha 
    WHEN NOT MATCHED THEN 
    INSERT (ViagemID, Data, Extra, Modalidade, FleetID, Partida, 
      Chegada, Capacidade, LocationID, DestinoID, CodLinha, Bloqueada) 
    VALUES (
      ViagemID,Data, Extra, Modalidade, FleetID, Partida, 
      Chegada, Capacidade, LocationID, DestinoID, CodLinha, 0); 
END