Geschäftslogik in der Datenbank - Best Practice Tobias Kreidel - Berenberg

Die Seite wird erstellt Ansgar-Maximilian Gross
 
WEITER LESEN
Geschäftslogik in der Datenbank
                      Best Practice

Tobias Kreidel                                   Nis Nagel

Datenbankentwickler                   Datenbankentwickler

                                          Hamburg, 17.06.2010
Geschäftslogik in der Datenbank - Best Practice

• Standardfelder- und Trigger
• Exceptionhandling
• Regelmäßige Reorganisation von Tabellen
• Datenverteilung (Historisierung und Replikation)
• Kapselung von PL/SQL

• Sichtbarkeiten mit Virtual Private Database
• Rules Manager
• PL/PDF
• Import von Massendaten
• Anbindung externer Systeme
• Asynchrone Prozesse

2   12.06.2012   Geschäftslogik in der Datenbank - Best Practice
Standardfelder- und Trigger

                                                                    Eindeutige technische ID. Wird über Before-
                           TABELLE                                      Insert-Trigger ermittelt, wenn nicht
                 TABELLE_ID                                                         übergeben
                 ...
                 ERSTELLT_ID                                            Erstellt-Felder. Werden über Spalten-
                                                                                    Defaults belegt
                 ERSTELLT_ZST
                 GEAENDERT_ID
                 GEAENDERT_ZST                                       Letzte Änderungs-Felder. Werden über einen Before-
                                                                                  Update-Trigger ermittelt:
                 GEAENDERT_ZAHLER
                                                                    :NEW.GEAENDERT_ZST := SYS_CONTEXT('VPD', 'USERID');
                 GELOESCHT_ZST                                      :NEW.GEAENDERT_ZST := SYSDATE;
                                                                    :NEW.GEAENDERT_ZAEHLER := :OLD.GEAENDERT_ZAEHLER + 1;

                                                                    Über den Gelöscht-Zst können einzelne
                                                                        Sätze logisch gelöscht werden

3   12.06.2012    Geschäftslogik in der Datenbank - Best Practice
Exceptionhandling - Anforderungen

                 • Zentrale Definition von Exceptions (SQL-Codes)
                 um die Mehrfachverwendung von Fehlercodes
                 verhindern zu können
                 • Überblick über verwendete Exceptions

4   12.06.2012   Geschäftslogik in der Datenbank - Best Practice
Exceptionhandling - Möglichkeiten

Möglichkeit 1
DECLARE
  EINE_EXCEPTION EXCEPTION;
  PRAGMA EXCEPTION_INIT (EINE_EXCEPTION, -20003);
BEGIN
  ...
  RAISE EINE_EXCEPTION;
  ...                                                              Möglichkeit 2
EXCEPTION
  WHEN EINE_EXCEPTION THEN
    ...                            CREATE OR REPLACE PACKAGE PA_EXCEPTIONS IS
END;                                 EINE_EXCEPTION EXCEPTION;
                                     K_EINE_EXCEPTION CONSTANT NUMBER(5) := -20003;
                                     PRAGMA EXCEPTION_INIT (EINE_EXCEPTION, -20003);
                                   END PA_EXCEPTIONS;
                                   ...
                                   BEGIN
                                     ...
                                     RAISE_APPLICATION_ERROR(K_EINE_EXCEPTION, ...);
                                     ...
                                   EXCEPTION
                                     WHEN EINE_EXCEPTION THEN
                                        ...
                                   END;

5   12.06.2012   Geschäftslogik in der Datenbank - Best Practice
Exceptionhandling - Zentrale Definition

                           Fehlertabelle
                                        FEHLER_CODE                FEHLER_NUMMER      FEHLER_TEXT
                                     EINE_EXCEPTION                   -20003       Fehler aufgetreten
                                                 ...                    ...               ...

                           Package
                                CREATE OR REPLACE PACKAGE PA_EXCEPTION IS

                                     PROCEDURE RAISE(
                                        IN_FEHLER_CODE IN VARCHAR2
                                      , IN_FEHLER_TEXT IN VARCHAR2 DEFAULT NULL
                                     );

                                     FUNCTION IST(
                                        IN_FEHLER_CODE   IN VARCHAR2
                                      , IN_FEHLER_NUMMER IN PLS_INTEGER DEFAULT SQLCODE
                                     ) RETURN BOOLEAN;

                                     FUNCTION GET_FEHLER_NUMMER(
                                        IN_FEHLER_CODE IN VARCHAR2
                                     ) RETURN NUMBER;

                                END PA_EXCEPTION;

