11.07.2015 Aufrufe

Trigger - Datenbanken

Trigger - Datenbanken

Trigger - Datenbanken

MEHR ANZEIGEN
WENIGER ANZEIGEN
  • Keine Tags gefunden...

Erfolgreiche ePaper selbst erstellen

Machen Sie aus Ihren PDF Publikationen ein blätterbares Flipbook mit unserer einzigartigen Google optimierten e-Paper Software.

5. Stored Procedures (Teil B) und <strong>Trigger</strong>© Prof. Dr.-Ing. WolfgangLehner |


Stored ProcedureStored Procedure (SP)• in der Datenbank abgelegte Prozeduren• parametrisiert (Ein- und Ausgabe)• optional: INTEGER-Rückgabewert als Statuscode• SQL oder extern (Java, C, …)• Aufruf mittels CALL(, …)• Prozedurales Compound SQL (Statisch)• Heute: Dynamisches SQLW. Lehner, T. Jäkel, T. Kiefer5 Stored Procedures (Teil B) und <strong>Trigger</strong> | 2


Statisch vs. dynamischStatisches SQL• feste SQL-Anweisungen, vorher bekannt• Parametrierung durch Variablen zulässig• Performanz• vorkompiliert und optimiert durch das DBMS kein Overhead• aber:sensitiv zu Änderungen der Datenverteilung (erfordert erneutes Binden)Probleme mit nicht gleichverteilten Attributen (skew): Index oder Tablescan?Dynamisches SQL• dynamisch generierte SQL-Anweisungen• typischerweise langsamer (Kompilierung!)• DB2 interner AnweisungscacheW. Lehner, T. Jäkel, T. Kiefer5 Stored Procedures (Teil B) und <strong>Trigger</strong> | 4


Dynamisches SQLKompilierung• kostet Zeit, aber kompilierte Anweisung kann mehrfach verwendet werden• Syntax• PREPARE FROM • vergibt Namen für SQL-Anweisung• ist eine vollständige SQL-Anweisung• keine Referenzen auf Hostvariablen, aber ParametermarkerParametermarker• können an allen Stellen auftauchen, an denen auch Hostvariablen auftauchenkönnen (falls typisiert)• 2 Arten• typisiert: CAST(? AS )• untypisiert: ?• auch hier: Probleme mit nicht-gleichverteilten AttributenW. Lehner, T. Jäkel, T. Kiefer5 Stored Procedures (Teil B) und <strong>Trigger</strong> | 5


Dynamisches SQLAusführung• Cursor für die angegebene Anweisung erstellen (SELECT)• max. ein Cursor pro Anweisung• Anweisung muss vor OPEN kompiliert worden sein• SyntaxDECLARE CURSOR FOR OPEN [USING , …]• USING: ersetzt Parametermarker (Reihenfolge beachten!)• Anweisung ausführen (≠SELECT)• Nach KompilierungEXECUTE [INTO ,…] [USING , …]INTO: AusgabeparameterUSING: Belegung von Parametermarkern / Eingabeparameter• Vor KompilierungEXECUTE IMMEDIATE entspricht PREPARE und EXECUTEkeine ParametermarkerW. Lehner, T. Jäkel, T. Kiefer5 Stored Procedures (Teil B) und <strong>Trigger</strong> | 6


