DBMS_SYNC_REFRESH
パッケージは、マテリアライズド・ビューの同期リフレッシュを実行するためのインタフェースを提供します。
関連項目: DBMS_SYNC_REFRESHの使用方法の詳細は、『Oracle Databaseデータ・ウェアハウス・ガイド』 を参照してください。 |
この章では、次の項目について説明します。
概要
セキュリティ・モデル
同期リフレッシュは、Oracle Databaseリリース12cで導入されたリフレッシュ方法で、一連の表およびその上に定義されたマテリアライズド・ビューを常に同期状態に保つことができます。
関連項目: 同期リフレッシュの使用方法の詳細は、『Oracle Databaseデータ・ウェアハウス・ガイド』を参照してください。 |
このパッケージの実行権限はPUBLIC
に付与されるため、すべてのユーザーがこのパッケージのプロシージャを実行して、所有するオブジェクトに対する同期リフレッシュを実行できます。データベース管理者は、データベース内のすべての表およびマテリアライズド・ビューに対して同期リフレッシュ操作を実行できます。
通常、DBA
権限のないユーザーが別のユーザーの表に対して同期リフレッシュを使用する場合、その表からの読取りおよびその表への書込みの完全な権限を持っている必要があります。つまり、ユーザーは、その表またはマテリアライズド・ビューに対してSELECT
、READ
、INSERT
、UPDATE
およびDELETE
の権限を持っている必要があります。次に例外を示します。
PURGE_REFRESH_STATS
ファンクションとALTER_REFRESH_STATS_RETENTION
ファンクション
これら2つのファンクションは、パージ・ポリシーを実装し、デフォルトのリテンション期間を変更するために使用できます。これらのファンクションは、データベース管理者のみが実行できます。
CAN_SYNCREF_TABLE
ファンクション
これは、指定した表に関連付けられたすべてのマテリアライズド・ビューの同期リフレッシュの適格性を検査するアドバイザ・ファンクションです。したがって、このファンクションでは、指定された表に関連付けられたすべてのマテリアライズド・ビューでSELECT
またはREAD
権限が必要です。
表165-1 DBMS_SYNC_REFRESHパッケージのサブプログラム
サブプログラム | 説明 |
---|---|
|
リフレッシュを中断します。 |
ALTER_REFRESH_STATS_RETENTIONプロシージャ |
日数で指定されたリフレッシュ履歴のリテンション値を変更します。 |
|
表およびその依存マテリアライズド・ビューの同期リフレッシュを処理できるかどうかをアドバイスします。 |
|
同期リフレッシュ・グループの同期リフレッシュを実行します。 |
|
データベースのすべての同期リフレッシュ・グループのグループIDを戻します。 |
|
表またはマテリアライズド・ビューのグループIDを戻します。 |
|
オブジェクト(表またはマテリアライズド・ビュー)の指定したリスト内にある表のグループIDを戻します。 |
|
リフレッシュする同期リフレッシュ・グループを準備します。 |
|
ステージング・ログのデータに関する統計情報を検証して収集します。 |
|
タイムスタンプ・パラメータで指定した時間内に実行した同期リフレッシュのリフレッシュ履歴をパージします。 |
|
同期リフレッシュ用にマテリアライズド・ビューを登録します。 |
REGISTER_PARTITION_OPERATIONプロシージャ |
元表のパーティションに対するパーティション・メンテナンス操作を登録します。 |
|
同期リフレッシュからマテリアライズド・ビューを登録解除します。 |
UNREGISTER_PARTITION_OPERATIONプロシージャ |
元表のパーティションに対するパーティション・メンテナンス操作の登録を解除します。 |
このプロシージャは、指定した同期リフレッシュ・グループに対してPREPARE_REFRESH
またはEXECUTE_REFRESH
で行ったすべての変更を元に戻します。これは、予期しないエラーが発生した場合に、表およびマテリアライズド・ビューを使用可能で整合性のある状態に戻す際に役立ちます。
このプロシージャはオーバーロードされています。
構文
DBMS_SYNC_REFRESH.ABORT_REFRESH ( group_id IN NUMBER); DBMS_SYNC_REFRESH.ABORT_REFRESH ( group_id_list IN DBMS_UTILITY.NUMBER_ARRAY);
使用上の注意
PREPARE_REFRESH
の後に呼び出された場合、このプロシージャは、これによって作成された外部表を削除し、同期リフレッシュ・グループ内の表およびマテリアライズド・ビューをロック解除します。
EXECUTE_REFRESH
が失敗した後に呼び出された場合、このプロシージャは、正常に終了したパーティション交換をすべて元に戻すことによって、表の状態をEXECUTE_REFRESH
の前に戻します。
このプロシージャは、PREPARE_REFRESH
プロシージャによって同期リフレッシュ・グループ内の表にかけられたロックを解放します。これらのロックの説明は、「PREPARE_REFRESHプロシージャ」を参照してください。
ABORT_REFRESH
は、PREPARE_REFRESH
文またはEXECUTE_REFRESH
文が失敗した場合のみ機能します。これらのコマンドが正常に実行した後では使用できません。その場合に使用すると、エラーがスローされます。
このプロシージャは、日数で指定されたリフレッシュ履歴のリテンション値を変更します。これは、PURGE_REFRESH_HISTORY
と組み合せて使用されることを想定しています。これを実行する権限に加えて、SYSDBA
権限も必要です。
このプロシージャは、表およびその依存マテリアライズド・ビューの同期リフレッシュを処理できるかどうかをアドバイスします。これは、その分析の説明を示します。処理できない場合、その理由を調べて、可能な場合は適切なアクションを実行できます。
このプロシージャは、表のすべての依存マテリアライズド・ビューと、それらが同期リフレッシュ可能かどうかを表示します。元表の同期リフレッシュが不可能な場合でも、マテリアライズド・ビューの同期リフレッシュは可能な場合があります。
同期リフレッシュにおけるマテリアライズド・ビューの適格性ルールの詳細は、『Oracle Databaseデータ・ウェアハウス・ガイド』を参照してください。
CAN_SYNCREF_TABLE
は、2つの方法で起動できます。1つは表を使用する方法、もう1つはVARRAY
を作成する方法です。
構文
DBMS_SYNC_REFRESH.CAN_SYNCREF_TABLE ( schema_name IN VARCHAR2, table_name IN VARCHAR2, statement_id IN VARCHAR2); DBMS_SYNC_REFRESH.CAN_SYNCREF_TABLE ( schema_name IN VARCHAR2, table_name IN VARCHAR2, output_array IN OUT Sys.CanSyncRefTypeArray);
CAN_SYNCREF_TABLE
に渡す必要があるのは、statement_id
とoutput_array
のどちらか一方であることに注意してください。
SYNCREF_TABLEの使用
CAN_SYNCREF_TABLE
の出力は、表SYNCREF_TABLE
に送信できます。SYNCREF_TABLE
は、ユーザーが作成する必要があります。これは不要になったら削除できます。その構造は次のとおりです。
CREATE TABLE SYNCREF_TABLE ( statement_id VARCHAR2(30), schema_name VARCHAR2(30), table_name VARCHAR2(30), mv_schema_name VARCHAR2(30), mv_name VARCHAR2(30), eligible VARCHAR2(1), seq_num NUMBER, msg_number NUMBER, message VARCHAR2(4000));
VARRAYの使用
CAN_SYNCREF_TABLE
の出力はPL/SQLのVARRAY
に保存できます。この配列の要素はCanSyncRefMessage
タイプで、SYS
スキーマで次のように事前定義されています。
TYPE CanSyncRefMessage IS OBJECT ( schema_name VARCHAR2(30), table_name VARCHAR2(30), mv_schema_name VARCHAR2(30), mv_name VARCHAR2(30), eligible VARCHAR2(1), seq_num NUMBER, msg_number NUMBER, message VARCHAR2(4000));
配列タイプCanSyncRefArrayType
は、CanSyncRefMessage
オブジェクトのVARRAYで、SYS
スキーマで次のように事前定義されています。
TYPE CanSyncRefArrayType AS VARRAY(256) OF CanSyncRefMessage;
各CanSyncRefMessage
レコードは、同期リフレッシュにおける元表またはマテリアライズド・ビューの適格性に関するメッセージを提供します。フィールドのセマンティクスは、SYNCREF_TABLE
の対応するフィールドと同じです。ただし、SYNCREF_TABLE
には、CanSyncRefMessage
にはないstatement_id
フィールドがあります。これは、CAN_SYNCREF_TABLE
がVARRAY
パラメータを指定して呼び出されたときにstatement_id
が提供されない(不要であるため)からです。
このプロシージャは、DBMS_SYNC_REFRESH.PREPARE_REFRESH
によって準備された同期リフレッシュ・グループに対して同期リフレッシュを実行します。これらのグループは、そのグループIDで識別されます。このプロシージャは、同期リフレッシュ用に登録されたマテリアライズド・ビューのみでリフレッシュを実行します。その他のマテリアライズド・ビューは、このプロシージャの終了後に失効します。
2つの同期リフレッシュ操作、PREPARE_REFRESH
とEXECUTE_REFRESH
のステータスを監視する方法および発生したエラーをカタログ・ビューの情報を使用してトラブルシューティングする方法は、『Oracle Databaseデータ・ウェアハウス・ガイド』の同期リフレッシュ操作のトラブルシューティングに関する項を参照してください。
このプロシージャはオーバーロードされています。
構文
DBMS_SYNC_REFRESH.EXECUTE_REFRESH ( group_id IN NUMBER); DBMS_SYNC_REFRESH.EXECUTE_REFRESH ( group_id_list IN DBMS_UTILITY.NUMBER_ARRAY);
使用上の注意
このプロシージャは、PREPARE_REFRESH
プロシージャによって同期リフレッシュ・グループ内の表にかけられたロックも解放します。これらのロックの説明は、「PREPARE_REFRESHプロシージャ」を、 DBMS_SYNC_REFRESH.EXECUTE_REFRESH実行後のリフレッシュ操作のステータスの詳細は、『Oracle Databaseリファレンス』をそれぞれ参照してください。
このファンクションは、マテリアライズド・ビューのグループIDを戻します。グループIDは、表が属している同期リフレッシュ・グループを識別します。同期リフレッシュ・グループとは、整合性と正確性を確保するために一緒にリフレッシュする必要がある、関連表とその依存マテリアライズド・ビューのグループのことです。
このファンクションは、オブジェクト(マテリアライズド・ビュー)の指定したリストにある表のグループIDを戻します。
このプロシージャは、入力のグループIDにより識別された同期リフレッシュ・グループをリフレッシュするための準備をします。同期リフレッシュ・グループは、一連の関連表およびそれらの元表に依存するすべてのマテリアライズド・ビューから構成されます。このプロシージャは、同期リフレッシュ用に登録済の依存マテリアライズド・ビューのみをリフレッシュのために準備することに注意してください。
2つの同期リフレッシュ操作、PREPARE_REFRESH
とEXECUTE_REFRESH
のステータスを監視する方法および発生したエラーをカタログ・ビューの情報を使用してトラブルシューティングする方法は、『Oracle Databaseデータ・ウェアハウス・ガイド』の同期リフレッシュ操作のトラブルシューティングに関する項を参照してください。
使用上の注意
このプロシージャは、同期リフレッシュ操作の3つのフェーズを計画し、準備フェーズ自体に関連付けられた手順を実行します。これらの手順には、ファクト表とマテリアライズド・ビューの変更された各パーティションの識別、および変更結果を反映した新しい値の計算が含まれます。パーティションの新しい値は、EXECUTE_REFRESH
の実行時に対応するパーティションに交換される外側の表と呼ばれる表に格納されます。
このプロシージャを実行する前に、ユーザーは、グループのすべての表に対してPREPARE_STAGING_LOG
を実行する必要があります。これは、変更がないステージング・ログに対しても必須です。ユーザーは、REGISTER_PARTITION_OPERATION
を使用して、グループの表に対するパーティション操作を登録する必要もあります。
このプロシージャの副作用の1つは、準備される表が次のようにロックされてしまうことです。すなわち、表のステージング・ログは、DMLの発生を防ぐためにロックされます。その結果、パーティション操作の登録が無効になります。これらのロックは、EXECUTE_REFRESH
文が発行されるまで有効です。または、ABORT_REFRESH
操作を発行してこれらのロックを解除することもできます。このプロシージャの別の副作用は、以前の同期リフレッシュ操作のカタログ・レコードをパージすることです。カタログ・レコードは、リテンション期間より古いときにパージされます。
リフレッシュ準備ジョブの並列性の程度は、ALTER
SESSION
文によって制御可能なセッション・パラメータから継承されます。
表のグループIDは、GET_GROUP_ID(table_name)
を使用して検出できます。表のリストのグループIDは、GET_GROUP_ID_LIST(table_name_list)
を使用して検出できます。表のすべてのリストのグループIDは、GET_ALL_GROUP_IDS
を使用して取得できます。
デフォルトの同期リフレッシュでは、同期リフレッシュ・グループの表およびマテリアライズド・ビューに属しているグローバル索引は保持されません。保持するには、イベント31904、レベル64を設定してからPREPARE_REFRESH
を実行します。これにより、PREPARE_REFRESH
によって生成されるパーティション交換DDL文にUPDATE
INDEXES
句が追加されます。この句をEXECUTE_REFRESH
で実行すると、グローバル索引が保持されます。
このプロシージャは、元表のステージング・ログのデータに関する統計情報を収集し、ログのデータを検証します。これは、データの厳格なチェックが行われる強制モードからチェックが行われない信頼モードまで、いくつかの異なるモードで実行できます。このプロシージャは、ステージング・ログのロード後、およびPREPARE_REFRESH
の実行前に実行する必要があります。
強制モード(デフォルト)では、このプロシージャは、削除または更新される行の列の欠落値を入力します。ステージング・ログ・ルールの違反が見つかった場合、エラーがスローされます。ビューUSER_SR_STLOG_EXCEPTIONS
を問い合せることで、例外の詳細を取得できます。
ステージング・ログ・キーの概念については、『Oracle Databaseデータ・ウェアハウス・ガイド』を参照してください。
強制モードでは、ステージング・ログの行の削除または更新が、次のように処理されます。
キーを使用して元表に行があるかどうかを確認します。
削除される行では(DMLTYPE$$
が'D'
)、このキーを持つ行が元表にあることを確認します。NULLではないキー以外の値がステージング・ログに提供された場合、この値が元表の対応する列と一致していることを確認します。そうでない場合は、例外が例外表に記録されます。キー以外の列の値が欠落している場合、元表の行からその値が入力されます。
更新される行では(DMLTYPE$$
が'UO'
または'UN'
)、このキーを持つ行が元表に存在することを確認します。古い値の行では(DMLTYPE$$
が'UO'
)、削除される行と同様のチェックおよび処理が実行されます。新しい値の行では(DMLTYPE$$
が'UN'
)、少なくとも1つの列の値がその古い値とは異なることをチェックします。そうでない場合は、例外が記録されます。
新しい値の行では(DMLTYPE$$
が'UN'
)、列のNULL値は、列の古い値と同じ値であると解釈されます。ただし、古い値がNULL以外で新しい値がNULLの場合は、例外的に列の新しい値がNULLであると解釈されます。ユーザーは、NULL
に更新される列の古い値を提供する必要があります。
デフォルトの強制モードでは、削除操作または更新操作で各キーが1回のみ指定されていることが確認されます。したがって、ユーザーは、変更を統合する際に、同じ行の削除-挿入を 'UO'
行と'UN'
行を使用して更新操作に統合し、複数の更新を1つの更新に統合し、同じ行の挿入-更新-削除のようなNull変更がステージング・ログに表示されないようにする必要があります。
強制モードで実行されるチェックには時間がかかる場合があります。データの整合性を確信できる場合は、低いレベルのチェックを選択できます。次のいずれかを選択できます。
DBMS_SYNC_REFRESH.INSERT_TRUSTED
のpsl_mode
を選択して、すべての挿入行(DMLTYPE$$
が'I'
)を信頼する
DBMS_SYNC_REFRESH.DELETE_TRUSTED
のpsl_mode
を選択して、すべての削除行(DMLTYPE$$
が'D'
)を信頼する
DBMS_SYNC_REFRESH.UPDATE_TRUSTED
のpsl_mode
を選択して、すべての更新行(DMLTYPE$$
が'UO'
または'UN'
)を信頼する
DBMS_SYNC_REFRESH.TRUSTED
のpsl_mode
を選択して、DMLの3つのタイプすべてを信頼する
さらに、psl_mode
を前述のフラグのビットマスクとして指定できます。たとえば、DBMS_SYNC_REFRESH.INSERT_TRUSTED
+ DBMS_SYNC_REFRESH_DELETE_TRUSTED
は、挿入と削除を信頼して処理しますが、更新は信頼して処理しません。
構文
DBMS_SYNC_REFRESH.PREPARE_STAGING_LOG ( schema_name IN VARCHAR2, base_table_name IN VARCHAR2, psl_mode IN NUMBER DEFAULT DBMS_SYNC_REFRESH.ENFORCED);
パラメータ
表165-10 PREPARE_STAGING_LOGプロシージャのパラメータ
パラメータ | 説明 |
---|---|
|
元表のスキーマの名前。 |
|
元表の名前。 |
|
ステージング・ログの準備を実行する必要があるモード。有効な値は、次のとおりです。
|
このプロシージャは、BEFORE_TIMESTAMP
パラメータで指定した値の前に実行した同期リフレッシュのリフレッシュ履歴をパージします。このプロシージャでは、これを実行する権限に加えてSYSDBA
権限が必要です。
このプロシージャは、同期リフレッシュ用にマテリアライズド・ビューのリストを登録します。これは、リスト内のマテリアライズド・ビューを個別にチェックして、それぞれが属する同期リフレッシュ・グループに配置します。同期リフレッシュ・グループは、関連する表とその上に定義されたマテリアライズド・ビューのセットです。2つの表の間に参照制約が存在する場合、その2つの表は関連するとみなされます。
同期リフレッシュ用のマテリアライズド・ビューの適格性ルールについては、『Oracle Databaseデータ・ウェアハウス・ガイド』で詳しく説明しています。主要な要件として、マテリアライズド・ビューはパーティション化されていて、そのパーティション・キーがファクト表のパーティション・キーから導出可能である必要があります。同期リフレッシュは外部キーと主キーのリレーションシップを信頼して様々なリフレッシュ最適化を行うため、マテリアライズド・ビューの定義ではUSING
TRUSTED
CONSTRAINTS
句を指定する必要があります。マテリアライズド・ビューのリフレッシュ・ポリシーはON
DEMAND
として指定する必要があります。
表に関連付けられているマテリアライズド・ビューの一部のみを登録し、その他を未登録にするオプションもあります。オラクル社ではこれをお薦めしておりません。このオプションを使用する場合、ユーザーはPCTを使用して未登録のビューのメンテナンスを行うか、リフレッシュ・メソッドを完了する必要があります。
マテリアライズド・ビュー・リスト(mv_list
)の各マテリアライズド・ビューのベース表ごとに、ステージング表を作成しておく必要があります。そうしない場合、エラーがスローされます。
マテリアライズド・ビューのなかに同期リフレッシュに適格でないものがある場合、エラーがスローされて、マテリアライズド・ビュー・リストのすべてのマテリアライズド・ビューの登録が失敗します。
このプロシージャは、元表のパーティションのパーティション・メンテナンス操作(PMOP)を登録します。
構文
DBMS_SYNC_REFRESH.REGISTER_PARTITION_OPERATION ( partition_op IN VARCHAR2, schema_name IN VARCHAR2, base_table_name IN VARCHAR2, partition_name IN VARCHAR2, outside_partn_table_schema IN VARCHAR2, outside_partn_table_name IN VARCHAR2);
パラメータ
表165-13 REGISTER_PARTITION_OPERATIONプロシージャのパラメータ
パラメータ | 説明 |
---|---|
|
パーティション操作( |
|
元表のスキーマの名前。 |
|
元表の名前。 |
|
変更するパーティションの名前。外部パーティション表と交換されるか、削除または切捨ての対象になります。 |
|
外部パーティション表のスキーマの名前( |
|
外部パーティション表の名前( |
使用上の注意
パーティションに対して指定される3種類の変更操作は、DROP
、TRUNCATE
およびEXCHANGE
です。
DROP
が指定された場合、パーティションはEXECUTE_REFRESH
のときに元表から削除されます。TRUNCATE
が指定された場合、パーティションのデータは削除されますが、パーティション自体は削除されません。これらの操作では、ステージング・ログで行を個別に指定するよりも効率的にパーティションのすべての行の削除を指定できます。
EXCHANGE
が指定された場合、外部表の内容がEXECUTE_REFRESH
で指定したパーティションの内容と交換されます。これにより、元表に変更を適用する別の方法(ステージング・ログにデータを移入する以外)が提供されます。
このプロシージャは、マテリアライズド・ビューのリストを同期リフレッシュから登録解除します。マテリアライズド・ビューが登録解除されると、ユーザーはcomplete、PCT、refreshなどの標準的なリフレッシュ・メソッドを使用して、そのマテリアライズド・ビューのメンテナンスを行うことができます。
このプロシージャは、REGISTER_PARTITION_OPERATION
で以前に元表に登録されたパーティション・メンテナンス操作(PMOP)を登録解除します。パーティションで指定可能な3種類の変更操作は、DROP
、TRUNCATE
およびEXCHANGE
です。