Oracle support
==============

LiveCompareを使用して、Oracleデータベースのデータを任意の数のPostgreSQLまたはPGDデータベースと比較できます。

たとえば、データ接続で\ ``technology = oracle``
を定義できます。次に、他の設定を使用してOracleへの接続を定義できます。

- ``host``

- ``port``

- ``service``

- ``user``

- ``password``

他のすべてのデータ接続はPostgreSQLである必要があります。

Oracleへの接続に使用する\ ``user``
には、比較するテーブルからデータを読み取るために必要な特権が必要です。具体的には、これらの権限は\ ``CONNECT``
、\ ``SELECT ANY TABLE`` 、および\ ``SELECT_CATALOG_ROLE``
です。これらは次のコマンドで付与できます。

.. code:: sql

   GRANT CONNECT, SELECT ANY TABLE, SELECT_CATALOG_ROLE TO username;

``username`` は、Oracleへの接続に使用するユーザーです。

次に、OracleデータベースとPostgreSQLデータベースの単純な比較の例を示します。

.. code:: ini

   [General Settings]
   logical_replication_mode = off
   max_parallel_workers = 4
   oracle_user_tables_only = on
   oracle_ignore_unsortable = on
   column_intersection = on
   difference_tie_breakers = oracle

   [Oracle Connection]
   technology = oracle
   host = 127.0.0.1
   port = 1521
   service = XE
   user = LIVE
   password = live

   [Postgres Connection]
   technology = postgresql
   dsn = dbname=liveoracle user=william

   [Output Connection]
   dsn = dbname=liveoutput user=william

   [Table Filter]
   schemas = schema_name = live

ここで、Oracleの\ ``schema_name``
はユーザーテーブルサンドボックスです。すべてのテーブル名はデフォルトでスキーマ修飾されます。

- Postgres ``<schema_name> . <table_name>``

- Oracle ``<user> . <table_name``

``schema_qualified_table_names = off``
を設定することにより、スキーマ修飾テーブル名を無効にできます。これは、\ ``oracle_user_tables_only = on``
の場合にのみ実行できます。この設定は、接続されているOracleユーザーに属するテーブルのみを検索するようにLiveCompareに指示します。スキーマ修飾テーブル名が無効になっている場合、Postgresでは、ロールまたは構成でデフォルトの\ ``search_path``
を設定する必要があります。または、接続 ``start_query``
パラメーターを使用して、適切な\ ``search_path``
を設定できます。たとえば、

.. code:: ini

   [General Settings]
   logical_replication_mode = off
   max_parallel_workers = 4
   oracle_user_tables_only = on
   oracle_ignore_unsortable = on
   column_intersection = on
   difference_tie_breakers = oracle
   schema_qualified_table_names = off

   [Oracle Connection]
   technology = oracle
   host = 127.0.0.1
   port = 1521
   service = XE
   user = LIVE
   password = live

   [Postgres Connection]
   technology = postgresql
   dsn = dbname=liveoracle user=william
   start_query = SET search_path = myschema1, myschema2, public

   [Output Connection]
   dsn = dbname=liveoutput user=william

   [Table Filter]
   tables = table_name in (mytable1, mytable2)

``schema_qualified_table_names = off`` の場合、\ ``Table Filter``
、\ ``Row Filter`` 、および\ ``Column Filter``
で非修飾テーブル名を使用することもできます。

..  Note::
   `Output Connection` は、LiveCompareから進行状況とレポート情報を書き込むために必要です。

PGDデータベースをOracleと比較する必要があり、 ``Initial Connection``
、\ ``node_name`` 、および\ ``replication_sets`` 機能
:ref:`EDB Postgres Distributed support <EDB Postgres Distributed support>` で説明を利用したい場合、次のように最後のデータ接続をOracleにポイントできます。

.. code:: ini

   [General Settings]
   logical_replication_mode = bdr
   max_parallel_workers = 4
   oracle_user_tables_only = on
   oracle_ignore_unsortable = on
   column_intersection = on
   difference_tie_breakers = oracle

   [Initial Connection]
   dsn = port=5432 dbname=live user=postgres

   [BDR Connection]
   node_name = node1

   [Oracle Connection]
   technology = oracle
   host = 127.0.0.1
   port = 1521
   service = XE
   user = LIVE
   password = live

   [Output Connection]
   dsn = port=5432 dbname=liveoutput user=postgres

   [Table Filter]
   replication_sets = set_name = bdrgroup

