33 DBMS_COMPARISON

DBMS_COMPARISONパッケージでは、様々なデータベースでデータベース・オブジェクトを比較および収束するインタフェースが提供されています。

この章のトピックは、次のとおりです:

参照:

33.1 DBMS_COMPARISONの概要

DBMS_COMPARISONパッケージは、2つのデータベースのデータベース・オブジェクトの比較に使用できるオラクル社提供のパッケージです。また、このパッケージを使用すると、様々なデータベースで一貫性が保持されるようにデータベース・オブジェクトを収束することができます。通常、このパッケージは、複数のデータベースでデータベース・オブジェクトを共有している環境で使用されます。複数のデータベースに同じデータベース・オブジェクトのコピーが存在する場合、そのデータベース・オブジェクトは共有データベース・オブジェクトです。いくつかのデータ・ディクショナリ・ビューには、DBMS_COMPARISONパッケージで作成された比較に関する情報が含まれています。

共有データベース・オブジェクトは、データ・レプリケーションによって保持できます。たとえば、マテリアライズド・ビューまたはOracle Streamsコンポーネントによって、データベース・オブジェクトをレプリケートして複数のデータベースで保持できます。また、カスタム・アプリケーションによって、共有データベース・オブジェクトを保持することもできます。データベース・オブジェクトが共有されている場合、そのデータベース・オブジェクトを共有するデータベースでデータベース・オブジェクトが拡散する可能性があります。このパッケージを使用すると、共有データベース・オブジェクトの相違点を特定できます。違いの識別後、必要に応じて、このパッケージを使用して共有データベース・オブジェクトを同期化することもできます。

2つの異なるデータベースで共有されているデータベース・オブジェクトを比較するには、次の一般的な手順を実行します。

  1. このパッケージのCREATE_COMPARISONプロシージャを実行して、比較を作成します。この比較によって、比較するデータベース・オブジェクトが特定され、比較用のパラメータが指定されます。

  2. このパッケージのCOMPAREファンクションを実行して、2つのデータベースのデータベース・オブジェクトを比較し、相違点を特定します。このファンクションは、相違点が検出された場合はTRUE、相違点が検出されなかった場合はFALSEを戻します。また、このファンクションは、データ・ディクショナリ・ビューに比較結果を移入します。COMPAREファンクションを実行するたびに、個別の比較結果が生成されます。

  3. 比較結果を確認する場合は、次のデータ・ディクショナリ・ビューを問い合せます。

    • DBA_COMPARISON_SCAN

    • USER_COMPARISON_SCAN

    • DBA_COMPARISON_SCAN_VALUES

    • USER_COMPARISON_SCAN_VALUES

    • DBA_COMPARISON_ROW_DIF

    • USER_COMPARISON_ROW_DIF

  4. 2つのデータベース間で相違点が検出されたデータベース・オブジェクトを同期化する場合は、このパッケージのCONVERGEプロシージャを実行します。

DBMS_COMPARISONパッケージのCREATE_COMPARISONプロシージャを使用して比較を作成した後は、COMPAREファンクションを使用して比較を随時実行できます。COMPAREファンクションを実行するたびに、適切なデータ・ディクショナリ・ビューに比較結果が記録されます。このパッケージのサブプログラムを起動し、比較結果のスキャンを指定すると、比較結果が変更される場合があります。たとえば、RECHECKファンクションを実行すると、比較結果が変更される場合があります。

COMPAREファンクションを1回実行したときの比較結果に、1回以上のスキャンが含まれている場合があります。スキャンでは、共有データベース・オブジェクトの一部またはすべての行で、特定の時点における違いが確認されます。データベース・オブジェクトは複数回比較することができ、比較結果の各スキャンは一意のスキャンIDによって識別されます。

バケットとは、比較されているデータベース・オブジェクトの一定範囲の行です。バケットを使用すると、データベース・オブジェクトが複数の範囲に分割され、別々に比較されるため、パフォーマンスが向上します。すべての比較では、比較対象の行が適切な数のバケットに分割され、各バケットがスキャンによって比較されます。

COMPAREファンクションによってバケットが小さいバケットに分割されるたびに、小さいバケットに対して新しいスキャンが実行されます。大きいバケットを分析するスキャンは、大きいバケットが分割されて生成された小さいバケットを分析する各スキャンの親スキャンとなります。比較結果のルート・スキャンは、最上位の親スキャンです。ルート・スキャンに親スキャンはありません。

スキャンを再チェックするにはRECHECKファンクションを使用し、スキャンを収束するにはCONVERGEプロシージャを使用します。比較結果のすべての行を再チェックまたは収束する場合は、適切なサブプログラムの比較結果にルート・スキャンIDを指定します。比較結果の一部の行を再チェックまたは収束する場合は、相違点が含まれているスキャンのスキャンIDを指定します。

参照:

スキャン、バケット、親スキャンおよびルート・スキャンの詳細情報などの比較の詳細は、『Oracle Streamsレプリケーション管理者ガイド』を参照してください。

33.2 DBMS_COMPARISONのセキュリティ・モデル

このパッケージのセキュリティは、2つのいずれかの方法で制御できます。

  • 選択したユーザーまたはロールに、このパッケージのEXECUTEを付与する方法

  • 選択したユーザーまたはロールに、EXECUTE_CATALOG_ROLEを付与する方法

パッケージのサブプログラムをストアド・プロシージャ内から実行する場合、そのサブプログラムを実行するユーザーには、パッケージのEXECUTE権限を直接付与する必要があります。ロールを通して付与することはできません。

