この記事では、SQL Server Migration Assistant (SSMA) for Oracle がトリガーがある場合にテーブルに列を追加 ROWID
する理由について説明します。
背景
Oracle では、変更される一連の行全体ではなく、実行 FOR EACH ROW
されるトリガーを作成できます。 SQL Server では、変更された行のセット全体に対してトリガーが常に実行されます。 行レベルの Oracle トリガーが両方の :old
:new
特別な変数にアクセスする場合、SSMA では、更新の前後の特定の行の値を識別するために、両方の行セットの行を照合する方法が必要です。 各行の機能に対してこのようなエミュレートを行うために、SSMA は、変更された各行を一意に識別する特別なROWID
列を追加し、それを使用して行セット間のinserted
deleted
リレーションシップを確立します。
例
次の例では、Oracle トリガーはテーブルで更新された各行に対して TRIG_TEST
実行されます。
CREATE OR REPLACE TRIGGER TSCHM.TRIG_TEST_AU
AFTER UPDATE OF DATA ON TSCHM.TRIG_TEST
FOR EACH ROW
BEGIN
IF (:new.DATA = 'ABC') THEN
INSERT INTO TSCHM.TRIG_TEST(DATA) VALUES ('-' || :old.DATA);
END IF;
END;
SSMA でこのトリガーを変換しようとすると、SQL Server トリガー内に次の T-SQL が生成されます。
inserted
行セットの上にカーソルを移動し、ROWID
およびDATA
列を選んで@new$0
および@new$DATA
変数を選びます。DECLARE ForEachInsertedRowTriggerCursor CURSOR LOCAL FORWARD_ONLY READ_ONLY FOR SELECT ROWID, DATA FROM inserted OPEN ForEachInsertedRowTriggerCursor FETCH ForEachInsertedRowTriggerCursor INTO @new$0, @new$DATA
ループでは、挿入
ROWID
された (変数に@old$0
格納されている@new$0
) に基づいて、行セットからdeleted
一致する行を選択し@old$DATA
、変数を選択します。SELECT @old$0 = ROWID, @old$DATA = DATA FROM deleted WHERE ROWID = @new$0
変数を使用してトリガー アクションを
@old$DATA
/@new$DATA
実行します。IF (@new$DATA = 'ABC') INSERT SSMAADMIN.TRIG_TEST(DATA) VALUES (('-' + ISNULL(@old$DATA, '')))
追加情報
この動作は、ROWID 列の生成プロジェクト設定によって制御されます。この設定は、[ツール>プロジェクト設定] >の [一般>変換>ROWID 生成] にあります。 設定が [いいえ] に設定されているが、トリガー変換中に SSMA によって列が必要ROWID
であることが識別された場合は、O2SS0239変換エラーが生成されます。
関連する変換メッセージ
- O2SS0239: ROWID 列にアクセスできません (エラー)
- O2SS0267: ROWID 列
- O2SS0404: ROWID 列を変換できません