オラクル出版社の設計上の考慮事項と制限

適用対象:SQL Server

Oracleデータベースからの公開は、Microsoft SQL Server データベースからの公開とほぼ同じ仕組みです。 ただし、以下の制限や問題点に注意してください。

  • Oracle GatewayオプションはOracle Completeよりも優れたパフォーマンスを提供します。 ただし、Oracle Gatewayオプションを使って同じテーブルを複数のトランザクション出版物に公開することはできません。 テーブルは1つのトランザクション出版物にのみ現れることができますが、任意の数のスナップショット出版物に現れることができます。 複数のトランザクション パブリケーションで同じテーブルをパブリッシュする必要がある場合は、[Oracle (完全)] を選択します。

  • レプリケーションでは、テーブル、インデックス、および具体化されたビューのパブリッシュをサポートしています。 他の物体を再現することはありません。

  • OracleとSQL Serverのデータベースにおけるデータの保存や処理の細かな違いがレプリケーションに影響を与えます。

  • Oracle Publisherを使う場合、トランザクションレプリケーション機能のサポート方法には違いがあります。

Oracleによるオブジェクト公開のサポート

レプリケーションでは、Oracle データベースからの以下のオブジェクトのレプリケートをサポートしています。

  • テーブル

  • 索引構成テーブル

  • インデックス

  • マテリアル化されたビュー(表として再現)

以下のオブジェクトは公開されたテーブル上に存在できますが、複製されません:

  • ドメイン ベースのインデックス

  • 関数ベースのインデックス

  • 既定

  • CHECK 制約

  • 外部キー

  • ストレージオプション(テーブルスペース、クラスタなど)

以下のオブジェクトは複製できません:

  • 入れ子になったテーブル

  • ビュー

  • パッケージ、パッケージ本体、プロシージャ、およびトリガー

  • キュー

  • シーケンス

  • 類義語

サポートされるデータ型の詳細については、「Oracle パブリッシャーのデータ型マッピング」を参照してください。

Oracle と SQL Server の違い

  • Oracle では、一部のオブジェクトに対する最大サイズ制限が異なります。 Oracleの出版データベースで作成するオブジェクトは、SQL Serverで対応するオブジェクトの最大サイズ制限に従う必要があります。 SQL Server の制限について詳しくは、「SQL Server の最大容量仕様」をご覧ください。

  • デフォルトでは、Oracleは大文字でオブジェクト名を作成します。 Oracleのデータベース上で大文字であれば、SQL Serverディストリビューター経由で公開する際には、Oracleオブジェクト名を大文字で記載することを必ずしてください。 正しいケースでオブジェクトを指定しない場合、オブジェクトが見つからないというエラーメッセージが表示されることがあります。

  • OracleはSQL Serverとはやや異なるSQL方言を使用しています。行フィルターはOracle準正の構文で書きます。

大きな物体に対する考慮事項

記事ログテーブルは大きなオブジェクト(LOB)データを保存しません。 LOBデータの更新は常に公開されたテーブルから直接取得されます。 更新がトランザクション パブリケーションでレプリケートされるのは、LOB に影響を与える操作により、レプリケートされたテーブルでレプリケーション トリガーが起動される場合に限られます。 オラクルトリガーは、LOBを含む行を挿入または削除したときに発動します。 ただし、LOB列の更新はトリガーを発動しません。 LOB列への更新は、同じ行の非LOB列が同じOracleトランザクション内で更新された場合にのみ即座に複製されます。 そうでない場合、同じ行の非 LOB 列が次に更新されるときに、LOB 列はサブスクライバーで再読み込みされます。 アプリケーションでこの動作を許容できることを確認してください。

トランザクション パブリケーションで LOB の列への更新をレプリケートするには、アプリケーションを記述するときに、次のいずれかの方法を検討してください。

  • 行を更新する代わりに、トランザクション内でその行を削除して再挿入してください。行を再挿入する際に、新しいLOBを指定してください。 削除と挿入の両方のファイアトリガーがあるため、その行は複製されます。

  • LOB の列に加え、LOB ではない列を行の更新に含めるか、同じ Oracle トランザクションの一部として、その行の LOB ではない列を更新します。 どちらの場合でも、LOB ではない列の更新により、トリガーが起動します。

