Entwicklungsumgebung für die Übung VU Datenbanksysteme Wolfgang Fischl Arbeitsbereich Datenbanken und Artificial Intelligence Institut für Informationssysteme Technische Universität Wien Wintersemester 2016/17 1 / 35 Gliederung PostgreSQL PostgreSQL Datenbank psql pgAdmin Bordo Server Beispiel Datenbank Beispiel 1 Zusammenfassung 2 / 35 PostgreSQL Datenbank I Für die Übung verwenden wir PostgreSQL Server 9.4.9 I Kann von https://www.postgresql.org/ heruntergeladen werden I Enthält I I I I Datenbankserver (postgresql), Datenbankclient (psql) und grafisches Tool zur Datenbankadministration (pgAdmin) https://www.postgresql.org/docs/9.4/static/ index.html 3 / 35 PostgreSQL Datenbank I Für die Übung verwenden wir PostgreSQL Server 9.4.9 I Kann von https://www.postgresql.org/ heruntergeladen werden I Enthält I I I I Datenbankserver (postgresql), Datenbankclient (psql) und grafisches Tool zur Datenbankadministration (pgAdmin) https://www.postgresql.org/docs/9.4/static/ index.html 3 / 35 PostgreSQL Datenbank I Für die Übung verwenden wir PostgreSQL Server 9.4.9 I Kann von https://www.postgresql.org/ heruntergeladen werden I Enthält I I I I Datenbankserver (postgresql), Datenbankclient (psql) und grafisches Tool zur Datenbankadministration (pgAdmin) https://www.postgresql.org/docs/9.4/static/ index.html 3 / 35 psql - Verbinden zur Datenbank I Starten von psql I Default DB: postgres I Default user: postgres I Default PW: =empty= (bei der Installation gesetzt) 4 / 35 psql - Datenbank für DBS anlegen I Datenbank für DBS anlegen I Zur Datenbank wechseln 5 / 35 psql - Beschreibungsbefehle \d+ \df+ \d+ table \df+ functions Tabellen auflisten Funktionen auflisten Tabelle beschreiben Funktion beschreiben Beispiel SELECT column name FROM INFORMATION SCHEMA .COLUMNS WHERE table name = ’ t a b l e ’ ; 6 / 35 psql - Weitere Befehle I Wichtige Befehle für die Laborübung \o datei \o \i datei I Output wird in datei geschrieben Ende der Ausgabe in datei Führt die Befehle aus datei aus Hilfe?! \h \? \q Hilfe über SQL-Anweisungen Hilfe über interne Anweisungen psql beenden 7 / 35 psql - Weitere Befehle I Wichtige Befehle für die Laborübung \o datei \o \i datei I Output wird in datei geschrieben Ende der Ausgabe in datei Führt die Befehle aus datei aus Hilfe?! \h \? \q Hilfe über SQL-Anweisungen Hilfe über interne Anweisungen psql beenden 7 / 35 pgAdmin I Grafisches Tool zur Datenbankadministration I SQL Editor, Anzeigen von Tabellen, Datenbanken I http://www.pgadmin.org 8 / 35 Einrichtung von pgAdmin I Zu PostgreSQL verbunden I Schaltfläche SQL öffnet Query Fenster 9 / 35 Einrichtung von pgAdmin - SQL 10 / 35 Gliederung PostgreSQL Bordo Server Übung Secure Shell PostgreSQL Datenbank auf Bordo Editoren auf Bordo Beispiel Datenbank Beispiel 1 Zusammenfassung 11 / 35 Übung I I Adresse: bordo.dbai.tuwien.ac.at Zugriff: I I I I Von überall“ her möglich (z.B. Übungsräume, andere ” Rechner im TU-Netz, zu Hause, in der Firma, etc.) ausschließlich mittels Secure Shell (egal von wo aus) Betriebssystem auf bordo: Debian Linux Kennung: I I I Alle Übungsteilnehmer erhalten nach der Anmeldung eine Linux Kennung mit Usernamen u<matrikelnummer>. Das Passwort wird am 18.10.2016 an die in TISS hinterlegte E-Mail zugesandt. Passwort ändern: mit Linux-Befehl passwd. Geändertes Passwort nicht vergessen! 12 / 35 Secure Shell I Von Windows-PC aus: I I I SSH-Client (PuTTY) und SCP-Client (PSCP): http://www.chiark.greenend.org.uk/ ˜sgtatham/putty/download.html Bequemer Datentransfer: WinSCP http://winscp.net/ Von Linux-PC aus: I I ssh und scp sind ohnehin vorhanden Bequemer Datentransfer: sftp mit Konquerer oder Nautilus Beispiel I I ssh [email protected] scp bsp1.sql [email protected]:abgabe1.sql 13 / 35 PostgreSQL Datenbank auf Bordo DB-Server auf Bordo: I PostgreSQL 9.4 DB-Benutzung: I Alle LVA-TeilnehmerInnen erhalten eine eigene DB-Kennung in der Datenbank I DB-Username: gleich wie Linux-Username I Starten einer interaktiven Session: mit dem Kommando psql (im ssh-Fenster). Authentifikation über SSH Account, d.h. kein Passwort notwendig 14 / 35 Editoren auf Bordo I emacs: Hilfe im Web, z.B. http://www.gnu.org/software/emacs/tour/ I vi: Hilfe im Web, z.B. http://www.library.yale. edu/wsg/docs/vi_hands_on/ I pico: Hilfe im Web, z.B. http://www.uic.edu/depts/ accc/software/pine/pico.html Alternativen: I I I Entwicklung von SQL und PL/SQL auf dem lokalen PC und Upload nach Bordo mittels scp (oder sftp). pgAdmin mit Bordo verbinden (ohne Support: siehe AdvTooling.pdf) 15 / 35 Gliederung PostgreSQL Bordo Server Beispiel Datenbank CREATE Tables SQL Statement PL/SQL Prozedur Beispiel 1 Zusammenfassung 16 / 35 CREATE Tables 17 / 35 CREATE Tables I Datei 01 create.sql: CREATE TABLE Vorlesungen ( V o r l N r INTEGER PRIMARY KEY, SWS INTEGER , name VARCHAR( 5 0 ) ); CREATE TABLE Studenten ( MatrNr INTEGER PRIMARY KEY, semester INTEGER , name VARCHAR( 5 0 ) ); CREATE TABLE hoeren ( V o r l N r INTEGER REFERENCES Vorlesungen , MatrNr INTEGER REFERENCES Studenten , PRIMARY KEY( VorlNr , MatrNr ) ); I Einlesen und Kompilieren: \i 01 create.sql 18 / 35 CREATE Tables I Datei 02 insert . sql: INSERT INTO Vorlesungen VALUES ( 1 , 4 , ’DBS ’ ) ; INSERT INTO Vorlesungen VALUES ( 2 , 4 , ’DM ’ ) ; INSERT INTO Vorlesungen VALUES ( 3 , 2 , ’SSD ’ ) ; I INSERT INSERT INSERT INSERT INTO INTO INTO INTO Studenten Studenten Studenten Studenten INSERT INSERT INSERT INSERT INSERT INSERT INSERT INSERT INTO INTO INTO INTO INTO INTO INTO INTO hoeren hoeren hoeren hoeren hoeren hoeren hoeren hoeren VALUES VALUES VALUES VALUES VALUES VALUES VALUES VALUES VALUES VALUES VALUES VALUES (1 (2 (1 (2 (3 (3 (2 (3 (1 ,1 , (2 ,2 , (3 ,2 , (4 ,4 , ’ Franz ’ ) ; ’ Anna ’ ) ; ’ Maria ’ ) ; ’ Karl ’ ) ; ,2); ,2); ,3); ,3); ,3); ,1); ,4); ,4); Einlesen und Kompilieren: \i 02 insert . sql 19 / 35 SQL Statement Beispiel Suche die Namen jener Studierenden, die alle 4-stündigen Vorlesungen gehört haben. I Ersetzung von for all“ durch exists“: ” ” Suche die Namen jener Studierenden, für die nicht gilt: Es gibt eine 4-stündige VO, für die nicht gilt: der/die Studierende hat diese VO gehört. I Geschachteltes SQL-Statement erstellen: schrittweise“ ” von innen nach außen. 20 / 35 SQL Statement Innerstes SELECT: I Wähle MatrNr eines/r beliebigen Studierenden sowie Vorlesungsnummer einer beliebigen Vorlesung: SELECT ∗ FROM hoeren ORDER BY V o r l N r SELECT MatrNr FROM s t u d e n t e n SELECT DISTINCT MatrNr FROM hoeren z.B., wähle MatrNr 1 und VorlNr 3 I SELECT Statement (in Datei test1.sql editieren): SELECT ∗ FROM hoeren h WHERE h . V o r l N r = 3 AND h . MatrNr = 1 I Datei einlesen und ausführen in psql: \i test1 . sql 21 / 35 SQL Statement Mittleres SELECT: I Gesucht: Informationen über alle 4-stündigen Vorlesungen, die von einem/r bestimmten Studierenden (z.B. wieder der/die Studierende mit MatrNr 1) nicht gehört wurden. I SELECT Statement (in Datei test2.sql editieren): SELECT ∗ FROM Vorlesungen v WHERE v .SWS = 4 AND NOT EXISTS (SELECT ∗ FROM hoeren h WHERE h . V o r l N r = v . V o r l N r AND h . MatrNr = 1 ) I Datei einlesen und ausführen in psql: \i test2 . sql 22 / 35 SQL Statement Äußeres SELECT: I Gesucht: Informationen über Studierende, für die es keine 4-stündigen Vorlesungen gibt, die von diesen/r Studierenden nicht gehört wurden. I SELECT Statement (in Datei abgabe bsp1.sql editieren): SELECT ∗ FROM Studenten s WHERE NOT EXISTS (SELECT ∗ FROM Vorlesungen v WHERE v .SWS = 4 AND NOT EXISTS (SELECT ∗ FROM hoeren h WHERE h . V o r l N r = v . V o r l N r AND h . MatrNr = s . MatrNr ) ) I Datei einlesen und ausführen in psql: \i abgabe bsp1.sql 23 / 35 PL/SQL Prozedur I I Gesucht: Prozedur, die den Namen und die Semesteranzahl eines/r Studierenden ausgibt Mögliche Vorgangsweise: I I I I I I Entwicklung mittels pgAdmin Am Anfang: nur Prozedur-Kopf und NULL“-Body ” Schrittweise“ den Body hinzufügen ” Nach jedem Schritt kompilieren. Test-Treiber“ erstellen ” Bildschirmausgaben mittels RAISE NOTICE / RAISE DEBUG zwecks Fehlersuche 24 / 35 PL/SQL Prozedur CREATE OR REPLACE FUNCTION suche ( m a t r n r i n t e g e r ) RETURNS v o i d AS $$ DECLARE BEGIN NULL ; END; $$ LANGUAGE p l p g s q l ; SELECT suche ( 1 ) ; 25 / 35 PL/SQL Prozedur CREATE OR REPLACE FUNCTION suche ( mnr i n t e g e r ) RETURNS v o i d AS $$ DECLARE name varchar ( 3 0 ) ; semester numeric ( 2 ) ; BEGIN SELECT s . name , s . semester INTO name , semester FROM s t ud e n t en s WHERE s . m a t r n r = mnr ; RAISE NOTICE ’Name : % , Semester : % ’ , name , semester ; END; $$ LANGUAGE p l p g s q l ; SELECT suche ( 1 ) ; I Aber was wenn kein Ergebnis gefunden wurde? 26 / 35 PL/SQL Prozedur CREATE OR REPLACE FUNCTION suche ( mnr i n t e g e r ) RETURNS v o i d AS $$ DECLARE name varchar ( 3 0 ) ; semester numeric ( 2 ) ; BEGIN SELECT s . name , s . semester INTO name , semester FROM s t ud e n t en s WHERE s . m a t r n r = mnr ; I F ( name IS NULL) THEN RAISE NOTICE ’ S t u d i e r e n d e r m i t der MatrNr % n i c h t gefunden ’ , mnr ; ELSE RAISE NOTICE ’Name : % , Semester : % ’ , name , semester ; END I F ; END; $$ LANGUAGE p l p g s q l ; SELECT suche ( 1 0 ) ; I Datei einlesen und ausführen in SQL*Plus: \i plpgsql. sql 27 / 35 Gliederung PostgreSQL Bordo Server Beispiel Datenbank Beispiel 1 Zusammenfassung 28 / 35 Beispiel 1- Aufgabenstellung I http://dbai.tuwien.ac.at/education/dbs/ current/uebung/bsp1.html I Datenbank einer Theaterverwaltung I I I I I I Beschreibung und ER-Diagramm gegeben Anlegen der Tabellen in PostgreSQL Anlegen von Testdaten Datenauswertung mit SQL Queries PL/pgSQL Trigger und Functions Vollständiges Löschen der angelegten Objekte 29 / 35 Beispiel 1- Punktevergabe I Beim Abgabegespräch wird das Verständnis der Konzepte überprüft! I Punkteverteilung I I I DB anlegen/löschen: max. 4 Punkte Queries: max. 2 Punkte PL/pgSQL: max. 4 Punkte 30 / 35 Beispiel 1- Korrekte Abgabe I 1 ZIP Datei mit folgenden Dateien: 1. 2. 3. 4. 5. 6. 7. create.sql insert.sql drop.sql queries.sql plpgsql.sql test.sql listing.txt 31 / 35 Beispiel 1- listing.txt I Kopiere alle Dateien auf Bordo, und dann auf Bordo: u0602106@bordo:˜/bsp1$ ls create.sql drop.sql insert.sql test.sql u0602106@bordo:˜/bsp1$ psql psql (9.4.9) Type "help" for help. listing.txt plpgsql.sql queries.sql u0602106=> \o listing.txt u0602106=> \i create.sql u0602106=> \i plpgsql.sql u0602106=> \i insert.sql u0602106=> \i queries.sql u0602106=> \i test.sql psql:test.sql:3: ERROR: new row for relation "rposition" violates check constraint "rposition_wert_check" DETAIL: Failing row contains (3, 2, 30, 2, 0.50, RPosition 3-2). psql:test.sql:6: ERROR: new row for relation "sonstigeposition" violates check constraint "sonstigeposition_wert_check" DETAIL: Failing row contains (30, 2, 0.50, SonstigePosition 1). psql:test.sql:10: ERROR: new row for relation "leistung" violates check constraint "leistung_preis_check" DETAIL: Failing row contains (5, Leistung 5, 0.80, 1). psql:test.sql:14: ERROR: duplicate key value violates unique constraint "rposition_anr_apnr_key" DETAIL: Key (anr, apnr)=(30, 1) already exists. psql:test.sql:18: ERROR: RPosition hat nicht den selben Auftrag psql:test.sql:22: ERROR: Leistungsposition kann nicht SonstigePosition sein (und umgekehrt) psql:test.sql:25: ERROR: Leistungen haben eine zirkulaere Abhaengigkeit! u0602106=> \i drop.sql u0602106=> \q 32 / 35 Beispiel 1- beispiel1.zip I zB.: auf Bordo: u0602106@bordo:˜/bsp1$ zip beispiel1.zip * updating: create.sql (deflated 72%) updating: drop.sql (deflated 64%) updating: insert.sql (deflated 64%) updating: listing.txt (deflated 73%) updating: plpgsql.sql (deflated 66%) updating: queries.sql (deflated 57%) updating: test.sql (deflated 51%) 33 / 35 Gliederung PostgreSQL Bordo Server Beispiel Datenbank Beispiel 1 Zusammenfassung 34 / 35 Zusammenfassung I PostgreSQL installieren I Mit PostgreSQL DB verbinden und verwenden I psql und pgAdmin I Verbindung zu Übungsserver bordo.dbai.tuwien.ac.at herstellen I Entwickeln einer einfachen Beispieldatenbank I I I I I Create Statements SQL Statements Stored Procedures Drop Statements Durchbesprechung des ersten Übungsbeispiels 35 / 35