A1とA2という2つのテーブルがあります。テーブルA1に新しいレコードを挿入するときに、同じレコードをA2に挿入する必要があるように、挿入、更新、および削除のトリガーを作成したい、
A1 テーブルを更新または削除すると、同じことが起こるはずです。
A1とA2という2つのテーブルがあります。テーブル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