LOB の詳細については、「Oracle パブリッシャーのデータ型マッピング」を参照してください。

一意なインデックスと制約

スナップショット複製およびトランザクションレプリケーションの両方において、一意インデックスおよび制約(主キー制約を含む)の列は一定の制約に従う必要があります。 これらの制限を守らなければ、制約やインデックスは複製されません。

  • SQL Serverでは最大16列までインデックスを含めることができます。

  • ユニーク制約のすべての列はサポートされたデータ型でなければなりません。 データ型の詳細については、「Oracle パブリッシャーのデータ型マッピング」をご覧ください。

  • すべての列を一意の制約で公開しなければなりません(フィルタリングはできません)。

  • ユニークな制約やインデックスの列はnullであってはいけません。

以下の問題についても考慮に入れてください。

  • Oracle および SQL Server は、NULL の扱いが異なります。Oracle では、NULL を許容する列に NULL 値が指定された複数の行を許可し、一意の制約またはインデックスに含めることができます。 SQL Server では一意性が強制され、同じ列に NULL 値のある行は 1 行だけ許可されます。 NULLを許可する一意制約やインデックスを公開することはできません。なぜなら、公開されたテーブルにインデックスや制約に含まれる列のいずれかに対して複数の行がNULLである場合、サブスクライバーで制約違反が発生するからです。

  • 一意性をテストする際、SQL Serverはフィールド内の後尾の空欄を無視しますが、Oracleはそうしません。

SQL Serverのトランザクションレプリケーションと同様に、Oracleトランザクション出版物のテーブルもプライマリキーを必要とします。 主鍵は前述のルールに基づいて一意でなければなりません。 主キーがこれらのルールに従わなければ、トランザクションレプリケーションのためにテーブルを公開できません。

Oracle パブリッシングと標準的なトランザクション レプリケーションの違い

  • Oracle パブリッシャーは、SQL Server ディストリビューター、そのディストリビューターを使用する任意の パブリッシャー、またはパブリケーションを受信する任意のサブスクライバーと同じ名前にすることはできません。 同じディストリビューターによって処理される各パブリケーションには、一意の名前を付ける必要があります。

  • Oracle パブリケーションでパブリッシュされたテーブルは、レプリケートされたデータを受信することはできません。 したがって Oracle パブリッシングでは、即時更新サブスクリプションまたはキュー更新サブスクリプションを使用したパブリケーション、およびピア ツー ピア レプリケーションや双方向レプリケーションなど、パブリケーション テーブルがサブスクリプション テーブルとしても機能するトポロジはサポートしていません。

  • Oracle データベースでの主キーから外部キーのリレーションシップは、サブスクライバーにレプリケートされません。 ただし、変更が配信されると、リレーションシップはデータに保持されます。

  • 標準的なトランザクション パブリケーションは、最大 1000 列のテーブルをサポートします。 Oracle のトランザクション パブリケーションがサポートするのは 995 列です (レプリケーションにより、パブリッシュされた各テーブルに 5 列が追加されます)。

  • COLLATE 句は、CREATE TABLE ステートメントに追加され、大文字と小文字を区別する比較を有効にします。この比較は、主キーおよび一意の制約にとって重要です。 この動作は、@schema_option の パラメーターで指定するスキーマ オプション 0x1000 によって制御されます。

  • ストアド プロシージャを使用して Oracle パブリッシャーを構成またはメンテナンスする場合、プロシージャを明示的なトランザクションに入れないでください。 これは Oracle パブリッシャーへの接続に使用するリンク サーバーではサポートされていません。

  • ウィザードにより Oracle パブリケーションに対するプル サブスクリプションを作成する場合は、 SQL Server 2005 (9.x) 以降で提供されたサブスクリプションの新規作成ウィザードを使用する必要があります。 より古い SQL Server のバージョンの場合でも、ストアド プロシージャおよび SQL-DMO インターフェイスを使用して、Oracle パブリケーションに対するプル サブスクリプションを設定できます。

  • ストアド プロシージャを使用して、サブスクライバーに変更を反映する場合 (既定)、MCALL 構文はサポートされていても、Oracle パブリッシャーからのパブリケーションである場合は、異なる動作をすることに注意してください。 通常、MCALL では、パブリッシャーで更新された列を示すビットマップを提供します。 Oracle パブリケーションの場合、ビットマップは常にすべての列が更新されたことを示しています。 ストアド プロシージャの使用に関する詳細については、「トランザクション アーティクルに変更を反映する方法の指定」を参照してください。

