1

テーブルT1でレコードが挿入または更新されたときに、これをテーブルT2にミラーリングするトリガーを作成しました(いくつかの条件に従います)。

T1 の最初のステートメント (挿入) では、トリガーがうまく機能します (T1 のすべてを T2 にコピーします)。ただし、最初のトリガーの後、トリガーは実行されなくなります (Insert または Update 句を使用)。

コード:

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

誰にも手がかりがありますか?ログを検索しましたが、何も見つかりませんでした。トリガーをデバッグする方法はありますか?

(初心者ですので、しばらくお待ちください)

Obs:解決策を見つけました。コードは正しいです。

4

2 に答える 2

2

テーブル上のデータの存在を確認するとき、問題は最初にありProgramacaoBarcasます。だから、あなたはこれをやっています:

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

条件を参照してくださいWHERE。2 つの列をそれ自体と比較しています:ProgramacaoBarcas.ViagemID = ViagemIDProgramacaoBarcas.Data = Data. したがって、基本的にはSELECTno で a を実行していますWHERE(s は何もないため、完全に真というわけではありNULLませんが、要点はわかります)。したがって、最初の実行では、テーブルは空でありINSERT、トリガーの部分に移動して、いくつかのデータを入力します。そのテーブルにデータがあるため、トリガーの他のすべての実行はトリガーのUPDATE一部になります。したがって、データを挿入したためにトリガーが呼び出された場合、そのデータは 2 番目のテーブルに挿入されず、2 番目のテーブルにない新しいデータが既に更新されている場合、トリガーは何もしていないように見えます。UPDATE存在しないデータはできません。うまくいけば、これはあなたのために物事を明確にします。

于 2013-04-24T19:18:13.130 に答える