Komplexes BeispielCREATE PROCEDURE DROP_IF_LARGER (IN TABLENAME VARCHAR(20),IN MAXSIZE INT,OUT ACTION_PERFORMED VARCHAR(100))BEGIN ATOMICDECLARE SQLCODE INT DEFAULT 0;DECLARE SIZE INT DEFAULT -1;DECLARE SQL VARCHAR(200);DECLARE C1 CURSOR FOR STMT;DECLARE UNDO HANDLER FOR SQLEXCEPTION BEGINSET ACTION_PERFORMED = 'Ein Fehler ist aufgetreten.';END;SET SQL = 'SELECT COUNT(*) FROM ' || TABLENAME;PREPARE STMT FROM SQL;OPEN C1;FETCH C1 INTO SIZE;CLOSE C1;IF (SIZE


Temporäre TabellenW. Lehner, T. Jäkel, T. Kiefer5 Stored Procedures (Teil B) und <strong>Trigger</strong> | 8


Temporäre TabellenTemporäre Tabellen (temporary tables)• Vorteile• nehmen Zwischenergebnisse auf• verhindern mehrfache Berechnungen der gleichen Anfragen• Eigenschaften• Tabelle mit optionalen Indizes und Constraints• nur von aktueller Sitzung aus zugreifbar• automatisch bei Verbindungsabbau gelöscht• sofern möglich im Hauptspeicher gehalten• oft innerhalb von Prozeduren verwendetVoraussetzung• temporärer Nutzer-Tabellenbereich (user temporary tablespace)• CREATE USER TEMPORARY TABLESPACE usertmp1MANAGED BY AUTOMATIC STORAGEW. Lehner, T. Jäkel, T. Kiefer5 Stored Procedures (Teil B) und <strong>Trigger</strong> | 9


Temporäre TabellenErstellung• automatisch in sitzungsbezogenem Schema SESSION• DECLARE GLOBAL TEMPORARY TABLE () [WITH REPLACE][ON COMMIT [DELETE ROWS | PRESERVE ROWS]][IN ]Optionen• WITH REPLACE: Tabelle ersetzen, falls schon vorhanden• Verhalten nach Commit: ON COMMIT• DELETE ROWS: Löschen aller Tupel (Standardwert)• PRESERVE ROWS: Behalten aller Tupel• IN : in angegebenen Tabellenbereich erzeugenW. Lehner, T. Jäkel, T. Kiefer5 Stored Procedures (Teil B) und <strong>Trigger</strong> | 10


Temporäre TabellenBeispiel (ohne automatisches Commit)• DECLARE GLOBAL TEMPORARY TABLE MYTEMP (ID INT);• INSERT INTO SESSION.MYTEMP VALUES (1);• SELECT * FROM SESSION.MYTEMP;ID------1• DROP TABLE SESSION.MYTEMP;• COMMIT;W. Lehner, T. Jäkel, T. Kiefer5 Stored Procedures (Teil B) und <strong>Trigger</strong> | 11


<strong>Trigger</strong>W. Lehner, T. Jäkel, T. Kiefer5 Stored Procedures (Teil B) und <strong>Trigger</strong> | 12


<strong>Trigger</strong><strong>Trigger</strong>• durch DML-Operationen ausgelöste Aktionsfolge (UPDATE, DELETE, INSERT)• in dynamischen Compound SQL geschrieben• Verwendung• Einhalten von Geschäftsregeln• Sicherstellen von Datenintegrität (Erweiterungen der CHECK-Constraints)• Propagierung von Updates• Automatisches Generieren abgeleiteter Werte• Auslösen von beliebigen (externen) Aktionen• mehrere <strong>Trigger</strong> pro Tabelle/Sicht möglich• sofort nach Definition aktiv• Definition in Katalogtabellen (Sichten SYSCAT.TRIGGERS, SYSCAT.TRIGDEPT)<strong>Trigger</strong> allgemeinhttp://publib.boulder.ibm.com/infocenter/db2luw/v9r7/topic/com.ibm.db2.luw.admin.dbobj.doc/doc/c0004113.htmlBeispielehttp://publib.boulder.ibm.com/infocenter/db2luw/v9r7/topic/com.ibm.db2.luw.admin.dbobj.doc/doc/r0001097.htmlW. Lehner, T. Jäkel, T. Kiefer5 Stored Procedures (Teil B) und <strong>Trigger</strong> | 13


ECA-KonzeptW. Lehner, T. Jäkel, T. Kiefer5 Stored Procedures (Teil B) und <strong>Trigger</strong> | 14


ECA-KonzeptECA-Konzept• Ereignis (event)• auslösende DML-Anweisung (INSERT, UPDATE, DELETE)• Bedingung (condition)• <strong>Trigger</strong> wird nur ausgelöst, wenn Bedingung erfüllt• optional• Aktion (action)• durchzuführende Aktion in Compound SQL• Einbinden komplexer Logik durch UDFs und Stored Procedures• <strong>Trigger</strong>kaskadierung• Ausführung eines <strong>Trigger</strong>s kann andere <strong>Trigger</strong> auslösen• ACHTUNG: Kettenreaktionen möglichW. Lehner, T. Jäkel, T. Kiefer5 Stored Procedures (Teil B) und <strong>Trigger</strong> | 15


Anlegen von <strong>Trigger</strong>nAnlegen eines <strong>Trigger</strong>sCREATE TRIGGER BEFORE | AFTER | INSTEAD OFINSERT | DELETE | UPDATE [OF (, …)]ON REFERENCING [OLD AS ] [NEW AS ]Übergangsvariablen[OLD_TABLE AS ] [NEW_TABLE AS ]]FOR EACH ROW | FOR EACH STATEMENTGranularität[MODE DB2SQL][WHEN ()]BedingungBEGIN ATOMIC | ENDEntfernen von <strong>Trigger</strong>n• DROP TRIGGER AuslösezeitpunktAktionAuslöserW. Lehner, T. Jäkel, T. Kiefer5 Stored Procedures (Teil B) und <strong>Trigger</strong> | 16


