触发仅工作一次/调试

时间:2013-04-24 19:02:34

标签: sql sql-server-2012

我创建了一个触发器,当在表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:我找到了解决方案。代码现在是正确的。

2 个答案:

答案 0 :(得分: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 s等于什么都没有,但你明白了。)因此,在第一次执行时,表格为空,然后转到触发器的INSERT部分,并填充一些数据。由于现在该表上有数据,触发器的所有其他执行都会触发您的UPDATE部分。因此,如果因为您插入数据而调用触发器,那么该数据将不会插入到第二个表中,并且如果第二个表上没有的新数据已经更新,那么触发器看起来似乎没有做任何事情。它不能UPDATE不存在的数据。希望这能为你澄清一些事情。

答案 1 :(得分: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