DBMS_COMPARISONパッケージの各サブプログラムには、comparison_nameパラメータがあります。現行のユーザーは、DBMS_COMPARISONパッケージのサブプログラムを実行する場合、指定した比較の所有者である必要があります。

COMPAREファンクション、RECHECKファンクションまたはCONVERGEプロシージャを実行するには、次のユーザーが共有データベース・オブジェクトのコピーごとにSELECTまたはREAD権限を持っている必要があります。

  • ローカル・データベースの比較の所有者

  • 比較の所有者がデータベース・リンクを介して接続するリモート・データベースのユーザー(データベース・リンクを使用する場合)

CONVERGEプロシージャには、共有データベース・オブジェクトに対する変更を行うデータベースのいずれかのユーザーに対して追加の権限も必要です。このユーザーは、このデータベースの共有データベース・オブジェクトに対するINSERTUPDATEおよびDELETE権限を持っている必要があります。

また、CONVERGEプロシージャが、NULL以外の値に設定されたlocal_converge_tagまたはremote_converge_tagパラメータで実行されるとき、次の要件も満たしている必要があります。

  • ローカル表が優先される場合は、CONVERGEプロシージャの実行者がデータベース・リンクを通じて接続するリモート・データベースのユーザーにDBMS_STREAMS_ADMパッケージのEXECUTE_CATALOG_ROLEまたはEXECUTE権限を付与する必要があります。

  • リモート表が優先される場合は、ローカル・データベースのCONVERGEプロシージャ実行者にDBMS_STREAMS_ADMパッケージのEXECUTE_CATALOG_ROLEまたはEXECUTE権限を付与する必要があります。

注意:

データベース管理者(DBA)は、他のユーザーが所有する一部のDBMS_COMPARISONファンクションおよびプロシージャを制御することができます。DROP_COMPARISONPURGE_COMPARISONも制御の対象になります。DBAによるオーバーライドは、別のユーザーが作成した比較を削除する必要があるクリーンアップ操作で特に有用です。

33.3 DBMS_COMPARISONの定数

DBMS_COMPARISONパッケージは、パラメータ値の指定に使用するいくつかの列挙定数を定義します。列挙定数にはパッケージ名を接頭辞として付加する必要があります。たとえば、DBMS_COMPARISON.CMP_SCAN_MODE_FULLです。

表33-1に、パラメータおよび列挙定数の一覧を示します。

表33-1 DBMS_COMPARISONパラメータおよび列挙定数

パラメータ オプション タイプ 説明

comparison_mode

  • CMP_COMPARE_MODE_OBJECT

VARCHAR2(30)

CMP_COMPARE_MODE_OBJECTは、データベース・オブジェクトです。この定数は、'OBJECT'のように指定できます。

scan_mode

  • CMP_SCAN_MODE_FULL

  • CMP_SCAN_MODE_RANDOM

  • CMP_SCAN_MODE_CYCLIC

  • CMP_SCAN_MODE_CUSTOM

VARCHAR2(30)

CMP_SCAN_MODE_FULLは、データベース・オブジェクト全体が比較されることを示します。この定数は、'FULL'のように指定できます。

CMP_SCAN_MODE_RANDOMは、データベース・オブジェクトの一部がランダムに比較されることを示します。この定数は、'RANDOM'のように指定できます。

CMP_SCAN_MODE_CYCLICは、比較を1回実行した場合、データベース・オブジェクトの一部が比較されることを示します。データベース・オブジェクトを再度比較すると、前回の比較が終了した場所から、データベース・オブジェクトの別の部分が比較されます。この定数は、'CYCLIC'のように指定できます。

CMP_SCAN_MODE_CUSTOMは、サブプログラムを実行するユーザーが、データベース・オブジェクトで比較する範囲を指定することを示します。この定数は、'CUSTOM'のように指定できます。

converge_options

  • CMP_CONVERGE_LOCAL_WINS

  • CMP_CONVERGE_REMOTE_WINS

VARCHAR2(30)

CMP_CONVERGE_LOCAL_WINSは、ローカル・データベースの列の値とリモート・データベースの列の値が異なる場合、リモート・データベースの列の値がローカル・データベースの列の値に置き換えられることを示します。この定数は、'LOCAL'のように指定できます。

CMP_CONVERGE_REMOTE_WINSは、ローカル・データベースの列の値とリモート・データベースの列の値が異なる場合、ローカル・データベースの列の値がリモート・データベースの列の値に置き換えられることを示します。この定数は、'REMOTE'のように指定できます。

null_value

  • CMP_NULL_VALUE_DEF

VARCHAR2(100)

CMP_NULL_VALUE_DEFは、比較時にデータベース・オブジェクトのNULL値がORA$STREAMS$NVに置き換えられることを示します。この定数は、'ORA$STREAMS$NV'のように指定できます。

max_num_buckets

  • CMP_MAX_NUM_BUCKETS

INTEGER

CMP_MAX_NUM_BUCKETSは、バケットの最大数が1,000であることを示します。この定数は、1000のように指定できます。

min_rows_in_bucket

  • CMP_MIN_ROWS_IN_BUCKET

INTEGER

CMP_MIN_ROWS_IN_BUCKETは、バケット内の行の最小数が10,000であることを示します。この定数は、10000のように指定できます。

33.4 DBMS_COMPARISONのビュー

DBMS_COMPARISONパッケージでは、複数のビューが使用されます。

