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 函数 [Miscellaneous]

指示一个列是否是在 SQL Remote 环境下统一数据库中执行的 UPDATE 操作的冲突溯源。

语法
CONFLICT( column-name )
参数
  • column-name   要测试是否冲突的列的名称。

返回值

如果列出现在 SQL Remote 消息代理执行的 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 消息代理在统一数据库中运行并应用此 UPDATE 语句时,SQL Anywhere 会使用 VERIFY 和 VALUES 子句来确定是否将会触发 RESOLVE UPDATE 触发器。RESOLVE UPDATE 触发器仅当从 SQL Remote 消息代理中执行对统一数据库的更新时才会被触发。以下是一个 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;