如何解决如何使用触发器在数据库中两次插入相似的行?
让我解释一下。
我在表A上有一个触发器,每次在表A中插入数据或更新数据时都会执行该触发器。 触发器每次都将相同的数据复制到“日志”表B中。
现在,我请求通过相同的操作将表A中的特定行添加到该“日志” B表中,但是更改了一个字段。
此处示例:
插入或更新到表A中的数据
LEGACY_ROW_NUMBER = 1
CONTROL_STATUS = 'N'
ID = 1234
DEST_UNIT = 'ALL'
LEGACY_ROW_NUMBER = 2
CONTROL_STATUS = 'Y'
ID = 4321
DEST_UNIT = 'ALL'
然后触发一个触发器,并将此数据复制到日志表B中 触发器如下所示:
CREATE TRIGGER Trigger_A
ON table_A
AFTER UPDATE,INSERT
AS
BEGIN
SET NOCOUNT ON;
INSERT INTO table_B(
LEGACY_ROW_NUMBER,CONTROL_STATUS,ID,DEST_UNIT)
SELECT(
i.LEGACY_ROW_NUMBER,i.CONTROL_STATUS,i.ID,i.DEST_UNIT)
FROM inserted i
这很好,因为表B中的行已填充数据
要求将该行两次插入到table_B中,但是数据相同。
因此原始触发的结果是:
table_B
LEGACY_ROW_NUMBER | CONTROL_STATUS | ID | DEST_UNIT
1 | N | 1234 | ALL
1 | Y | 4321 | ALL
我需要在相同的插入/更新中实现什么;
table_B
LEGACY_ROW_NUMBER | CONTROL_STATUS | ID | DEST_UNIT
1 | N | 1234 | ALL
1 | N | 1234 | APP <-- the duplicate row with different data in the field
1 | Y | 4321 | ALL
本质上,我需要使用触发器两次将同一行添加一次,但是更改第二行中的一个字段。
我确实尝试使用2个单独的触发器,并尝试在同一个触发器中编写两个插入语句,但实际上并没有用。
如果我这样编写触发器:
CREATE TRIGGER Trigger_A
ON table_A
AFTER UPDATE,i.DEST_UNIT)
FROM inserted i
END
BEGIN
INSERT INTO table_B(
LEGACY_ROW_NUMBER,i.DEST_UNIT)
FROM inserted i
END
它可以工作,但是它复制了两行并将其“ DEST_UNIT”更改为“ APP” 像这样:
LEGACY_ROW_NUMBER | CONTROL_STATUS | ID | DEST_UNIT
1 | N | 1234 | ALL
1 | N | 1234 | APP
1 | Y | 4321 | ALL
1 | Y | 4321 | APP
但是如果我将触发器更改为此:
CREATE TRIGGER Trigger_A
ON table_A
AFTER UPDATE,i.DEST_UNIT)
FROM inserted i WHERE i.ID = '1234'
END
最后添加WHERE不会做任何事情,它只会复制原始的两行。 再次出现:
LEGACY_ROW_NUMBER | CONTROL_STATUS | ID | DEST_UNIT
1 | N | 1234 | ALL
1 | Y | 4321 | ALL
很长的代码,很抱歉,我只想提供尽可能多的信息! 感谢您的帮助!
解决方法
您可以使用cross apply
生成两行:
INSERT INTO table_B (LEGACY_ROW_NUMBER,CONTROL_STATUS,ID,DEST_UNIT)
SELECT i.LEGACY_ROW_NUMBER,i.CONTROL_STATUS,i.ID,v.DEST_UNIT
FROM inserted i CROSS APPLY
(VALUES (v.DEST_UNIT),('APP')) v(DEST_UNIT);
如果希望这是有条件的,则添加一个WHERE
子句。我可能会使用:
INSERT INTO table_B (LEGACY_ROW_NUMBER,(CASE WHEN ID = 1234 THEN 'APP' END)
) v(DEST_UNIT)
WHERE v.DEST_UNIT IS NOT NULL;
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。