Stefanie Wagensonner EBS, 7. Fachsemester [DATENBANKPROGRAMMIERUNG IM INTER-/INTRANET] Fachhochschule Landshut Fakultät Betriebswirtschaft WS 2008/09
Inhaltsverzeichnis Einleitung..... 3 Frage Nr. 2... 3 insert... 3 delete... 5 select... 6 update... 7 Frage Nr. 7... 8 Frage Nr. 10... 10 Frage Nr. 15... 11 Frage Nr. 18... 11 Frage Nr. 23... 13 Frage Nr. 26... 14 Frage Nr. 29... 15 Frage Nr. 30... 16 Quellenverzeichnis... 18 Abbildungsverzeichnis... 19 Anhang: Fragen zur Vorlesung Datenbankprogrammierung im Inter-/Intranet Stefanie Wagensonner, EBS, WS 2008/09 Page 2
Einleitung: Im Rahmen unseres Schwerpunktfaches Datenbankprogrammierung im Inter-/Intranet ist es für Studierende des Studienganges Europäische Betriebswirtschaftslehre vorgeschrieben, zusätzlich zur schriftlichen Prüfung am Ende des Semesters eine Studienarbeit anzufertigen. Zur Prüfungsvorbereitung wurde uns ein Fragenkatalog von 30 Fragen zur Verfügung gestellt, von denen ich im Folgenden die Nummern 2, 7, 10, 15, 18, 23, 26, 29 und 30 in Form der Studienarbeit bearbeiten werde. Frage Nr. 2 Für die vier wichtigsten Befehle insert, delete, select und update gebe man jeweils ein einfaches Beispiel an. Insert: Der Befehl insert steht für das Einfügen eines Datensatzes in eine Tabelle. In SQL wird dies wie folgt ausgedrückt: INSERT INTO Tabelle (Spalte 1,..., Spalte n) VALUES (Ausdruck 1,...),(Ausdruck #,...) Während unserer Vorlesung programmieren wir eine Datenbank für Adressen und Telefongespräche, die mit Hilfe von PHP online angezeigt und bearbeitet werden kann. Mit dem Befehl insert können wir neue Datensätze in die Tabellen Adressen oder Telefongespräche aufnehmen. Hierfür haben wir folgende vier PHP-Dateien geschrieben: insert_addressesform.php, insert_callsform.php, insert_addresses.php und insert_calls.php. Die beiden Dateien insert_addressesform.php und insert_callsform.php dienen nur der graphischen Anzeige, während die Dateien insert_addresses.php und insert_calls.php unseren insert Befehl durchführen. Stefanie Wagensonner, EBS, WS 2008/09 Page 3
insert_addresses.php zur Verdeutlichung der Umsetzung des insert Befehls in der Praxis: <html> <head> <title> </title> </head> <body> <?php include opendb.php ; $str = insert_into addresses ; $phonenr = $_POST[ phonenr ]; $nachname = $_POST[ nachname ]; $vorname = $_POST[ vorname ]; $str_hnr = $_POST[ str_hnr ]; $plz = $_POST[ plz ]; $stadt = $_POST[ stadt ]; $persnr = $_POST[ persnr ]; $str.= $str + (phonenr, nachname, vorname, str_hnr, plz, stadt, persnr) values ; $str.= $str + ( $phonenr, $nachname, $vorname, $str_hnr, $plz, $stadt, $persnr ); ; $erg = mysql_query($str); if ($erg==false) { printf( <br>fehler bei insert: %s %s, mysql_errno(), mysql_error()); } else { printf( <br>satz aufgenommen ); }; mysql_close($dbid);?> </body> </html> Abbildung 1 Stefanie Wagensonner, EBS, WS 2008/09 Page 4
Delete: Der delete Befehl löscht einen oder mehrere Datensätze einer Tabelle. Dies sollte Idealerweise über den Primärschlüssel erfolgen. Bei mysql ist die delete Funktion auch nur möglich, wenn vorher ein Primärschlüssel definiert wurde. In SQL wird dies folgendermaßen dargestellt: DELETE FROM Tabelle WHERE Bedingung In unserem Fall haben wir für das Löschen von Adressen beziehungsweise Telefongesprächen die zwei Dateien delete_addresses.php und delete_calls.php angelegt. delete_addresses.php: <html> <head> <title> </title> </head> <body> <?php include opendb.php ; $sql = delete from addresses where phonenr= $phonenr ; //printf( %s<br>, $sql); $erg = mysql_query( $sql ); if ($erg==false) { printf( <br>fehler bei delete: %s %s, mysql_errno(), mysql_error()); } else { printf( <br>satz gelöscht ); }; //printf( <br>ii %s, $erg); mysql_close($dbid); Stefanie Wagensonner, EBS, WS 2008/09 Page 5
?> </body> </html> Abbildung 2 Select: Mit der select-funktion kann man sich bestimmte Datensätze einer Tabelle anzeigen lassen. Der SQL Ausdruck dazu lautet: SELECT * FROM Tabelle Für unsere Datenbank haben wir wiederum zwei Dateien angelegt, um jeweils in der Tabelle Gespräche beziehungsweise in der Tabelle Adressen bestimmte Datenzeilen auswählen zu können: select_addresses.php und select_calls.php. Für die Auswahl von Adressen sieht select_addresses.php wie folgt aus: <html> <head> <title> Test von PHP und HTML </title> <body> <?php include opendb.php ; $ergebnis = mysql_query( select * from addresses ); if ($ergebnis==null) { printf( <br>fehler bei select: %s %s, mysql_errno(), mysql_error()); exit(); } else { Stefanie Wagensonner, EBS, WS 2008/09 Page 6
$anzahl_zahlen = mysql_num_rows($ergebnis); printf( <br> Anzahl Zeilen %d <br>, $anzahl_zeilen); printf( <table> ); while ($zeile = mysql_fetch_row($ergebnis)) { printf( <tr> ); foreach($zeile as $element){printf( <td> %s, $element);}; printf( <br> ); }; printf( </table> ); }; mysql_close($dbid);?> </body> </html> Abbildung 3 Update: Mit dem Befehl update können Datensätze einer Tabelle geändert werden. Dazu wird zuerst der alte Datensatz gelöscht und dann ein neuer hinzugefügt. Dies wird in SQL wie folgt dargestellt: UPDATE Tabelle SET Spaltenname=Wert WHERE Bedingung Stefanie Wagensonner, EBS, WS 2008/09 Page 7
Frage Nr. 7: Man erläutere den Begriff Transaktion. Welche Tabellentypen kennen Transaktionen? Wie kennzeichnet man in MySQL den Beginn und das Ende einer Transaktion? Wie kann man eine noch nicht beendete Transaktion rückgängig machen? Definition: Eine Transaktion ist eine logische Abfolge von einzelnen Befehlen, die zusammen eine unteilbare Einheit bilden. Mit Transaktionen bieten Datenbanken die Möglichkeit mehrere SQL-Anweisungen in einen gemeinsamen Block zusammenzufassen und diesen Block dann sicher auszuführen. Sicher bedeutet hierbei, dass nur der gesamten Block garantiert bis zum Ende ausgeführt wird. Ist dies nicht möglich, beispielsweise wenn ein Fehler bei einem Befehl der Transaktion auftritt, wird der Vorgang komplett rückgängig gemacht. Bei jedem Datenbanksystem darf nur eine bestimmte Anzahl von Transaktionen nicht abgeschlossen sein, damit keine Behinderung auftritt. Grundsätzlich sollten immer möglichst wenige und keine langen Transaktionen offen bleiben. Bei der Implementierung von Datenbanktransaktionen gibt es den ACID Standard. Dieser steht für: ATOMICITY die Transaktion verbindet alle enthaltenen MySQL-Anweisungen zu einer atomaren Einheit, die nach außen hin einer einzelnen Anweisung entspricht. CONSISTENCY wenn die Transaktion durch Commit oder Rollback abgeschlossen wird, muss die Datenbank in einem konsistenten Zustand verbleiben. ISOLATION jede Transaktion muss gegenüber allen anderen Datenbankoperationen und Transaktionen isoliert ausgeführt werden; während sie abläuft bemerken andere Operationen nichts von ihren Änderungen und umgekehrt. DURABILITY nach einem Commit müssen die Änderungen durch die Transaktion dauerhaft in der Datenbank gespeichert bleiben. Stefanie Wagensonner, EBS, WS 2008/09 Page 8
Welche Tabellentypen kennen Transaktionen? Transaktionen werden in MySQL nur von speziellen transaktionsfähigen Tabellentypen unterstützt. Diese unterscheiden sich von den Standardtabellentypen in MySQL, z.b. MyISAM, dadurch, dass die im Rahmen von Transaktionen benutzten Datensätze währenddessen automatisch gesperrt werden. Bei MySQL unterstützen die Tabellentypen BDB und InnoDB Transaktionen. Wie kennzeichnet man in MySQL den Beginn und das Ende einer Transaktion? MySQL arbeitet standardmäßig im so genannten autocommit-modus (Voreinstellung in der Konfigurationsdatei autocommit = yes). Jeder Befehl stellt automatisch eine abgeschlossene Transaktion dar. Dies bedeutet, dass MySQL Transaktionen automatisch beginnt, wenn man einen Befehl bezüglich einer passenden Tabelle startet. Autocommit bedeutet, dass jeder SQL-Befehl eine Transaktion ist. Um eine lange Transaktion selber zu bestimmen und zu steuern sind deshalb bestimmte Befehle notwendig. Mit BEGIN startet MySQL eine lange Transaktion, beendet wird sie mit dem Befehl COMMIT, der die queries ausführt, gegebenenfalls auch durch den Befehl ROLLBACK, nämlich dann, wenn eine Transaktion vor dem Ende bereits unterbrochen wird. Erst wenn einer dieser beiden Befehle greift, kann ein anderer Benutzer die durchgeführten Änderungen oder den Zustand vor Beginn der Transaktion sehen. Wie kann man eine noch nicht beendete Transaktion rückgängig machen? Wie im vorherigen Satz bereits angedeutet kann eine noch nicht beendete Transaktion mit dem Befehl ROLLBACK rückgängig gemacht werden. Stefanie Wagensonner, EBS, WS 2008/09 Page 9
Beispiel aus dem Bankenbereich: Überweisung Man nehme eine Transaktion bei der die Überweisung von Konto A nach Konto B durchgeführt wird. Diese Aktion muss ganz oder gar nicht durchgeführt werden. Begonnen wird die Transaktion mit BEGIN, beendet mit COMMIT. Um sicher zu stellen, dass bei Konto A die Überweisung zu Konto B auch gedeckt ist kann man nun einen ROLLBACK einbauen, der besagt, dass das Geld nur überwiesen werden darf, wenn auf Konto A eine ausreichende Summe vorhanden ist. Ist dies nicht der Fall, wird anhand des Befehls ROLLBACK die gesamte Transaktion rückgängig gemacht und kein Geld überwiesen. Frage Nr. 10: Welche Schritte müssen in PHP ausgeführt werden, um mit einer Datenbank arbeiten zu können, um z.b. eine Select-Anweisung absetzen zu können? Man gebe auch beispielhaft die Befehle an! Um mit einer Datenbank arbeiten zu können, muss man zunächst in PHP eine Verbindung zur Datenbank herstellen. Dazu verwendet man mysql_connect (Rechnername, Benutzername, Passwort) Danach öffnet man eine Datenbank mit mysql_select (Datenbankname) Nun kann man einen Datenbankbefehl absetzen, wie beispielsweise mysql_query ( select * from calls ); Ein Abbau der Verbindung erfolgt am Ende automatisch oder manuell durch mysql_close() Stefanie Wagensonner, EBS, WS 2008/09 Page 10
Frage Nr. 15: Für welche Softwareprodukte stehen die vier Buchstaben LAMP? L A M P Linux Apache MySQL PHP (kann auch für Perl oder Python stehen) LAMP steht für den kombinierten Einsatz von bestimmten Programmen auf der Basis von Linux. Die einzelnen Buchstaben stellen dabei die Anfangbuchstaben der Komponenten dar. Diese Programmkombination stellt eine Art Infrastruktur dar, mit der dynamische Webseiten und Anwendungen entwickelt werden können. Frage Nr. 18: Man beschreibe die Schritte bei der Entwicklung eines Javaprogramms. Was ist der grundlegende Unterschied zu PHP? Die Entwicklung eines Javaprogramms: Um ein Java Programm zu erstellen, schreibt man zuerst den so genannten Quellcode und speichert diesen in einer einfachen Textdatei. Damit dieser Code nun ausführbar wird, benötigt man bei Java einen Compiler. Dieser übersetzt die Datei mit dem Quellcode in den so genannten Bytecode, den jetzt wiederum die Java Virtual Machine lesen und ausführen kann. Programm schreiben (kedit) -> Übersetzen (javac) -> Ausführen (javavm) Stefanie Wagensonner, EBS, WS 2008/09 Page 11
Sowohl beim Compiler, als auch bei der Java Virtual Machine handelt es sich dabei um Software, die zuvor auf dem Computer installiert werden muss. Genau dies ist auch der Grund, warum Java-Programme im Gegensatz zu Programmen in anderen Programmiersprachen Plattformunabhängig auf nahezu jedem beliebigen Betriebssystem oder Prozessortyp laufen es ist an die Software und nicht an ein Betriebssystem gebunden. Die JVM ist maschinenabhängig und übersetzt den Bytecode in den Maschinencode, der dann ausgeführt wird. Was ist der grundlegende Unterschied zu PHP? Der grundlegende Unterschied zu PHP ist, dass Java im Client-Server-System von der Client- Seite ausgeführt wird. Bei PHP wird ein php-skript erzeugt und vom Client an den php-server geschickt, der daraus eine html-datei erzeugt. Diese schickt der php-server dann entweder zur Bearbeitung weiter an den Datenbank-Server oder gleich zurück an den Client, wo die Datei ausgeführt wird. Bei Java führt man mit der Java Virtual Machine eine Software auf Client-Ebene das Programm aus. Auf Server-Ebene bearbeitet nur der Datenbankserver die Aufträge des Clients. Stefanie Wagensonner, EBS, WS 2008/09 Page 12
Frage Nr. 23: Was muss man alles tun, um die JDBC-Schnittstelle einer Datenbank, z.b. MySQL, nutzen zu können? Welche Umgebungsvariable muss dabei verändert werden und warum? JDBC = Java Database Connectivity JDBC ist eine Datenbankschnittstelle für Java, die speziell auf relationale Datenbanken ausgerichtet ist. Sie baut Datenbankverbindungen auf und verwaltet diese, leitet SQL- Anfragen an die Datenbank weiter und wandelt die Ergebnisse in eine für Java lesbare Form um. Um JDBC nutzen zu können sind zwei Schritte nötig: 1. Zunächst muss der Treiber MySQL Connector/J installiert werden. Ohne ihn ist kein Zugriff auf die Datenbank möglich! 2. Dann muss das jar-file des Treibers in den Klassenpfad mit aufgenommen werden. Dazu verwendeten wir die Befehle export CLASSPATH = $CLASSPATH:.: Verzeichnis, aus dem man die Datei exportiert set CLASSPATH = $CLASSPATH: Verzeichnis, aus dem man die Datei exportiert Die Umgebungsvariable CLASSPATH muss angepasst werden, damit sie den Treiber für die Datenbankschnittstelle findet! Stefanie Wagensonner, EBS, WS 2008/09 Page 13
Frage Nr. 26: Welche Befehlsfolgen durchläuft man beim Absetzen einer SQL-Anweisung nachdem die Verbindung aufgebaut und die Datenbank eröffnet ist? Grundsätzlich kann man den Ablauf einer SQL-Anweisung in drei Phasen unterteilen: die Vorbereitung, das Ausführen und das Ausgeben der Ergebnisse. Folgende Befehle werden dazu verwendet: 1. Vorbereitung: Statement stmt = conn.create Statement (); 2. Ausführen: stmt.execute (... ); 3. Ergebnis: ResultSet rs = stmt.get.resultset (); oder 4. Ergebnis: ResultSetMetaData rsmeta = rs.get.metadata (); Das Ergebnis ResultSetMetaData steht für ausgegebene Daten bei denen aber das Format unbekannt ist. Als Metadaten bezeichnet man allgemein Daten, die Informationen über andere Daten enthalten. Stefanie Wagensonner, EBS, WS 2008/09 Page 14
Frage Nr. 29: Man beschreibe die Syntax der try-anweisung. Die try-anweisung dient dazu mögliche Fehler abzufangen, ohne dass eine Fehlermeldung ausgelöst wird, und kann dadurch eine Anwendung vor dem Absturz schützen. Tritt innerhalb einer try-anweisung ein Fehler auf, so wird dieser Teil abgebrochen und nach der Anweisung ohne eine Fehlermeldung auszugeben fortgefahren. Auf die try-anweisung kann eine catch-anweisung folgen, die nur dann ausgeführt wird, wenn in der vorangegangenen try-anweisung ein Fehler aufgetreten ist. Auf eine try- Anweisung können mehrere catch-anweisungen folgen, die verschiedene Fehler abfangen. Bei der Abarbeitung der Anweisungen in try können verschiedene Fehlersituationen auftreten, die durch unterschiedliche catch-anweisungen behandelt werden müssen. Zuletzt kann eine finally-anweisung folgen. Hier werden alle Anweisungen aufgelistet, die nach der Behandlung aller Fehler unabhängig von Fehlermeldungen definitiv ausgeführt werden sollen. Syntax einer vollständigen try-catch-finally-anweisung: try {fehlerauslösender Befehl} catch (Ausnahme, die auch an eine if-bedingung geknüpft sein kann) finally {definitiv am Ende ausgeführte Befehle} Stefanie Wagensonner, EBS, WS 2008/09 Page 15
Frage Nr. 30: Man vergleiche die folgenden Ansätze für die Datenbankprogrammierung im Inter- /Intranet: Verwendung datenbankspezifischer Benutzeroberflächen, Verwendung von PHP, Verwendung der JDBC-Schnittstelle hinsichtlich folgender Punkte. Aufwand beim Erstellen der Anwendung Benötigte Software auf dem Server bzw. dem Client Effizienz in der Nutzung der Übertragungskapazität Man bewerte die Ansätze bezüglich der Einsetzbarkeit im Internet und im Intranet. Verwendung datenbankspezifischer Benutzeroberflächen: Kaum Aufwand beim Erstellen Benötigte Software auf dem Client: graphische Oberfläche Benötigte Software auf dem Server: Datenbank-Manager, Datenbank Hohe Übertragungseffizienz durch direkten Zugriff auf die Datenbank und Kompatibilität mit unterschiedlichen Datenbanken und Betriebssystemen Verwendung von PHP: kein sehr hoher Aufwand beim Erstellen, da man durch die relativ einfache Programmiersprache sehr genaue Anweisungen gibt Benötigte Software auf dem Client: Browser, Texteditor (z.b. kedit) Benötigte Software auf dem Server: Datenbank, PHP-Server Niedrige Übertragungseffizienz, da man die Datenbanken ständig öffnen und schließen muss Stefanie Wagensonner, EBS, WS 2008/09 Page 16
Verwendung der JDBC-Schnittstelle: Hoher Aufwand beim Erstellen, da zuerst spezielle Software und Treiber installiert und Anweisungen im Verzeichnis (jar-file im CLASSPATH) geändert werden müssen Benötigte Software auf dem Client: JRE im Produktivbetrieb, JDBC, JRE und JDK während Entwicklung und Test, Texteditor Benötigte Software auf dem Server: Datenbank Hohe Übertragungseffizienz, da unabhängig von Datenbanktyp und Betriebssystem direkt auf das System zugegriffen wird Stefanie Wagensonner, EBS, WS 2008/09 Page 17
Quellenverzeichnis Alle Links zuletzt geöffnet am 19.01.2009 http://www.highscore.de/ http://openbook.galileocomputing.de/it_handbuch/fachinformatiker_11_datenbanken_003.htm#mj2651eb9ee62621ef6b80a5e9063d8c28 http://www.usegroup.de/software/phptutorial/eine_kleine_mysqlreferenz.html#transaktionen http://www.cfml.de/index.cfm?pt=artikel_detail&id=a9eeb542-c09f-30a1-74def1879b118263#myt http://de.wikipedia.org/wiki/lamp http://de.wikipedia.org/wiki/jdbc http://java.sun.com/javase/technologies/database/index.jsp http://www.developer.com/java/data/article.php/3417381 http://books.google.de/books?id=yaxncrzqkcc&pg=pa363&lpg=pa363&dq=befehle+f%c3%bcr+transaktionen+in+mysql&source= web&ots=myk6kcspt&sig=boytscgahvivsrbywzrxldxgfys&hl=de&sa=x&oi=book_result&resnum=4&ct=result http://www.user.fhstralsund.de/~twenge/programmierung_2/javainsel4/javainsel_20_004.htm#rxx365java200 04040008361F02A1BD http://dev.mysql.com/doc/refman/5.1/de/connector-j-usagenotes-basic.html http://www.html-world.de/program/js_9.php Stefanie Wagensonner, EBS, WS 2008/09 Page 18
Abbildungsverzeichnis Abbildung 1: insert_addresses.php Abbildung 2: delete_addresses.php Abbildung 3: select_addresses.php Stefanie Wagensonner, EBS, WS 2008/09 Page 19