Dieses Beispiel implementiert den dateibasierten Download für die zeitstempelbasierte Synchronisation. Es werden die drei Datenbanken eingerichtet, und anschließend wird erläutert, wie die Daten per Datei heruntergeladen werden. Sie können entweder das Beispiel einfach durchlesen oder den Text ausschneiden und einfügen, um das Beispiel auszuführen.
Die folgenden Befehle erstellen die drei in dem Beispiel verwendeten Datenbanken, nämlich eine konsolidierte Datenbank, eine entfernte Datenbank und eine Dateidefinitionsdatenbank.
dbinit tcons.db dbinit tremote.db dbinit tfdef.db |
Die folgenden Befehle starten die drei Datenbanken und erstellen einen Datenquellennamen, den MobiLink verwendet, um sich mit der konsolidierten Datenbank zu verbinden.
dbeng11 -n tfdef_eng tfdef.db dbeng11 -n tcons_eng tcons.db dbeng11 -n tremote_eng tremote.db dbdsn -y -w tfbd_demo -c "eng=tcons_eng;dbf=tcons.db;uid=DBA; pwd=sql;astart=off;astop=off" |
Öffnen Sie Interactive SQL, stellen Sie eine Verbindung mit tcons.db her, und führen Sie das MobiLink-Setupskript aus. Zum Beispiel:
read "c:\Programme\SQL Anywhere 11\MobiLink\setup\syncsa.sql" |
Starten Sie den MobiLink-Server.
start mlsrv11 -v+ -c "dsn=tfbd_demo" -zu+ -ot tcons.txt |
In diesem Beispiel enthält die konsolidierte Datenbank eine einzige Tabelle namens T1. Nach der Verbindungserstellung zur konsolidierten Datenbank können Sie folgenden Code ausführen, um Tabelle T1 zu erstellen:
CREATE TABLE T1 ( pk INTEGER PRIMARY KEY, c1 INTEGER, last_modified TIMESTAMP DEFAULT TIMESTAMP ); |
Der folgende Code legt eine Skriptversion namens normal; mit einer minimalen Anzahl von Skripten fest. Diese Skriptversion wird für Synchronisationen verwendet, die keinen dateibasierten Download verwenden.
CALL ml_add_table_script( 'normal', 'T1', 'upload_insert', 'INSERT INTO T1( pk, c1) VALUES( {ml r.pk}, {ml r.c1} )' ); CALL ml_add_table_script( 'normal', 'T1', 'upload_update', 'UPDATE T1 SET c1 = {ml r.c1} WHERE pk = {ml r.pk} ' ); CALL ml_add_table_script( 'normal', 'T1', 'upload_delete', 'DELETE FROM T1 WHERE pk = {ml r.pk}' ); CALL ml_add_table_script( 'normal', 'T1', 'download_cursor', 'SELECT pk, c1 FROM T1 WHERE last_modified >= {ml s.last_table_download}' ); |
Der folgende Code setzt die Generierungsnummer für alle Subskriptionen auf 1. Es wird empfohlen, Generierungsnummern zu verwenden, falls Ihre konsolidierte Datenbank verloren geht oder beschädigt wird und Sie einen Upload durchführen müssen.
CREATE PROCEDURE begin_pub ( INOUT generation_num integer, IN username varchar(128), IN pubname varchar(128) ) BEGIN SET generation_num = 1; END; CALL ml_add_connection_script( 'normal', 'begin_publication', '{ call begin_pub( {ml s.generation_number}, {ml s.username}, {ml s.publication_name}, {ml s.last_publication_upload}, {ml s.last_publication_download} ) }' ); COMMIT; |
Der folgende Code legt die Skriptversion namens "filebased" fest. Diese Skriptversion wird für die Erstellung dateibasierter Downloads verwendet.
CALL ml_add_connection_script( 'filebased', 'begin_publication', '{ call begin_pub( {ml s.generation_number}, {ml s.username}, {ml s.publication_name} ) }' ); CALL ml_add_table_script( 'filebased', 'T1', 'download_cursor', 'SELECT pk, c1 FROM T1 WHERE last_modified >= {ml s.last_table_download}' ); |
Der folgende Code legt die letzte Downloadzeit fest, sodass alle Änderungen, die innerhalb der letzten fünf Tage vorgenommen wurden, in Download-Dateien einbezogen werden. Jede entfernte Datenbank, die keine der in den letzten fünf Tagen erstellten Download-Dateien übernommen hat, muss eine normale Synchronisation ausführen, bevor sie weitere dateibasierte Downloads übernehmen kann.
CREATE PROCEDURE ModifyLastDownloadTimestamp( INOUT last_download_timestamp TIMESTAMP, IN ml_username VARCHAR(128) ) BEGIN SELECT dateadd( day, -5, CURRENT TIMESTAMP ) INTO last_download_timestamp; END; CALL ml_add_connection_script( 'filebased', 'modify_last_download_timestamp', 'CALL ModifyLastDownloadTimestamp( {ml s.last_download}, {ml s.username} )' ); COMMIT; |
In diesem Beispiel enthält die entfernte Datenbank eine einzige Tabelle namens T1. Wenn Sie eine Verbindung zur entfernten Datenbank hergestellt haben, führen Sie den folgenden Code aus, um die Tabelle T1, eine Publikation namens P1 und einen Benutzer namens U1 zu erstellen. Der Code erstellt außerdem für U1 eine Subskription von P1.
CREATE TABLE T1 ( pk INTEGER PRIMARY KEY, c1 INTEGER ); CREATE PUBLICATION P1 ( TABLE T1 ); CREATE SYNCHRONIZATION USER U1; CREATE SYNCHRONIZATION SUBSCRIPTION TO P1 FOR U1; |
Der folgende Code definiert die gespeicherte Prozedur sp_hook_dbmlsync_validate_download_file. Diese gespeicherte Prozedur verhindert, dass Download-Dateien übernommen werden, in denen die Zeichenfolge OK nicht enthalten ist.
CREATE PROCEDURE sp_hook_dbmlsync_validate_download_file() BEGIN DECLARE udata varchar(256); SELECT value INTO udata FROM #hook_dict WHERE name = 'user data'; IF udata <> 'ok' THEN UPDATE #hook_dict SET value = 'FALSE' WHERE name = 'apply file'; END IF; END |
Der folgende Code definiert die Dateidefinitionsdatenbank für das Zeitstempelbeispiel. Er erstellt eine Tabelle, eine Publikation, einen Benutzer und eine Publikationssubskription für den Benutzer.
CREATE TABLE T1 ( pk INTEGER PRIMARY KEY, c1 INTEGER ); CREATE PUBLICATION P1 ( TABLE T1 ); CREATE SYNCHRONIZATION USER G1; CREATE SYNCHRONIZATION SUBSCRIPTION TO P1 FOR G1; |
Sie müssen Ihre neue entfernte Datenbank für die Übernahme einer Download-Datei vorbereiten, indem Sie entweder eine normale Synchronisation ausführen oder die Download-Datei mit der dbmlsync-Option -bg erstellen. Dieses Beispiel veranschaulicht die Verwendung von -bg.
Der folgende Code definiert eine Skriptversion namens filebased_init für die konsolidierte Datenbank. Diese Skriptversion hat ein einziges begin_publication-Skript.
CALL ml_add_table_script( 'filebased_init', 'T1', 'download_cursor', 'SELECT pk, c1 FROM T1' ); CALL ml_add_connection_script( 'filebased_init', 'begin_publication', '{ call begin_pub( {ml s.generation_number}, {ml s.username}, {ml s.publication_name} ) }' ); COMMIT; |
Die beiden folgenden Befehlszeilen erstellen eine Download-Ausgangsdatei, die die Skriptversion filebased_init und die Option -bg verwendet.
dbmlsync -c "uid=DBA;pwd=sql;eng=tfdef_eng;dbf=tfdef.db" -v+ -e "sv=filebased_init" -bc tfile1.df -be ok -bg -ot tfdef1.txt dbmlsync -c "uid=DBA;pwd=sql;eng=tremote_eng;dbf=tremote.db" -v+ -ba tfile1.df -ot tremote.txt |
Stellen Sie eine Verbindung zur konsolidierten Datenbank her und fügen Sie Daten ein, die durch einen dateibasierten Download synchronisiert werden, wie im folgenden Beispiel:
INSERT INTO T1(pk, c1) VALUES( 1, 1 ); INSERT INTO T1(pk, c1) VALUES( 2, 4 ); INSERT INTO T1(pk, c1) VALUES( 3, 9 ); commit; |
Die folgende Befehlszeile erstellt eine Download-Datei, die die neuen Daten enthält.
dbmlsync -c "uid=DBA;pwd=sql;eng=tfdef_eng;dbf=tfdef.db" -v+ -e "sv=filebased" -bc tfile2.df -be ok -ot tfdef2.txt |
Die folgende Befehlszeile übernimmt eine Download-Datei in die entfernte Datenbank.
dbmlsync -c "uid=DBA;pwd=sql;eng=tremote_eng;dbf=tremote.db" -v+ -ba tfile2.df -ot tfdef3.txt |
Die Änderungen werden nun in die entfernte Datenbank übernommen. Öffnen Sie Interactive SQL, verbinden Sie sich mit der entfernten Datenbank und führen Sie die folgende SQL-Anweisung aus, um zu überprüfen, ob die entfernte Datenbank die Daten enthält:
SELECT * FROM T1 |
Die folgenden Befehle stoppen alle drei Datenbankserver und löschen dann die Dateien.
del tfile1.df mlstop -h -w dbstop -y -c "eng=tfdef_eng; uid=DBA; pwd=sql" dbstop -y -c "eng=tcons_eng; uid=DBA; pwd=sql" dbstop -y -c "eng=tremote_eng; uid=DBA; pwd=sql" dberase -y tfdef.db dberase -y tcons.db dberase -y tremote.db |
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 |