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 Anywhere サーバ - SQL リファレンス » SQL の使用 » SQL 関数 » SQL 関数 (A ~ D)

 

CONFLICT 関数 [その他]

カラムが、SQL Remote 環境で統合データベースに対して実行される UPDATE の競合の原因であるかどうかを示します。

構文
CONFLICT( column-name )
パラメータ
  • column-name   競合をテストされるカラムの名前。

戻り値

カラムが SQL Remote Message Agent によって実行される UPDATE 文の VERIFY リストにあり、またその文の VALUES リストで提供されている値が更新されるローのカラムの元の値と一致しない場合に TRUE を返します。それ以外の場合は、FALSE を返します。

参照
標準と互換性
  • SQL/2003   ベンダ拡張。

CONFLICT 関数は、エラー・メッセージを回避するために、SQL Remote RESOLVE UPDATE トリガで使用します。CONFLICT 関数の使用法を示すために、次のテーブルについて考えます。

CREATE TABLE Admin (
  PKey bigint NOT NULL DEFAULT GLOBAL AUTOINCREMENT,
  TextCol CHAR(20) NULL, PRIMARY KEY ( PKey ) );

統合データベースとリモート・データベースの両方で、Admin テーブルに次のローがあると想定します。

1, 'Initial'

ここで、統合データベースでローを次のように更新します。

UPDATE Admin SET TextCol = 'Consolidated Update' WHERE PKey = 1;

リモート・データベースで、ローを次のように別の値に更新します。

UPDATE Admin SET TextCol = 'Remote Update' WHERE PKey = 1;

次に、リモート・データベースで dbremote を実行します。これによって、統合データベースで実行される次の文を含むメッセージ・ファイルが生成されます。

UPDATE Admin SET TextCol='Remote Update'
VERIFY ( TextCol )
VALUES ( 'Initial' )
WHERE PKey=1;

SQL Remote Message Agent を統合データベースで実行し、この UPDATE 文を適用すると、SQL Anywhere は、VERIFY 句と VALUES 句を使用して、RESOLVE UPDATE トリガが起動するかどうかを決定します。RESOLVE UPDATE トリガは、統合データベースに対して SQL Remote Message Agent から更新が実行された場合にのみ起動します。次に、RESOLVE UPDATE トリガを示します。

CREATE TRIGGER ResolveUpdateAdmin 
RESOLVE UPDATE ON Admin
REFERENCING OLD AS OldConsolidated
    NEW AS NewRemote 
    REMOTE as OldRemote
FOR EACH ROW BEGIN
  MESSAGE 'OLD';
  MESSAGE OldConsolidated.PKey || ',' || OldConsolidated.TextCol;
  MESSAGE 'NEW';
  MESSAGE NewRemote.PKey || ',' || NewRemote.TextCol;
  MESSAGE 'REMOTE';
  MESSAGE OldRemote.PKey || ',' || OldRemote.TextCol;
END;

統合データベースの TextCol カラムの現在の値 ('Consolidated Update') は、関連付けられているカラムの VALUES 句の値 ('Initial') と一致しないため、RESOLVE UPDATE トリガが起動します。

PKey カラムはリモートで実行された UPDATE 文で修正されず、このトリガからアクセスできる OldRemote.PKey 値がないため、このトリガは失敗します。

CONFLICT 関数は、次の値を返すことによってこのエラーの回避に役立ちます。

  • OldRemote.PKey 値がない場合は、FALSE を返します。

  • OldRemote.PKey 値があっても OldConsolidated.PKey と一致する場合は、FALSE を返します。

  • OldRemote.PKey 値があり、OldConsolidated.PKey と異なる場合は、TRUE を返します。

CONFLICT 関数を使用して、トリガを次のように書き直し、エラーを回避できます。

CREATE TRIGGER ResolveUpdateAdmin
RESOLVE UPDATE ON Admin
REFERENCING OLD AS OldConsolidated
    NEW AS NewRemote
    REMOTE as OldRemote
FOR EACH ROW BEGIN
  message 'OLD';
  message OldConsolidated.PKey || ',' || OldConsolidated.TextCol;
  message 'NEW';
  message NewRemote.PKey || ',' || NewRemote.TextCol;
  message 'REMOTE';
  if CONFLICT( PKey ) then
    message OldRemote.PKey;
  end if;
  if CONFLICT( TextCol ) then
    message OldRemote.TextCol;
  end if;
END;