ADMIN_COPY_SCHEMA プロシージャー - 特定のスキーマとそのオブジェクトのコピー
ADMIN_COPY_SCHEMA プロシージャーは、特定のスキーマと、その中に含まれているすべてのオブジェクトをコピーするために使用されます。
新しいターゲット・スキーマ・オブジェクトは、ソース・スキーマ内のオブジェクトと同じオブジェクト名を使って作成されますが、ターゲット・スキーマの修飾子が付きます。
ADMIN_COPY_SCHEMA プロシージャーは表をコピーするために使用することができます。元の表のデータは、含めることも除くことも可能です。
許可
スキーマが正常にコピーされるためには、ユーザーは CREATE_SCHEMA 特権およびオブジェクト固有の特権を持っている必要があります。
例: ADMIN_COPY_SCHEMA コマンドで表をコピーするために必要な CREATE_TABLE 特権および索引をコピーするために必要な CREATE_INDEX 特権が必要です。
ソース・スキーマ内の表がラベル・ベースのアクセス制御 (LBAC) で保護されている場合、ユーザー ID は、ターゲット表にもその同じ保護を作成できるようにするための LBAC 信用証明情報を必要とします。データもコピーする場合、ユーザー ID は、ソース表からのデータの読み取りとそのデータのターゲット表への書き込みの両方を許可する LBAC 信用証明情報を必要とします。
ADMIN_COPY_SCHEMA プロシージャーに対する EXECUTE 特権も必要です。
デフォルトの PUBLIC 特権
制限のないデータベースでは、このプロシージャーが自動的に作成されると、EXECUTE 特権が PUBLIC に付与されます。
構文
スキーマは SYSPROC です。
プロシージャー・パラメーター
- sourceschema
- コピーされるオブジェクトが属しているスキーマの名前を指定する、タイプ VARCHAR(128) の入力引数。 この名前は大文字小文字が区別されます。
- targetschema
- コピーされたオブジェクトの作成先となる固有のスキーマ名を指定する、タイプ VARCHAR(128) の入力引数。この名前は大文字小文字が区別されます。そのスキーマ名が既に存在する場合、プロシージャー呼び出しは失敗し、プロシージャーを呼び出す前にそのスキーマを削除する必要があることを示すメッセージが戻されます。
- copymode
- コピー操作のモードを指定する、タイプ VARCHAR(128) の入力引数。有効なオプションは以下のとおりです。
- 'DDL': ソース・スキーマの、サポートされているすべてのオブジェクトの空のコピーを作成します。
- 'COPY': ソース・スキーマのすべてのオブジェクトの空のコピーを作成し、それから各ターゲット・スキーマ表にデータをロードします。ロードは 'NONRECOVERABLE' モードで行われます。ADMIN_COPY_SCHEMA を呼び出した後でバックアップを取る必要があります。そうしなければ、リカバリーの後、コピーされた表がアクセス不能になります。
- 'COPYNO': ソース・スキーマのすべてのオブジェクトの空のコピーを作成し、それから各ターゲット・スキーマ表にデータをロードします。ロードは 'COPYNO' モードで行われます。
注: copymode が「COPY」または「COPYNO」の場合、完全修飾ファイル名 (例えば「COPYNO /home/mckeough/loadoutput」) を copymode パラメーター値とともに指定できます。 パスが渡されると、指定のファイルにロード・メッセージが記録されます。 ファイル名は、インスタンスでの fenced ルーチン呼び出しで使用されるユーザー ID が書き込めるものでなければなりません。 パスが指定されないと、ロード・メッセージ・ファイルは廃棄されます (デフォルトの振る舞い)。 - objectowner
- コピーされたオブジェクトの所有者として使用される許可 ID を指定する、タイプ VARCHAR(128) の入力引数。NULL の場合、所有者は、コピー操作を実行するユーザーの許可 ID になります。
- sourcetbsp
- コピー用のソース表スペースのコンマ区切りリストを指定する、タイプ CLOB(2 M) の入力引数。区切り文字で区切られている表スペース名がサポートされます。作成される表ごとに、このリストに含まれているいずれかの表スペースと表定義が、targettbsp リストの n 番目の項目に変換されます。このパラメーターに NULL が指定されている場合、新規オブジェクトは、ソース・オブジェクトが使用するのと同じ表スペースを使って作成されます。
- targettbsp
- コピー用のターゲット表スペースのコンマ区切りリストを指定する、タイプ CLOB(2 M) の入力引数。区切り文字で区切られている表スペース名がサポートされます。表スペースのリスト sourcetbsp の各項目ごとに 1 つの表スペースが指定されていなければなりません。DDL の再生中、sourcetbsp リストの n 番目の表スペースは、targettbsp リストの n 番目の表スペースにマップされます。'SYS_ANY' を最後の表スペース (ソース・リストのどの名前とも対応しない、追加の表スペース名) として指定することが可能です。'SYS_ANY' が検出されると、オブジェクト作成時にデフォルトの表スペース選択アルゴリズムが使用されます (選択アルゴリズムについて詳しくは、CREATE TABLE ステートメントの資料の IN tablespace-name1 オプションを参照してください)。このパラメーターに NULL が指定されている場合、新規オブジェクトは、ソース・オブジェクトが使用するのと同じ表スペースを使って作成されます。
- errortabschema
- コピーできなかったオブジェクトのエラー情報を入れる表のスキーマ名を指定する、タイプ VARCHAR(128) の入出力引数。ADMIN_COPY_SCHEMA プロシージャーがユーザーのためにこの表を SYSTOOLSPACE 表スペースに作成します。エラーが生じなかった場合、このパラメーターの出力は NULL です。
- errortab
- コピーできなかったオブジェクトのエラー情報を入れる表の名前を指定する、タイプ VARCHAR(128) の入出力引数。ADMIN_COPY_SCHEMA プロシージャーがユーザーのためにこの表を SYSTOOLSPACE 表スペースに作成します。この表は、プロシージャーを呼び出したユーザー ID によって所有されます。エラーが生じなかった場合、このパラメーターの出力は NULL です。表が作成できなかった場合、または既に存在する場合には、プロシージャー操作は失敗し、エラー・メッセージが戻されます。ADMIN_COPY_SCHEMA プロシージャーを呼び出した後、ユーザーは表をクリーンアップしなければなりません。つまり、SYSTOOLSPACE で表が占めているスペースを取り戻すためには、表をドロップする必要があります。
表 1. ADMIN_COPY_SCHEMA errortab の形式 列名 データ・タイプ 説明 OBJECT_SCHEMA VARCHAR(128) object_schema - オブジェクト・スキーマ・モニター・エレメント OBJECT_NAME VARCHAR(128) object_name - オブジェクト名モニター・エレメント OBJECT_TYPE VARCHAR(30) objtype - オブジェクト・タイプ・モニター・エレメント SQLCODE INTEGER エラー SQLCODE。 SQLSTATE CHAR(5) エラー SQLSTATE。 ERROR_TIMESTAMP TIMESTAMP 失敗した操作の失敗時刻。 STATEMENT CLOB(2 M) 失敗したオブジェクトの DDL。ターゲット表へのデータのロード中に障害が生じた場合、このフィールドには失敗したロード・コマンドに対応するテキストが含まれます。 DIAGTEXT CLOB(2 K) 失敗した操作のエラー・メッセージ・テキスト。
制約事項
- HADR を構成するデータベースでは、DDL copymode のみがサポートされています。
- COPY または COPY NO を指定した XML はサポートされません。
- COPYNO オプションを指定した ADMIN_COPY_SCHEMA プロシージャーを使用して、ターゲット・データベース・オブジェクトが常駐している表スペースを、バックアップ・ペンディング状態にします。 ロード操作の完了後、ターゲット・スキーマ表は SET INTEGRITY ペンディング状態になります。その後、ADMIN_COPY_SCHEMA プロシージャーは、SET INTEGRITY ステートメントを発行して、表をこの状態から解除します。 表スペースは既にバックアップ・ペンディング状態にあるので、SET INTEGRITY ステートメントは失敗します。 この問題の解決方法について詳しくは、『スキーマのコピー』を参照してください。
使用上の注意
- コピーされるオブジェクト内の完全修飾されたオブジェクトへの参照は変更されません。ADMIN_COPY_SCHEMA プロシージャーは、作成されるオブジェクトの修飾スキーマのみを変更し、それらのオブジェクトの SQL 式内に現れるスキーマ名は変更しません。これには生成された列やトリガー本体などのオブジェクトが含まれます。
- このプロシージャーは、以下のオブジェクトのコピーはサポートしません。
- 索引拡張
- ニックネーム
- パッケージ
- 型付き表
- 配列タイプ
- ユーザー定義の構造化タイプ (およびそれらのトランスフォーム関数)
- 型付きビュー
- JAR (Java™ ルーチン・アーカイブ)
- ステージング表
- 同じソース・スキーマに属さない基本オブジェクトの別名
- 表スペース・マッピングが必要なパーティション表
- コピーされるスキーマ内にこれらのオブジェクトのいずれかが存在する場合、そのオブジェクトはコピーされず、オブジェクトがコピーされなかったことを示す項目がエラー表に追加されます。
- 複製された表をコピーする場合、表の新しいコピーではサブスクリプションが使用可能になりません。表は、基本表として再作成されるに過ぎません。
- このプロシージャーを操作するには、SYSTOOLSPACE 表スペースが存在していることが必要です。この表スペースは、ADMIN_COPY_SCHEMA プロシージャーが使用するメタデータと、このプロシージャーによって戻されるエラー表を保管するために使用されます。表スペースが存在しない場合は、エラーが戻されます。
- ターゲット・スキーマ内のオブジェクトの統計はデフォルトに設定されています。
- 表に生成された ID 列があり、かつ copymode が 'COPY' または 'COPYNO' のいずれかである場合、ソース表からのデータ値はロード中に保存されます。
- 各外部ルーチンごとに、元のソース・ルーチンのバイナリーを参照する新しいカタログ項目が 1 つ作成されます。
- コピー操作の開始時に表が SET INTEGRITY ペンディング状態にあった場合、データはターゲット表にロードされず、その表に関してデータがロードされなかったことを示す項目が errortab に記録されます。
- ロードまたは DDL 操作が失敗した場合、作成されなかったオブジェクトに関する項目が errortab に記録されます。正常に作成されたオブジェクトすべてはそのまま残ります。リカバリーするには、手動ロードを開始するか、ADMIN_DROP_SCHEMA プロシージャーを使用して新しいスキーマをドロップしてから、ADMIN_COPY_SCHEMA プロシージャーを再び呼び出すことができます。
- ターゲット・スキーマがソース・スキーマと一致する場合、DDL 再生中に、デフォルト・スキーマはターゲット・スキーマにオーバーライドされます。
- トリガー、ビュー、または SQL 関数のコンパイルに使用される関数パスは、ソース・オブジェクトの作成に使用されたパスです。ただしこれには例外があり、オブジェクトの関数パスにソース・スキーマ名が含まれている場合、DDL 再生中にパス内のこの項目がターゲット・スキーマ名に変更されます。
- 複数の ADMIN_COPY_SCHEMA プロシージャーを実行すると、デッドロックが生じます。 一度に 1 つの ADMIN_COPY_SCHEMA プロシージャー呼び出しだけを発行する必要があります。 コピー処理中にソース・スキーマ内で表を変更すると、ターゲット・スキーマ内のデータがコピー操作の後には等しくないことを示す場合があります。
- 単一パーティションのデータベース・パーティション・グループ内の表スペースから、複数パーティションのデータベース・パーティション・グループ内の表スペースに、表を備えたスキーマをコピーするときは、慎重に考慮する必要があります。 分散キーの自動選択が設定済みでない限り、スキーマのコピー操作を実行する前に、分散キーを表で定義する必要があります。 分散キーの変更は、表スペースが単一パーティション・データベース・パーティション・グループと関連している表に対してのみ行うことができます。
トランザクションの考慮事項
- ADMIN_COPY_SCHEMA プロシージャーが、その処理中にデッドロックまたはロックのタイムアウトのためにロールバックを強制された場合、ADMIN_COPY_SCHEMA プロシージャーを呼び出した作業単位内で行われた作業もロールバックされます。
- コピーの DDL 段階で障害が生じた場合、ターゲット・スキーマになされた変更はすべてセーブポイントにロールバックされます。
- copymode が 'COPY' または 'COPYNO' に設定されている場合、いったんコピーの DDL 段階が完了すると ADMIN_COPY_SCHEMA プロシージャーがコミットし、そのプロシージャーを呼び出した作業単位でなされた作業もコミットします。
例
CALL SYSPROC.ADMIN_COPY_SCHEMA('SOURCE_SCHEMA', 'TARGET_SCHEMA',
'COPY', NULL, 'SOURCETS1 , SOURCETS2', 'TARGETTS1, TARGETTS2,
SYS_ANY', 'ERRORSCHEMA', 'ERRORNAME')
