次の方法で共有


O2SS0028: 生成された ROWID 列 (情報)

この記事では、SQL Server Migration Assistant (SSMA) for Oracle がトリガーがある場合にテーブルに列を追加 ROWID する理由について説明します。

背景

Oracle では、変更される一連の行全体ではなく、実行 FOR EACH ROWされるトリガーを作成できます。 SQL Server では、変更された行のセット全体に対してトリガーが常に実行されます。 行レベルの Oracle トリガーが両方の :old :new 特別な変数にアクセスする場合、SSMA では、更新の前後の特定の行の値を識別するために、両方の行セットの行を照合する方法が必要です。 各行の機能に対してこのようなエミュレートを行うために、SSMA は、変更された各行を一意に識別する特別なROWID列を追加し、それを使用して行セット間のinserteddeletedリレーションシップを確立します。

次の例では、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 が生成されます。

  1. 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
    
  2. ループでは、挿入ROWIDされた (変数に@old$0格納されている@new$0) に基づいて、行セットからdeleted一致する行を選択し@old$DATA、変数を選択します。

    SELECT @old$0 = ROWID, @old$DATA = DATA
    FROM deleted
    WHERE ROWID = @new$0
    
  3. 変数を使用してトリガー アクションを @old$DATA/@new$DATA 実行します。

    IF (@new$DATA = 'ABC')
        INSERT SSMAADMIN.TRIG_TEST(DATA)
        VALUES (('-' + ISNULL(@old$DATA, '')))
    

追加情報

この動作は、ROWID 列の生成プロジェクト設定によって制御されます。この設定は、[ツール>プロジェクト設定] >の [一般>変換>ROWID 生成] にあります。 設定が [いいえ] に設定されているが、トリガー変換中に SSMA によって列が必要ROWIDであることが識別された場合は、O2SS0239変換エラーが生成されます。