これらのビューを次に示します。

  • DBA_COMPARISON

  • USER_COMPARISON

  • DBA_COMPARISON_COLUMNS

  • USER_COMPARISON_COLUMNS

  • DBA_COMPARISON_SCAN

  • USER_COMPARISON_SCAN

  • DBA_COMPARISON_SCAN_VALUES

  • USER_COMPARISON_SCAN_VALUES

  • DBA_COMPARISON_ROW_DIF

  • USER_COMPARISON_ROW_DIF

33.5 DBMS_COMPARISONの使用上の注意

DBMS_COMPARISONパッケージには、特定の要件および使用上の注意があります。

例を次に示します。

  • DBMS_COMPARISONパッケージのOracle Databaseリリース要件

  • DBMS_COMPARISONパッケージのデータベース・キャラクタ・セット要件

  • DBMS_COMPARISONパッケージのデータベース・オブジェクト要件

  • DBMS_COMPARISONパッケージの索引列要件

  • DBMS_COMPARISONパッケージのデータ・タイプ要件

  • 更新されない行のみの収束

DBMS_COMPARISONパッケージのOracle Databaseリリース要件

DBMS_COMPARISONパッケージのサブプログラムを実行する場合は、次のOracle Databaseリリース要件を満たしている必要があります。

  • DBMS_COMPARISONのサブプログラムを実行するローカル・データベースは、Oracle Database 11gリリース1(11.1)のデータベースである必要があります。

  • リモート・データベースは、Oracle Database 10gリリース1(10.1)以上のデータベースである必要があります。このリリースより前のOracle DatabaseおよびOracle以外のデータベースは、サポートされていません。

DBMS_COMPARISONパッケージのデータベース・キャラクタ・セット要件

データベース・キャラクタ・セットは、比較対象のデータベース・オブジェクトが含まれているデータベースのものと同じである必要があります。

参照:

データベース・キャラクタ・セットの詳細は、『Oracle Databaseグローバリゼーション・サポート・ガイド』を参照してください。

DBMS_COMPARISONパッケージのデータベース・オブジェクト要件

DBMS_COMPARISONパッケージでは、次のタイプのデータベース・オブジェクトを比較できます。

  • 単一表ビュー

  • マテリアライズド・ビュー

  • 表、単一表ビューおよびマテリアライズド・ビューのシノニム

異なるデータベースで、様々なタイプのデータベース・オブジェクトを比較および収束できます。たとえば、このパッケージを使用して、あるデータベースの表と別のデータベースのマテリアライズド・ビューを比較および収束できます。

DBMS_COMPARISONパッケージのサブプログラムを実行するには、指定したデータベース・オブジェクトが各データベースで同じ形状をしている必要があります。具体的には、データベース・オブジェクトは各データベースで同数の列を持ち、対応する列のデータ・タイプが一致している必要があります。

比較されるデータベース・オブジェクトに、その他のデータベース・オブジェクトに存在しない列が含まれている場合は、比較の作成時に余分な列を除外することによってデータベース・オブジェクトを比較できます。両方のデータベース・オブジェクトに存在する列のみを表示するには、CREATE_COMPARISONプロシージャでcolumn_listパラメータを使用します。

DBMS_COMPARISONパッケージの索引列要件

この項では、数値、タイムスタンプおよび時間隔の列について説明します。これらには、次のデータ・タイプのものが含まれます。

  • 数値列のデータ・タイプは、NUMBERFLOATBINARY_FLOAT、およびBINARY_DOUBLEです。

  • タイムスタンプ列のデータ・タイプは、TIMESTAMPTIMESTAMP WITH TIME ZONE、およびTIMESTAMP WITH LOCAL TIME ZONEです。

  • 期間列のデータ・タイプは、INTERVAL YEAR TO MONTHおよびINTERVAL DAY TO SECONDです。

DBMS_COMPARISONパッケージですべてのスキャン・モードがサポートされるには、データベース・オブジェクトに次のいずれかのタイプの索引が必要です。

  • 数値、タイムスタンプまたはDATEデータ・タイプの列に対する単一列索引。

  • 数値、タイムスタンプ、時間隔またはDATEデータ・タイプの列のみが含まれているコンポジット索引。コンポジット索引内の各列は、NOT NULL制約を含んでいるか、または主キーの一部である必要があります。

CMP_SCAN_MODE_FULLおよびCMP_SCAN_MODE_CUSTOMがサポートされるには、データベース・オブジェクトに次のいずれかのタイプの索引が必要です。

  • 数値、タイムスタンプ、期間、DATEVARCHAR2、またはCHARの各データ・タイプの列に対する単一列索引。

  • 数値、タイムスタンプ、時間隔、DATEVARCHAR2またはCHARの列のみが含まれているコンポジット索引。コンポジット索引内の各列は、NOT NULL制約を含んでいるか、または主キーの一部である必要があります。

データベース・オブジェクトにこれらのタイプの索引のいずれかが含まれていない場合、そのデータベース・オブジェクトはDBMS_COMPARISONパッケージではサポートされません。たとえば、データベース・オブジェクトにNVARCHAR2列に対する単一索引のみが含まれている場合、そのデータベース・オブジェクトはDBMS_COMPARISONパッケージではサポートされません。また、データベース・オブジェクトに1つのみの索引が含まれていて、その索引がNUMBER列およびNCHAR列を含むコンポジット索引である場合、そのデータベース・オブジェクトはDBMS_COMPARISONパッケージではサポートされません。