6   12.06.2012   Geschäftslogik in der Datenbank - Best Practice
Exceptionhandling - Anwendung

                    BEGIN
                      ...
                      PA_EXCEPTION.RAISE('EINE_EXCEPTION');
                      ...
                    EXCEPTION
                      WHEN OTHERS THEN
                        IF PA_EXCEPTION.IST('EINE_EXCEPTION') THEN
                          ...
                        END IF;
                    END;

7   12.06.2012   Geschäftslogik in der Datenbank - Best Practice
Exceptionhandling - Fazit

             • zentrale (und dadurch eindeutige) Vergabe der
             Fehlercodes
             • keine Gefahr von invaliden Objekte durch einen Fehler
             im zentralen Package
             • keine Probleme bei der Entwicklung in größeren Teams

8   12.06.2012   Geschäftslogik in der Datenbank - Best Practice
Regelmäßige Reorganisation von Tabellen - Anforderungen

                 • Operative Datenbank soll klein gehalten werden
                 • Zentrale und übersichtliche Definition der Reorg-
                 Vorgänge
                 • Flexible und einfache Erweiterbarkeit und
                 Anpassungsmöglichkeiten

9   12.06.2012   Geschäftslogik in der Datenbank - Best Practice
Regelmäßige Reorganisation von Tabellen - Tabellenaufbau

                                      Gruppierung der
                                      Reorg-Vorgänge

                                         REORG_SET
                                NAME
                                                                                                Reihenfolge innerhalb
                                                                            REORG               des Reorg-Sets
                                                                    REORG_SET
                                                                    REIHENFOLGE
                                DELETE                                                           Zu reorganisierende Tabelle
                                TRUNCATE                            VARIANTE
                                                                                                 / Bei CALL steht hier der
                                SHRINK                              TABELLE                      Name der aufzurufenden
                                CALL                                LOESCH_BEDINGUNG             Prozedur
                                                                    AKTIV
                                                                                                  Soll Reorg-Vorgang
                                                                    LETZTER_AUFRUF                durchgeführt werden?
                             WHERE-Bedingung,
                             die die zu löschenden
                             Sätze beschreibt                                 Zeitpunkt des letzten
                                                                              Reorg-Laufs

10   12.06.2012   Geschäftslogik in der Datenbank - Best Practice
Regelmäßige Reorganisation von Tabellen - Ablauf

                                                                          Reorg-Sets durchlaufen

                                                                    Vorgänge des Reorg-Sets durchlaufen

                             CASE VARIANTE
                               WHEN 'DELETE' THEN
                                 EXECUTE IMMEDIATE 'DELETE FROM ' || TABELLE || ' WHERE ' || LOESCH_BEDINGUNG;
                               WHEN 'TRUNCATE' THEN
                                 EXECUTE IMMEDIATE 'TRUNCATE TABLE ' || TABELLE;
                               WHEN 'SHRINK' THEN
                                 EXECUTE IMMEDIATE 'ALTER TABLE '|| TABELLE ||' SHRINK SPACE';
                               WHEN 'CALL' THEN
                                 EXECUTE IMMEDIATE 'BEGIN ' || TABELLE || '; END;';
                             END CASE;

11   12.06.2012   Geschäftslogik in der Datenbank - Best Practice
Regelmäßige Reorganisation von Tabellen - Fazit

                  • Läuft seit Einführung 2007 fehlerfrei
                  • Sehr flexibel bei kurzfristigen Änderungen

12   12.06.2012   Geschäftslogik in der Datenbank - Best Practice
Datenverteilung (Historisierung und Replikation)

             • Daten-Änderungen mitloggen
             • Tabellen auf zwei Datenbanken synchron halten
             • Sichern von Daten, die auf einer Instanz nur kurze
             Zeit vorgehalten werden sollen

