テーブルまたは結合インデックスの行パーティションの変更または再検証を行なうときに使用するnullパーティション処理句WITH INSERT INTO save_tableとWITH DELETEに関するルールを以下にまとめます。
Nullパーティション処理句を指定しない場合
Nullパーティション処理句であるWITH INSERT INTO save_tableまたはWITH DELETEを指定しない場合、テーブルに現在含まれているすべての行の新しいパーティション式は、パーティション式の値がINTEGERまたはBIGINTにキャストされた後(INTEGER、BIGINT、またはCHARACTERにまだ型付けされていない場合)、1から、そのレベルで定義されているパーティション数までの範囲の値を生成する必要があります。
そうでない場合、Teradata Databaseはリクエスト側にエラーを返します。
既存の行が新しいパーティション式に違反する場合
nullパーティション処理句WITH DELETEまたはWITH INSERT INTO save_tableを指定しなかった場合に、既存の行が新しいパーティション式に違反していると、その新しいパーティション式を適用することはできません。
暗黙のパーティションCHECK制約に違反する行(パーティション式の評価がnullになる行も含む)がテーブルに存在しないようにする必要があります。
Nullパーティション処理句WITH DELETE
Nullパーティション処理句WITH DELETEを指定すると、新しいパーティション式が、すでにINTEGER型、BIGINT型、CHARACTER型のいずれかとして定義されていなければINTEGERまたはBIGINTにキャストされた後で、1から、そのレベルで定義されているパーティション数までの範囲の値を生成しないすべての行が削除されます。
そうでない場合、Teradata Databaseはリクエスト側にエラーを返します。
Nullパーティション処理句WITH INSERT INTO save_table
Nullパーティション処理句WITH INSERT INTO save_tableを指定すると、Teradata Databaseは、新しいパーティション式が、1からそのレベルで定義されているパーティション数までの範囲の値にならないすべての行を削除し、それらの行をsave_tableに挿入します。
この句に関するルールを以下にまとめます。
- save_tableをtable_nameと同じテーブルにすることはできません。同じテーブルにしようとすると、Teradata Databaseはリクエスト元にエラーを返します。
- save_tableとtable_nameは、互換データ型の列の数が同じでなければなりません。同じでないと、Teradata Databaseはリクエスト元にエラーを返します。
エラーが発生した場合のロールバック
テーブルの行の新しいパーティション式の評価がエラーになると、Teradata Databaseは、テーブルとsave_tableへの変更をロールバックし、パーティション設定を変更しません。
save_tableへの挿入でエラーが発生すると、セッション モードに応じて、以下のロールバック動作が生じます。
セッション モード | ロールバックされた処理ブロック |
---|---|
ANSI | リクエスト |
Teradata | トランザクション |
新しいパーティション設定
あるレベルに対する新しいパーティション設定は、変更が成功するまで、そのレベルのパーティション設定になりません。
行パーティション テーブルの行の挿入または更新を後から行なう結果、その行のパーティション式が、1から、そのレベルで定義されているパーティション数までの範囲の値にならない場合、そのような操作を実行しようとすると、Teradata Databaseはリクエスト側にエラーを返します。
設定されたテーブルでの行パーティションの変更
テーブルまたは結合インデックスに列パーティションと行パーティションの両方がある場合に、データの入っているテーブルで行パーティションを変更すると、パフォーマンスに悪影響が出ます。テーブルの行を行パーティション間で移動する操作には、大きなコストがかかる場合が多いからです。
テーブルの変更または再検証の前にトリガーを無効にする
テーブルの変更や再検証を行なうALTER TABLEリクエストを実行するには、以下の表のとおり、まずそのトリガーを無効にしなければなりません。行パーティションを変更または再検証するためのALTER TABLE句 | 無効にするトリガー |
---|---|
WITH DELETE | table_nameのすべてのDELETEトリガー。 ALTER TABLEリクエストの完了後、無効にしたトリガーを再び有効にできます。 |
WITH INSERT INTO save_table |
ALTER TABLEリクエストの完了後、無効にしたトリガーを再び有効にできます。 |