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

SAP Sybase SQL Anywhere 16.0 (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 erstellen Sie eine Tabelle, einen Trigger und eine gespeicherte Prozedur zum Verarbeiten von Löschungen.

Voraussetzungen

In dieser Lektion wird davon ausgegangen, dass Sie die Rollen und Privilegien haben, die im Abschnitt "Privilegien" am Anfang dieser praktischen Einführung aufgeführt sind: Praktische Einführung: Verwenden des skriptgesteuerten Uploads.

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

 Aufgabe
  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. Dieser Trigger setzt voraus, dass eine gelöschte Zeile nicht wieder eingefügt wird. Daher verarbeitet er das Löschen derselben Zeile nicht mehr als einmal.

  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.

Ergebnisse

Erstellt werden eine Tabelle zum Speichern einer Liste von Löschungen, ein Trigger, der die employee_delete-Tabelle beim Löschen von Zeilen aus der Tabelle "employee" ausfüllt, und eine Upload-Prozedur zum Verarbeiten der Löschungen.

Nächste Schritte

Gehen Sie weiter zu Lektion 6: Pre-Image leeren und Tabellen löschen.