13   12.06.2012   Geschäftslogik in der Datenbank - Best Practice
Datenverteilung (Histor. und Repl.) – Bestandteile

                      Quell - DB                                                           Ziel - DB

                                                                         LCR
                                                                        bauen

(Capture-)Trigger
                                                                                                Apply-Prozess
                                                                     Propagation-Prozess

 14   12.06.2012   Geschäftslogik in der Datenbank - Best Practice
Datenverteilung (Histor. und Repl.) – Methoden

         ALL / CHANGE
         • Änderung hat neuen Eintrag in der Zieltabelle zur Folge
         • Jede Änderung an einem Datensatz ist so
         nachvollziehbar
         • ALL loggt auch die Anlage, CHANGE nur die
         Änderungen mit
         ARCHIVE / REPLICATION
         • Änderungen in der Quelltabelle werden auch als
         Änderungen in die Zieltabelle übernommen
         • ARCHIVE überträgt keine Löschungen, eine
         Reorganisation in der Quelltabelle hat dadurch keine
         Auswirkungen auf die Zieltabelle

15   12.06.2012   Geschäftslogik in der Datenbank - Best Practice
Datenverteilung (Histor. und Repl.) – Methode LOG

                                                                    Quelltabelle

                       (Capture-)Trigger
                                                                            Quelltabelle$LOG
                                                                            PK_ID
                                                                            LAST_CHANGED

                                                           Geänderte Sätze              Aufräumen wenn alle     MODIFY_LOG
                                                          für den Subscriber            Subscriber Änderung
                                                                                                              QUELLTABELLE
                                                                                        übernommen haben
                  Zieltabelle                                                                                 SUBSCRIBER
                                                                                                              LAST_IMPORT

                                                                               Subscriber

                                                                                                    Auslesen und Hochsetzen
                                                                                                    des letzten Importdatums

16   12.06.2012   Geschäftslogik in der Datenbank - Best Practice
Datenverteilung (Histor. und Repl.) – Generator

                                                                    HISTORICAL_TABLE
                                                                    TABELLE
                                                                    METHODE
                                                                    TRIGGER_DDL
                                                                    TABLE_DDL
                                                                    INIT_SKRIPT

           Tabelle in der über einen Trigger die nötigen Skripte
                generiert werden, um den Capture-Trigger,
           Historisierungstabellen und Initialisierungsskripte zu
                                 erzeugen

17   12.06.2012   Geschäftslogik in der Datenbank - Best Practice
Datenverteilung (Histor. und Repl.) – Fazit

           • Einfache, schnelle und komfortable Lösung zur
           Historisierung von Daten
           • Hoher Erstellungsaufwand für den Generator
           • Sehr flexible Verwendung der $LOG-Methode (andere
           Instanzen, Dateiexport, etc.)

18   12.06.2012   Geschäftslogik in der Datenbank - Best Practice
Kapselung von PL/SQL - Problemstellung

                                                                       COBOL
 • Zugriff von „alten“
 COBOL-Programmen
 auf die DB erfolgt über                                            Zugriffsschicht
 eine Zugriffschicht, die
 nur Select, Insert,                                                                  Nur Select, Insert,
 Update und Delete                                                                    Update, Delete
 unterstützt
 • Der Aufruf von
 PL/SQL-Sourcen soll                                                 Datenbank
 ermöglicht werden

19   12.06.2012   Geschäftslogik in der Datenbank - Best Practice
Kapselung von PL/SQL - Lösung

                                                                              Spalten
                                                                                  Funktion
                        UPDATE                                                    Parameter
                        Funktion                                                  Ergebnis
COBOL                   SELECT
                        Parameter                                    View         Fehlercode
                                                                                               PL/SQL
                                                                                               Source 1
                                                         Instead-Of         Package            PL/SQL
                                                           Trigger            Ergebnis
                                                                              Fehlercode       Source n

 20   12.06.2012   Geschäftslogik in der Datenbank - Best Practice
Kapselung von PL/SQL - Fazit

                  • Gute Möglichkeit um PL/SQL für „alte“ Systeme
                  ansprechbar zu machen
                  • Package-Variablen sind aus SQL (der View) nicht
                  ansprechbar => Wrapper-Funktionen nötig