AuslösezeitpunktAuslösezeitpunkt (BEFORE)• vor der Ausführung des DML-Befehls• keine Modifikation (außer aktuelles Tupel) erlaubt• keine kaskadierenden <strong>Trigger</strong> möglich (NO CASCADE)• Einsatz• Überprüfung von Integritätsbedingungen• Automatische Generierung von Werten (im aktuellen Tupel)W. Lehner, T. Jäkel, T. Kiefer5 Stored Procedures (Teil B) und <strong>Trigger</strong> | 17


AuslösezeitpunktBeispiel (BEFORE-<strong>Trigger</strong>)• bringt Anfang und Ende einer Unterrichtsstunde in chronologische ReihenfolgeCREATE TRIGGER CLASS_ENDBEFORE INSERT ON CL_SCHEDREFERENCING NEW AS new_rowFOR EACH ROWMODE DB2SQLBEGIN ATOMICDECLARE t TIME;IF new_row.STARTING > new_row.ENDING THENSET t = new_row.ENDING;SET new_row.ENDING = new_row.STARTING;SET new_row.STARTING = t;END IF;END@W. Lehner, T. Jäkel, T. Kiefer5 Stored Procedures (Teil B) und <strong>Trigger</strong> | 18


AuslösezeitpunktAuslösezeitpunkt (AFTER)• nach der Ausführung des DML-Befehls• Ausführung nach Überprüfung bereits existierender Constraints• Automatische Generierung von Werten (in anderen Tupeln/ Relationen)Beispiel (AFTER-<strong>Trigger</strong>)• Pflegen der Firmenstatistik nach Einfügen neuer MitarbeiterCREATE TRIGGER NEW_HIREAFTER INSERT ON EMPLOYEEFOR EACH ROWMODE DB2SQLUPDATE COMPANY_STATS SET NBEMP = NBEMP + 1;W. Lehner, T. Jäkel, T. Kiefer5 Stored Procedures (Teil B) und <strong>Trigger</strong> | 19


AuslösezeitpunktAuslösezeitpunkt (INSTEAD OF)• anstelle der Ausführung des DML-Befehls• nur für Sichten anwendbar• keine Bedingungen erlaubt (WHEN)• nur ein INSTEAD OF-<strong>Trigger</strong> pro Ereignis und Sicht• Definition der Aktualisierungssemantik für SichtenW. Lehner, T. Jäkel, T. Kiefer5 Stored Procedures (Teil B) und <strong>Trigger</strong> | 20


Auslösezeitpunkt A BBeispiel (INSTEAD OF-<strong>Trigger</strong>)• Löschen in SichtenDELETE FROM v1WHERE A=1 AND B=2 FEHLERView v1A B C1 2 82 3 9CREATE TRIGGER V1_DELETEINSTEAD OF DELETE ON v1REFERENCING OLD AS oFOR EACH ROWMODE DB2SQLDELETE FROM t1WHERE o.A = A AND o.B = BDELETE FROM v1WHERE A=1 AND B=2 OKAYTabelle t11 22 3A B2 3Tabelle t2B C2 83 9W. Lehner, T. Jäkel, T. Kiefer5 Stored Procedures (Teil B) und <strong>Trigger</strong> | 21


