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 » MobiLink - dateibasierte Downloads » Beispiele zu dateibasierten Downloads

 

Zeitstempelbasierte Beispiele

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.

Datenbanken für das Beispiel erstellen

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
Die konsolidierte Zeitstempel-Beispieldatenbank einrichten

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;
Die entfernte zeitstempelbasierte Beispieldatenbank erstellen

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
Dateidefinitions-Beispieldatenbank mit Zeitstempel erstellen

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;
Erste Synchronisation vorbereiten

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
Dateibasierten Zeitstempel-Download veranschaulichen

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
Zeitstempelbeispiel aufräumen

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