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 » Eindeutige Primärschlüssel aufrechterhalten

 

Primärschlüsselpools verwenden

Eine effiziente Methode zur Lösung dieses Problems mit eindeutigen Primärschlüsseln besteht darin, jedem Datenbankbenutzer einen Pool von Primärschlüsselwerten zuzuweisen, die er bei Bedarf verwenden kann. Sie können zum Beispiel jedem Verkäufer 100 neue Identifizierungswerte zuteilen. Jeder Verkäufer kann Werte aus seinem eigenen Pool frei an neue Kunden vergeben.

♦  So implementieren Sie einen Primärschlüsselpool
  1. Fügen Sie in der konsolidierten Datenbank und in jeder entfernten Datenbank eine neue Tabelle ein, die den neuen Primärschlüsselpool enthält. Zusätzlich zu einer Spalte für den eindeutigen Wert müssen diese Tabellen eine Spalte für den Benutzernamen enthalten, der identifiziert, wer das Recht hat, den Wert zuzuweisen.

  2. Schreiben Sie eine gespeicherte Prozedur, die sicherstellt, dass jedem Benutzer genügend neue Identifizierungswerte zugeordnet sind. Ordnen Sie Benutzern, die viele neue Einträge einfügen oder selten synchronisieren, mehr neue Werte zu.

  3. Schreiben Sie ein download_cursor-Skript, um die neuen Werte auszuwählen, die den einzelnen Benutzern zugeordnet wurden, und sie in die entfernte Datenbank einzulesen.

  4. Ändern Sie die Anwendung, die die entfernte Datenbank benutzt, sodass sie einen Wert aus dem Pool verwendet, wenn ein Benutzer eine neue Zeile einfügt. Die Anwendung muss dann den Wert aus dem Pool löschen, damit sie nicht mehrfach benutzt wird.

  5. Schreiben Sie ein Uploadskript. Der MobiLink-Server löscht dann Zeilen aus dem konsolidierten Werte-Pool, die der Benutzer in seinem persönlichen Werte-Pool in der entfernten Datenbank gelöscht hat.

  6. Schreiben Sie ein end_upload-Skript, das die gespeicherte Prozedur aufruft, die den Werte-Pool wartet. Dies hat zur Wirkung, dass weitere Werte in den Pool des Benutzers eingefügt werden, um die beim Download gelöschten Werte zu ersetzen.

Beispiel

Die Beispielanwendung gestattet es entfernten Benutzern, Kunden hinzuzufügen. Jede neue Zeile muss unbedingt einen eindeutigen Primärschlüsselwert haben. Dennoch ist die Verbindung jeder entfernten Datenbank zum Zeitpunkt der Dateneingabe getrennt.

Die Tabelle ULCustomerIDPool enthält eine Liste mit Primärschlüsselwerten, die von jeder entfernten Datenbank verwendet werden können. Außerdem füllt die gespeicherte Prozedur ULCustomerIDPool_maintain den Pool wieder auf, wenn die Werte verbraucht werden. Die Wartungsprozeduren werden von einem end_upload-Skript aufgerufen, und die Pools in jeder entfernten Datenbank werden von den Skripten upload_insert und download_cursor gewartet.

  1. Die Tabelle ULCustomerIDPool in der konsolidierten Datenbank enthält den Pool neuer Identifizierungsnummern für Kunden. Sie hat keine direkte Verbindung mit der Tabelle ULCustomer.

    Die Tabellen ULCustomerIDPool, ULEmployee und ULCustomer.
  2. Die Prozedur ULCustomerIDPool_maintain aktualisiert die Tabelle ULCustomerIDPool in der konsolidierten Datenbank. Der folgende Beispielcode gilt für eine konsolidierte SQL Anywhere-Datenbank.

    CREATE PROCEDURE ULCustomerIDPool_maintain ( IN syncuser_id INTEGER )
    BEGIN
        DECLARE pool_count INTEGER;
    
        -- Determine how may ids to add to the pool
        SELECT COUNT(*) INTO pool_count
        FROM ULCustomerIDPool
        WHERE pool_emp_id = syncuser_id;
     
        -- Top up the pool with new ids
        WHILE pool_count < 20 LOOP
          INSERT INTO ULCustomerIDPool ( pool_emp_id )
          VALUES ( syncuser_id );
          SET pool_count = pool_count + 1;
        END LOOP;
    END

    Diese Prozedur zählt die Nummern, die dem aktuellen Benutzer derzeit zugeordnet sind, und fügt neue Zeilen ein, sodass dem Benutzer genügend Identifizierungsnummern für Kunden zur Verfügung stehen.

    Diese Prozedur wird am Ende des Uploads vom end_upload-Tabellenskript für die Tabelle ULCustomerIDPool aufgerufen. Das Skript sieht wie folgt aus:

    CALL ULCustomerIDPool_maintain( {ml s.username} )
  3. Das download_cursor-Skript für die Tabelle ULCustomerIDPool liest die neuen Nummern in die entfernte Datenbank ein.

    SELECT pool_cust_id
    FROM ULCustomerIDPool
    WHERE pool_emp_id = {ml s.username}
    AND last_modified >= {ml s.last_table_download}
  4. Um einen neuen Kunden einzufügen, muss die Anwendung, die die entfernte Datenbank verwendet, eine nicht verwendete Identifizierungsnummer auswählen, diese Nummer aus dem Pool löschen und die neuen Kundendaten mit dieser Identifizierungsnummer einfügen. Folgende Embedded SQL-Funktion für eine UltraLite-Anwendung ruft eine neue Kundenummer aus dem Pool ab:

    bool CDemoDB::GetNextCustomerID( void )
    /*************************************/
    {
        short ind;
    
        EXEC SQL SELECT min( pool_cust_id )
        INTO :m_CustID:ind FROM ULCustomerIDPool;
        if( ind < 0 ) {
            return false;
        }
        EXEC SQL DELETE FROM ULCustomerIDPool
        WHERE pool_cust_id = :m_CustID;
        return true;
    }