GranularitätGranularität• FOR EACH ROW• pro bearbeitetes Tupel• n-mal ausgeführt, bevor/nachdem n Tupel abgearbeitet• FOR EACH STATEMENT• pro DML-Anweisung• einmal ausgeführt nachdem Anweisung abgearbeitet• nur für AFTER-<strong>Trigger</strong>• bei UPDATE und DELETE: auch aktiviert falls kein Tupel verändert/gelöschtBeispiel• Pflege der Firmenstatistik nach jedem Einfügen eines neuen MitarbeitersCREATE TRIGGER NEW_HIREDAFTER INSERT ON EMPLOYEEFOR EACH ROWUPDATE COMPANY_STATS SET NBEMP = NBEMP + 1;W. Lehner, T. Jäkel, T. Kiefer5 Stored Procedures (Teil B) und <strong>Trigger</strong> | 22


GranularitätBeispiel• Pflegen der Firmenstatistik nach Einfügen einer Menge neuer MitarbeiterCREATE TRIGGER NEW_HIREDAFTER INSERT ON EMPLOYEEREFERENCING NEW_TABLE AS NEWEMPSFOR EACH STATEMENTUPDATE COMPANY_STATSSET NBEMP = NBEMP + (SELECT COUNT(*) FROM NEWEMPS) ;W. Lehner, T. Jäkel, T. Kiefer5 Stored Procedures (Teil B) und <strong>Trigger</strong> | 23


Übergangsvariablen/-tabellen, BedingungenÜbergangsvariable (transition variable)• OLD AS bzw. NEW AS • betroffenes Tupel vor bzw. nach Ausführung der OperationÜbergangstabelle (transition table)• OLD_TABLE AS bzw. NEW_TABLE AS • betroffene Tabelle vor bzw. nach Ausführung der OperationBedingungen• optionale Bedingung für Ausführung, ähnlich WHERE-Klausel• Nutzung von Übergangsvariablen• WHEN ()W. Lehner, T. Jäkel, T. Kiefer5 Stored Procedures (Teil B) und <strong>Trigger</strong> | 24


Übergangsvariablen und -tabellenZeitpunktAuslösendesFOR EACH ROWFOR EACH STATEMENTEreignisBEFOREINSERTUPDATEDELETE• NEW• - -• OLD,NEW• - -• OLD• - -INSERT• NEW• -• NEW_TABLE• NEW_TABLEAFTERUPDATE• OLD,NEW•OLD_TABLE,NEW_TABLE• -•OLD_TABLE,NEW_TABLEDELETE• OLD• -• OLD_TABLE• OLD_TABLEW. Lehner, T. Jäkel, T. Kiefer5 Stored Procedures (Teil B) und <strong>Trigger</strong> | 25


Übergangsvariablen und -tabellenBeispiel• Verhinderung von Gehaltserhöhungen um mehr als 20%CREATE TRIGGER SAL_CHECKAFTER UPDATE OF SALARY ON EMPLOYEEREFERENCING OLD AS OLD_EMPFOR EACH ROWMODE DB2SQLNEW AS NEW_EMPWHEN (NEW_EMP.SALARY > (OLD_EMP.SALARY * 1.20))SIGNAL SQLSTATE '80000' ('Keine Gehaltserhöhung über20% erlaubt.');W. Lehner, T. Jäkel, T. Kiefer5 Stored Procedures (Teil B) und <strong>Trigger</strong> | 26


AufrufreihenfolgeAufrufreihenfolge• mehrere <strong>Trigger</strong> gleichen Typs: Ausführung in Reihenfolge des Erstellens• Aufrufreihenfolge kann Ergebnis beeinflussen• Zeit der Erstellung CREATE_TIME in SYSCAT.TRIGGERS hinterlegtBeispiel• <strong>Trigger</strong> A addiert 100 Euro zum Gehalt• <strong>Trigger</strong> B multipliziert das Gehalt mit 1.1Reihenfolge: A B (1000 + 100) * 1.1 = 1210Reihenfolge: B A (1000 * 1.1) + 100 = 1200≠W. Lehner, T. Jäkel, T. Kiefer5 Stored Procedures (Teil B) und <strong>Trigger</strong> | 27


EntwicklungswerkzeugeW. Lehner, T. Jäkel, T. Kiefer5 Stored Procedures (Teil B) und <strong>Trigger</strong> | 28