CREATE_COMPARISONプロシージャでindex_schema_nameおよびindex_nameパラメータを使用して比較を作成すると、索引を指定できます。索引を指定する場合は、索引の列が、比較に使用されるスキャン・モードの要件を満たしていることを確認してください。

比較の索引列は、比較に関連するすべての行を一意に識別する必要があります。次の制約は、この要件を満たしている必要があります。

  • 主キー制約

  • 1つ以上のNULL以外の列に対する一意制約

これらの制約が表に存在しない場合は、CREATE_COMPARISONプロシージャでindex_schema_nameおよびindex_nameパラメータを使用して、この要件を満たす列を含む索引を指定できます。

単一の索引値によってローカル行およびリモート行の両方が識別される場合、それらの行はレプリケーション表の同じ行のコピーである必要があります。また、同じ行のコピーの各ペアの索引値は常に同じである必要があります。

CREATE_COMPARISONプロシージャを使用して比較を作成するときは、索引内のすべての列がcolumn_listパラメータに含まれている場合にのみDBMS_COMPARISONパッケージで索引を使用できます。

比較の作成後、次の問合せを実行して索引列(複数も可)を特定できます。

SELECT COLUMN_NAME, COLUMN_POSITION FROM DBA_COMPARISON_COLUMNS 
  WHERE COMPARISON_NAME = 'COMPARE_CUSTOM' AND
        INDEX_COLUMN    = 'Y';

2つ以上の索引列が存在する場合は、COLUMN_POSITION1が指定されている索引列がコンポジット索引の先頭の索引列となります。

参照:

DBMS_COMPARISONパッケージのデータ・タイプ要件

DBMS_COMPARISONパッケージでは、次のデータ・タイプの列のデータを比較できます。

  • VARCHAR2

  • NVARCHAR2

  • NUMBER

  • FLOAT

  • DATE

  • BINARY_FLOAT

  • BINARY_DOUBLE

  • TIMESTAMP

  • TIME WITH TIME ZONE

  • TIMESTAMP WITH LOCAL TIME ZONE

  • INTERVAL YEAR TO MONTH

  • INTERVAL DAY TO SECOND

  • RAW

  • CHAR

  • NCHAR

TIMESTAMP WITH LOCAL TIME ZONEデータ・タイプの列を比較する場合、2つのデータベースで同じタイムゾーンが使用されている必要があります。また、データ・タイプNVARCHAR2またはNCHARの列を比較する場合、2つのデータベースで同じ各国語キャラクタ・セットが使用される必要があります。

DBMS_COMPARISONパッケージでは、次のデータ・タイプの列のデータは比較できません。

  • LONG

  • LONG RAW

  • ROWID

  • UROWID

  • CLOB

  • NCLOB

  • BLOB

  • BFILE

  • ユーザー定義型(オブジェクト型、REF、VARRAY、ネストした表など)

  • オラクル社提供のタイプ(任意のタイプ、XMLタイプ、空間タイプ、メディア・タイプなど)

比較の作成時にサポートされていない列を除外することによって、サポートされていない列が含まれているデータベース・オブジェクトを比較できます。共有データベース・オブジェクトでサポートされている列のみを表示するには、CREATE_COMPARISONプロシージャでcolumn_listパラメータを使用します。

参照:

更新されない行のみの収束

いずれのデータベースでも更新されない行のみを収束する必要があります。たとえば、共有データベース・オブジェクトがレプリケーション・コンポーネントによって更新される場合は、レプリケーションの変更が適用されている行のみを収束し、これらの行に対する新しい変更がレプリケートされていないことを確認します。レプリケートされたデータベース・オブジェクトを比較する場合は、通常、レプリケーション・アクティビティが少ないか、またはまったくない期間に比較して、永続的な相違点を識別することをお薦めします。

注意:

2つのデータベースで共有データベース・オブジェクトの行が異なることがスキャンで識別され、スキャン後にその行が変更された場合、CONVERGEプロシージャの実行後に、予期しないデータが行に含まれる可能性があります。

参照:

Oracle Streamsレプリケーション環境でのDBMS_COMPARISONパッケージの詳細は、『Oracle Streamsレプリケーション管理者ガイド』を参照してください。

33.6 DBMS_COMPARISONのデータ構造

DBMS_COMPARISONパッケージは、レコード・タイプを定義します。

DBMS_COMPARISONパッケージのCOMPAREファンクションまたはCONVERGEプロシージャによって戻される情報が含まれています。

注意:

COMPAREファンクションは、scan_idフィールドの値のみを戻します。

33.6.1 COMPARISON_TYPEレコード・タイプ

このレコード・タイプには、DBMS_COMPARISONパッケージのCOMPAREファンクションまたはCONVERGEプロシージャによって戻される情報が含まれます。

注意:

COMPAREファンクションは、scan_idフィールドの値のみを戻します。

構文

TYPE COMPARISON_TYPE IS RECORD(
  scan_id            NUMBER,
  loc_rows_merged    NUMBER,
  rmt_rows_merged    NUMBER,
  loc_rows_deleted   NUMBER,
  rmt_rows_deleted   NUMBER);

表33-2 COMPARISON_TYPEの属性

フィールド 説明

scan_id

スキャンのスキャンID。

loc_rows_merged

リモート・サイトのデータベース・オブジェクトからの情報で更新されたローカル・データベース・オブジェクトの行の数

rmt_rows_merged

