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 » Zeilen auf entfernte Datenbanken verteilen

 

Verteilung mit Überlappungen

Einige Tabellen in Ihrer Datenbank können Zeilen enthalten, die zu mehreren entfernten Datenbanken gehören. Jede entfernte Datenbank enthält eine Teilmenge der Zeilen in der konsolidierten Datenbank und diese Teilmenge überlappt mit anderen entfernten Datenbanken. Dies ist häufig bei Kundentabellen der Fall. Im vorliegenden Beispiel besteht eine Viele-zu-Viele-Beziehung zwischen der Tabelle und den entfernten Datenbanken, und es gibt gewöhnlich eine Tabelle, die diese Beziehung repräsentiert. Die Skripten für die Ereignisse download_cursor und download_delete_cursor müssen die per Download in die Beziehungstabelle zu übertragende Tabelle durch einen Join verknüpfen.

Beispiel

Die Beispielanwendung CustDB verwendet diese Methode für die Tabelle ULOrder. Die Tabelle ULEmpCust enthält die Informationen der Viele-zu-Viele-Beziehung zwischen ULCustomer und ULEmployee.

Jede einzelne entfernte Datenbank empfängt nur die Zeilen aus der Tabelle ULOrder, für die der Wert in der Spalte emp_id mit dem MobiLink-Benutzernamen übereinstimmt.

In der Version von SQL Anywhere sieht das download_cursor-Skript für ULOrder der Anwendung CustDB folgendermaßen aus:

SELECT o.order_id, o.cust_id, o.prod_id,
   o.emp_id, o.disc, o.quant, o.notes, o.status
FROM ULOrder o , ULEmpCust ec
WHERE o.cust_id = ec.cust_id
 AND ec.emp_id = {ml s.username}
 AND ( o.last_modified >= {ml s.last_table_download}
  OR ec.last_modified >= {ml s.last_table_download})
 AND  ( o.status IS NULL
  OR o.status != 'Approved' )
 AND ( ec.action IS NULL )

Dieses Skript ist relativ komplex. Es veranschaulicht, dass die Abfrage, die eine Tabelle in der entfernten Datenbank definiert, mehrere Tabellen in der konsolidierten Datenbank einbeziehen kann. Das Skript liest alle Zeilen von ULOrder ein, für die Folgendes gilt:

  • Die Spalte cust_id in ULOrder stimmt mit der Spalte cust_id in ULEmpCust überein.

  • Die Spalte emp_id in ULEmpCust stimmt mit dem Benutzernamen für die Synchronisation überein.

  • Die letzte Änderung der Reihenfolge oder der Mitarbeiter-Kundenbeziehung fand später statt als zum Zeitpunkt der letzten Synchronisation des Benutzers.

  • Der Status ist alles andere als Approved (Genehmigt).

Die Aktionsspalte von ULEmpCust dient dazu, Spalten für Löschvorgänge zu kennzeichnen. Ihr Zweck ist für das aktuelle Thema nicht von Bedeutung.

Das download_delete_cursor-Skript sieht folgendermaßen aus:

SELECT o.order_id
FROM ULOrder o, ULEmpCust ec
WHERE o.cust_id = ec.cust_id
  AND ec.emp_id = {ml s.username}
  AND ( o.last_modified >= {ml s.last_table_download} OR
        c.last_modified >= {ml s.last_table_download} )
  AND ( o.status IS NULL OR
        o.status != 'Approved' )
  AND ( ec.action IS NULL )

Dieses Skript löscht alle Zeilen mit dem Status Approved (Genehmigt) aus der entfernten Datenbank.