DB2 Data StudioEntwicklungswerkzeuge in DB2• DB2 V7: Stored Procedure Builder• DB2 V8: Entwicklungszentrale (development center)• DB2 V9: Developer Workbench• DB2 V9.5: Data StudioDB2 Data Studio• Eclipse-basierte IDE• Datenbankobjekte anlegen/bearbeiten• Visueller Editor für SQL/XQuery-Anfragen• Entwicklung/Debugging von UDFs und Stored Procedures• Java-Unterstützung (Stored Procedures, SQLJ)• Arbeiten mit Massendaten (LOAD, EXPORT)• starten mittels: /opt/IBM/DS3.2.0/eclipse• Oder lokale Installation und Verbindung wie bei Squirrel (Vorlesung 2)• Arbeitsbereiche (workspace) und ProjekteW. Lehner, T. Jäkel, T. Kiefer5 Stored Procedures (Teil B) und <strong>Trigger</strong> | 29


DB2 Data StudioW. Lehner, T. Jäkel, T. Kiefer5 Stored Procedures (Teil B) und <strong>Trigger</strong> | 30


DB2 Data Studio - lokale InstallationDownload von der IBM Website (IBM-ID erforderlich)• Neue Verbindung anlegen• DB2 for Linux … auswählen• JDBC 4.0 Treiber - Standardwert• Datenbankname / Server / Portund Benutzer + Pw eintragen• Portberechnung wie inVorlesung 2• Fertig stellen1234• Datenbank sollte unter „alle<strong>Datenbanken</strong>“ auftauchen5W. Lehner, T. Jäkel, T. Kiefer5 Stored Procedures (Teil B) und <strong>Trigger</strong> | 31


DB2 Data Studio – Server Installationstarten mittels: /opt/IBM/DS3.2.0/eclipseVerbindungen• Automatisches Einbinden von vorhandenen <strong>Datenbanken</strong>• Auch katalogisierte <strong>Datenbanken</strong> werden aufgenommen (siehe Übung 2)• Doppelklick auf die Datenbank um Verbindungsdaten einzugebenlokale <strong>Datenbanken</strong> solltenvorhanden seinAnmeldung wie bei eigenerInstallation (Server hier:localhost!)W. Lehner, T. Jäkel, T. Kiefer5 Stored Procedures (Teil B) und <strong>Trigger</strong> | 32


DB2 Data StudioVerfügbare Funktionen / Prozeduren• Datenbank wählen Anwendungsobjekte• Benutzerdefinierte Funktionen• Gespeicherte ProzedurenNeue Prozedur anlegen• + in der Breadcrump NaviBevor die Prozedur genutzt werden kann, muss sie implementiert werden• Danach ist diese auch in der Übersicht sichtbarDebugging• “weiter” bei Implementierung• “Debug aktivieren” ankreuzen• “Fertig stellen”• In der Übersicht “Debugger ausführen”Bearbeiten• Datei Datei öffnen xyz.spxmiW. Lehner, T. Jäkel, T. Kiefer5 Stored Procedures (Teil B) und <strong>Trigger</strong> | 33


DB2 Data Studio – DebuggerW. Lehner, T. Jäkel, T. Kiefer5 Stored Procedures (Teil B) und <strong>Trigger</strong> | 34


ZusammenfassungStored Procedures• Ein- und Ausgabeparameter• Rückgabe von (mehreren) Relationen möglich• prozedurales Compound SQL (Cursor, Fehlerbehandlung)• Dynamisches SQL, Vor- und Nachteile (gegenüber statischem SQL)Temporäre Tabellen• Zwischenspeichern von Teilergebnissen<strong>Trigger</strong>• ereignisgesteuerte Anwendungslogik (ECA-Konzept)• Aktivierungsarten (BEFORE, AFTER oder INSTEAD OF)• Granularität (ROW oder STATEMENT)• Übergangsvariablen (vor oder nach Änderungen; Tupel oder temporäre Tabelle)DB2 Data Studio• Eclipse-basierte IDEW. Lehner, T. Jäkel, T. Kiefer5 Stored Procedures (Teil B) und <strong>Trigger</strong> | 35

Hurra! Ihre Datei wurde hochgeladen und ist bereit für die Veröffentlichung.

Erfolgreich gespeichert!

Leider ist etwas schief gelaufen!