Präsentation herunterladen
Die Präsentation wird geladen. Bitte warten
Veröffentlicht von:Svein-Erik Aune Geändert vor über 5 Jahren
1
Geschäftslogik in der Datenbank Best Practice
Tobias Kreidel Datenbankentwickler Nis Nagel Datenbankentwickler Hamburg,
2
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
3
Standardfelder- und Trigger
Eindeutige technische ID. Wird über Before-Insert-Trigger ermittelt, wenn nicht übergeben TABELLE TABELLE_ID ... ERSTELLT_ID ERSTELLT_ZST GEAENDERT_ID GEAENDERT_ZST GEAENDERT_ZAHLER GELOESCHT_ZST Erstellt-Felder. Werden über Spalten-Defaults belegt Letzte Änderungs-Felder. Werden über einen Before-Update-Trigger ermittelt: :NEW.GEAENDERT_ZST := SYS_CONTEXT('VPD', 'USERID'); :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
4
Exceptionhandling - Anforderungen
Zentrale Definition von Exceptions (SQL-Codes) um die Mehrfachverwendung von Fehlercodes verhindern zu können Überblick über verwendete Exceptions
5
Exceptionhandling - Möglichkeiten
DECLARE EINE_EXCEPTION EXCEPTION; PRAGMA EXCEPTION_INIT (EINE_EXCEPTION, ); BEGIN ... RAISE EINE_EXCEPTION; EXCEPTION WHEN EINE_EXCEPTION THEN END; Möglichkeit 2 CREATE OR REPLACE PACKAGE PA_EXCEPTIONS IS EINE_EXCEPTION EXCEPTION; K_EINE_EXCEPTION CONSTANT NUMBER(5) := ; PRAGMA EXCEPTION_INIT (EINE_EXCEPTION, ); END PA_EXCEPTIONS; ... BEGIN RAISE_APPLICATION_ERROR(K_EINE_EXCEPTION, ...); EXCEPTION WHEN EINE_EXCEPTION THEN END;
6
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( ) RETURN NUMBER; END PA_EXCEPTION;
7
Exceptionhandling - Anwendung
BEGIN ... PA_EXCEPTION.RAISE('EINE_EXCEPTION'); EXCEPTION WHEN OTHERS THEN IF PA_EXCEPTION.IST('EINE_EXCEPTION') THEN END IF; END;
8
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
9
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
10
Regelmäßige Reorganisation von Tabellen - Tabellenaufbau
Gruppierung der Reorg-Vorgänge REORG_SET NAME Reihenfolge innerhalb des Reorg-Sets REORG REORG_SET REIHENFOLGE VARIANTE TABELLE LOESCH_BEDINGUNG AKTIV LETZTER_AUFRUF DELETE TRUNCATE SHRINK CALL Zu reorganisierende Tabelle / Bei CALL steht hier der Name der aufzurufenden Prozedur Soll Reorg-Vorgang durchgeführt werden? WHERE-Bedingung, die die zu löschenden Sätze beschreibt Zeitpunkt des letzten Reorg-Laufs
11
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;
12
Regelmäßige Reorganisation von Tabellen - Fazit
Läuft seit Einführung 2007 fehlerfrei Sehr flexibel bei kurzfristigen Änderungen
13
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
14
Datenverteilung (Histor. und Repl.) – Bestandteile
Quell - DB Ziel - DB LCR bauen (Capture-)Trigger Apply-Prozess Propagation-Prozess
15
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
16
Datenverteilung (Histor. und Repl.) – Methode LOG
Quelltabelle (Capture-)Trigger Quelltabelle$LOG PK_ID LAST_CHANGED Geänderte Sätze für den Subscriber Aufräumen wenn alle Subscriber Änderung übernommen haben MODIFY_LOG QUELLTABELLE SUBSCRIBER LAST_IMPORT Zieltabelle z.B. MERGE Subscriber z.B. Export Auslesen und Hochsetzen des letzten Importdatums
17
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
18
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.)
19
Kapselung von PL/SQL - Problemstellung
COBOL Zugriff von „alten“ COBOL-Programmen auf die DB erfolgt über eine Zugriffschicht, die nur Select, Insert, Update und Delete unterstützt Der Aufruf von PL/SQL-Sourcen soll ermöglicht werden Zugriffsschicht Nur Select, Insert, Update, Delete Datenbank
20
Kapselung von PL/SQL - Lösung
Spalten Funktion Parameter Ergebnis Fehlercode UPDATE Funktion Parameter COBOL View SELECT PL/SQL Source 1 Instead-Of Trigger Package Ergebnis Fehlercode PL/SQL Source n
21
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
22
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
23
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 VARCHAR2) RETURN VARCHAR2 IS BEGIN RETURN 'VPDID = '||SYS_CONTEXT('VPD','VPDID'); END; / 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'); ORDER ORDER_ID ... VPD_ID
24
Sichtbarkeiten mit VPD - Fazit
Sicher, kann nicht umgangen/vergessen werden Komplexe Zugriffsrechte möglich, aber… Materialized Views LogicalChangeRecords
25
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 erstellt werden.
26
Rules Manager - Umsetzung
Popup, Order übernehmen Kunde Datenbank Rules Manager Starten Kundenorder Stoppen
27
Rules Manager - Fazit komfortabel, um auf fehlende Ereignisse zu reagieren Reorganisieren der Events Sehr individuell anpassbar durch komplexe Eventstrukturen => überdimensioniert
28
Geschäftslogik in der Datenbank
PL/PDF Tägliche Reports erstellen als pdf Reports direkt aus der Datenbank heraus drucken
29
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 => 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;
30
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
31
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
32
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
33
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
34
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“
35
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
36
Anbindung externer Systeme - Umsetzung
Extern Produktion Berenberg Produktion Inbox Outbox Berenberg QS Berenberg Test Propagations Berenberg Integration Outbox Inbox Extern Test Berenberg Entw
37
Anbindung externer Systeme - Umsetzung
Inbox Outbox DBMS_SCHEDULER Send Verarbeiten MessageTabelle Speichern TypeMessage View Verarbeiten nach Fehlern InsteadOfTrigger TypeXYZ Geschäftslogik
38
Anbindung externer Systeme - Fazit
Sehr gute Erfahrungen Einfache und schnelle Nachverarbeitung im Fehlerfall Empfangen und Beantworten von Nachrichten in der gleichen Transaktion
39
Geschäftslogik in der Datenbank
Asynchrone Prozesse Verschiedene Situationen erfordern es Aufrufe asynchron zu verarbeiten. z.B.: Performance „ORA mutating table“ Transaktionsicherer Versand
40
Asynchrone Prozesse - Umsetzung
Unterteilung in serielle und parallele Verarbeitung Standardattribute ID und IDENT zum Aufrufen der Funktionen Dispatcher-Package zum Verteilen der Aufrufe seriell Queues Dispatcher Package Aufruf DBMS_SCHEDULER parallel
41
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 -- verschicken. GLOBAL.PA_MAIL.SEND_MAIL(IN_MAIL_ID => v_id); WHEN 'GLOBAL.MAIL_MESSAGE' THEN -- 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;
42
Asynchrone Prozesse - Beispiel
43
Asynchrone Prozesse - Fazit
„Bremsen“ im seriellen Ablauf verzögern nachfolgende Aufrufe Zustand der Datenbank ändert sich bis asynchrone Verarbeitung startet
44
Geschäftslogik in der Datenbank Best Practice
Fragen? Anregungen? Geschäftslogik in der Datenbank Best Practice Tobias Kreidel Datenbankentwickler Nis Nagel Datenbankentwickler Hamburg,
Ähnliche Präsentationen
© 2024 SlidePlayer.org Inc.
All rights reserved.