ローカル・サイトのデータベース・オブジェクトからの情報で、リモート・サイトで更新されたデータベース・オブジェクトの行の数

loc_rows_deleted

ローカル・データベース・オブジェクトから削除された行の数

rmt_rows_deleted

リモート・データベース・オブジェクトから削除された行の数

33.7 DBMS_COMPARISONサブプログラムの要約

この表は、DBMS_COMPARISONサブプログラムを示し、簡単に説明しています。

表33-3 DBMS_COMPARISONパッケージのサブプログラム

サブプログラム 説明

COMPAREファンクション

指定した比較を実行します。

CONVERGEプロシージャ

指定したスキャンで比較されたデータベース・オブジェクトの一部を同期化するために、データ操作言語(DML)の変更を実行します。

CREATE_COMPARISONプロシージャ

比較を作成します。

DROP_COMPARISONプロシージャ

比較を削除します。

PURGE_COMPARISONプロシージャ

比較のために、比較結果または比較結果のサブセットをパージします。

RECHECKファンクション

比較のために指定したスキャンで相違点を再チェックします。

33.7.1 COMPAREファンクション

このファンクションは、指定した比較を実行します。

比較を実行するたびに新しいスキャンが1回以上実行され、各スキャンには一意のスキャンIDがあります。CREATE_COMPARISONプロシージャを使用すると、比較を定義し、名前を付けることができます。

構文

DBMS_COMPARISON.COMPARE(
   comparison_name  IN   VARCHAR2,
   scan_info        OUT  COMPARISON_TYPE,
   min_value        IN   VARCHAR2   DEFAULT NULL,
   max_value        IN   VARCHAR2   DEFAULT NULL,
   perform_row_dif  IN   BOOLEAN    DEFAULT FALSE)
RETURN BOOLEAN;

パラメータ

表33-4 COMPAREファンクションのパラメータ

パラメータ 説明

comparison_name

比較の名前。

scan_info

COMPARISON_TYPEデータ・タイプに戻される比較操作に関する情報。

「COMPARISON_TYPEレコード・タイプ」を参照してください。

min_value

比較のスキャン・モードがCMP_SCAN_MODE_CUSTOMに設定されている場合は、比較される行の範囲に最小の索引列値を指定します。比較対象の索引列を決定するには、DBA_COMPARISON_COLUMNSデータ・ディクショナリ・ビューを問い合せます。コンポジット索引の場合は、DBA_COMPARISON_COLUMNSビューで、column_position1の列の値を指定します。「DBMS_COMPARISONの使用上の注意」の索引列要件を参照してください。

スキャン・モードがCMP_SCAN_MODE_CUSTOM以外の値に設定されている場合は、このパラメータをNULLに設定する必要があります。

scan_modeパラメータがCMP_SCAN_MODE_CUSTOMに設定されている場合にNULLに設定すると、エラーが発生します。

比較対象のスキャン・モードを決定するには、DBA_COMPARISONデータ・ディクショナリ・ビューを問い合せます。

スキャン・モードについては、「DBMS_COMPARISONの定数」を参照してください。

max_value

比較のスキャン・モードがCMP_SCAN_MODE_CUSTOMに設定されている場合は、比較される行の範囲に最大の索引列値を指定します。比較対象の索引列を決定するには、DBA_COMPARISON_COLUMNSデータ・ディクショナリ・ビューを問い合せます。コンポジット索引の場合は、DBA_COMPARISON_COLUMNSビューで、column_position1の列の値を指定します。「DBMS_COMPARISONの使用上の注意」の索引列要件を参照してください。

スキャン・モードがCMP_SCAN_MODE_CUSTOM以外の値に設定されている場合は、このパラメータをNULLに設定する必要があります。

scan_modeパラメータがCMP_SCAN_MODE_CUSTOMに設定されている場合にNULLに設定すると、エラーが発生します。

比較対象のスキャン・モードを決定するには、DBA_COMPARISONデータ・ディクショナリ・ビューを問い合せます。

スキャン・モードについては、「DBMS_COMPARISONの定数」を参照してください。

perform_row_dif

TRUEの場合は、比較用の許容最小バケットに達した後、比較対象のデータベース・オブジェクトの各行を別々に比較します。

FALSEの場合は、バケットの相違点を比較します。ただし、許容最小バケット内で相違点が検出された場合、各行の個別比較は行われません。

バケットの詳細は、「DBMS_COMPARISONの概要」を参照してください。

戻り値

このファンクションは、比較対象のデータベース・オブジェクトで相違点が検出されなかった場合はTRUEを戻します。また、比較されるデータベース・オブジェクトで相違点が検出された場合はFALSEを戻します。

33.7.2 CONVERGEプロシージャ

このプロシージャは、指定したスキャンで比較されたデータベース・オブジェクトの一部を同期化するために、データ操作言語(DML)の変更を実行します。

構文

DBMS_COMPARISON.CONVERGE(
   comparison_name      IN   VARCHAR2,
   scan_id              IN   NUMBER,
   scan_info            OUT  COMPARISON_TYPE,
   converge_options     IN   VARCHAR2  DEFAULT CMP_CONVERGE_LOCAL_WINS,
   perform_commit       IN   BOOLEAN   DEFAULT TRUE,
   local_converge_tag   IN   RAW       DEFAULT NULL,
   remote_converge_tag  IN   RAW       DEFAULT NULL);

パラメータ

表33-5 CONVERGEプロシージャのパラメータ

パラメータ 説明

comparison_name

比較の名前。

