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条件了吗?,您正在将两列与自己进行比较:ProgramacaoBarcas.ViagemID = ViagemIDProgramacaoBarcas.Data = Data. 所以基本上你是在做一个SELECT没有WHERE(不完全正确,因为NULLs 等于没有,但你明白了)。因此,在您第一次执行时,表是空的,然后转到INSERT触发器的部分,并填充一些数据。由于现在该表上有数据,因此触发器的所有其他执行都属于触发器的UPDATE一部分。因此,如果触发器因为您插入数据而被调用,则该数据不会被插入到第二个表中,并且如果不在第二个表中的新数据已经更新,则触发器似乎什么都不做,因为它不能UPDATE提供不存在的数据。希望这可以为您澄清事情。

于 2013-04-24T19:18:13.130 回答
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
于 2013-04-24T22:38:11.543 回答