21   12.06.2012   Geschäftslogik in der Datenbank - Best Practice
Geschäftslogik in der Datenbank

                        Sichtbarkeiten mit Virtual Private Database

• Einführung nach Börsencrash 1929 in den USA

• Trennung von Interessenskonflikten

             Research                                          Kundenhandel   Eigenhandel

22   12.06.2012   Geschäftslogik in der Datenbank - Best Practice
Sichtbarkeiten mit VPD - Umsetzung

-- LogOn-Trigger Anmelden
-- VPDID: 1=Kundenhandel, 2=Eigenhandel, 3=...
DBMS_SESSION.SET_CONTEXT ('VPD', 'VPDID', vpdid);

CREATE OR REPLACE PACKAGE BODY OR.ORDER_SECURITY AS
  FUNCTION ORDER_SEC (schema IN VARCHAR2, tab IN                             ORDER
VARCHAR2)
     RETURN VARCHAR2                                                ORDER_ID
     IS
     BEGIN
                                                                    ...
          RETURN 'VPDID = '||SYS_CONTEXT('VPD','VPDID');            ...
     END;
END;                                                                ...
/
                                                                    VPD_ID

BEGIN
     DBMS_RLS.ADD_POLICY (
          object_schema             => 'OR',
          object_name               => 'ORDER',
          policy_name               => 'ORDER_POLICY',
          function_schema => 'OR',
          policy_function => 'ORDER_SECURITY.ORDER_SEC',
          statement_types => 'SELECT,INSERT,UPDATE,DELETE');
END;
/

23   12.06.2012   Geschäftslogik in der Datenbank - Best Practice
Sichtbarkeiten mit VPD - Fazit

Sicher, kann nicht umgangen/vergessen werden
Komplexe Zugriffsrechte möglich, aber…
Materialized Views
LogicalChangeRecords

24   12.06.2012   Geschäftslogik in der Datenbank - Best Practice
Geschäftslogik in der Datenbank

                                                                    Rules Manager

Es soll überwacht werden, dass Kundenorder an die Börse weitergeleitet und
innerhalb einer bestimmten Zeit bestätigt werden.

Dazu soll
• nach 1 Minute ein Popup
• nach 3 Minuten eine eMail
erstellt werden.

25   12.06.2012   Geschäftslogik in der Datenbank - Best Practice
Rules Manager - Umsetzung

                                                                       Order                Popup, eMail
             Kunde                                                  übernehmen

                                                                                                      Rules
                                                                                                     Manager
                                                                                  Starten
                                                                    Kundenorder
                                                                                     Stoppen

                                                             Datenbank

26   12.06.2012   Geschäftslogik in der Datenbank - Best Practice
Rules Manager - Fazit

komfortabel, um auf fehlende Ereignisse zu reagieren
Reorganisieren der Events
Sehr individuell anpassbar durch komplexe Eventstrukturen => überdimensioniert

27   12.06.2012   Geschäftslogik in der Datenbank - Best Practice
Geschäftslogik in der Datenbank

                                                                    PL/PDF

Tägliche Reports erstellen als pdf
Reports direkt aus der Datenbank heraus drucken

28   12.06.2012   Geschäftslogik in der Datenbank - Best Practice
PL/PDF - Umsetzung

CREATE OR REPLACE PROCEDURE HELLOWORLD IS
     l_blob BLOB;
BEGIN
     /* Initialize, without parameters means: page orientation: portrait; page format: A4 */
     plpdf.init;
     plpdf.NewPage;

     /* Sets the font and its properties */
     plpdf.SetPrintFont(
      p_family => 'Arial',                       -- Font family: Arial
      p_size => 12                               -- Font size: 12 pt
      );

     /* Draws a rectangle cell with text inside. The rectangle may have a border and fill color specified. */
     plpdf.PrintCell(
      p_w => 50,                                 -- Rectangle width
      p_h => 10,                                 -- Rectangle heigth
      p_txt => 'Hello World!' -- Text in rectangle
      );

     /* Returns the generated PDF document. The document is closed and then returned in the OUT parameter. */
     plpdf.SendDoc(p_blob => l_blob);                                -- The generated document

     INSERT INTO STORE_BLOB (blob_file, created_date) VALUES (l_blob, sysdate);
     COMMIT;
END;

