特別なトリガー テーブルの順序は同じであるinserted
と期待できdeleted
ますか?
そうでない場合、ID 列に影響を与える挿入ステートメントをどのように処理すればよいですか?
本番 (メイン) データベースがあります。本番データベースの最上位層である開発データベースをセットアップしようとしています。開発データベースでは、アプリケーションが変更しないテーブルとビューは、運用データベースと同義です。変更するテーブルのビューを設定しています。これらのビューが更新または挿入されると、データは本番データベース テーブルではなく、セカンダリ テーブルに挿入されます。ビューは、セカンダリ テーブルからすべての行を選択し、次に、セカンダリ テーブルに存在しない運用テーブルの行を選択します (比較は主キー列で行われます)。
私のプロダクション テーブルの 1 つが で、MainDB.App.Data
セカンダリ テーブルがMockDB.MockTables.Data
で、ビューが であるとしますMockDB.App.Data
。モック テーブルを更新または挿入するビューにトリガーがあります。
USE MockDB
CREATE TRIGGER App.DataTrigger
ON App.Data INSTEAD OF INSERT, UPDATE
NOT FOR REPLICATION AS
BEGIN
SET NOCOUNT ON
-- try updating
UPDATE T1
SET <all T1 columns to TI columns>
FROM MockDB.MockTables.Data T1
INNER JOIN (SELECT *, ROW_NUMBER() OVER (ORDER BY @@ROWCOUNT) as # FROM deleted) TD
ON T1.Identity = TD.NotificationID
INNER JOIN (SELECT *, ROW_NUMBER() OVER (ORDER BY @@ROWCOUNT) as # FROM inserted) TI
ON TD.# = TI.#
-- see if the update did something
IF @@ROWCOUNT > 0
BEGIN
RETURN
END
-- insert rows that don't already exist in the mock table
SET IDENTITY_INSERT MockDB.MockTables.Data ON
INSERT INTO MockDB.MockTables.Data (<all columns>)
SELECT * FROM inserted
SET NOCOUNT OFF
SET IDENTITY_INSERT MockDB.MockTables.Data OFF
END