scan_id

収束されるデータベース・オブジェクト間での相違点が含まれているスキャンの識別子。

このパラメータでスキャンIDを指定する方法の詳細は、「概要」を参照してください。

scan_info

COMPARISON_TYPEデータ・タイプに戻される収束操作に関する情報。

「COMPARISON_TYPEレコード・タイプ」を参照してください。

converge_options

CMP_CONVERGE_LOCAL_WINS定数またはCMP_CONVERGE_REMOTE_WINS定数のいずれか。

これらの定数の詳細は、「定数」を参照してください。

perform_commit

TRUEの場合は、DMLの変更時に定期的にCOMMITを実行します。このパラメータをTRUEに設定すると、CONVERGEプロシージャでCOMMITが2回以上実行される場合があります。

FALSEの場合は、DMLの変更時にCOMMITを実行しません。

local_converge_tag

収束されるデータベース・オブジェクトでデータを収束するための変更を行う前に、ローカル・データベース上のセッションに設定するOracle Streamsタグ。

このパラメータ設定は、NULL以外の場合、比較を作成したCREATE_COMPARISONプロシージャのlocal_converge_tagパラメータより優先されます。

NULLの場合、このパラメータは無視され、比較を作成したCREATE_COMPARISONプロシージャのlocal_converge_tagパラメータが使用されます。

このパラメータに関連したセキュリティ要件の詳細は、「セキュリティ・モデル」を、またタグの詳細は、『Oracle Streamsレプリケーション管理者ガイド』を参照してください。

remote_converge_tag

収束されるデータベース・オブジェクトでデータを収束するための変更を行う前に、リモート・データベース上のセッションに設定するOracle Streamsタグ。

このパラメータ設定は、NULL以外の場合、比較を作成したCREATE_COMPARISONプロシージャのremote_converge_tagパラメータより優先されます。

NULLの場合、このパラメータは無視され、比較を作成したCREATE_COMPARISONプロシージャのremote_converge_tagパラメータが使用されます。

このパラメータに関連したセキュリティ要件の詳細は、「セキュリティ・モデル」を、またタグの詳細は、『Oracle Streamsレプリケーション管理者ガイド』を参照してください。

使用上の注意

収束されるデータベース・オブジェクトのいずれかが読取り専用のマテリアライズド・ビューである場合は、その読取り専用のマテリアライズド・ビューが収束操作で優先されるようにconverge_optionsパラメータを設定する必要があります。CONVERGEプロシージャで読取り専用のマテリアライズド・ビューに対する変更を試行すると、エラーが発生します。

33.7.3 CREATE_COMPARISONプロシージャ

このプロシージャは、比較を作成します。

構文

DBMS_COMPARISON.CREATE_COMPARISON(
   comparison_name      IN  VARCHAR2,
   schema_name          IN  VARCHAR2,
   object_name          IN  VARCHAR2,
   dblink_name          IN  VARCHAR2,
   index_schema_name    IN  VARCHAR2  DEFAULT NULL,
   index_name           IN  VARCHAR2  DEFAULT NULL,
   remote_schema_name   IN  VARCHAR2  DEFAULT NULL,
   remote_object_name   IN  VARCHAR2  DEFAULT NULL,
   comparison_mode      IN  VARCHAR2  DEFAULT CMP_COMPARE_MODE_OBJECT,
   column_list          IN  VARCHAR2  DEFAULT '*',
   scan_mode            IN  VARCHAR2  DEFAULT CMP_SCAN_MODE_FULL,
   scan_percent         IN  NUMBER    DEFAULT NULL,
   null_value           IN  VARCHAR2  DEFAULT CMP_NULL_VALUE_DEF,
   local_converge_tag   IN  RAW       DEFAULT NULL,
   remote_converge_tag  IN  RAW       DEFAULT NULL,
   max_num_buckets      IN  NUMBER    DEFAULT CMP_MAX_NUM_BUCKETS,
   min_rows_in_bucket   IN  NUMBER    DEFAULT CMP_MIN_ROWS_IN_BUCKET);

パラメータ

表33-6 CREATE_COMPARISONプロシージャのパラメータ

パラメータ 説明

comparison_name

比較の名前。

schema_name

比較するローカル・データベース・オブジェクトが含まれているスキーマの名前。

object_name

比較するローカル・データベース・オブジェクトの名前。

dblink_name

リモート・データベースへのデータベース・リンク。リモート・データベースに指定されたデータベース・オブジェクトは、ローカル・データベースのデータベース・オブジェクトと比較されます。

NULLの場合は、ローカル・データベースの2つのデータベース・オブジェクトを比較するように比較が構成されます。この場合、リモート・データベース・オブジェクトを指定するパラメータは、比較の2番目のデータベース・オブジェクトおよび2番目のデータベース・オブジェクトに対する操作に適用されます。たとえば、remote_schema_nameおよびremote_object_nameパラメータを使用して、このプロシージャの2番目のデータベース・オブジェクトを指定します。

index_schema_name

索引が含まれているスキーマの名前。

NULLの場合は、schema_nameパラメータで指定されているスキーマが使用されます。

index_name

索引の名前。

NULLの場合は、比較用の索引列がシステムによって自動的に決定されます。

index_schema_nameパラメータがNULL以外の場合は、index_nameパラメータもNULL以外にする必要があります。そうでない場合は、エラーが発生します。

関連項目: 索引の指定方法の詳細は、「使用上の注意」を参照してください。

remote_schema_name