29    12.06.2012   Geschäftslogik in der Datenbank - Best Practice
PL/PDF - Fazit

PL/PDF ist ausschließlich in PL/SQL geschrieben
Erzeugung von PDF-Dokumenten direkt in der Datenbank
Geringe Kosten
kein WYSIWYG
keine automatischen Spaltensummen
einfache Charts möglich

30   12.06.2012   Geschäftslogik in der Datenbank - Best Practice
Geschäftslogik in der Datenbank

                                                         Import von Massendaten

Es müssen täglich Dateien in unterschiedlichen Formaten importiert werden.
Die Dateien beinhalten beispielsweise:
• Wertpapierkurse
• Stammdaten
• Datenabgleiche mit „End of Day“-Dateien

31   12.06.2012   Geschäftslogik in der Datenbank - Best Practice
Import von Massendaten - Umsetzung

Variante 1:
• Datei bereitstellen als „external table“
• Dateistrukturen direkt in der Tabellendefinition angeben
• Laden der Daten per Merge-Statement
• Fehlerhafte Daten in Error-Tabelle schreiben
• Nachverarbeiten der Fehler

Variante 2:
• Dateistruktur mit Hilfe eines PL/SQL-Type parsen

Variante 3:
• Einzelverarbeitung in FOR LOOP anstatt MERGE
• Type zum Parsen und Speichern der Daten

32   12.06.2012   Geschäftslogik in der Datenbank - Best Practice
Import von Massendaten – Beispiel

MERGE INTO WP.KURSE s
     USING ( SELECT tab.typ.isin isin
                         , tab.typ.boerse boerse_id
                         , tab.typ.kurs_datum datum
                         , tab.typ.kurs kurs
                         , tab.typ.waehrung waehrung_id
                   FROM (SELECT WP.TYPE_KURS(Ext.SATZ) Typ -- Type zum Parsen
                           FROM WP.EXTERNAL_KURSE                     Ext
                           ) Tab
              ) t
     ON (    s.ISIN                         = t.ISIN
       AND s.BOERSE_ID                      = t.BOERSE_ID
       AND s.WAEHRUNG_ID                    = t.WAEHRUNG_ID)
WHEN MATCHED                 THEN UPDATE SET s.DATUM                   = t.DATUM
                                                    , s.KURS           = t.KURS
        WHERE s.DARUM < t.DATUM
WHEN NOT MATCHED THEN INSERT (s.ISIN
                                                 ,s.BOERSE_ID
                                                 ,s.DATUM
                                                 ,s.KURS
                                                 ,s.WAEHRUNG_ID)
                                     VALUES (t.ISIN
                                                 ,t.BOERSE_ID
                                                 ,t.DATUM
                                                 ,t.KURS
                                                 ,t.WAEHRUNG_ID)
LOG ERRORS INTO WP.KURSE_ERR (v_err_ident) -- Errorlogging
REJECT LIMIT 100;

-- Bei Fehlern eine Mail verschicken
33    12.06.2012    Geschäftslogik in der Datenbank - Best Practice
Import von Massendaten - Fazit

Möglichst Variante 1 benutzen
Kein Abbruch bei einzelnen fehlerhaften Daten
Optimizer hat Probleme mit „external tables“
Nachverarbeiten aus Error-Log schwierig
Formatangabe in „external table“

34   12.06.2012   Geschäftslogik in der Datenbank - Best Practice
Geschäftslogik in der Datenbank

                                                 Anbindung externer Systeme

• mehrere interne Testinstanzen an eine externe Testinstanz anbinden
• einheitliche Kommunikation mit externen Systemen
• einfaches Handling von fachlichen Fehlern ermöglichen

35   12.06.2012   Geschäftslogik in der Datenbank - Best Practice
Anbindung externer Systeme - Umsetzung

             Extern                                                 Berenber
            Produktio                                                   g
                n                                                   Produktio
                                                                        n

                                                                                                         Outbox
                                                                                 Inbox
                                                                    Berenber
                                                                      g QS

                                                                    Berenber
                                                                     g Test

                                                                                          Propagations

                                                                    Berenber
                                                                        g
                                                                    Integratio
                                                                        n

                                                                                 Outbox

                                                                                                          Inbox
                  Extern                                            Berenber
                   Test                                              g Entw