PGDクラスター全体を単一のOracleデータベースと比較することもできます。たとえば、

.. code:: ini

   [General Settings]
   logical_replication_mode = bdr
   max_parallel_workers = 4
   oracle_user_tables_only = on
   oracle_ignore_unsortable = on
   column_intersection = on
   difference_tie_breakers = oracle
   all_bdr_nodes = on

   [Initial Connection]
   dsn = port=5432 dbname=live user=postgres

   [Oracle Connection]
   technology = oracle
   host = 127.0.0.1
   port = 1521
   service = XE
   user = LIVE
   password = live

   [Output Connection]
   dsn = port=5432 dbname=liveoutput user=postgres

   [Table Filter]
   replication_sets = set_name = bdrgroup

の違い
------

LiveCompareは違いを見つけた場合、PostgreSQL接続にのみ適用するDMLスクリプトを生成します。
Oracle接続に適用するDMLスクリプトは生成されません。

BLOBおよび CLOBデータ型
-----------------------

PostgreSQLの同等のフィールドが\ ``text``
型である場合、LiveCompareはOracleの CLOBフィールドを比較できます。
OracleのBLOBフィールドにも同じことが当てはまります。
PostgreSQLの同等のものは\ ``bytea`` 型です。

ただし、デフォルトでは、LiveCompareはBLOB /
CLOBフィールドが主キーにある場合、またはテーブルに主キーがない場合、BLOB
/
CLOBフィールドを処理しません。その場合、テーブルは無視され、LiveCompareログには次のようなメッセージが記録されます。

::

   ORA-00932: inconsistent datatypes: expected - got BLOB

テーブルに主キーがない場合にBLOB /
CLOBフィールドを無視するようにLiveCompareに指示することにより、この動作をワークアラウンドできます。
``General Settings`` セクションで次の2つの設定を有効にします。

::

   oracle_ignore_unsortable = on
   column_intersection = on

共通ハッシュ
------------

デフォルトでは、PostgreSQLとOracleを比較する場合でも、LiveCompareには\ ``comparison_algorithm = block_hash``
があります。ただし、 *共通ハッシュ* は、次のルールに従って構築されます。

- すべての列値を連結することにより、行はテキストとして完全に表されます。

- Postgres側では、タイムスタンプ、数値、およびbyteaデータ型がOracleを模倣するように処理されます。

- この方法では、完全な行表現が両側でMD5を使用してハッシュされます。

- これにより、\ ``comparison_algorithm`` を\ ``block_hash``
  および\ ``row_hash`` に設定して使用できます。

- ``block_hash``
  の使用時に不一致があった場合、PostgresとPostgresの比較の場合と同様に、LiveCompareは\ ``row_hash``
  に、次に\ ``full_row`` にフォールバックします。

- OracleのBLOB、
  CLOB、およびNCLOBフィールドは、最初の2000文字にのみ制限されています。
  ``comparison_algorithm = full_row`` では、 BLOBおよび
  CLOB全体の比較ができます。

- Oracleでは、完全な行表現の幅が4000文字以下である必要があります。完全な行表現が4000文字を超えている場合、LiveCompareはその特定のテーブルの比較を中止し、次のエラーメッセージがログに追加されます。

::

   ORA-01489: result of string concatenation is too long

以降のLiveCompareバージョンでは、これらの特定のテーブルでの\ ``full_row``
比較にフォールバックします。今のところ、回避策は、
``comparison_algorithm = full_row``
を使用して、これらのテーブルでのみ個別の比較セッションを構成することです。
Oracle
10gでLiveCompareを使用するには、常に\ ``comparison_algorithm = full_row``
設定が必要です。

共通ハッシュは、Oracle 12c以降で\ ``standard_hash``
ファンクションを使用します。 Oracle 11gでは、\ ``standard_hash``
ファンクションを使用できないため、LiveCompareは代わりに\ ``dbms_crypto.hash``
ファンクションを使用しようとします。ただし、Oracle側のユーザーの追加の特権が必要になる場合があります。例

.. code:: sql

   GRANT EXECUTE ON sys.dbms_crypto TO testuser;
