プライマリ・コンテンツに移動
Oracle® Fusion Middleware Oracle DatabaseのためのOracle GoldenGateのインストールおよび構成
12c (12.2.0.1)
E70107-04
目次へ移動
目次

前
次

13.10 Oracle GoldenGateにおける導出オブジェクト名の処理方法

DDL操作には、ベース・オブジェクト名と導出オブジェクト名を含めることができます。ベース・オブジェクトは、データを含むオブジェクトです。導出オブジェクトは、ベース・オブジェクトの一部の属性を継承し、そのオブジェクトに関連する関数を実行するオブジェクトです。ベース・オブジェクトと導出オブジェクトの両方を含むDDL文は、次のとおりです。

  • RENAMEおよびALTER RENAME

  • 索引、シノニムまたはトリガーに対するCREATEおよびDROP

次のDDL文があるとします。

CREATE INDEX hr.indexPayrollDate ON TABLE hr.tabPayroll (payDate);

この場合、表がベース・オブジェクトです。その名前(hr.tabPayroll)がベース名で、MAPPEDスコープでのTABLEまたはMAPによるマッピングの対象です。導出オブジェクトは索引で、その名前(hr.indexPayrollDate)が導出名です。

導出名は、ベース・オブジェクトとは別に、それ自体のTABLEまたはMAP文でマップできます。または、1つのMAP文で両方を処理できます。MAPの場合、ターゲットでの導出オブジェクト名の変換は次のように処理されます。

13.10.1 ベース・オブジェクトに対するMAPはあるが、導出オブジェクトに対するMAPはない場合

MAP文がベース・オブジェクトに存在して、導出オブジェクトに存在しない場合、結果は導出オブジェクトの暗黙的マッピングになります。DDL文にMAPPEDが含まれる場合、Replicatによって、ベース・オブジェクトと同じターゲット・スキーマが導出オブジェクトに付与されます。導出オブジェクトの名前は、ソース文と同じです。たとえば、次のようだとします。

Extract (ソース)

Table hr.tab*;

Replicat (ターゲット)

MAP hr.tab*, TARGET hrBackup.*;

次のソースDDL文があるとします。

CREATE INDEX hr.indexPayrollDate ON TABLE hr.tabPayroll (payDate);

ターゲットでReplicatによって実行されるCREATE INDEX文は次のとおりです。

CREATE INDEX hrBackup.indexPayrollDate ON TABLE hrBackup.tabPayroll (payDate);

暗黙的マッピングのルールは、導出オブジェクトにベース・オブジェクトと同じスキーマを割り当てるという一般的な方法に基づきます。導出オブジェクトの名前がソースの文で完全修飾されていない場合でも、名前が適切に変換されることが保証されます。また、ベース・オブジェクトと同じターゲット・スキーマによって索引が所有される場合、暗黙的マッピングによって、導出オブジェクト名を明示的にマップする必要がなくなります。

13.10.2 MAPがベース・オブジェクトと導出オブジェクトに存在する場合

ベース・オブジェクトに対するMAP文があり、導出オブジェクトに対するものもある場合、結果は明示的マッピングです。DDL文にMAPPEDが含まれる場合、Replicatで独自のTARGET句に従って各オブジェクトのスキーマと名前が変換されます。たとえば、次のようだとします。

Extract (ソース)

TABLE hr.tab*;  TABLE hr.index*;

Replicat (ターゲット)

MAP hr.tab*, TARGET hrBackup.*;MAP hr.index*, TARGET hrIndex.*;

次のソースDDL文があるとします。

CREATE INDEX hr.indexPayrollDate ON TABLE hr.tabPayroll (payDate);

ターゲットでReplicatによって実行されるCREATE INDEX文は次のとおりです。

CREATE INDEX hrIndex.indexPayrollDate ON TABLE hrBackup.tabPayroll (payDate);

ターゲットの索引が、ベース・オブジェクトとは異なるスキーマによって所有される必要がある場合、またはターゲットでの名前がソースの名前と異なる必要がある場合、明示的マッピングを使用します。

13.10.3 MAPが導出オブジェクトに存在してベース・オブジェクトに存在しない場合

MAP文が導出オブジェクトに存在して、ベース・オブジェクトに存在しない場合、Replicatでは、どちらのオブジェクトに対しても名前の変換が行われません。ターゲットのDDL文は、ソースと同じになります。導出オブジェクトをマップするには、次の方法があります。

  • ベース・オブジェクトに明示的MAP文を使用します。

  • 名前の問題がない場合は、ワイルドカードを使用して、ベース・オブジェクトと導出オブジェクトの両方を同じMAP文にマップします。

  • 名前をどのように変換するかに応じて、各オブジェクトのMAP文を作成します。

13.10.4 導出オブジェクトとしての新しい表

次のものから作成された新規の表のOracle GoldenGateによる処理方法について、次に説明します。

  • RENAMEおよびALTER RENAME

  • CREATE TABLE AS SELECT

13.10.4.1 RENAMEおよびALTER TABLE RENAME

RENAMEおよびALTER TABLE RENAME操作では、ベース・オブジェクトは常に新規の表の名前です。次の例において、ベース・オブジェクト名はindex_paydateです。

ALTER TABLE hr.indexPayrollDate RENAME TO index_paydate;

または

RENAME hr.indexPayrollDate TO index_paydate;

導出オブジェクト名はhr.indexPayrollDateです。

13.10.4.2 CREATE TABLE AS SELECT