36   12.06.2012   Geschäftslogik in der Datenbank - Best Practice
Anbindung externer Systeme - Umsetzung

Extern

                                           Inbox
                                                                              DBMS_SCHEDULER
                                         Outbox

                                                                    Send       Verarbeiten

                                                                                                            MessageTabelle
                                                                                              Speichern
                                                                           TypeMessage

                                                                                                                 View
                                                                                              Verarbeiten
                                                                                             nach Fehlern
                                                                                                            InsteadOfTrigger
                                                                          TypeXYZ
                                                                        Geschäftslogik

   37    12.06.2012   Geschäftslogik in der Datenbank - Best Practice
Anbindung externer Systeme - Fazit

Sehr gute Erfahrungen
Einfache und schnelle Nachverarbeitung im Fehlerfall
Empfangen und Beantworten von Nachrichten in der gleichen Transaktion

38   12.06.2012   Geschäftslogik in der Datenbank - Best Practice
Geschäftslogik in der Datenbank

                                                              Asynchrone Prozesse

Verschiedene Situationen erfordern es Aufrufe asynchron zu verarbeiten.
z.B.:
• Performance
• „ORA-04091 mutating table“
• Transaktionsicherer eMail Versand

39   12.06.2012   Geschäftslogik in der Datenbank - Best Practice
Asynchrone Prozesse - Umsetzung

Unterteilung in serielle und parallele Verarbeitung
Standardattribute ID und IDENT zum Aufrufen der Funktionen
Dispatcher-Package zum Verteilen der Aufrufe

                                                        Queues
                                                          seriell

                                                                    DBMS_SCHEDULER   Dispatcher
         Aufruf
                                                                                      Package

                                                         parallel

40   12.06.2012   Geschäftslogik in der Datenbank - Best Practice
Asynchrone Prozesse - Beispiel

PROCEDURE APPLY_MESSAGE(IN_MSG IN SYS.XMLTYPE)
IS
     v_ident                      VARCHAR2(50);
     v_id                         NUMBER(12);
BEGIN
     v_ident := IN_MSG.EXTRACT('/async/ident//text()');
     v_id         := IN_MSG.EXTRACT('/async/parameter/id//text()');
     CASE v_ident
       WHEN 'GLOBAL.EXPORT' THEN -- Export anstossen
            GLOBAL.PA_EXPORT.EXPORT_USER(IN_USER_ID => v_id);

       WHEN 'GLOBAL.VERARBEITE_ORDER' THEN -- Order einarbeiten
            GLOBAL.PA_ORDER.VERARBEITEN(IN_ORDER_ID => v_id);

       WHEN 'GLOBAL.MAIL' THEN -- eMail verschicken.
            GLOBAL.PA_MAIL.SEND_MAIL(IN_MAIL_ID => v_id);

       WHEN 'GLOBAL.MAIL_MESSAGE' THEN -- eMail verschicken.
            GLOBAL.PA_MAIL.SEND_MAIL(IN_MESSAGE => IN_MSG);

       WHEN 'ORDER.GATTUNG_LOESCHUNG' THEN -- Löschen einer Gattung
            ORDER.PA_GATTUNG.LOESCHE_GATTUNG(IN_GATTUNG_ID => v_id);

       ELSE
            RAISE_APPLICATION_ERROR(-20000,'QUEUE_DISPATCHER : Unbekannter Message Typ.');
     END CASE;
END;
41   12.06.2012   Geschäftslogik in der Datenbank - Best Practice
Asynchrone Prozesse - Beispiel

42   12.06.2012   Geschäftslogik in der Datenbank - Best Practice
Asynchrone Prozesse - Fazit

„Bremsen“ im seriellen Ablauf verzögern nachfolgende Aufrufe
Zustand der Datenbank ändert sich bis asynchrone Verarbeitung startet

43   12.06.2012   Geschäftslogik in der Datenbank - Best Practice
Fragen? Anregungen?

     Geschäftslogik in der Datenbank
                      Best Practice

Tobias Kreidel                                   Nis Nagel

Datenbankentwickler                   Datenbankentwickler

                                          Hamburg, 17.06.2010
Sie können auch lesen