リモート・データベースのデータベース・オブジェクトが含まれているスキーマの名前。2つのデータベースでスキーマ名が異なる場合は、NULL以外の値を指定します。

NULLの場合は、schema_nameパラメータで指定されているスキーマが使用されます。

remote_object_name

リモート・データベースのデータベース・オブジェクトの名前。2つのデータベースでデータベース・オブジェクト名が異なる場合は、NULL以外の値を指定します。

NULLの場合は、object_nameパラメータで指定されているデータベース・オブジェクトが使用されます。

comparison_mode

デフォルト値のCMP_COMPARE_MODE_OBJECTを指定します。今後のリリースで、モードが追加される可能性があります。

column_list

比較されるデータベース・オブジェクトにすべての列を含めるには、'*'を指定します。

データベース・オブジェクトの列のサブセットを比較するには、チェックする列をカンマで区切ったリストを指定します。リストに含まれていない列は、比較時および収束時に無視されます。

column_listパラメータで必要な列については、「使用上の注意」を参照してください。

scan_mode

CMP_SCAN_MODE_FULLCMP_SCAN_MODE_RANDOMCMP_SCAN_MODE_CYCLICまたはCMP_SCAN_MODE_CUSTOMのいずれか。

CMP_SCAN_MODE_CUSTOMを指定した場合は、index_schema_nameおよびindex_nameパラメータを使用して索引を指定してください。索引を指定すると、COMPAREまたはRECHECKファンクションの実行時に、先頭の索引列に正しいmax_valueおよびmax_valueの値を指定できます。

これらの定数の詳細は、「定数」を参照してください。

scan_percent

scan_modeパラメータがCMP_SCAN_MODE_RANDOMまたはCMP_SCAN_MODE_CYCLICのいずれかに設定されている場合に、比較用にスキャンするデータベース・オブジェクトの割合。これらのscan_mode設定では、0(ゼロ)より大きく、100より小さいNULL以外の値が必要です。

scan_modeパラメータがCMP_SCAN_MODE_FULLに設定されている場合にNULLに設定すると、データベース・オブジェクト全体が比較用にスキャンされます。

scan_modeパラメータがCMP_SCAN_MODE_CUSTOMに設定されている場合にNULLに設定すると、COMPAREファンクションの実行時に比較用にスキャンされるデータベース・オブジェクトの一部が指定されます。

scan_modeパラメータがCMP_SCAN_MODE_FULLまたはCMP_SCAN_MODE_CUSTOMに設定されている場合にNULL以外に設定すると、scan_percentパラメータは無視されます。

注意: scan_percentパラメータがNULL以外に設定されており、比較用の先頭の索引列によってデータベース・オブジェクトの行が均等に配布されない場合は、比較対象のデータベース・オブジェクトの一部が、指定したscan_percentの値より小さくなるか、または大きくなることがあります。DBMS_COMPARISONパッケージの先頭の索引列の索引要件の詳細は、「DBMS_COMPARISONの使用上の注意」を参照してください。

null_value

比較されるデータベース・オブジェクトの各NULLのかわりに使用される値。値を指定するか、またはCMP_NULL_VALUE_DEF定数を使用します。

比較される列にNULLを含めることができる場合は、その列のNULL以外の値とは異なる値をこのパラメータに指定する必要があります。そうしない場合、このパラメータに指定した値を列に表示したときに、行の相違点が検出されないことがあります。

この定数の詳細は、「定数」を参照してください。

local_converge_tag

比較されるデータベース・オブジェクトでデータを収束するための変更を行う前に、ローカル・データベース上のセッションに設定するOracle Streamsタグ。

この比較の結果が収束される際にCONVERGEプロシージャのlocal_converge_tagパラメータがNULL以外である場合は、CONVERGEプロシージャの設定が優先されます。詳細は、「CONVERGEプロシージャ」を参照してください。

タグの詳細は、『Oracle Streamsレプリケーション管理者ガイド』を参照してください。

remote_converge_tag

比較されるデータベース・オブジェクトでデータを収束するための変更を行う前に、リモート・データベース上のセッションに設定するOracle Streamsタグ。

この比較の結果が収束される際にCONVERGEプロシージャのremote_converge_tagパラメータがNULL以外である場合は、CONVERGEプロシージャの設定が優先されます。詳細は、「CONVERGEプロシージャ」を参照してください。

タグの詳細は、『Oracle Streamsレプリケーション管理者ガイド』を参照してください。

max_num_buckets

使用するバケットの最大数を指定します。値を指定するか、またはCMP_MAX_NUM_BUCKETS定数を使用します。この定数の詳細は、「定数」を参照してください。

バケットの詳細は、「概要」を参照してください。

注意: 比較用の索引列がVARCHAR2またはCHAR列の場合は、バケットの数がmax_num_bucketsパラメータに指定された値を超えることがあります。

min_rows_in_bucket

各バケットの行の最小数を指定します。値を指定するか、またはCMP_MIN_ROWS_IN_BUCKET定数を使用します。この定数の詳細は、「定数」を参照してください。

バケットの詳細は、「概要」を参照してください。

使用上の注意

この項では、CREATE_COMPARISONプロシージャの使用上の注意について説明します。

index_schema_nameおよびindex_nameパラメータの使用上の注意

index_schema_nameおよびindex_nameパラメータを使用して比較用の索引を指定すると、指定した索引によって比較の索引列およびその順序付けが決定されます。指定した索引の列の順序によって、比較用の索引列の順序付けが決定されます。したがって、索引の列位置1にある列が比較用の先頭列となります。

