次の方法で共有


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

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

背景

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

テーブルで更新された各行に対して実行される次の Db2 トリガー TRIG_TEST 考えてみます。

CREATE OR REPLACE TRIGGER TSCHM.TRIG_TEST_AU
AFTER UPDATE OF DATA ON TSCHM.TRIG_TEST
REFERENCING OLD AS O NEW AS N
FOR EACH ROW
MODE DB2SQL
BEGIN ATOMIC
    IF (N.DATA = 'ABC') THEN
        INSERT INTO TSCHM.TRIG_TEST(DATA) VALUES ('-' || O.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 格納されている) に基づいて、行セットと @old$DATA 変数から deleted 一致する行を @new$0 選びます。

    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 生成] にあります。 設定が No ですが、トリガー変換中に SSMA が ROWID 列を必要とすることを識別した場合、 DB22SS0239: ROWID 列にアクセスできません (エラー)、変換エラー 生成されます。