Fakultät für Informatik und Wirtschaftsinformatik SS 2013 Datenbanken und Informationssysteme II Szenario: Projektverwaltung. Es gibt Projekte, Projektleiter, Mitarbeiter und ihre Zuordnung zu Projekten. Aufgabe 1 (Trigger) [ ] a) Analysiere das relationale Schema aus Anhang A und erstelle ein ER-Diagramm (Notation mit min/max- Kardinalitäten). Bitte Attribute angeben, Schlüsselattribute unterstreichen, Not Null Statements beachten! b) Implementiere in PL/SQL einen Trigger, der beim Eintrag einer Projektmitarbeit überprüft, ob der Mitarbeiter nicht bereits aktuell (zum aktuellen Zeitpunkt) im Projekt tätig ist. In diesem Fall soll mittels RAISE_APPLICATION_ERROR(errno, msg)folgende Fehlermeldung ausgegeben werden: Der Mitarbeiter <vorname> <name> arbeitet bereits am Projekt <projektkuerzel> mit c) Modifiziere das relationale Modell, so dass auch mehrere Projektleiter für ein Projekt unterstützt werden. Erweitere dazu die Tabelle projekt_mitarbeit in geeigneter Weise und modifiziere falls notwendig auch weitere Tabellen entsprechend. In Anhang B finden sich einige DDL-Statements die dabei hilfreich sein könnten. Modifiziere anschließend auch das ER-Modell entsprechend. d) (Bonusaufgabe) Um die Einträge in der Datenbank aus der alten Struktur (genau ein Projektleiter) in die neue Struktur aus Aufgabenteil (c) zu überführen, muss vor dem Löschen der betreffenden Spalte ein SQL- Statement formuliert werden, das alle Projektleiter in die neue Struktur überführt. Wie lautet das Statement? Aufgabe 2 (PHP) [ ] Gegeben ist das Fragment einer OR-Schicht (Anhang B). Benutze das in Anhang A gegebene relationale Schema (ohne die Erweiterung aus Aufgabe 1c) und erweitere die OR-Schicht um folgende Methoden (Hinweis: du kannst entweder die MDB2 oder die MDB2_Util Library zur Implementierung der Methoden benutzen): Hinweis: Der heutige Tag kann mit dem PHP-Funktionsaufruf date('y-m-d') 1 ermittelt werden. Das Datumsformat sieht dann für den heutigen Tag so aus: 2013-07-10. Die alphanumerische Ordnung entspricht dabei der datumsmäßigen Sortierung (das kannst du ausnutzen). Du kannst weiterhin davon ausgehen, dass das Oracle Datumsformat genauso aussieht. a) Implementiere in der Klasse CRUD_Person eine Instanzenmethode arbeitet_mit($projekt). Die Methode soll den angegebenen Mitarbeiter dem als Parameter angegebenen Projekt (Instanz) ab dem heutigen Tag zuordnen. Als Ergebnis soll eine Instanz vom Typ ProjektMitarbeit zurückgeliefert werden. b) Erstelle die Klasse Projekt sowie darin eine Methode aktuelle_mitarbeiter(), welche alle Personen als Array zurückliefert die aktuell am Projekt beteiligt sind. Der Projektleiter soll an erster Stelle zurückgeliefert werden. Hinweis: Die Implementierung dieser Methode soll kein SQL-Statement enthalten. Schau dir die Methoden an die es schon gibt. 1 1
Fakultät für Informatik und Wirtschaftsinformatik SS 13 c) (Bonusaufgabe) Was macht die folgende Methode? Wie wird sie eingesetzt? function call($method, $params) { if (substr($method,0,3)=='get' and count($params)==0) { $property = strtolower(substr($method,3)); if (property_exists($this, $property)) return $this->$property; die("method '$method(...)' does not exist"); Aufgabe 3 (XML) [ ] a) Gegeben ist das in Anhang D dargestellte XML Dokument. Formuliere als XPATH (Input ist unterstrichen): - Wie heißt der Projektleiter des Projektes MINAM mit Nachnamen? - In wie vielen Projekten ist Thomas Schulz aktuell beschäftigt? - Wie viele Mitarbeiter hat das Projekt Eco-LaserFact aktuell (Datum: 2013-07-10)? b) Erstelle einen SQLX Ausdruck auf Basis von Anhang A, der für alle Mitarbeiter die Projekte auflistet, an denen sie beteiligt waren (oder sind). Mitarbeiter die bisher an keinem Projekt teilgenommen haben sollen nicht angezeigt werden. Die Ausgabe soll wie in Anhang E aussehen. c) Erstelle einen XQuery Ausdruck (Input ist die Datei aus Anhang D), der für alle Mitarbeiter (nach Nachnamen sortiert) die Projekte auflistet, an denen sie beteiligt waren (oder sind). Mitarbeiter die bisher an keinem Projekt teilgenommen haben sollen nicht angezeigt werden. Die Ausgabe soll wie in Anhang E aussehen. d) (Bonusaufgabe) Gehe davon aus, dass in der Spalte PROJEKT der Tabelle PROJEKT_XML jeweils als Datensatz ein Projekt gespeichert ist und in der Spalte PERSON der Tabelle PERSON_XML jeweils ein Personendatensatz (Format siehe Anhang D). Erstelle ein SQL-Statement, so dass der Mitarbeiter mit dem Nachnamen Schulz ab dem aktuellen Tag Mitarbeiter im Projekt Eco-LaserFact ist. e) Was macht das folgende Codefragment? CREATE or replace TRIGGER unbekanter_weise BEFORE INSERT OR UPDATE ON projekt_xml FOR EACH ROW DECLARE value xmlsequencetype; persons_found number; xml xmltype; cursor cur_p_ids (p xmltype) is select extractvalue(column_value,'/mitarbeiter/@id') id from table(select xmlsequence(p.extract('/projekt//mitarbeiter')) from dual); BEGIN for data in cur_p_ids(:new.projekt) loop select * into xml from person_xml where existsnode(person,'/person[@id="' trim(data.id) '"]')=1; end loop; END; 2
Fakultät für Informatik und Wirtschaftsinformatik SS 2013 Anhänge: Anhang A: create table person ( personalnummer number, nachname varchar2(32) not null, vorname varchar2(32) not null, geburtsdatum date not null, beschaeftigt_seit date not null, ausgeschieden_am date, primary key(personalnummer) ); create table projekt ( projektnummer number, projektleiter_fk number not null references person(personalnummer), projektkuerzel varchar(20) not null, projektbeschreibung clob, projektstart date, laufzeit_in_monaten number, primary key (projektnummer) ); create table projekt_mitarbeit ( person_fk number not null references person(personalnummer), projekt_fk number not null references projekt(projektnummer) on delete cascade, anteil number(4,1) default 100.0, seit date default round(sysdate,'day'), -- Default: Aktueller Tag ohne Uhrzeit bis date, primary key(person_fk, projekt_fk, seit) ); Anhang B: add <attributname> <datentyp>; add <attributname> <datentyp> references <tabelle> (<primaerschluessel>); drop column <attributname>; add check (column_name in (value1, value2,...)); 3
Fakultät für Informatik und Wirtschaftsinformatik SS 13 Anhang C: class CRUD_Person { protected $personalnummer; // Primary key; protected $nachname; protected $vorname; protected $geburtsdatum; protected $beschaeftigt_seit; protected $ausgeschieden_am; function construct($dic) static function get($personalnummer) // liefert Personeninstanz mit der angegebenen Personalnummer zurück function tostring() class CRUD_Projekt { protected $projektnummer; // Primary key; protected $projektleiter_fk; protected $projektkuerzel; protected $projektbeschreibung; protected $projektstart; protected $laufzeit_in_monaten; function construct($dic) static function get($id) function projekt_mitarbeiter() // listet Array mit ProjektMitarbeit Instanzen (s.u.) zurück function tostring() function getprojektnummer() class CRUD_ProjektMitarbeit { protected $projekt_fk; protected $person_fk; protected $anteil; protected $seit; protected $bis; function construct($dic) function getseit() function getbis() function getprojekt() // liefert zugehoerige projektinstanz function getperson() // liefert zugehoerige Personeninstanz 4
Fakultät für Informatik und Wirtschaftsinformatik SS 2013 Anhang D (XML-Dokument) <?xml version="1.0" encoding="utf-8"?> <projektmanagement> <projektliste> <projekt kuerzel="minam" projektleiter="p-34567"> <beschreibung>rhababer laber laber</beschreibung> <laufzeit> <von>2012-01-07</von> <dauer>12</dauer> </laufzeit> <projektmitarbeiter> <mitarbeiter id="p-45678" von="2013-07-01"/> </projektmitarbeiter> </projekt> <projekt kuerzel="eco-laserfact" projektleiter="p-23456"> <beschreibung>bla bla</beschreibung> <laufzeit> <von>2012-01-01</von> <dauer>24</dauer> </laufzeit> <projektmitarbeiter> <mitarbeiter id="p-56789" von="2012-01-01" bis="2012-12-31"/> <mitarbeiter id="p-56789" von="2013-07-01"/> </projektmitarbeiter> </projekt> </projektliste> <angestellte> <person id="p-12345"> <name>schulz</name> <vorname>stefan</vorname> <geburtsdatum>1969-01-05</geburtsdatum> <eintrittsdatum>1997-01-01</eintrittsdatum> </person> <person id="p-23456"> <name>dickerhof</name> <vorname>markus</vorname> <geburtsdatum>1966-11-06</geburtsdatum> <eintrittsdatum>1995-01-01</eintrittsdatum> </person> </angestellte> </projektmanagement> 5
Fakultät für Informatik und Wirtschaftsinformatik SS 13 Anhang E (SQLX/XQuery Ausgabeformat) <?xml version="1.0" encoding="utf-8"?> <projektliste-mitarbeiter> <mitarbeiter name="markus Dickerhof"> <projekt laufzeit="36" start="2013-01-01" name="smartframe"/> <projekt laufzeit="24" start="2012-01-01" name="eco-laserfact"/> </mitarbeiter> <mitarbeiter name="max Dobler"> <projekt laufzeit="12" start="2012-01-07" name="minam"/> <projekt laufzeit="36" start="2013-01-01" name="smartframe"/> <projekt laufzeit="24" start="2012-01-01" name="eco-laserfact"/> </mitarbeiter> <mitarbeiter name="filip Perisic"> <projekt laufzeit="24" start="2012-01-01" name="eco-laserfact"/> </mitarbeiter> </projektliste-mitarbeiter> 6