ALTOBJ プロシージャー
ALTOBJ プロシージャーは、変更される既存の表のターゲット・データ定義言語 (DDL) として機能する、入力 CREATE TABLE ステートメントを解析します。
このプロシージャーは、変更される表のデータのバックアップを取ってから、元の表をドロップし、DDL ステートメントを使用して新しいバージョンを作成します。最終ステップでは、保管データを新しい表にロードして戻します。
- 列の名前変更
- 列のサイズの増減
- 列タイプの変更とスカラー関数を使用した既存データのトランスフォーム
- 10 進数値の精度または位取りの変更
- 列のデフォルト値の変更
- 列の NULL 可能属性の NULL 可能への変更
- 列のドロップ
構文
スキーマは SYSPROC です。
プロシージャー・パラメーター
- exec-mode
- 次の実行モードのいずれかを指定する、タイプ VARCHAR(30) の入力引数。
- 'GENERATE'
- VALIDATE、APPLY、および UNDO モードで必要なすべてのスクリプトを生成することを指定します。
- 'VALIDATE'
- ステートメント構文が検査されることを指定します。 このオプションにより、変更される表の関連オブジェクトおよびリレーションシップの処理を管理するスクリプトも生成されます。
- 'APPLY_CONTINUE_ON_ERROR' または 'APPLY_STOP_ON_ERROR'
- 変更される表の関連オブジェクトおよびリレーションシップの処理を管理するスクリプトを生成することを指定します。 元の表のデータは、新しい表を取り込むために、エクスポートされ、トランスフォームされて使用されます。
- 'UNDO'
- 生じた可能性のあるエラーをロールバック操作でリカバリーできない場合に、表変更操作によって加えられた変更を取り消すことを指定します。 このモードは、元の表および生成されたスクリプトが削除されていない場合にのみ有効です。 このモードでは、前の ALTOBJ 操作で生成されたとおりに alter-id パラメーターを指定する必要があり、値 -1 を指定できません。 そうでなければ、SQL0443N が返されます。
- 'FINISH'
- 名前変更された元の表をドロップすることを指定します。
sql-stmt - 既存の表を変更するときのテンプレートとして使用される CREATE TABLE ステートメントを指定する、 タイプ VARCHAR(2048) の入力引数。 exec-mode が 'GENERATE' である場合、sql-stmt は NULL 値であってはなりません。 それ以外の場合、sql-stmt を NULL 値にすることはできますが、alter-id が -1 ではない場合だけです。 変更 ID
- この呼び出しによって生成されるすべてのステートメントを識別する、 タイプ INTEGER の入力および出力引数。 -1 が指定される場合、新しい ID が生成されて呼び出し元に戻されます。 指定した整数で識別される既存のステートメントがあれば、 それらは上書きされます。 メッセージ
- 指定した実行モード下で、表変更プロセス用に生成されるか表変更プロセスで使用されるすべての SQL ステートメントを表示するために実行できる SQL 照会を含む、 タイプ VARCHAR(2048) の出力引数。
許可
LOAD コマンドを実行するための DBADM 権限と許可は、この関数を実行する場合に必要になります。
デフォルトの PUBLIC 特権
制限のないデータベースでは、このプロシージャーが自動的に作成されると、EXECUTE 特権が PUBLIC に付与されます。
例
CREATE TABLE T1 (CL1 VARCHAR(5), CL2 INTEGER)
列データを変更するための ALTOBJ プロシージャー呼び出しは、次のとおりです。CALL SYSPROC.ALTOBJ('APPLY_CONTINUE_ON_ERROR',
'CREATE TABLE T1 (CL1 VARCHAR(5), CL2 BIGINT)', -1, ?)
CALL SYSPROC.ALTOBJ('VALIDATE', CAST (NULL AS VARCHAR(2048)), 123, ?)
使用上の注意
このプロシージャーは表をドロップして再作成しますが、元の表を作成したユーザーは表の定義者として残ります。 しかし、監査では、このプロシージャーを実行しているユーザーが表をドロップして再作成したと示されます。
- マテリアライズ照会表 (MQT) の変更はサポートされていません。 MQT の入っている表の変更はサポートされます。
- 型付き表の変更はサポートされていません。
- ニックネームを使用したリモート表の変更は、サポートされていません。
- 列のシーケンスを再配列することはできません。
- 列の追加と除去、または名前変更と除去を、プロシージャーの 1 回の呼び出しで行うことはサポートされていませんが、列の追加と名前変更はサポートされています。 その理由は、表の変更方法を指示する唯一の方法が、列一致情報ではなく、ターゲット DDL を使用する方法であるからです。 既存の表から変更後の表へデータを変換するときには、ALTOBJ プロシージャーは次のような規則に従います。
- 既存の表中の列数が、変更後の表と同じである場合、列の追加または除去は行われないとみなされます。 この場合、列の名前変更のみが可能であり、列索引によって突き合わせられます。
- 既存の表中の列数が、変更後の表より少ない場合、列の追加が行われるとみなされます。 列の名前変更が可能であり、新規の列が末尾に追加されます。 既存の列は、索引によって突き合わせられます。
- 既存の表中の列数が、変更後の表より多い場合、列の除去が行われるとみなされます。 列は、名前変更不能になり、名前で突き合わせられます。 ドロップする対象の列は、表中の任意の既存の列でかまいません。
- 構造化タイプ UDT および参照タイプの UDT は、サポートされていません。
- 変更される基本表上に定義された MQT が、表の変更プロセス中にデータを追加されることはありません。
ALTOBJ プロシージャーを使用して表を変更した場合に、その表に MQT が定義されていると、MQT は作成されますが、そこにはデータは取り込まれません。
ALTOBJ プロシージャーを使用して表を変更した場合に、その表に MQT が定義されていると、変更された表での選択結果に属さないすべての列は失われてしまいます。なぜなら、MQT の内容は、新規の基本表から再作成されるからです。
オブジェクトの定義は、ALTOBJ プロシージャーを次に呼び出したときには変わっていることがあります。セッションからセッションへ持続するオブジェクト・ロックはないからです。
表に関連付けられた表プロファイル (RUNSTATS プロファイルなど) は、このような広範囲にわたるプロセスを実行する過程で失われてしまいます。
SYSTOOLSPACE をルーチンの操作表に使用してメタデータを保管します。つまり、データベース・オブジェクトとその操作の記述に使用されるデータです。
表の行または列のアクセス制御がアクティブになっている場合は、その表に対して ALTOBJ を実行するとエラー (DBA7903) になります。