我创建了一个触发器,当在表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:我找到了解决方案。代码现在是正确的。
答案 0 :(得分:2)
好的,当你检查ProgramacaoBarcas
表上是否存在数据时,问题就在一开始就是正确的。所以,你这样做:
IF EXISTS (SELECT ProgramacaoBarcas.ViagemID, ProgramacaoBarcas.Data
FROM ProgramacaoBarcas
WHERE ProgramacaoBarcas.ViagemID = ViagemID
AND ProgramacaoBarcas.Data = Data)
查看WHERE
条件?,您要将两列与自己进行比较:ProgramacaoBarcas.ViagemID = ViagemID
和ProgramacaoBarcas.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