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

SQL Anywhere 11.0.1 (Deutsch) » SQL Anywhere Server - SQL-Referenzhandbuch » Verwendung von SQL » SQL-Funktionen » SQL-Funktionen (A-D)

 

CONFLICT-Funktion [Verschiedene]

Zeigt an, ob eine Spalte die Ursache eines Konflikts in einem UPDATE ist, das gegenüber einer konsolidierten Datenbank in einer SQL Remote-Umgebung durchgeführt wird.

Syntax
CONFLICT( Spaltenname )
Parameter
  • Spaltenname   Der Name der Spalte, die auf Konflikte untersucht wird.

Rückgabe

Gibt TRUE zurück, wenn die Spalte in der VERIFY-Liste einer UPDATE-Anweisung angezeigt wird, die vom SQL Remote-Nachrichtenagenten ausgeführt wird, und wenn der in der VALUES-Liste gelieferte Wert dieser Anweisung nicht mit dem ursprünglichen Wert der Spalte in der Zeile übereinstimmt, die aktualisiert wird. Ansonsten wird FALSE zurückgegeben.

Siehe auch
Standards und Kompatibilität
  • SQL/2003   Erweiterung des Herstellers

Beispiel

Die CONFLICT-Funktion ist für die Verwendung in SQL Remote RESOLVE UPDATE-Triggern gedacht, um Fehlermeldungen zu vermeiden. Um die Verwendung der CONFLICT-Funktion zu illustrieren, nehmen wir die folgende Tabelle:

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

Nehmen wir an, dass sowohl konsolidierte als auch entfernte Datenbanken die folgende Zeile in der Admin-Tabelle haben:

1, 'Initial'

Jetzt aktualisieren Sie in der konsolidierten Datenbank die Zeile folgendermaßen:

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

In der entfernten Datenbank altualisieren Sie die Zeile zu einem anderen Wert, und zwar folgendermaßen:

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

Als nächstes führen Sie dbremote in der entfernten Datenbank aus. Es wird eine Meldungsdatei generiert, die die folgenden Anweisungen enthält, die in der konsolidierten Datenbank ausgeführt werden sollen:

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

Wenn der SQL Remote-Nachrichtenagent auf der konsolidierten Datenbank läuft und diese UPDATE-Anweisung anwendet, verwendet SQL Anywhere die VERIFY- und VALUES-Klauseln, um zu ermitteln, ob ein RESOLVE UPDATE-Trigger ausgelöst wird. Ein RESOLVE UPDATE-Trigger wird nur ausgelöst, wenn das Update vom SQL Remote-Nachrichtenagenten gegenüber einer konsolidierten Datenbank ausgeführt wird. Hier ist ein RESOLVE UPDATE-Trigger:

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;

Der RESOLVE UPDATE-Trigger wird ausgelöst, weil der aktuelle Wert der TextCol-Spalte in der konsolidierten Datenbank ('Consolidated Update') nicht mit dem Wert in der VALUES-Klausel für die zugeordnete Spalte ('Initial') übereinstimmt.

Der Trigger führt zu einem Fehlschlag, weil die PKey-Spalte in der UPDATE-Anweisung, die auf der entfernten Datenbank ausgeführt wurde, nicht geändert wurde. Dadurch gibt es keinen OldRemote.PKey-Wert, auf den dieser Trigger zugreifen könnte.

Die CONFLICT-Funktion hilft, diesen Fehler zu vermeiden, indem die folgenden Werte zurückgegeben werden:

  • Wenn es keinen OldRemote.PKey-Wert gibt, wird FALSE zurückgegeben.

  • Wenn es einen OldRemote.PKey-Wert gibt, der aber mit OldConsolidated.PKey übereinstimmt, wird FALSE zurückgegeben.

  • Wenn es einen OldRemote.PKey-Wert gibt, der von OldConsolidated.PKey verschieden ist, wird TRUE zurückgegeben.

Sie können die CONFLICT-Funktion verwenden, um den Trigger neu zu schreiben und den Fehler zu vermeiden:

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;