トランスフォーメーションでは、ターゲットデータベースにSQL操作を適用する代わりに、PL/SQLプロシージャ(トランスフォーメーションルーチンとして定義)を呼び出すようにPostプロセスに指示します。トランスフォーメーションによって、ターゲットにポストする前に、またはターゲットのポストの代わりにレプリケートされたデータを操作することができます。
例えば、ソース側のテーブルとターゲット側のテーブルの構造が異なる場合は(ある人の姓と名がソース側のテーブルでは1つの列に含まれるが、ターゲット側のテーブルでは別の列にある場合など)、レプリケーションに成功するように、これらの列のデータを変換するトランスフォーメーションルーチンを記述することができます。トランスフォーメーションルーチンを使用してデータ型、測定単位、文字セットを変換することができます。また、I/Oオーバーヘッドを削減するためにデータベースのトリガーの代わりに使用したり、その他多くのビジネス要件に使用したりすることができます。
テーブルにトランスフォーメーションを指定した場合、Postはレプリケートされたデータに対して何も行いません。その代わりに、トランスフォーメーションルーチンにデータ値を渡すため、プロシージャでデータの形式と送信先の両方を制御することができます。ターゲット側のテーブルへのポスト、別の場所へのポスト、またはその両方が可能です。したがって、ルーチンを記述する場合は、プロシージャの中にポストに必要なSQL操作を含める必要があります。
Oracle
Oracle
トランスフォーメーションは、同一の構造やデータの維持を考慮することなく、SharePlexを使用して1つのテーブルから別のテーブルにデータを転送する便利な方法です。このため、レポート作成、ブロードキャスト、データマート、およびウェアハウスの用途に有効です。
トランスフォーメーションは、ピアツーピアや高可用性レプリケーション環境には適していません。高可用性を実現するには、レプリケーションによって同期させた同一のデータベースが必要です。ピアツーピアレプリケーションでは、SharePlexは、同じレコードに同時に変更があった場合にコンフリクトを検出して解決できなければなりません。データが変換されると、SharePlexは同期を検証し、コンフリクトを検出するために前後の値を比較することができません。
トランスフォーメーションでは、INSERT、UPDATE、DELETEの操作のみがサポートされています。プロシージャを開発する際には以下が可能です。
トランスフォーメーションルーチンが個々のテーブルに指定され、そのテーブルが別のルーチンが指定されたテーブルグループの一部でもある場合、関連するDML操作が発生すると、そのテーブルに固有のルーチンだけがそのテーブルに使用されます。
トランスフォーメーションによってデータが変更され、SharePlexはデータをポストしないため、トランスフォーメーションによってレプリケーションの動作が変更されます。これはSharePlex処理のカスタマイズです。トランスフォーメーション手順を確実に成功させるために、トランスフォーメーションを実施する前に以下の考慮事項を確認してください。
トランスフォーメーションのためにPL/PGSQLを通じてアクセスするテーブルには、オブジェクトの所有者からSharePlexに暗黙的に付与された権限が必要です。
PRIMARYまたはUNIQUEキーは、トランスフォーメーションを使用するすべてのテーブルに必要です。SharePlexは、キーを使用してUPDATEとDELETEに対するターゲット側の行を特定します。これにより、UPDATE操作のターゲット側のテーブルからトランスフォーメーションルーチンに値を返すことができます。ターゲットシステムでキーの変更を許可しないでください。許可すると、SharePlexはルーチンに値を渡すための行を特定することができなくなります。
意図したとおりに動作することを確認し、あるルーチンが別のルーチンを打ち消さないことを確認するために、本番稼働環境に投入する前にトランスフォーメーションルーチンをテストしてください。データが変換されると、SharePlexは、ルーチンが正しく機能しているかどうかの指標である同期を検証するために前後の値を比較することができません。同期を確認する唯一の方法は、compareコマンドにkeyオプションを使用することです。このオプションはキーの値だけを比較するもので、同期の完全な確認にはなりません。欠落している行や余分な行を検出するだけです。これは、ターゲットデータが変換されているため、非キー列の値がソース列の値と適切に相関しているかどうかを示すものではありません。
これらの理由から、repairコマンドはデータの再同期には使用できません。再同期の手順は、各企業のビジネスルールとデータベース環境に基づいて独自に考案する必要があります。
SharePlexのトランスフォーメーションのデフォルトの日付形式はMMDDYYYY HH24MISSです。デフォルトの日付を持つテーブルでは、この形式を使用する必要があります。使用しないとトランスフォーメーションでエラーが返されます。デフォルトの日付でテーブルを作成する前に、SQL*Plusで以下のコマンドを使用して日付形式を変更してください。
ALTER SESSION SET nls_date_format = 'MMDDYYYYHH24MISS'
トランスフォーメーションの展開には以下のステップがあります。
トランスフォーメーションルーチンは動的PL/SQLプロシージャ言語で記述します。sp_crという名前のパブリックパッケージで定義されているパラメーター、レコード構造、テーブル構造を使用します。このパッケージは、データベースのSharePlexスキーマにインストールされています。このパッケージでは以下のパラメーターを使用します。
このテンプレートに従ってプロシージャを作成してください。
(table_info in outsplex.sp_cr.row_typ, col_values insplex.sp_cr.col_def_tabtyp) |
ここで:
SharePlexは、SharePlexのデータベーススキーマのsp_crという名前を持つパブリックパッケージのPL/SQLレコードとテーブルの構造を定義します。 このパッケージでは以下のパラメーターを使用します。
CREATE SCHEMA IF NOT EXISTS sp_cr;
CREATE TYPE sp_cr.row_typ AS
(src_host VARCHAR(32),
src_db VARCHAR(32),
src_time VARCHAR(20),
statement_type VARCHAR(6),
source_table VARCHAR(128),
target_table VARCHAR(128),
native_error INTEGER,
sql_state VARCHAR(10)
);
CREATE TYPE sp_cr.col_def_typ AS
(column_name VARCHAR,
datatype VARCHAR,
is_key BOOLEAN,
is_changed BOOLEAN,
old_value VARCHAR ,
new_value VARCHAR
);
CREATE SEQUENCE EXC_SEQ START WITH 1 INCREMENT BY 1 MINVALUE 1 CACHE 20 NO CYCLE ;
行の操作によってコンフリクトが発生するたびに、SharePlexはこのメタデータ情報をプロシージャに渡します。
変数 | 説明 |
---|---|
src_host |
(操作が実行された)ソースシステムの名前。文字と小文字は区別され、例えばSysAのように、ソースシステムと同じ大文字と小文字を使用して渡されます。ターゲットシステム上で名前付きpostキューが使用されている場合、この変数は、例えばpostq1などのpostキューの名前で構成されます。 注: 最大文字数は32文字です。32文字を超えるホスト名は32文字に切り詰められます。 |
src_ora_sid | ソースデータベースのORACLE_SID。大文字と小文字は区別され、oratabファイルまたはV$PARAMETERテーブルと同じ大文字と小文字を使用して渡されます。 |
src_ora_time | ソースREDOログ内の変更レコードのタイムスタンプ。 |
source_rowid | ソース行の行ID。例えば'123456'のように、一重引用符で囲まれたリテラルとして渡されます。 |
target_rowid | ターゲットデータベースの対応する行の行ID。SharePlexは、ターゲットデータベースに問い合わせることで行IDを取得します。例えば'123456'のように、一重引用符で囲まれたリテラルとして渡されます。PRIMARYキーを使用して行が見付からない場合、値はNULLとなります。 |
statement_type | 操作がINSERT、UPDATE、DELETEステートメントのどれであるかを示すI、U、Dのいずれかの文字。 |
source_table | owner.tableで表すソース側のテーブルの所有者と名前。この値では大文字と小文字を区別します。これは、データベースでのテーブルの命名方法と同じです。例えば"scott". "emp"のように、二重引用符で囲んで渡します。 |
target_table | owner.tableで表すターゲット側のテーブルの所有者と名前。この値では大文字と小文字を区別します。これは、データベースでのテーブルの命名方法と同じです。例えば"scott". "emp"のように、二重引用符で囲んで渡します。 |
oracle_err |
これは、プロシージャの使用目的がコンフリクト解決かトランスフォーメーションかによって異なります。 トランスフォーメーション: SharePlexは0の値をこの変数に渡します。この変数はコンフリクトの解決のみに使用されます。 コンフリクト解決: コンフリクトの原因となったOracleのエラー番号。 |
これらの変数は、プロシージャに成功したか失敗したかに基づいてSharePlexのアクションを指示します。
変数 | 説明 |
---|---|
status |
プロシージャが成功したかどうかを定義します。このパラメーターには値を指定する必要があります。
|
action |
希望するSharePlexのアクションを定義します。これは、プロシージャの使用目的がトランスフォーメーションかコンフリクト解決かによって異なります。 トランスフォーメーション: このパラメーターには0の値を指定する必要があります。これは、SQLステートメントをポストしないようにSharePlexに指示します。トランスフォーメーションルーチンは、トランスフォーメーションの結果をターゲット側のテーブルや別のテーブルにポストします。このアクションの結果は、レポート変数に指定した内容によって異なります。 コンフリクト解決: コンフリクト解決プロシージャに失敗した場合に取るべきアクションを指定します。このパラメーターには値を指定する必要があります。
|
reporting |
不成功に終わったプロシージャの結果をSharePlexがどのように報告するかを決定します。このパラメーターには値を指定する必要があります。
|
SharePlexは、レプリケートされた操作ごとにcol_def_tabtyp PL/SQLテーブルを作成します。 このテーブルには列情報が保存されます。これは、プロシージャの使用目的がトランスフォーメーションかコンフリクト解決かによって異なります。
すべてのフィールドはSharePlexによってルーチンに渡されますが、SharePlexが行を見付けられない場合は、すべてのフィールドに値があるとは限りません。
以下はcol_def_tabtypテーブルに入力するために使用するデータ型です。
CREATE SCHEMA IF NOT EXISTS sp_cr;
CREATE TYPE sp_cr.row_typ AS
(src_host VARCHAR(32),
src_db VARCHAR(32),
src_time VARCHAR(20),
statement_type VARCHAR(6),
source_table VARCHAR(128),
target_table VARCHAR(128),
native_error INTEGER,
sql_state VARCHAR(10)
);
CREATE TYPE sp_cr.col_def_typ AS
(column_name VARCHAR,
datatype VARCHAR,
is_key BOOLEAN,
is_changed BOOLEAN,
old_value VARCHAR ,
new_value VARCHAR
);
CREATE SEQUENCE EXC_SEQ START WITH 1 INCREMENT BY 1 MINVALUE 1 CACHE 20 NO CYCLE ;
列 | 説明 |
---|---|
column_name | 例えばemp_last_nameなど、ソース側のテーブルからレプリケートされた列の名前をプロシージャに伝えます。この値では大文字と小文字を区別しません。 |
data type | 例えばVARCHAR2など、レプリケートされた列のデータのデータ型をプロシージャに伝えます。この値は常に大文字です。 |
is_key | 列がキー列であるかどうかをプロシージャに伝えます。キー列の場合、SharePlexはTRUEの値を渡します。列がキーの一部でない場合、SharePlexはFALSEの値を渡します。 |
is_changed |
列の値が変更されたかどうかをプロシージャに伝えます。変更された場合、SharePlexはTRUEの値を渡します。列が変更されない場合、SharePlexはFALSEの値を渡します。
|
old_value |
レプリケートされた列の、ソースシステムで変更される前の古い値をプロシージャに伝えます。INSERTでは、この列はNULLです。これは、INSERTを実行する前にターゲットデータベースに行が存在しなかったためです。 コンフリクト解決のみ: これは、UPDATEとDELETEの同期チェックの一環としてSharePlexがソース列とターゲット列を比較したときの基準となるプリイメージです。SharePlexによって渡された古い値が、ターゲット行から得られたcurrent_valueの値と一致しない場合、コンフリクトが発生します。 |
new_value | ソースシステムで変更された、レプリケートされた列の新しい値をプロシージャに伝えます。 |
current_value | ターゲット側のテーブルの列の現在の値をプロシージャに伝えます。SharePlexがターゲット行を見付けられない場合、値はNULLになります。 |
以下の表は、各操作で起こりうる結果を示しています。
column_name | is_changed | old_value | new_value | current_value1 | is_key |
---|---|---|---|---|---|
C1 | TRUE | NULL | bind | NULL | FALSE |
C2 | TRUE | NULL | bind | NULL | TRUE |
C3 | FALSE | NULL | NULL | NULL | TRUE | FALSE |
1 INSERTが失敗するのは、同じPRIMARYキーを持つ行が既にターゲットデータベースに存在するためです。SharePlexはINSERTの現在の値を返しません。
column_name | is_changed | old_value | new_value | current_value1, 2 | is_key |
---|---|---|---|---|---|
C1 | TRUE | bind | bind | NULL | target_value | FALSE |
C2 | FALSE | bind | NULL | NULL | target_value | TRUE |
C3 | TRUE | bind | bind | NULL | target_value | TRUE |
1(コンフリクト解決)UPDATEが失敗するのは、SharePlexがPRIMARYキーとプリイメージを使用して行を見付けることができないためです。行が見付からない場合、SharePlexはPRIMARYキーのみを使用して行を検索します。SharePlexが行を見付けた場合、変更された列だけでなくキー列の現在の値も返します。SharePlexがPRIMARYキーを使用しただけでは行を見付けられない場合、SharePlexはNULLを返します。
2(トランスフォーメーション)UPDATEの場合、SharePlexはPRIMARYキーとプリイメージを使用して行を検索することはできません。これはトランスフォーメーションによりプリイメージが異なるためです。別の方法として、PRIMARYキーだけを使用して行を検索することもできます。見付かった場合、SharePlexは変更された列だけでなくキー列の現在の値も返します。PRIMARYキーだけでは行を特定できない場合、current_valueはNULLになります。
column_name | is_changed | old_value | new_value | current_value1 | is_key |
---|---|---|---|---|---|
C1 | FALSE | bind | NULL | NULL | TRUE |
1 DELETEが失敗するのは、SharePlexがPRIMARYキーを使用して行を見付けることができなかったためです。したがって、SharePlexはNULLを返します。
SQL操作のポストではなくトランスフォーメーションルーチンの呼び出しをSharePlexに指示するには、transformation.SIDファイルを使用します。ここで、SIDはターゲットデータベースのORACLE_SIDです。SQL操作を実行する前に、Postはこのファイルを読み込んで、呼び出さなければならないトランスフォーメーションルーチンがあるかどうかを判断します。
空白のtransformation.SIDファイルでは、SIDはターゲットインスタンスのORACLE_SIDです。これは、SharePlexのインストール時にSharePlexの変数データディレクトリのdataサブディレクトリに含まれていたものです。ターゲットシステム上のファイルを使用します。
このファイルがない場合は、ASCIIテキストエディタでASCII形式のファイルを作成することができます。名前はtransformation.SIDでなければなりません。ここで、SIDはターゲットインスタンスのORACLE_SIDです。
注: SIDでは大文字と小文字を区別します。
重要: transformation.SIDファイルは、アクティブな設定ごとに1つだけでなければなりません。
以下のテンプレートを使用して、プロシージャを1つ以上のオブジェクトおよび操作のタイプにリンクします。
owner.object | {i | u | d | iud} | owner.procedure |
ここで:
scott.sal | IUD | scott.sal_tr |
like:scott.%\_corp\_emp | IUD | scott.emp_tr1 |
like:scott% | IUD | scott.emp_tr2 |
scott.cust | U | scott.sal_tr |
トランスフォーメーションファイルはレプリケーション中にいつでも変更でき、テーブルやプロシージャを追加したり削除したりできます。ファイルを変更したら、Postプロセスを一旦停止し、再度開始します。
SharePlexは、ローカルシステム上およびネットワーク経由で転送中のレプリケートされたデータを保護するのに役立つ多くのセキュリティ機能を備えています。この章では、これらの機能の設定と使用に関するガイドラインを説明します。
注意: PostgreSQLからPostgreSQLへデータをレプリケートする場合、SharePlexはSSL/TLSによるデータの保護およびエクスポートとインポート間のデータの暗号化セキュリティ機能のみをサポートします。
© ALL RIGHTS RESERVED. 利用規約 プライバシー Cookie Preference Center