通常、リモート・データベースには、統合データベースに存在するトリガと同じトリガが定義されています。
デフォルトでは、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) とデータベース抽出ウィザードによってトリガ定義が抽出されます。
Copyright © 2009, iAnywhere Solutions, Inc. - SQL Anywhere 11.0.1 |