トランザクションレプリケーション機能のサポート

  • Oracleの出版物はSQL Serverの出版物がサポートするすべてのスキーマオプションをサポートしていません。 スキーマ オプションの詳細については、「sp_addarticle (Transact-SQL)」を参照してください。

  • Oracle出版物の購読者は即時更新やキュー更新サブスクリプションを利用できず、ピアツーピアや双方向トポロジーのノードにもなれません。

  • Oracleの出版物の購読者はバックアップから自動的に初期化できません。

  • SQL Server では、バイナリと行数の 2 種類の検証をサポートしています。 Oracle パブリッシャーでは、行数検証をサポートしています。 詳細については、「レプリケートされたデータの検証」 を参照してください。

  • SQL Server には、ネイティブ bcp モードと文字モードの 2 種類のスナップショット形式が用意されています。 Oracle パブリッシャーでは、キャラクター モード スナップショットをサポートしています。

  • 公開されたOracleテーブルへのスキーマ変更はサポートされていません。 スキーマ変更を行うには、まずパブリケーションを削除し、変更を行ってから、パブリケーションおよびサブスクリプションを再作成します。

    注

    スキーマを変更し、公開テーブルで活動が起きていないときに出版とサブスクリプションを削除・再作成した場合、サブスクリプションのオプション replication support only を指定することができます。 このオプションは各サブスクライバーにスナップショットをコピーせずに同期させます。 詳細については、「 スナップショットを使用しないトランザクション サブスクリプションの初期化を使用して、サブスクリプションを手動で初期化する方法について説明します。

複製セキュリティモデル

Oracleのパブリッシングにおけるレプリケーションセキュリティモデルは、標準的なトランザクションレプリケーションのセキュリティモデルと同じですが、以下の例外があります。

  • スナップショット エージェントとLog Reader AgentがディストリビューターからPublisherへの接続を以下のいずれかの方法で行うアカウントを指定します:

    • @security_modeパラメータsp_adddistpublisher(Transact-SQL)(Oracle 認証が使用されている場合は@loginおよび@passwordの値を指定します)

    • SQL Server Management Studioの「Connect to Server」ダイアログボックスで、SQL Server DistributorでOracle Publisherを設定する際に使います。

    標準的なトランザクションレプリケーションでは、アカウントを sp_addpublication_snapshot(Transact-SQL) と sp_addlogreader_agent(Transact-SQL)で指定します。

  • スナップショット エージェントとLog Reader Agentが接続するアカウントは、sp_changedistpublisher(Transact-SQL)やプロパティシートを通じて変更できませんが、パスワードは変更できます。

  • @security_mode の パラメーターに値 1 (Windows 統合認証) を指定する場合:

    • スナップショット エージェントとログ リーダー エージェントの両方で使用されるプロセス アカウントおよびパスワード (@job_login および @job_password の パラメーターおよび パラメーター) は、Oracle パブリッシャーへの接続に使用されるアカウントおよびパスワードと同じである必要があります。

    • @job_loginパラメータはsp_changepublication_snapshot(Transact-SQL)やsp_changelogreader_agent(Transact-SQL)では変更できませんが、パスワードは変更できます。

レプリケーションのセキュリティの詳細については、「レプリケーションのセキュリティ設定の表示および変更」を参照してください。