Vertiefungsmodul Daten-, Informations- und Wissensmanagement Einige erweiterte Funktionalitäten in SQL WI Vorlesung "Daten-, Informations- und Wissensmanagement" (MW31.3) | Prof. Dr. J. Ruhland | WS 2016/17 1 Gliederung des Kapitels a) Berechtigungskonzept a) Benutzer und Rollen b) Updateable Views b) c) d) e) f) WI Metadaten Parametrisierte Abfragen Stored Procedures Indices Constraints und Triggers Vorlesung "Daten-, Informations- und Wissensmanagement" (MW31.3) | Prof. Dr. J. Ruhland | WS 2016/17 2 aa) Benutzerverwaltung • • Zentral für alle DBMS Rollenkonzept – • Rechte werden an Rollen vergeben – Benutzer sind (n:m) Rollen zugeteilt Genehmigung gewisser Aktivitäten + logging − GRANT privilege_name # ON object_name TO {user_name |PUBLIC |role_name} [WITH GRANT OPTION]; − CREATE ROLE verwalter; − GRANT verwalter TO joerg, sabine, harald; − GRANT INSERT, SELECT, UPDATE(gehalt) ON mitarbeiter TO verwalter WITH GRANT OPTION; − REVOKE verwalter from joerg • WI Einschränkung mittels VIEWS und updateable views Vorlesung "Daten-, Informations- und Wissensmanagement" (MW31.3) | Prof. Dr. J. Ruhland | WS 2016/17 3 ab) Updateable Views • In besonderen Fällen, in denen das DBMS eine eindeutige Zuordnung zwischen den in der Sicht zu ändernden Daten und einer physikalischen Tabelle, zu der sie gehören, herstellen kann, ist ein Update möglich. Beispiel für so eine Updateable View wäre folgende triviale Sicht: • CREATE VIEW ''SoftwareVerkaeufe2'' AS ''SELECT verkaeufe.kaeufer'' • Ein Update auf SoftwareVerkaeufe2 kann hier eindeutig select verkaeufe.kaeufer zugeordnet werden. WI Vorlesung "Daten-, Informations- und Wissensmanagement" (MW31.3) | Prof. Dr. J. Ruhland | WS 2016/17 4 Updateable Views • Im Beispiel unten ist eine eindeutige Zuordnung nicht möglich, da produkt_id in beiden Quellrelationen enthalten ist, ... CREATE VIEW SoftwareVerkaeufe AS SELECT v.kaeufer, v.verkaeufer, p.product_id FROM produkte p, verkaeufe v WHERE p.produkt_id = v.produkt_id -- ← Achtung! AND p.produkt = "Software" • ... und z. B. bei einer Löschung wie in ... DELETE FROM SoftwareVerkaeufe WHERE produkt_id = 123456 ... nicht entscheidbar ist, ob Datensätze aus Produkte oder Verkaeufe gelöscht werden sollen. • WI selbst ein Update SoftwareVerkaeufe set p.product_id = „alte_SW“ ist extrem gefährlich. Wenn nicht referentielle Integrität die Änderung verhindert, kann es sein, dass wir wegen des inner join gar nicht mehr für eine Rückänderung an den Eintrag rankommen Vorlesung "Daten-, Informations- und Wissensmanagement" (MW31.3) | Prof. Dr. J. Ruhland | WS 2016/17 5 Updateable Views: in welchen Situationen verboten Die geschilderte Anomalie entsteht generell in einer Situation, wo eine Durchführung der Änderung nicht den Erwartungen des Benutzers entspricht oder nicht entscheidbar ist, welche Änderungen genau durchzuführen sind. Man kann sie folgendermaßen einteilen: • • • • WI In einer Selektionssicht können Datensätze aus dem sichtbaren Bereich verschwinden, wenn ein in der Sicht vorhandener Datensatz so geändert wird, dass er aus der Sicht herausfällt. In einer Projektionssicht kann eine Einfügeoperation dann problematisch werden, wenn in der Originalrelation Felder vorhanden sind, die belegt sein müssen (NOT NULL), aber nicht in der Sicht vorkommen, oder wenn die Sicht durch die Angabe von DISTINCT gleiche Ergebnistupel zu einem zusammenfasst. In einer Verbundsicht ist nicht immer entscheidbar, auf welcher Originalrelation die Operation auszuführen ist. In einer Aggregationssicht kann nicht entschieden werden, wie die Operation umzusetzen ist. Zum Beispiel ist nicht klar, wie eine Halbierung aller Verkaufszahlen auf die Originalrelation umzusetzen ist: Entweder kann die Hälfte der Verkäufe gelöscht oder die einzelnen Verkäufe halbiert werden. Vorlesung "Daten-, Informations- und Wissensmanagement" (MW31.3) | Prof. Dr. J. Ruhland | WS 2016/17 6 Probleme mit diesem Updateable(?) view =„W“ Nname ändern? Ausleiher auf „Null“ Umbuchung in „Ausleihe“auf gleiches Werk mit anderem Standort WI Vorlesung "Daten-, Informations- und Wissensmanagement" (MW31.3) | Prof. Dr. J. Ruhland | WS 2016/17 7 Updateable Views Beispiel mySQL (mySQL:) A view is not updatable if any of the following conditions are true: the keyword DISTINCT is used in the view definition the select list contains components other than column specifications, or contains more than one specification of the same column the FROM clause specifies more than one table reference or refers to a non-updatable view the GROUP BY clause is used in the view definition the HAVING clause is used in the view definition Ähnlich DB2 Im Prinzip sollten Views mit 2+ Tabellen den gleichen Regeln wie Single Table Views unterliegen, sofern alle Primär- und Fremdschlüssel im View vorkommen, aber: Die Entscheidung, ob ein View updateable ist, wird letztlich vom DBMS getroffen Zusätzlich muss der Benutzer / die Rolle auch noch die entsprechenden Rechte auf den View besitzen WI Vorlesung "Daten-, Informations- und Wissensmanagement" (MW31.3) | Prof. Dr. J. Ruhland | WS 2016/17 7 b) Metadaten und Data Dictionary im Relationalen Modell ERD zum Aufbau „jedes“ ERD Meta-ERD Meta-Tabellen in einem Datenbanksystem Ein ERD lässt sich aus den Systemtabellen (ggf. mit graphischer Position im gezeichneten ERD) jederzeit rekonstruieren Ausschnitte aus einem ERD lassen sich als SQL-Abfragen gegen die MetaTabellen formulieren Beispiel: welche Tabellen sind in einer Relation mit „HAUPTTABELLE“ verbunden? Beobachtung: die Metatabellenstruktur ist für alle ERDs (und damit alle RDBMS) gleich Die Namen und die Struktur der Metatabellen sind zwischen Herstellern unterschiedlich Schreibende Zugriffe sind in aller Regel dem RDBMS vorbehalten Oft spezielle Befehle zum Lesen der Tabellen (statt select … from sysTables ..) Auch andere Entwurfsmethoden (z.B. klassische Flussdiagramme) lassen sich via Meta-ERD syntaktisch beschreiben WI Vorlesung "Daten-, Informations- und Wissensmanagement" (MW31.3) | Prof. Dr. J. Ruhland | WS 2016/17 8 Meta-ERD in Krähenfuß-Notation Quelle: http://www.infforum.de/themen/anwendungsentwicklung/thema_SE-methode_esa.htm WI Vorlesung "Daten-, Informations- und Wissensmanagement" (MW31.3) | Prof. Dr. J. Ruhland | WS 2016/17 9 SQLITE Metadata • Extract metadata about a column of a table SELECT name, type FROM sqlite_master WHERE type in ('table', 'view') AND name not like 'sqlite?_%' escape '?' WI Vorlesung "Daten-, Informations- und Wissensmanagement" (MW31.3) | Prof. Dr. J. Ruhland | WS 2016/17 10 SQL Server Beispiele (das Ergebnis lässt sich jeweils auch anders erzielen) Tabellen SELECT Owner = TABLE_SCHEMA, TableName = TABLE_NAME FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_TYPE = 'BASE TABLE' AND OBJECTPROPERTY(OBJECT_ID(TABLE_NAME), 'IsMsShipped') = 0 ORDER BY TABLE_SCHEMA, TABLE_NAME; WI SELECT column_name FROM INFORMATION_SCHEMA.COLUMNS WHERE table_name = 'test2'; Spalten SELECT name FROM sysobjects WHERE xtype = 'V'; Views http://www.alberton.info/sql_server_meta_info.html#.UKDjFX_3En0 Vorlesung "Daten-, Informations- und Wissensmanagement" (MW31.3) | Prof. Dr. J. Ruhland | WS 2016/17 11 c) Parametrisierte Queries Motivation ? Welche Bücher haben die „Opuszko“s ausgeliehen? SELECT BuchTitel, PLZ,… FROM Bücher INNER JOIN Personen ON Bücher.AusleiherID = Personen.PersID WHERE Personen.Nachname = ‚Opuszko‘ Oder parametrisiert SELECT BuchTitel, PLZ, … FROM Bücher INENR JOIN Personen ON Bücher.AusleiherID = Personen.PersID WHERE Personen.Nachname =[Nachname des Ausleihers:] WI Vorlesung "Daten-, Informations- und Wissensmanagement" (MW31.3) | Prof. Dr. J. Ruhland | WS 2016/17 12 Parametrisierte Queries und Stored Procedures Parametrisierte Queries • Abfrageparameter werden erst zur Laufzeit eingegeben • Struktur der Abfrage bleibt select … from … where EingangsDatum Between [Start date:] And [End date:] • Vorteile – Vorformulierung durch den Abfragedesigner – “Voroptimierung” der Abfrage durch das RDBMS – Sicherheit vor Manipulationen (insbesondere sogenannte Query Injection) WI Vorlesung "Daten-, Informations- und Wissensmanagement" (MW31.3) | Prof. Dr. J. Ruhland | WS 2016/17 13 d) Stored Procedures Stored Procedures • Programme, die die Datenbank abfragen und ihr Ergebnis i.d.R. als Tabelle abliefern (und auch SQL-Teile enthalten) • Gespeichert im DBMS und in der Quelle nur bei entsprechender Berechtigung zugänglich • „precompiled“ im Datenbankserver • Eigene Programmiersprache („T-SQL“ oder ähnlich) • Oft unmittelbar aufgerufen vom Benutzer (bei entsprechender Berechtigung) • Von sehr vielen RDBMS unterstützt WI Vorlesung "Daten-, Informations- und Wissensmanagement" (MW31.3) | Prof. Dr. J. Ruhland | WS 2016/17 14 http://jedi.informatik.unileipzig.de/de/Vorles/Einfuehrung/Tx/TX03.pdf WI Vorlesung "Daten-, Informations- und Wissensmanagement" (MW31.3) | Prof. Dr. J. Ruhland | WS 2016/17 15 Stored Procedures CREATE PROCEDURE sp_GetInventory @location varchar(10) AS SELECT Product, Quantity FROM Inventory WHERE Warehouse = @location • Our Florida warehouse manager can then access inventory levels by issuing the command – EXECUTE sp_GetInventory 'FL' • The New York warehouse manager can use the same stored procedure to access that area's inventory. – EXECUTE sp_GetInventory 'NY' databases.about.com/od/sqlserver/a/storedprocedure.htm WI Vorlesung "Daten-, Informations- und Wissensmanagement" (MW31.3) | Prof. Dr. J. Ruhland | WS 2016/17 16 Beispiele CREATE PROCEDURE uspGetAddress @City nvarchar(30) AS SELECT * FROM AdventureWorks.Person.Address WHERE City = @City CREATE PROCEDURE uspGetAddress @City nvarchar(30) AS SELECT * FROM AdventureWorks.Person.Address WHERE City LIKE @City + '%' EXEC uspGetAddress @City = 'New York' WI Vorlesung "Daten-, Informations- und Wissensmanagement" (MW31.3) | Prof. Dr. J. Ruhland | WS 2016/17 17 Stored Procedure mit 2 Parametern und Default-Werten CREATE PROCEDURE uspGetAddress @City nvarchar(30) = NULL, @AddressLine1 nvarchar(60) = NULL AS SELECT * FROM AdventureWorks.Person.Address WHERE City = ISNULL(@City,City) AND AddressLine1 LIKE '%' + ISNULL(@AddressLine1 ,AddressLine1) + '%’ WI EXEC uspGetAddress @City = 'Calgary', @AddressLine1 = 'A' Vorlesung "Daten-, Informations- und Wissensmanagement" (MW31.3) | Prof. Dr. J. Ruhland | WS 2016/17 18 Parametrisierte Queries und Stored Procedures Stored Procedures Vorteile • • Effizienz durch Prä-Compilation Information Hiding: die Namen der Tabellen, joins etc interessieren den Anwender nicht Sicherheit einfachere Wartung • • • Stored Procedure sitzt in der Datenbank und ist benutzerunabhängig zu warten Stored Procedure hat u.U. gegenüber dem Aufrufer erweiterte Rechte Performanz: wenig „round trips“ über das Netz Vorteile der SP: in jüngster Zeit nicht unumstritten siehe zB http://forum.de.selfhtml.org/archiv/2010/6/t198475/ vertiefend http://download.microsoft.com/download/0/c/1/0c11f05d-d47d-41eb-9d0b8e1db32ba67b/073_StoredP.ganzneu.mlo.w.pdf WI Vorlesung "Daten-, Informations- und Wissensmanagement" (MW31.3) | Prof. Dr. J. Ruhland | WS 2016/17 19 recap: Probleme des Updates unter Views … • buch(buchId,AusleiherId,Titel) student (MatrNr,Nname) AusleiherId kann MatrNr, aber auch eine GastStudentId sein, so dass RefInt schwer zu fordern ist. Wir definieren für die Ausleihe a) create view ausleihe as select (Titel,Nname,MatrNr) from buch ⋈ student b) create view ausleihe1 as select (Titel,Nname, AusleiherId) buch ⋈ student Wir möchten in einer Anwendung ein Buch auf jemand anderes umbuchen 1. wenn ich in (a) einen anderen Namen eingebe, benenne ich den Mann überall um, wenn ich eine neue (gültige) MatrNr eingebe, dann ändert das auch den Nnamen-spalte, ohne dass ich ein Update gegeben hätte lieber diesen view non-updatebale machen! 2. auch ein gleichzeitigen Ändern von Nname und MatrNr auf den neuen Ausleiher in (a) geht komplett schief, da in student dann gar nichts geändert wird, aber die AusleiherId im view (a) gar nicht zur Verfügung steht 3. view (b) sieht bis zu einem update genauso aus wie (a). Die Probleme sind wie bei (1). Außerdem (2‘): Wenn ich bei AusleiherId eine nicht existente MatrNr eingebe, verschwindet das Buch aus dem View und ich kann es nie mehr zurückändern! auch dieser View eignet sich nicht zum updaten, selbst wenn das DBMS das zuließe WI Vorlesung "Daten-, Informations- und Wissensmanagement" (MW31.3) | Prof. Dr. J. Ruhland | WS 2016/17 20 … Lösung durch Update mit Stored Procedure create procedure umbuchen(@buch,@neuNr,@neuName) AS if exists select * from student where MatrNr = @neuNr and NName = @neuName update buch set AusleiherId=@neuNr where buchId=@buch else -- Fehlermeldung endif then Wir könnten diese Prozedura auch via „instead“-Trigger an das Update der Views hängen. Auf jeden Fall brauchen wir der «Ausleihe» -Rolle im DBMS nur „execute“ Rechte an der Prozedur zu geben WI Vorlesung "Daten-, Informations- und Wissensmanagement" (MW31.3) | Prof. Dr. J. Ruhland | WS 2016/17 21 e) Indizes (recap:Parametrisierte Queries) Wiederholung ? Welche Bücher haben die „Opuszko“s ausgeliehen? select BuchTitel, PLZ,… from Bücher inner join Personen on Bücher.AusleiherID = Personen.PersID where Personen.Nachname = ‘Opuszko‘ Oder parametrisiert select BuchTitel, PLZ, … from Bücher inner join Personen on Bücher.AusleiherID = Personen.PersID where Personen.Nachname =[Nachname des Ausleihers:] WI Vorlesung "Daten-, Informations- und Wissensmanagement" (MW31.3) | Prof. Dr. J. Ruhland | WS 2016/17 22 e) Indizes Fortsetzung des „Ausleihe“-Beispiels …. Oder parametrisiert SELECT BuchTitel, PLZ, … FROM Bücher INNER JOIN Personen ON Bücher.AusleiherID = Personen.PersID WHERE Personen.Nachname =[Nachname des Ausleihers:] Sehr häufig wird auf die Bücher Tabelle mit Fremd-Schlüssel AusleiherID zugegriffen … Und sehr häufig auf die Personen Tabelle via Nachname, was gar kein Schlüssel ist !! Wirklich schnelle Zugriffe in eine Tabelle erfolgen nur sequentiell, oder wenn man – ungefähr formuliert – die Zeilennummer kennt WI Vorlesung "Daten-, Informations- und Wissensmanagement" (MW31.3) | Prof. Dr. J. Ruhland | WS 2016/17 23 Organisation auf Platte und Beispiel des Low Level Zugriff • Zugriff über „Satznummer“ in der Programmiersprache Visual Basic – Get #FileNum, Position, Employee – Put #FileNum, Position, Employee – LastRecord = LastRecord + 1 ; Put #FileNum, LastRecord, Employee • Problem: in einem DBMS mit multiuser-Zugriff und –zig Insert/Deletes kennt man die Satznummer eigentlich nie … • … außerdem durchbräche man das Geheimhaltungsprinzip der DBMS WI Vorlesung "Daten-, Informations- und Wissensmanagement" (MW31.3) | Prof. Dr. J. Ruhland | WS 2016/17 24 Indizes Lösung: Neben der Tabelle eine weitere Struktur pflegen, in der die Zuordnung „Suchbegriff Satznummer“ rasch nachgeschlagen werden kann: „Index“ Beispiel einer Indexorganisation: Grundmuster der „Inverted file“ Index on Personen.Nachname Index on Bücher.AusleiherID WI Suchbegriff Liste des Auftretens (Satznummern! Nicht Primärschlüssel) Opusko 981 Ruhland persID Opuszko 2,99 Müller Suchbegriff 12,13,14,45,98 Liste des Auftretens (Satznummern) 789 123,453,121 1901 4 901 45 Vorlesung "Daten-, Informations- und Wissensmanagement" (MW31.3) | Prof. Dr. J. Ruhland | WS 2016/17 25 Indizes Beobachtungen • Der Index ist erheblich kleiner als die Datenbanktabelle und kann daher oft im Hauptspeicher gehalten werden • Tradeoff – – • Es ist bei Vorhandensein eines Index zunächst auf den Index und dann auf Teile der Tabelle zuzugreifen Der Index muss gepflegt werden (Löschen/Einfügen von Einträgen) Nicht immer ist ein bestimmter Index vorteilhaft – Wieviele Bücher sind derzeit insgesamt ausgeliehen? lies ein Mal die Buch-Tabelle – – – • WI Wieviel Bücher von Männern? Pers.Nachname-Index sinnlos, aber Bücher.AusleiheId könnte hilfreich sein Wieviele von 4 Personen-Familien? brauchen noch ein paar Indizes zum Joinen der Familie-Tabelle Wieviele Bücher von Personen, deren Namen mit „O“ beginnt? Anfrage kann rein aus dem Index beantwortet werden (sog. „Covered query“) Die Ergebnisse sind mit und ohne Index identisch (reine Performanz-Überlegung) Vorlesung "Daten-, Informations- und Wissensmanagement" (MW31.3) | Prof. Dr. J. Ruhland | WS 2016/17 26 Indizes Konsequenzen Die Anlage eines Index auf Spalten/Spaltengruppen muss vom Benutzer angefordert werden (Ausnahme: Primärschlüssel und UNIQUE constraints) Ob ein Index bei der Abfrage verwendet wird, kann und wird meist vom DBMS allein entschieden (Der Benutzer kann sog. Query Hints setzen) Sobald ein Index angelegt ist, muss er bei insert/delete/updates neben den Tabellen gepflegt werden. Das DBMS macht das automatisch. Die optimale Indexstruktur ist ein bedeutendes Problem der Praktischen Informatik und ist von Eigenschaften der indexierten Spalten abhängig (Beispiel: „Index auf Primärschlüssel“ maximal 1 Eintrag; „Index auf Geschlecht“ ~50% aller Zeilen). Die leistungsfähigsten DBMS stellen unterschiedliche Indexarten bereit Beispiel: Buch zu „Gleichberechtigungsartikeln“. Die Indexeinträge zu „Mann“ bzw „Frau“ umfassen jeweils wohl 70% der Seiten bessere Idee wäre hier, jede Seite am Rand blau und/oder rot zu markieren „bitmap“ Indizes in der Informatik vertiefend en.wikipedia.org/wiki/Index_(database) ist ein guter Einstieg WI Vorlesung "Daten-, Informations- und Wissensmanagement" (MW31.3) | Prof. Dr. J. Ruhland | WS 2016/17 27 Randbemerkungen • Btree Indizes und Verwandte sind wie inverted files aufgebaut, nur die Suche innerhalb des Index (und dessen verwaltung) wird nochmals beschleunigt (Index eines Buches ist auch alphabetisch sortiert) • ein hash Index entspricht der phyischen Anlage eines Buches nach Bänden mit „A-K“,“L-Z“ (oder Zeitaltern bei Weltgeschichten) und kann jeweils nur auf einen Index angelegt werden WI Vorlesung "Daten-, Informations- und Wissensmanagement" (MW31.3) | Prof. Dr. J. Ruhland | WS 2016/17 30 Fischers Weltgeschichte WI Vorlesung "Daten-, Informations- und Wissensmanagement" (MW31.3) | Prof. Dr. J. Ruhland | WS 2016/17 31 komplizierter Hash in einer Weltgeschichte Region (Europa, Islamische Welt, …) + Zeitalter bestimmen Band innerhalb des Bands hilft entweder ein Index oder lineares Suchen … Gliederung nach Datum wäre möglich, aber nicht sachgerecht WI Vorlesung "Daten-, Informations- und Wissensmanagement" (MW31.3) | Prof. Dr. J. Ruhland | WS 2016/17 32 Syntax zur Index-Verwendung: typische Syntax • CREATE INDEX index_name [index_type] ON tbl_name (index_col_name,...) – index_col_name: col_name [(length)] [ASC | DESC] – index_type: USING {BTREE | HASH} • • WI SELECT * FROM table1 IGNORE INDEX (col3_index) WHERE col1=1 AND col2=2 AND col3=3; SELECT * FROM table1 USE INDEX (col3_index) WHERE col1=1 AND col2=2 AND col3=3; Vorlesung "Daten-, Informations- und Wissensmanagement" (MW31.3) | Prof. Dr. J. Ruhland | WS 2016/17 28 Indizes in SQLite • http://www.sqlite.org/queryplanner.html: Most of the time, the query planner in SQLite does a good job on its own and without outside help. However, the query planner needs indices to work with and it usually falls to the programmer to add indices to the schema that are sufficient for the query planner to accomplish its task. WI Vorlesung "Daten-, Informations- und Wissensmanagement" (MW31.3) | Prof. Dr. J. Ruhland | WS 2016/17 29 partial indices • Tabellenspalten werden manchmal von wenigen Einträgen dominiert – – – • • nordkoreanischer Bücher: 90% haben (vermutlich) als Autor Kim Jong-un Tabelle mit Artikeln zu Gleichberechtigung: 90% haben als Kernthema „Frau“ in allen Fällen gilt aber: die restlichen Anteile verteilen sich auf viele Einträge in einem realen Buch hätten wir zu den derart dominanten Einträgen keine Indexeinträge aber: ein sinnvoller Index kann alle anderen Autoren umfassen – – select …. where autor = „Pak Pong-ju“ select … where thema = „Senioren“ CREATE INDEX mypartial ON buchtabelle (autor) WHERE autor <> „Kim Jong-un“ CREATE INDEX indAus ON buchtabelle (ausleiher) WHERE ausleiher IS NOT NULL CREATE INDEX partSalary ON employee(age) WHERE salary > 2100 • WI DBMS entscheidet wie üblich autonom, ob es in der Anfrage den Index verwenden will SELECT … WHERE autor LIKE „Kim%“ Index eher nicht verwenden SELECT … WHERE autor LIKE „Pak%“ Index eher schon verwenden Vorlesung "Daten-, Informations- und Wissensmanagement" (MW31.3) | Prof. Dr. J. Ruhland | WS 2016/17 30 f) Constraints und Triggers • Idee: Lege in der Datenbank Eigenschaften fest, die legale Einträge erfüllen müssen Constraint – AnzahlBücher integer <50 OR NULL – PersID Start mit 1 oder 2, dann eine gültige 2 stellige Ländernummer, dann 4 beliebige Ziffern – PersID in BÜCHER gültige PersID in PERSONEN or NULL „referentielle Integrität“ • Beispiele zu Aktionen (meist stored procedures), die von Ereignissen ausgelöst werden: Trigger – Bei update von PERSON.gehalt durch die Benutzerrolle „Sachbearbeiter“ schreibe einen Eintrag in eine spezielle log-Tabelle … • Neben der Gehaltsänderung • … oder an Stelle der Gehaltsänderung (der Chef stößt die eigentliche Änderung dann später an) – Bei ungültigem PersID -Eintrag: Warne Benutzer und biete Hilfe an – On delete cascade | on delete abort | on delete set Null | on delete exec procedureName typische Aktionen bei Verletzung der referentiellen Integrität WI Vorlesung "Daten-, Informations- und Wissensmanagement" (MW31.3) | Prof. Dr. J. Ruhland | WS 2016/17 31 Constraint: Referentielle Integrität (Beispiel SQLite) CREATE TABLE track( trackid INTEGER, trackname TEXT, trackartist INTEGER Not Null, FOREIGN KEY(trackartist) REFERENCES artist(artistid) ); Ein NULL wäre sonst auch OK CREATE TABLE song( songid INTEGER, songartist TEXT, songalbum TEXT, songname TEXT Not Null, FOREIGN KEY(songartist, songalbum) REFERENCES album(albumartist, albumname) ); WI Vorlesung "Daten-, Informations- und Wissensmanagement" (MW31.3) | Prof. Dr. J. Ruhland | WS 2016/17 32 Probleme mit Referentieller Integrität Befüllungsprobleme einer Relation MaritalTable (PersID, Gender, marriedTo references MaritalTable(persID) ) Einzeleintrag eines Paares muss der 1. Partner mit NULL eingetragen werden Beim anfänglichen Befüllen der Tabelle („bulk load“) zunächst alle Ehepartner auf NULL ??? Dubiose Lösung Bessere Lösung: Ausschalten der referentiellen Integrität „für gewisse Zeit“ Unterschiedliche Mechanismen je nach DBMS marriedTo references MaritalTable(persID) DEFERRED INITIALLY DEFERRED SQLite SQLServer, DB2 ,,, *‘ BCP- Befehl zum „bulk copy“ Maggie heiratet Hans OK (außer es kommt zu einem Systemabsturz, nachdem die Heirat bei Hans schon eingetragen ist und bei Maggie noch nicht Problem des Transaktionsschutz; siehe später) Aber das Eintragen der schon immer verheirateten Grete macht Probleme, da ihr Tupel bis zum Eintrag von Egon die RefInt verletzt! WI Vorlesung "Daten-, Informations- und Wissensmanagement" (MW31.3) | Prof. Dr. J. Ruhland | WS 2016/17 persID First name Gen der marrie dTo 10 Guido M NULL 11 Hans M NULL 12 Grete F 43 13 Maggie F NULL 14 Michael M NULL 15 George M NULL 43 Egon M 12 33 Beispiele zum Trigger CREATE TRIGGER salary_trigger BEFORE UPDATE ON employee_table REFERENCING NEW ROW AS n, OLD ROW AS o FOR EACH ROW IF n.salary <> o.salary THEN do something END IF; ; Quelle: http://en.wikipedia.org/wiki/Database_trigger WI Vorlesung "Daten-, Informations- und Wissensmanagement" (MW31.3) | Prof. Dr. J. Ruhland | WS 2016/17 34 Beispiele Assuming that customer records are stored in the "customers" table, and that order records are stored in the "orders" table, the following trigger ensures that all associated orders are redirected when a customer changes his or her address: CREATE TRIGGER update_customer_address UPDATE OF address ON customers BEGIN UPDATE orders SET address = new.address WHERE customer_name = old.name; END; With this trigger installed, executing the statement: UPDATE customers SET address = '1 Main St.' WHERE name = 'Jack Jones'; causes the following to be automatically executed: UPDATE orders SET address = '1 Main St.' WHERE customer_name = 'Jack Jones'; Example from http://www.sqlite.org/lang_createtrigger.html WI Vorlesung "Daten-, Informations- und Wissensmanagement" (MW31.3) | Prof. Dr. J. Ruhland | WS 2016/17 35 Beispiele: Trigger zur Neuverheiratung CREATE TRIGGER married_trigger BEFORE UPDATE ON marital_table REFERENCING NEW ROW AS n, OLD ROW AS o FOR EACH ROW IF n.marriedTo <> o.marriedTo THEN if (n.marriedTo is not null) and ((select m.gender from marriedTo as m where m.persId = n.marriedTo) = n.gender) THEN persID First Gend marrie ABORT; name er dTo END IF; 10 Guido M NULL END IF; 11 Hans M 13 12 Grete F 43 ; WI 13 Maggie F 11 14 Michael M NULL … … … … Vorlesung "Daten-, Informations- und Wissensmanagement" (MW31.3) | Prof. Dr. J. Ruhland | WS 2016/17 36 SQLite Syntax WI Vorlesung "Daten-, Informations- und Wissensmanagement" (MW31.3) | Prof. Dr. J. Ruhland | WS 2016/17 37