索引列およびその順序付けによって、比較用に生成および実行される各SQL文の詳細が影響を受けます。各SQL文に対して、索引を使用するかどうかがオプティマイザによって決定されます。オプティマイザでは、索引の使用の決定時に、使用する特定の索引も決定されます。column_listパラメータに指定された索引が使用される場合も、使用されない場合もあります。

指定した索引の列は、「DBMS_COMPARISONの使用上の注意」に示されている要件を満たしている必要があります。索引列がこれらの要件を満たしていない場合は、エラーが発生します。

注意:

比較の作成時に索引を指定しなかった場合、CREATE_COMPARISONプロシージャは主キー(存在する場合)または既存の一意の索引のいずれかを選択します。このプロシージャが一意でない索引を選択することはありません。ただし、索引を指定した場合、CREATE_COMPARISONプロシージャは索引の一意性をチェックしません。したがって、索引キーが重複して存在する場合に一意でない索引を選択すると、CONVERGEプロシージャでデータを同期化したときに、結果が不適切になる可能性があります。

column_listパラメータの使用上の注意

column_listパラメータを'*'以外の値に設定する場合、column_listパラメータには次の列が必要です。

  • DBMS_COMPARISONパッケージの索引列要件を満たすために必要な列。index_nameパラメータがNULL以外の場合は、指定した索引の列が列リストに含まれている必要があります。index_nameパラメータがNULLの場合は、DBMS_COMPARISON索引要件について、「DBMS_COMPARISONの使用上の注意」を参照してください。

  • CONVERGEプロシージャを使用して、比較に基づいてデータベース・オブジェクトを変更する場合は、NOT NULL制約が含まれ、デフォルト値は含まれていないデータベース・オブジェクト内の列が、列リストに含まれている必要があります。これらの列が含まれていない場合、CONVERGEプロシージャはエラーを戻します。「CONVERGEプロシージャ」を参照してください。

33.7.4 DROP_COMPARISONプロシージャ

このプロシージャは、比較を削除します。

構文

DBMS_COMPARISON.DROP_COMPARISON(
   comparison_name  IN  VARCHAR2);

パラメータ

表33-7 DROP_COMPARISONプロシージャのパラメータ

パラメータ 説明

comparison_name

比較の名前。

33.7.5 PURGE_COMPARISONプロシージャ

このプロシージャは、比較のために、比較結果または比較結果のサブセットをパージします。

注意:

少なくともscan_idまたはpurge_timeパラメータのいずれかをNULLに設定する必要があります。scan_idpurge_timeパラメータの両方をNULLに設定すると、このプロシージャは比較のすべての結果をパージします。

構文

DBMS_COMPARISON.PURGE_COMPARISON(
   comparison_name  IN  VARCHAR2,
   scan_id          IN  NUMBER     DEFAULT NULL,
   purge_time       IN  TIMESTAMP  DEFAULT NULL);

パラメータ

表33-8 PURGE_COMPARISONプロシージャのパラメータ

パラメータ 説明

comparison_name

比較の名前。

scan_id

結果がパージされるスキャンのスキャンID。スキャンIDでルート・スキャンが識別される必要があります。スキャンIDでルート・スキャンが識別されない場合は、エラーが発生します。ルート・スキャンIDが指定されている場合、そのIDはパージされ、指定したルート・スキャンのすべての直接的および間接的な子スキャンもパージされます。

NULLの場合は、比較の結果のパージ時にスキャンIDは考慮されません。

スキャンの詳細は、「概要」を参照してください。

purge_time

この日付より前の結果がパージされます。

NULLの場合は、比較の結果のパージ時に日付は考慮されません。

33.7.6 RECHECKファンクション

このファンクションは、比較のために指定したスキャンで相違点を再チェックします。

このファンクションは、次のいずれかのアクションを実行します。

  • 指定したスキャンが前回実行時に正常に完了していた場合、このファンクションは、スキャンで以前に特定された相違点をチェックします。

  • 指定したスキャンが部分的に完了していた場合、このファンクションは、以前のスキャンが終了した時点からデータベース・オブジェクトのチェックを継続します。

注意:

このファンクションは、指定した比較スキャンに記録されなかった相違点については共有データベース・オブジェクトを比較しません。このような違いを確認するには、COMPAREファンクションを実行します。

構文

DBMS_COMPARISON.RECHECK(
   comparison_name  IN  VARCHAR2,
   scan_id          IN  NUMBER,
   perform_row_dif  IN  BOOLEAN  DEFAULT FALSE)
RETURN BOOLEAN;

パラメータ

表33-9 RECHECKファンクションのパラメータ

パラメータ 説明

comparison_name

比較の名前。

scan_id

再チェックするスキャンのスキャンID。

このパラメータでスキャンIDを指定する方法の詳細は、「概要」を参照してください。

perform_row_dif

TRUEの場合は、比較用の許容最小バケットに達した後、比較対象のデータベース・オブジェクトの各行を別々に比較します。

FALSEの場合は、バケットの相違点を比較します。ただし、許容最小バケット内で相違点が検出された場合、各行の個別比較は行われません。

バケットの詳細は、「概要」を参照してください。

戻り値

このファンクションは、比較対象のデータベース・オブジェクトで相違点が検出されなかった場合はTRUEを戻します。また、比較されるデータベース・オブジェクトで相違点が検出された場合はFALSEを戻します。