Datenbanken 13 Views, Stored Procedures und Triggers Karl Meier [email protected] 07.12.2010 MySQL 5.0 MySQL 5 wurde von vielen Datenbankentwicklern sehnsüchtig erwartet. Neue Funktionen wie Stored Procedures, Trigger, Views und Subselects (In ausgereifter Form) als auch das Caching System sollen die Professionalität der MySQL Datenbank weiter ausbauen. Doch die neuen Features zu nutzen, nur weil sie vorhanden sind, macht keinen Sinn. 07.12.2010 13 Views, Stored Procedures und Triggers 2 1 Inhalt Views Stored Procedures Triggers Exceptions Prepared Statements 13 Views, Stored Procedures und Triggers 07.12.2010 3 3 – Ebenen – Modell (ANSI-SPARC 1978) Externe Ebene Sicht 1 Sicht 2 Sicht 3 Benutzerdefinierte Sichten Transformationsregeln Konzeptionelle Ebene Konzeptionelles Schema Logische Gesamtsicht Transformationsregeln Internes Schema Interne Ebene Physikalische Beschreibung 07.12.2010 13 Views, Stored Procedures und Triggers 4 2 Definition View Eine View ist eine virtuelle Tabelle, die mit einer Select Abfrage erzeugt worden ist. Das Rechte-System von MySQL behandelt Views wie eigenständige Tabellen. Somit wird eine Freigabe auf View Ebene möglich. 07.12.2010 13 Views, Stored Procedures und Triggers 5 Syntax CREATE [OR REPLACE] [ALGORITHM = {UNDEFINED | MERGE | TEMPTABLE}] [DEFINER = { user | CURRENT_USER }] [SQL SECURITY { DEFINER | INVOKER }] VIEW view_name [(column_list)] AS select_statement [WITH [CASCADED | LOCAL] CHECK OPTION] 07.12.2010 13 Views, Stored Procedures und Triggers 6 3 Beispiel CREATE VIEW zuercher AS SELECT * FROM t_ma WHERE ort=„zuerich“; 07.12.2010 13 Views, Stored Procedures und Triggers 7 Definition Stored Procedure Stored Procedures (SP) sind eigenständig abgespeicherte Formulierungen von komplexen Zugriffs- und Datenmodifikationsoperationen. Diese werden in Tabellen gespeichert. Der Benutzer benötigt keine Privilegien für die darunterliegende Tabelle. 07.12.2010 13 Views, Stored Procedures und Triggers 8 4 SP in MySQL basierend auf Vorgaben in SQL2003 noch sehr viele Restriktionen Wird sich in den kommenden Versionen noch stark weiterentwickeln 07.12.2010 13 Views, Stored Procedures und Triggers 9 Syntax CREATE PROCEDURE sp_name ([proc_parameter[,...]]) [characteristic ...] routine_body CREATE FUNCTION sp_name ([func_parameter[,...]]) RETURNS type [characteristic ...] routine_body proc_parameter: [ IN | OUT | INOUT ] param_name type func_parameter: param_name type type: Any valid MySQL data type characteristic: LANGUAGE SQL | [NOT] DETERMINISTIC |{ CONTAINS SQL | NO SQL | READS SQL DATA | MODIFIES SQL DATA } | SQL SECURITY { DEFINER | INVOKER } | COMMENT 'string‘ routine_body: Valid SQL procedure statement 07.12.2010 13 Views, Stored Procedures und Triggers 10 5 Beispiel MySQL DELIMITER // CREATE PROCEDURE AlleMitarbeiter() BEGIN SELECT * FROM t_ma; END // DELIMITER ; CALL AlleMitarbeiter(); 07.12.2010 13 Views, Stored Procedures und Triggers 11 Beispiel MySQL CREATE PROCEDURE SalaerErhoehung (IN AngNr INT, IN SalIncr INT) BEGIN UPDATE Angestellter SET Salaer = Salaer + SalIncr WHERE PersNr = AngNr; END; GRANT EXECUTE ON SalaerErhoehung TO user; CALL SalaerErhoehung (&AngNr, &SalIncr); 07.12.2010 13 Views, Stored Procedures und Triggers 12 6 Beispiel ORACLE PROCEDURE SalaerErhoehung (AngNr IN NUMBER, SalIncr IN NUMBER) AS BEGIN UPDATE Angestellter A SET A.Salaer = A.Salaer + SalIncr WHERE A.PersNr = AngNr; IF SQL%NOTFOUND THEN Raise_application_error(…); END IF; END Salaererhoehung; GRANT EXECUTE ON SalaerErhoehung TO user; EXECUTE SalaerErhoehung (&AngNr, &SalIncr); 07.12.2010 13 Views, Stored Procedures und Triggers 13 Variablen in Stored Procedures DECLARE variable_name datatype(size) DEFAULT default_value; DECLARE x, y INT DEFAULT 0; DECLARE total_count INT DEFAULT 0 SET total_count = 10; DECLARE total_products INT DEFAULT 0 SELECT COUNT(*) INTO total_products FROM products; Eine Variable beginnend mit ‘@’ ist eine Session Variable. 07.12.2010 13 Views, Stored Procedures und Triggers 14 7 Vorteile Erhöhte Datensicherheit Automatisierte Programmabläufe Systemrelevante Daten sind nicht sichtbar Einfachere Wartung der Programmcodes Verbesserter Datenschutz kein Zugriff auf sensible Daten Höhere Leistungsfähigkeit direkter Zugriff auf gespeicherte Daten von Compiler in interne DB-Sprache übersetzt 07.12.2010 13 Views, Stored Procedures und Triggers 15 Nachteile Eigene Implementierung pro RDBMS MySQL kennt Stored Procedures ab der Version 5.0 Unterschiedliche Deklaration / Verwendung 07.12.2010 13 Views, Stored Procedures und Triggers 16 8 Aufgabe Schreiben Sie eine Prozedur „Durchschnitt“, an die zwei Zahlen übergeben werden und die als Ergebnis (x + y)/2 liefert: DELIMITER // CREATE PROCEDURE durchschnitt (IN x INT, IN y INT) BEGIN SELECT (x + y)/2; END// 07.12.2010 13 Views, Stored Procedures und Triggers 17 Definition Trigger Trigger sind Event-Handler, die bei dem Erreichen von Werten in einer Tabelle Stored Procedures oder auch externe Prozesse anstossen können. 07.12.2010 13 Views, Stored Procedures und Triggers 18 9 Syntax CREATE [DEFINER = { user | CURRENT_USER }] TRIGGER trigger_name trigger_time trigger_event ON tbl_name FOR EACH ROW trigger_stmt trigger_time: BEFORE | AFTER trigger_event: INSERT | DELETE | UPDATE Verfügbar ab MySQL 5.0 07.12.2010 13 Views, Stored Procedures und Triggers 19 Beispiel MySQL DELIMITER // CREATE TRIGGER LogSalaerAenderung AFTER UPDATE ON Angestellter FOR EACH ROW IF (new.Salaer != old.Salaer) THEN INSERT INTO AngAudit VALUES (user, new.PersNr, now(), new.Salaer, „Neues Salaer“); END IF// DELIMITER ; 07.12.2010 13 Views, Stored Procedures und Triggers 20 10 Beispiel (ORACLE) CREATE OR REPLACE TRIGGER LogSalaerAenderung AFTER UPDATE OF Salaer ON Angestellter FOR EACH ROW WHEN (new.Salaer != old.Salaer) BEGIN INSERT INTO AngAudit VALUES (user, :new.PersNr, SYSDATE, :new.Salaer, ´Neues Salaer´); END; 07.12.2010 13 Views, Stored Procedures und Triggers 21 Verwendung Sicherstellung komplexer Konsistenzbedingungen Berechnen der Werte von abgeleiteten Attributen Zugriffsschutz und Auditing Sammeln von Statistik- und Logdaten Trigger sind keine DB-Objekte immer einer Tabelle zugeordnet ohne Parameter ereignisgesteuert 07.12.2010 13 Views, Stored Procedures und Triggers 22 11 Eigenschaften Auslösendes Ereignis (Trigger Event) INSERT DELETE UPDATE Trigger Time BEFORE AFTER Vorbedingungen Nachbedingungen Trigger Restrictions (Bedingte Ausführung) Trigger Typen ROW-Trigger Aufruf pro Datensatz STATEMENT-Trigger Aufruf pro SQL-Anweisung 13 Views, Stored Procedures und Triggers 07.12.2010 23 Eigenschaften Trigger Action Block mit SQL Anweisungen Deklaration für Variablen, etc. Implizite Parameter OLD NEW alter Datensatz neuer Datensatz Rechte Rechte ihres Owners bei Ausführung Systemprivileg CREATE TRIGGER notwendig 07.12.2010 13 Views, Stored Procedures und Triggers 24 12 Exceptions (Ausnahmen) Ein Trigger mit der Angabe BEFORE kann eine entsprechende INSERT, UPDATE oder DELETE Anweisung abbrechen, bevor sie ausgeführt wird. Es existieren System Exceptions und eigene Exceptions Nicht jede Exception ist ein Fehler! Wichtig ist das korrekte Exception Handling. 07.12.2010 13 Views, Stored Procedures und Triggers 25 Prepared Statements Prepared statements bieten die Möglichkeit, ein SQL Statement mit verschiedenen Parametern mehrmals auszuführen. (Verfügbar ab MySQL 4.1) SELECT * FROM Country WHERE code = ? ( ? wird als Platzhalter benötigt ) Vorteile: - Sicherheit - Effizienz 07.12.2010 13 Views, Stored Procedures und Triggers 26 13 Beispiel mysql> PREPARE stmt_name FROM "SELECT name FROM Country WHERE Query OK, 0 rows affected (0.09 sec) Statement prepared code = ?"; mysql> SET @test_parm := „CH"; Query OK, 0 rows affected (0.00 sec) mysql> EXECUTE stmt_name USING @test_parm; +---------+ | name | +---------+ | Schweiz | +---------+ 1 row in set (0.03 sec) mysql> DEALLOCATE PREPARE stmt_name; Query OK, 0 rows affected (0.00 sec) 13 Views, Stored Procedures und Triggers 07.12.2010 27 MySQL White Papers Stored Procedures http://dev.mysql.com/tech-resources/articles/mysqlstoredprocedures.pdf Triggers http://dev.mysql.com/tech-resources/articles/mysql-triggers.pdf 07.12.2010 13 Views, Stored Procedures und Triggers 28 14 07.12.2010 13 Views, Stored Procedures und Triggers 29 15