Sie schreiben download_delete_cursor-Skripten, um Zeilen aus einer entfernten Datenbank zu löschen. Sie müssen für jede Tabelle der entfernten Datenbank, aus der Sie im Verlauf einer Synchronisation Zeilen löschen möchten, eines dieser Skripten schreiben.
Es ist nicht möglich, Zeilen aus der konsolidierten Datenbank einfach zu löschen, damit sie in den entfernten Datenbanken nicht mehr enthalten sind. Sie müssen die Primärschlüssel für gelöschte Zeilen berücksichtigen und diese Primärschlüssel mit Ihrem download_delete_cursor auswählen. Für die Erreichung dieses Ziels gibt es zwei Methoden:
Logische Löschungen Löschen Sie die Zeile nicht physisch in der konsolidierten Datenbank. Verwenden Sie stattdessen eine Statusspalte, die protokolliert, ob Zeilen gültig sind. Dies vereinfacht den download_delete_cursor. Der download_cursor und andere Anwendungen müssen jedoch möglicherweise geändert werden, um die Statusspalte zu erkennen und zu verwenden. Wenn Sie eine Spalte mit der letzten Änderung verwenden, die den Löschzeitpunkt enthält, und außerdem den letzten Download-Zeitpunkt für die einzelnen entfernten Datenbanken protokollieren, können Sie die Zeile physisch löschen, wenn alle Downloadzeiten der entfernten Datenbanken nach dem Zeitpunkt der Löschung liegen.
Schattentabelle Für jede Tabelle, für die Sie Löschungen verfolgen wollen, erstellen Sie eine Schattentabelle mit zwei Spalten, die den Primärschlüssel für die Tabelle und einen Zeitstempel enthalten. Erstellen Sie einen Trigger, der den Primärschlüssel und den Zeitstempel in die Schattentabelle einfügt, wenn eine Zeile gelöscht wird. Ihr download_delete_cursor kann dann auf diese Schattentabelle zugreifen. Wie bei logischen Löschungen können Sie die Zeile aus der Schattentabelle löschen, wenn alle entfernten Datenbanken die entsprechenden Daten eingelesen haben.
Der MobiLink-Server löscht Zeilen aus der entfernten Datenbank, indem er Primärschlüsselwerte aus der konsolidierten Datenbank auswählt und sie an die entfernte Datenbank weitergibt. Wenn die Werte mit den Werten eines Primärschlüssels in der entfernten Datenbank übereinstimmen, wird die betreffende Zeile gelöscht.
Jedes download_delete_cursor-Skript muss eine SELECT-Anweisung oder einen Aufruf einer gespeicherten Prozedur enthalten, die eine Ergebnismenge zurückgibt. Der MobiLink-Server verwendet diese Anweisung, um einen Cursor in der konsolidierten Datenbank zu definieren.
Diese Anweisung muss alle Spalten auswählen, die mit den Primärschlüsselspalten in der entsprechenden Tabelle der entfernten Datenbank übereinstimmen. Die Spalten in der konsolidierten Datenbank können andere Namen haben als die entsprechenden Spalten in der entfernten Datenbank. Ihre Datentypen müssen jedoch kompatibel sein.
Die Werte müssen dabei genau in der Reihenfolge ausgewählt werden, in der die entsprechenden Spalten der entfernten Datenbank definiert sind. Es handelt sich dabei um die Reihenfolge, in der die Spalten in der CREATE TABLE-Anweisung aufgeführt sind, mit der die Tabelle erstellt wurde, und nicht um die Reihenfolge in der Anweisung zum Definieren des Primärschlüssels.
Wenn Sie einen übergeordneten Datensatz löschen, werden die untergeordneten Datensätze automatisch mitgelöscht.
Weitere Hinweise zum Löschen von untergeordneten Datensätzen finden Sie unter Referenzielle Integrität und Synchronisation.
Jedes download_delete_cursor-Skript muss alle Spaltenwerte auswählen, die im Primärschlüssel der entsprechenden entfernten Tabelle enthalten sind. Das Skript kann zusätzlich auch alle anderen Spalten auswählen. Diese Funktion ist aber eigentlich nur aus Gründen der Kompatibilität zu älteren Clients enthalten. Das Auswählen der zusätzlichen Spalten ist wenig effizient, da der Datenbankserver auf diese Weise mehr Daten abrufen muss. Wenn es sich bei dem Client nicht um eine alte Struktur handelt, werden die zusätzlichen Werte vom MobiLink-Server sofort übergangen. Diese zusätzlichen Werte werden nur auf ältere Clients übertragen.
Wenn MobiLink ein download_delete_cursor-Skript für eine Zeile findet, die nur NULL-Werte enthält, werden alle Daten in der entfernten Tabelle gelöscht. Die Anzahl der NULL-Werte im download_delete_cursor-Skript kann der Anzahl der Primärschlüsselspalten oder der Gesamtzahl der Spalten in der Tabelle entsprechen.
Das folgende download_delete_cursor-SQL-Skript löscht z.B. alle Zeilen in einer Tabelle, in der zwei Primärschlüsselspalten enthalten sind. Dieses Beispiel ist für SQL Anywhere-, Adaptive Server Enterprise- und Microsoft SQL Server-Datenbanken geeignet.
SELECT NULL, NULL |
In konsolidierten IBM DB2 LUW- und Oracle-Datenbanken müssen Sie eine Durchgangstabelle festlegen, um NULL auszuwählen. Bei IBM DB2 LUW 7.1 können Sie die folgende Syntax verwenden:
SELECT NULL, NULL FROM SYSIBM.SYSDUMMY1 |
Bei konsolidierten Oracle-Datenbanken können Sie folgende Syntax verwenden:
SELECT NULL, NULL FROM DUAL |
Folgendes Beispiel ist ein download_delete_cursor-Skript für eine entfernte Tabelle, die Mitarbeiterdaten enthält. Der MobiLink-Server verwendet diese SQL-Anweisung, um den Löschcursor festzulegen. Dieses Skript löscht Informationen über Mitarbeiter, die zur Zeit der Ausführung des Skripts sowohl in der konsolidierten als auch in der entfernten Datenbank vorhanden sind.
SELECT emp_id FROM employee |
Das download_delete_cursor-Skript übernimmt die Parameter last_download und ml_username. Aus dem folgenden Skript ist ersichtlich, wie die einzelnen Parameter eingesetzt werden können, um die Auswahl einzugrenzen.
SELECT order_id FROM ULOrder WHERE last_modified >= {ml s.last_table_download} AND status = 'Approved' AND user_name = {ml s.username} |
Bei einigen konsolidierten Datenbanken müssen Sie unter Umständen Datentypen mithilfe der CAST-Funktion konvertieren. Weitere Hinweise finden Sie unter CAST-Funktion [Datentypkonvertierung].
Diese Beispiele sind in einer Organisation mit vielen Mitarbeitern unter Umständen nicht effizient. Sie können den Löschvorgang effizienter gestalten, indem Sie nur die Zeilen auswählen, die auch in der entfernten Datenbank vorhanden sein könnten. Sie können zum Beispiel die Anzahl der Zeilen begrenzen, indem Sie nur die Personen auswählen, die kürzlich einem neuen Manager zugeteilt wurden. Eine andere Strategie besteht darin, der Clientanwendung zu gestatten, selbst die Zeilen zu löschen. Allerdings ist dies nur dann möglich, wenn die nicht benötigten Zeilen durch eine Regel bestimmt werden. Zeilen können zum Beispiel einen Zeitstempel mit einem Ablaufdatum enthalten. Bevor Sie die Zeilen löschen, verwenden Sie die Anweisung STOP SYNCHRONIZATION DELETE, um zu verhindern, dass die Löschvorgänge bei der nächsten Synchronisation übertragen werden. Führen Sie START SYNCHRONIZATION DELETE sofort anschließend aus, wenn andere Löschungen auf die normale Weise synchronisiert werden sollen.
Das download_delete_cursor-Skript muss Primärschlüsselspalten in derselben Reihenfolge enthalten, in der sie in der entfernten Datenbank festgelegt sind.
Sie können die in allen UltraLite-Anwendungen integrierte Prüfung der referenziellen Integrität verwenden, um Zeilen effizient zu löschen. Weitere Hinweise finden Sie unter Referenzielle Integrität und Synchronisation.
Weitere Hinweise zur Verwendung von download_delete_cursor-Skripten finden Sie unter:
Kommentieren Sie diese Seite in DocCommentXchange. Senden Sie uns Feedback über diese Seite via E-Mail. |
Copyright © 2009, iAnywhere Solutions, Inc. - SQL Anywhere 11.0.1 |