Click here to view and discuss this page in DocCommentXchange. In the future, you will be sent there automatically.

SQL Anywhere 12.0.1 (Deutsch) » MobiLink - Clientadministration » SQL Anywhere-Clients für MobiLink » Skriptgesteuerter Upload » Praktische Einführung: Verwenden des skriptgesteuerten Uploads

 

Lektion 5: Umgang mit Löschungen

In dieser Lektion wird davon ausgegangen, dass Sie bereits alle vorherigen Lektionen abgeschlossen haben. Siehe Lektion 1: Erstellen der konsolidierten Datenbank.

 Umgang mit Löschungen
  1. Wählen Sie die mit der entfernten Datenbank verbundene Instanz von Interactive SQL und erstellen Sie eine Tabelle, in der eine Liste der gelöschten Zeilen verwaltet wird:

    CREATE TABLE employee_delete (
        id           unsigned integer  primary key NOT NULL,
        name         varchar( 256 ),
        salary       numeric( 9, 2 ),
        delete_time  timestamp
    );
  2. Erstellen Sie dann einen Trigger, um die Tabelle employee_delete beim Löschen von Zeilen aus der Tabelle employee zu füllen.

    CREATE TRIGGER emp_del AFTER DELETE ON employee
    REFERENCING OLD AS delrow
    FOR EACH ROW
    BEGIN
         INSERT INTO employee_delete 
    VALUES( delrow.id, delrow.name, delrow.salary, CURRENT TIMESTAMP );
    END;

    Dieser Trigger wird während eines Downloads nicht aufgerufen, da Sie später die erweiterte Option FireTriggers in dbmlsync auf FALSE setzen. Beachten Sie, dass dieser Trigger voraussetzt, dass eine gelöschte Zeile nicht wieder eingefügt wird. Daher können einmal gelöschte Zeilen nicht nochmals eingefügt werden.

  3. Die nächste SQL-Anweisung erstellt eine Upload-Prozedur für das Bearbeiten von Löschungen.



    CREATE PROCEDURE employee_delete()
    RESULT( id  unsigned integer,
              name varchar( 256),
              salary numeric( 9,2 )
          )
    BEGIN
        DECLARE start_time timestamp;
    
        SELECT value
        INTO start_time
        FROM #hook_dict
        WHERE name = 'start progress as timestamp';
    
       // Upload as a delete all rows that were deleted after the 
       // start_time that were not inserted after the start_time.
       // If a row was updated before it was deleted, then the row
       // to be deleted is the pre-image of the update.
        SELECT IF ep.id IS NULL THEN ed.id ELSE ep.id ENDIF,
               IF ep.id IS NULL THEN ed.name ELSE ep.name ENDIF,
               IF ep.id IS NULL THEN ed.salary ELSE ep.salary ENDIF
        FROM employee_delete ed LEFT OUTER JOIN employee_preimages ep
              ON( ed.id = ep.id AND ep.img_time > start_time )
        WHERE
          // Only upload deletes that occurred since the last sync.
          ed.delete_time > start_time
          // Don't upload a delete for rows that were inserted since 
          // the last upload and then deleted.
        AND NOT EXISTS ( 
          SELECT id
             FROM employee e
             WHERE e.id = ep.id AND e.insert_time > start_time )
        // Select the earliest preimage after the start time.
        AND ( ep.id IS NULL OR ep.img_time = (SELECT MIN( img_time )
                                              FROM employee_preimages
                                              WHERE id = ep.id
                                               AND img_time > start_time ) );
    END;

    Diese gespeicherte Prozedur gibt eine Ergebnismenge zurück, die die Zeilen enthält, die in der konsolidierten Datenbank gelöscht werden sollen. Die gespeicherte Prozedur verwendet die Tabelle employee_preimages. Wenn also eine Zeile aktualisiert und dann gelöscht wird, handelt es sich bei dem Image, das für die Löschung heraufgeladen wird, um das Image, das als Letztes erfolgreich herunter- oder heraufgeladen wurde.

  4. Fahren Sie fort mit Lektion 6: Löschen des Inhalts der Pre-Image-Tabelle.