Click here to view and discuss this page in DocCommentXchange. In the future, you will be sent there automatically.

SQL Anywhere 11.0.1 (日本語) » SQL Remote » SQL Remote のレプリケーション設計 » SQL Remote のレプリケーション設計と設定 » トランザクション・ログ・ベースのレプリケーションの概要

 

トリガのレプリケート

通常、リモート・データベースには、統合データベースに存在するトリガと同じトリガが定義されています。

デフォルトでは、SQL Remote はトリガによって実行される動作をレプリケートしません。代わりに、統合データベースでトリガを起動するアクションが、リモート・データベースにレプリケートされると、その複製トリガはリモート・データベースで自動的に起動します。これによって、パーミッションに関する問題と各動作が 2 回発生する可能性を回避します。この原則には次のような例外があります。

  • RESOLVE UPDATE トリガのレプリケーション   競合解析または RESOLVE UPDATE トリガが実行する動作は、統合データベースから、競合を発生させたメッセージを送信したリモート・データベースを含む、すべてのリモート・データベースにレプリケートされます更新の競合に対するデフォルトの解決を参照してください。

  • BEFORE トリガのレプリケーション   更新中のローを変更する BEFORE トリガの動作は、UPDATE 文が動作する前にレプリケートされます

    たとえば、ローの更新回数を追跡するカウンタ・カラムをロー内で増加させる BEFORE UPDATE トリガは、レプリケートされると 2 回カウントが行われます。これは、UPDATE 文がレプリケートされると、リモート・データベースの BEFORE UPDATE トリガが起動されるためです。

    また、カラムを最終更新時間に設定する BEFORE UPDATE トリガは、UPDATE 文がレプリケートされた時間を取得します。

    この問題を回避するには、サブスクライバ・データベースに BEFORE UPDATE トリガが存在しないこと、または BEFORE UPDATE トリガがレプリケートされた動作を実行しないことを確認してください。

トリガの動作をレプリケートするオプション

メッセージを送信するときにトリガの動作をすべてレプリケートするには、Message Agent (dbremote) の -t オプションを使用します。Message Agent (dbremote)を参照してください。

-t オプションを使用する場合は、トリガの動作がリモート・データベースで 2 回 (レプリケートされたトリガの動作が適用されるときと、リモート・データベースでトリガを起動するとき) 実行されないようにします。

トリガの動作が 2 回実行されないようにするには、次のいずれかのオプションを使用します。

  • トリガの本文を IF CURRENT REMOTE USER IS NULL ... END IF 文で囲みます。

  • SQL Remote ユーザ名に対して、SQL Anywhere の fire_triggers オプションを Off に設定します。fire_triggers オプション [互換性]を参照してください。

トリガ・エラーの回避

パブリケーションにデータベースのサブセットのみが含まれる場合、統合データベースのトリガは、統合データベースには存在し、リモート・データベースには存在しないテーブルやローを参照できます。このようなトリガがリモート・データベースで起動すると、エラーが発生します。こうしたエラーを回避するには、IF 文を使用してトリガの動作を条件付きとし、次の処理を実行します。

  • CURRENT PUBLISHER の値を使用して、条件付きのトリガ・アクションにします。CURRENT PUBLISHER 特別値を参照してください。

  • NULL 値を返さない object_id 関数を使用して、条件付きのトリガ・アクションにします。object_id 関数は、テーブルやその他のオブジェクトを引数として取得し、そのオブジェクトの ID 番号か NULL 値 (オブジェクトが存在しない場合) を返します。システム関数を参照してください。

  • ローが存在するかどうか決定する SELECT 文を使用して、条件付きのトリガ・アクションにします。

抽出ユーティリティ (dbxtract)

デフォルトでは、データベース抽出ユーティリティ (dbxtract) とデータベース抽出ウィザードによってトリガ定義が抽出されます。

参照