我有 2 张桌子说 A1 和 A2。当我在表 A1 中插入新记录时,我想以这种方式为插入、更新和删除创建触发器,相同的记录应该插入 A2 中,
当我更新或删除 A1 表时也会发生同样的情况。
我有 2 张桌子说 A1 和 A2。当我在表 A1 中插入新记录时,我想以这种方式为插入、更新和删除创建触发器,相同的记录应该插入 A2 中,
当我更新或删除 A1 表时也会发生同样的情况。
我将向您展示一种在 SQL Server 2000 或 2005 中检查这一点的简单方法,但总的来说,我同意 Remus 的观点,即您应该将它们分解为单独的触发器:
DECLARE @insert INT, @delete INT;
SELECT @insert = COUNT(*) FROM inserted;
SELECT @delete = COUNT(*) FROM deleted;
IF @insert +@delete > 0
BEGIN
IF @insert > 0 AND @delete = 0
-- insert
IF @insert > 0 AND @delete > 0
-- update
IF @insert = 0 AND @delete > 0
-- delete
END
请注意,由于 MERGE 在 SQL Server 2008/2012 中引入的复杂性,这可能不是完全向前兼容的。
因此,如果您计划在未来使用 SQL Server 2008/2012 和 MERGE,就像上面的解决方案一样,那么这更有理由将触发器拆分为每种类型的 DML 操作的触发器。
您可以将 A2 与触发器的 UPDATED 表合并。
CREATE TRIGGER dbo.trg_A1
ON dbo.A1
AFTER INSERT, UPDATE, DELETE
AS
BEGIN
MERGE dbo.A2 AS target
USING (SELECT * FROM INSERTED) AS source
ON (target.A1_ID= source.A2_ID)
WHEN MATCHED THEN
UPDATE SET Col1 = source.Col1,
Col2 = source.Col2,
.
.
.
WHEN NOT MATCHED THEN
INSERT (Col1,Col2,Col3....)
VALUES (source.Col1, source.Col2, source.Col3....)
WHEN NOT MATCHED BY source and target.A1_ID= source.A2_ID
THEN DELETE
END