CREATE TABLE AS SELECT (CTAS)文には、基礎となる任意の数のオブジェクトを参照するSELECT文とINSERT文が含まれます。デフォルトでは、Oracle GoldenGateにより、ターゲット・データベースからAS SELECT句のデータが取得されます。このパラメータを使用して元の挿入を保持するようにCTAS操作を強制できます。

注意:

このため、CTAS (CREATE TABLE AS SELECT)文から作成されるOracle XMLTypeの表はサポートされません。XMLType表の場合、行オブジェクトIDがソースとターゲットの間で一致する必要がありますが、これは、このシナリオでは保持されません。空のCTAS文(新規表にデータを挿入しない)で作成されたXMLType表は適切に保持されません。

また、CTASによるCTASの挿入への応答を可能にするGETCTASDMLパラメータを使用できるため、レプリケーション中にOIDを保持できます。このパラメータは、統合ディクショナリでのみサポートされるため、トレイルを使用するには、ダウンストリームReplicatが12.1.2.1以上である必要があり、そうでないと、相違が生じる場合があります。

ターゲット・データベースにはAS SELECT句のオブジェクトが存在し、その名前がソースのものと同一であることが必要です。

MAP文でOracle GoldenGateは、新規の表の名前(CREATE TABLE name)のみTARGET指定にマップします。AS SELECT句の基になるオブジェクトの名前はマップしません。名前がTARGETの指定に変換されると、データ不整合の原因となるオブジェクトに対する依存性が存在する可能性があります。

次に、ソースのCREATE TABLE AS SELECT文と、この文がOracle GoldenGateによってターゲットにどのようにレプリケートされるかの例を示します。

CREATE TABLE a.tab1 AS SELECT * FROM a.tab2;

ReplicatのMAP文は次のとおりです。

MAP a.tab*, TARGET a.x*;

Replicatによって適用されるターゲットのDDL文は次のとおりです。

CREATE TABLE a.xtab1 AS SELECT * FROM a.tab2;

AS SELECT * FROM句の表名は、ソースと同じtab2のまま(xtab2ではなく)です。

ソースとターゲットで、基礎となるオブジェクトのデータの一貫性を保つには、Oracle GoldenGateによるデータ・レプリケーションに備えて構成します。前述の例では、次の文を使用してこの要件に対応できます。

ソース

TABLE a.tab*;

ターゲット

MAPEXCLUDE a.tab2
MAP a.tab*, TARGET a.x*;
MAP a.tab2, TARGET a.tab2;

「DDL内の修飾されていないオブジェクト名の正しい識別」を参照してください。

13.10.5 導出オブジェクトのマッピングの無効化

NOMAPDERIVEDオプションを指定してDDLOPTIONSパラメータを使用し、これを含むMAP文のTARGET句に従って導出オブジェクトの名前が変換されないようにします。NOMAPDERIVEDによって、ベースまたは導出オブジェクトの名前を含む明示的なMAP文はオーバーライドされます。導出オブジェクトを含むソースDDLは、ソースと同じスキーマとオブジェクト名のターゲットにレプリケートされます。

次の表に、MAP文がベース・オブジェクトのみに対するものか、導出オブジェクトのみに対するものか、両方に対するものかに基づいたMAPDERIVEDの結果を、NOMAPDERIVEDと比較して示します。


表13-2 マッピング構成に基づいた、ターゲットでの[NO]MAPDERIVEDの結果

ベース・オブジェクト 導出オブジェクト MAP/NOMAP DERIVED MAPごとの導出オブジェクトの変換されるか 導出オブジェクトにベース・オブジェクトのスキーマが割り当てられるか

マップされる脚注1

マップされる

MAPDERIVED

はい

いいえ

マップされる

マップされない

MAPDERIVED

いいえ

はい

マップされない

マップされる

MAPDERIVED

いいえ

いいえ

マップされない

マップされない

MAPDERIVED

いいえ

いいえ

マップされる

マップされる

NOMAPDERIVED

いいえ

いいえ

マップされる

マップされない

NOMAPDERIVED

いいえ

いいえ

マップされない

マップされる

NOMAPDERIVED

いいえ

いいえ

マップされない

マップされない

NOMAPDERIVED

いいえ

いいえ


脚注1

「マップされる」とは、MAP文に含まれていることを示しています。

次の例で、MAPDERIVEDの結果をNOMAPDERIVEDと比較して示します。表13-3では、ベース名と導出名の両方がMAPDERIVEDによって変換されるため、ターゲットでトリガーと表の両方がrptによって所有されます。


表13-3 導出オブジェクト名のデフォルト・マッピング(MAPDERIVED)

MAP文 Extractに取得されたソースDDL文 Replicatにより適用されたターゲットDDL文

MAP fin.*, TARGET rpt.*;

CREATE TRIGGER fin.act_trig ON fin.acct;

CREATE TRIGGER rpt.act_trig ON rpt.acct;


表13-4では、NOMAPDERIVEDの使用によって変換が行われないため、トリガーはfinによって所有されます。


表13-4 NOMAPDERIVEDを使用する場合の導出オブジェクト名のマッピング

MAP文 Extractに取得されたソースDDL文 Replicatにより適用されたターゲットDDL文

MAP fin.*, TARGET rpt.*;

CREATE TRIGGER fin.act_trig ON fin.acct;

CREATE TRIGGER fin.act_trig ON rpt.acct;


注意:

RENAME文の場合、新しい表名はベース表の名前とみなされ、古い表名は導出表の名前とみなされます。