SQL Remote レプリケーション用の-ar または-ac スイッチを付けてdbunload を 実行する際のユーザID エラーの回避

本書では、SQL Remote 用の-ar または-ac スイッチを付けたdbunload の実行中にエラー・メッセージが発生した場合にユーザが実行する手順について説明します。本書は、5.x データベースを使用して再構築する場合に役立ちます。

バックグラウンド情報

バージョン6 以降では、作成された各データベース・ファイルに2 つのユーザ(rs_systabgroup とSA_DEBUG)が追加されています。レプリケーションで使用していないときには、この2 つのユーザのユーザID のポジションはそれぞれ4 と5 になります。Interactive SQL でselect * from sysusers を実行してuid カラムの値を調べると、これらの値を確認できます。

ただし、SQL Remote レプリケーションでデータベースを使用するときには、潜在的な問題として、ユーザID のポジション4 と5 が既存のユーザ定義のユーザID にすでに割り当てられている可能性があります。SQL Remoteは正しいユーザID のポジションに依存して機能するので、再ロード・プロシージャは、検索できる最も小さなユーザID のポジションに新規ユーザを配置してレプリケーションの中断を回避します。この検索はユーザID のポジション101 から開始されます。

データベースの再ロード中にデータベース内のユーザによって占有される最も大きなユーザID のポジションに対して追加チェックを設定します。dbunload の実行前に、最も大きなユーザID のポジションと元の値が一致しないことを再構築ルーチンが認識すると、このエラーが発生して再構築プロセスが停止します。

問題を回避する方法

この問題を回避するには、rs_systabgroup とSA_DEBUG の両方が、データベース内の最後のユーザID のポジションを占有するユーザID にならないことを確認する必要があります。

最初の手順では、レプリケーションに関係しないダミーID を設定して、ダミー・ユーザのユーザID のポジションと最後のユーザID のポジションに配置します。割り当て可能な最も大きいID ポジションは32767 です。GRANTCONNECT 文でAT <integer>オプションを使用すると、ユーザID のポジションを指定することができます。

次に、dbunload ?ar を実行できます(このとき、他の諸問題を解決しています)。

dbunload の操作終了後には、ダミー・ユーザをデータベースから削除します。

手順

この例では、dbunload -ar を使用してバージョン5.5.0.3 のデータベースtest.db を再構築します。DBA のユーザID のパスワードはSQL、dbunload のディレクトリ名はC:\db です。

1. modify.sql ファイルを作成します。

2. GRANT CONNECT TO dummyuser AT 32767 という文と、dbunload ?ar の正常な操作を妨げる他の問題(欠落しているオプションやデータベース・テーブルなど)を解決するために5.5.0.3 データベースに対して実行する必要がある文をmodify.sql に記述します。

3. ファイルmodify.sql をC:\に保存します。

4. コマンド・プロンプトで次のコマンドを発行します。

dbisqlc -c “uid=dba;pwd=sql;eng=test.db” read C:\modify.sql

5. コマンド・プロンプトで次のコマンドを発行します。

dbunload -ar -c “uid=dba;pwd=sql;eng=test.db” C:\db

6. エラーなしにdbunload が終了した場合に、ダミー・ユーザを削除するには、コマンド・プロンプトで次のコマンドをもう一度発行します。

dbisqlc -c “uid=dba;pwd=sql;eng=test.db” REVOKE CONNECT FROM dummyuser.