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) » MobiLink - Serveradministration » MobiLink-Servertechnologie verwenden » Synchronisationsmethoden » Konfliktbehandlung » Konflikte auflösen

 

Konflikte mit den resolve_conflict-Skripten lösen

Wenn der MobiLink-Server bei einem upload_fetch-Skript einen Konflikt entdeckt, kommt es zu folgenden Ereignissen.

  • Der MobiLink-Server fügt alte Zeilenwerte ein, die mithilfe des im upload_old_row_insert-Skript definierten Cursors aus der entfernten Datenbank eingelesen wurden. Gewöhnlich werden die alten Werte in eine temporäre Tabelle eingefügt.

    Weitere Hinweise finden Sie unter upload_old_row_insert (Tabellenereignis).

  • Der MobiLink-Server fügt die neuen Zeilenwerte ein, die mithilfe des im upload_new_row_insert-Skript definierten Cursors aus der entfernten Datenbank eingelesen wurden. Gewöhnlich werden die neuen Werte in eine temporäre Tabelle eingefügt.

    Weitere Hinweise finden Sie unter upload_new_row_insert (Tabellenereignis).

  • Der MobiLink-Server führt das resolve_conflict-Skript aus. In diesem Skript können Sie eine gespeicherte Prozedur aufrufen oder eine Sequenz von Schritten festlegen, um den Konflikt mithilfe der neuen und alten Zeilenwerte zu lösen.

Weitere Hinweise finden Sie unter resolve_conflict (Tabellenereignis).

Beispiel

Im folgenden Beispiel erstellen Sie Skripten für sechs Ereignisse und erstellen dann eine gespeicherte Prozedur.

  • Im Skript begin_synchronization erstellen Sie zwei temporäre Tabellen namens contact_new und contact_old. (Sie können dies auch im Skript begin_connection vornehmen.)

  • Das Skript upload_fetch erkennt den Konflikt.

  • Liegt ein Konflikt vor, füllen Sie in den Skripten upload_old_row_insert und upload_new_row_insert die beiden temporären Tabellen mit neuen und alten Daten, die aus der entfernten Datenbank übertragen wurden.

  • Das Skript resolve_conflict ruft die gespeicherte Prozedur MLResolveContactConflict auf, um den Konflikt zu lösen.

Ereignis Skript
begin_synchronization
CREATE TABLE #contact_new( 
   id  INTEGER,
   location CHAR(36),
   contact_date DATE);
CREATE TABLE #contact_old(
   id  INTEGER,
   location CHAR(36),
   contact_date DATE)
upload_fetch
SELECT id, location, contact_date
   FROM contact
   WHERE id = {ml r.id}
upload_old_row_insert
INSERT INTO #contact_new( id, location, contact_date ) 
  VALUES ( {ml r.id}, {ml r.location}, {ml r.contact_date} )
upload_new_row_insert
INSERT INTO #contact_old( id, location, contact_date )
  VALUES ( {ml r.id}, {ml r.location}, {ml r.contact_date} )
resolve_conflict
CALL MLResolveContactConflict( )
end_synchronization
DROP TABLE #contact_new;
DROP TABLE #contact_old

Die gespeicherte Prozedur MLResolveContactConflict lautet folgendermaßen:

CREATE PROCEDURE MLResolveContactConflict( )
BEGIN
  --update the consolidated database only if the new contact date
  --is later than the existing contact date
  UPDATE contact c
    SET c.contact_date = cn.contact_date
      FROM #contact_new cn
      WHERE c.id = cn.id
        AND cn.contact_date > c.contact_date;
  --cleanup
  DELETE FROM #contact_new;
  DELETE FROM #contact_old;
END