この記事では、SQL Server Migration Assistant (SSMA) for Db2 がテーブルに ROWID
列を追加する理由について説明します (トリガーがある場合)。
背景
Db2 では、変更される行のセット全体ではなく、 FOR EACH ROW
実行されるトリガーを作成できます。 SQL Server では、変更された行のセット全体に対してトリガーが常に実行されます。 行レベルの Db2 トリガーが OLD
関連付け名と NEW
関連付け名の両方にアクセスする場合、SSMA では、両方の行セットの行を照合して、更新前後の特定の行の値を識別する方法が必要です。 このような行ごとの機能をエミュレートするために、SSMA は、変更された各行を一意に識別する特殊な ROWID
列を追加し、それを使用して inserted
と deleted
行セット間のリレーションシップを確立します。
例
テーブルで更新された各行に対して実行される次の 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 が生成されます。
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
格納されている) に基づいて、行セットと@old$DATA
変数からdeleted
一致する行を@new$0
選びます。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 生成] にあります。 設定が No ですが、トリガー変換中に SSMA が ROWID
列を必要とすることを識別した場合、 DB22SS0239: ROWID 列にアクセスできません (エラー)、変換エラー 生成されます。
関連する変換メッセージ
- DB22SS0239: ROWID 列にアクセスできません (エラー)
- DB22SS0267: ROWID 列
- DB22SS0404: ROWID 列を変換できません