= Interaktives SQL E-Learning Modul :author: Jan Klemkow, Benjamin Franzke :lang: de :imagesdir: image == Einleitung E-Learning ist heute mehr als nur die reine Zusammenstellung von Texten mit Bildern und Videos. Interaktive Inhalte mit denen der Student experimentieren kann, sind für den praktischen Lernerfolg von elementarer Bedeutung. Der Bereich der Datenbanken ist ein gutes Beispiel, welches verdeutlicht, wie wichtig das praktische Anwenden von Wissen fuer den Lernerfolg ist. Für Datenbanken gibt es eine große Menge von Lehrbuechern welche alle Aspekte dieses Bereichs erläutern. Diese Lehrbücher und die Vorlesungen bilden im Präsenzstudium die theoretische Grundlage. Um den Umgang mit Datenbanken zu erlernen werden zusätzlich Praktika gegeben, in denen die Studenten eigene Datenbanken erstellen, Daten einpflegen und wieder abfragen. Den Fernstudenten bieten sich solche Möglichkeiten leider nicht. Ihnen bleibt nur die Möglichkeit anhand von Anleitungen eigene Test-Umgebungen aufzubauen, um somit praktische Erfahrungen sammeln zu können. Diese Arbeit beschreibt die Integration von realen Datenbanken in einen E-Learning-Kurs. == Grundlagen Im Fachbereich EuI an der Hochschule Wismar werden zwei verschiedene Systeme -- ILIAS und Moodle -- für Online-Kurse genutzt. Diese Lernplattformen sind beide webbasiert und in PHP geschrieben. Inhalte für verschiedene Kurse der Präsenzstudiengänge sind dort zu finden. Die Lerninhalte des Fachs Datenbanken werden als Kurse des Moodle-Systems bereit gestellt. Zudem gibt es ein interaktives Online-Tutorial für eine Oracle-Datenbank. Dieses System wurde von Nils Weber im Rahmen einer Diplomarbeit realisiert. === Oracle-Tutorial Das Oracle-Tutorial ist ein eigenständiges webbasiertes System welches nicht mit den anderen Lernplattformen verknüpft ist. Es bietet den Studenten die Möglichkeit anhand eines konstruierten Szenarios, auf einer realen Datenbank SQL-Abfragen zu stellen. Den Studenten werden dabei verschiedene Aufgaben gestellt, zu dessen Beantwortung sie SQL-Abfragen formulieren müssen. Diese werden dann auf der Beispieldatenbank ausgeführt und das Ergebnis intern mit einer vorgegebenen Lösung verglichen. Die Aufgaben sind dabei so gewählt, dass der Student möglichst mit allen Arten und allen Aspekte einer SQL-Anfrage konfrontiert wird. Somit bekommt der Student einen umfassenden Einblick in die Möglichkeiten, die SQL-Datenbanken bieten. === Moodle Moodle ist eine modulares Open-Source System und dient als Lernplattform. Es ist webbasiert und in der Programmiersprache PHP geschrieben. Der Name ist gebildet als Akronym aus ``Modular Object-Oriented Dynamic Learning Environment''. Die im Namen bereits festgehalten Modularität kann genutzt werden um die Lernplattform um kursspezifische Aktivitäten zu erweitern. Zur Entwicklung dieses Projekts wurde Moodle in der Version 2.4 eingesetzt. === Videos einbinden Im Rahmen der Lehre von Datenbanken, ist eine attraktive Möglichkeit, die Studenten nicht nur durch Text zu bilden, sondern auch durch Video-Tutorials aufzuzeigen, wie praktisch Probleme umgesetzt werden können. So besteht die Möglichkeit die Installation einer Datenbank interaktiv zu gestalten. Moodle bietet hierfür schon im Standardrepertoire die Möglichkeit, Videos in Textseiten einzubetten. Für diese Aufgabe gibt es in dem WYSIWYG-Edtior eine Schaltfläche ``Medien Hinzufügen'', dort öffnet sich ein Dialog, in dem die Möglichkeit besteht auf dem Server vorhandene, oder direkt hochladbare Videos auszuwählen - oder aber Videos von YouTube einzubinden. == SQLBox ``SQLBox'' ist der Name des Aktivitätsmodul, welches die Möglichkeit bietet SQL Lerntests in Moodle zu integrieren. Es ist als Projekt des Faches ``Multimedia-Projekt'' implementiert worden. Mit diesem Modul lassen sich Aufgaben für Datenbanken anhand eines Beispiels formulieren. Der Tutor, welcher einen Lernkurs für Datenbanken verwaltet, gibt dabei eine Aufgabenstellung in Textform und eine Musterlösung in Form einer SQL-Anfrage-Strings an. Der Student muss entsprechend des Aufgabentextes eine SQL-Anfrage formulieren welche diese Aufgabe löst. .SQLBox mit ausgeführtem Query image::sqlbox.png[] Die SQL-Anfrage der Musterlösung, sowie die des Studenten werden beide nacheinander auf einer realen PostgreSQL-Datenbank ausgeführt. Die dabei entstehenden Antworten werden verglichen und bei Übereinstimmung aller Zeilen, gilt diese Aufgabe für den Studenten als bestanden. Während der Entwicklung des Queries hat der Nutzer, wie in Abbildung 1 zu sehen, die Möglichkeit, die Ergebnistabelle seiner Anfrage zu sehen. Auch mögliche Fehler in dem SQL-Statement, zurück gegeben vom PostgreSQL server, werden dem Studenten angezeigt. Der Tutor kann den Lernfortschritt aller Studenten anhand einer Übersichtstabelle (Abbildung 2) verfolgen. In dieser Tabelle werden alle SQLBox-Aufgaben sowie alle Benutzer einander gegenüber gestellt und zusätzlich der Gesamtfortschritt pro Benutzer angezeigt. .Resultate aller Benutzer für alle Aufgaben mit Fortschrittsanzeige image::reportall.png[] Außerdem gibt es eine weitere Tabelle die jeweils für eine SQLBox die von den Teilnehmern zuletzt angegebene Lösungen -- ob falsch oder richtig -- anzeigt. Diese ist in Abbildung 3 zu sehen. .Resultate einer SQLBox mit Anzeige der SQL-Anfragen image::report.png[] Alle SQLBox-Instanzen in einer Moodle-Installation beziehen sich auf die selbe, einmalig konfigurierte Datenbank. Die Konfiguration der zu nutzenden Datenbank ist also nur einmalig auszuführen. === Das Test-Szenario Alle SQLBoxen finden im selben Beispiel-Szenario statt. Dieses Szanario ist in der dafür im Administrationbereich konfigurierten Datenbank (Standard: ``sqlbox'') abgebildet. Im Rahmen dieser Arbeit wurde das von Nils Weber entwickelte KAPV-Beispiel übernommen. Es ist möglich dieses Szenario zu erweitern oder auch ein vollkommen anderes zu erstellen, indem das Datenbankschema manuell erweitert wird oder Datensätze hinzugefügt werden. Der Datenbestand wurde aus der Oracle Datenbank exportiert, indem alle Daten über +SELECT+-Anfragen, gekapselt in der Oracle-Funktion +dbms_xmlgen.getxml+, abgerufen wurden, und somit als XML gespeichert. Folgend ist die dazu notwendige Eingabe in das Oracle-Tool +sqlplus+ aufgelistet, um zum einen für die KAPV-Datenbank, zum anderen für die Aufgaben, die Daten zu erhalten: [source,sql] ---- include::../oracle-conversion/export-kapv.sql[] ---- [source,sql] ---- include::../oracle-conversion/export-lessons.sql[] ---- Die Ausgabe wird mit Hilfe des Unix-Tools +sed(2)+ und +xmllint+ so nachbearbeitet, dass ein valides XML entsteht, welches mehre Tabellen und Datensätze in einem Dokument enthält. Diese können nun durch XSLT-Processing einfach weiterverarbeitet werden. So werden z.B. die Test-Aufgaben durch ein XSLT-Script so verarbeitet, dass sie automatisiert einer Moodle-Instanz hinzugefügt werden können und die KAPV-Daten von XML in SQL-Befehle transformiert. === Separierung von Benutzern Der Benutzer der SQLBox muss bei jedem Aufruf einen konsistenten Datenbestand vorfinden. Da es dieses System einem Benutzer gestattet reale Anfragen an eine reale Datenbank zu stellen, könnte dieser den Bestand der Datenbank verändern oder beschädigen. Zudem könnten Aufgaben welche das Erstellen oder gezielte Verändern von Tabellen zum Ziel haben, nur einem Benutzer erfüllt werden. Aus diesem Grund ist es notwendig, dass die Anfragen von den verschiedenen Benutzern, von einander getrennt werden. In den Folgenden Abschnitten werden verschieden Möglichkeiten diskutiert und bewertet, die die Trennung der Benutzer erlauben. ==== Transaktionen Eine Idee ist es, die Eingaben des Nutzers durch Transaktionen zu schützen, indem vor dem Ausführen der Nutzeranfrage eine Transaktion gestartet, und danach diese immer zurückgerollt (=ROLLBACK) wird: [source,sql] ---- # sqlbox instruction BEGIN TRANSACTION; # User Input: SELECT * FROM blub; # sqlbox instruction ROLLBACK TRANSACTION; ---- Ein Nutzer könnte aber aus dieser ``Sandbox'' ausbrechen, in dem er die gestarte Transaktion beendet, den Datensatz manipuliert und dann eine neue Transaktion startet, wodurch es nicht einmal zu einer Warnung vom Datenbank-Server kommt: [source,sql] ---- # sqlbox instruction BEGIN TRANSACTION; # User Input: INSET INTO blub VALUES (1,'foo') COMMIT TRANSACTION; BEGIN TRANSACTION; SELECT * FROM blub; # sqlbox instruction ROLLBACK TRANSACTION; ---- Dieses Verfahren würde einen normalen Betrieb ermöglichen, indem Fehlerhafte SQL-Anfragen wieder behoben werden. Es bietet aber die Möglichkeit der gezielten Störung durch böswillige Benutzer. Dies könnte alle Tests unbrauchbar machen und damit einen normalen Lernbetrieb verhindern. ==== Separate Datenbank Um die Anfragen der Nutzer von einander zu trennen, gibt es weiterhin die Möglichkeit jedem Nutzer eine eigene Datenbank zur Verfügung zu stellen. Somit könnte der Nutzer in den Test-Szenarien umfassende Änderungen an der Datenbank vornehmen, ohne andere Nutzer dabei zu beeinträchtigen. Die Übungen können dann nacheinander so konstruiert werden, dass der Nutzer die Datenbank in eine bestimmte Richtung hin verändert. Der größte Nachteil liegt im erheblichen Verwaltungsaufwand. Es muss bestimmt werden für welche Moodle-Nutzer eine Datenbank angelegt wird. Zudem muss es Möglichkeiten geben, die Datenbanken wieder zurückzusetzen, sollte ein Nutzer die Datenbank in einen Zustand bringen, der keine erfolgreichen Test mehr erlaubt. Dabei müsste geklärt sein, zu welchem Zustand diese Rücksetzung geschehen müsste. Entweder in einen Zustand indem der Nutzer an der nächsten noch offenen Aufgabe weiter arbeiten kann, oder in einen Grundzustand, bei dem der Nutzer alle Aufgaben von neuem erfüllen muss. Alle diese Maßnahmen würden den Entwicklungsaufwand enorm steigern. ==== Keine Schreibrechte Im einfachsten Fall, bekommen die Nutzer nur Lese-Rechte auf die Datenbank. Dies hat den Vorteil, dass der Verwaltungsaufwand für das Modul, sowie der Speicherbedarf der Datenbank verringert wird. Mit dieser Variante lassen sich hingegen nur +SELECT+-Anfragen stellen. Andere Anfragen, wie +UPDATE+, +DELETE+, +CREATE+ und +ALTER+ könnten dann nicht innerhalb mit der SQLBox erprobt werden. Dazu wird mit einem privilegiertem Account ein Nutzer angelegt, der für die Datenbank nur Leserechte, also für +SELECT+, besitzt: [source,sql] ---- sqlbox=# create user sqlbox_read with password 'XXXXXX'; CREATE ROLE sqlbox=# GRANT SELECT ON ALL TABLES IN SCHEMA public TO sqlbox_read; GRANT ---- ==== Fazit Transaktionen könnten das Risiko von fehlerhaften Anfragen für die Datenbank stark reduzieren. Da dieser Mechanismus aber keinen Schutz vor gezielten Manipulationen bietet, ist er für eine Lernplattform mit vielen unbekannten Nutzern ungeeignet. Separate Datenbanken für Benutzer bieten eine sehr gute Trennung und verhindern eine direkte gegenseitige Beeinflussung. Der Entwicklungsaufwand des Moodle-Moduls und die genutzten Ressourcen der Datenbank im Betrieb sind zu hoch im Verhältnis der anderen Lösungen. Aus diesem Grund kommt diese Lösung unter den Umständen dieses Projekte nicht in Betracht. Eine Read-Only-Lösung indem es den Benutzern nur erlaubt wird +SELECT+-Anfragen zu stellen schränkt die Vielfalt der Aufgabenmoeglichkeiten ein, aber bietet sichere Trennung der Benutzer sowie einen geringen Entwicklungsaufwand für das Modul. Da der Hauptfokus beim Erlernen der SQL-Sprache auf den verschiedensten Möglichkeiten von Anfragen liegt und das Anlegen von Tabellen und Spalten im Vergleich eher nebensächlich zu betrachten ist, stellt sich diese Lösung am geeignetsten für das Problem der Benutzertrennung unter den aktuellen Umständen da. == Installation Das Moodle-Modul (+sqlbox/+ im Projektordner) muss zunächst auf den Server in das Modulverzeichnis (+mod+) der Moodle-Installation kopiert werden: [source,sh] ---- cp -R sqlbox/ /path/to/moodle/htdocs/mod/ ---- Es sollte im weiteren eine Datenbank für die Tests und dazugehörige Nutzer, mit und ohne Schreibrechte, angelegt werden. [source,sh] ---- su - postgres # Read-Write Nutzer: sqlbox psql -c "create user sqlbox createdb;" template1 psql -c "alter user sqlbox with encrypted password 'sqlbox_pw';" template1 # Read-Only Nutzer: sqlbox_read psql -c "create user sqlbox_read;" template1 psql -c "alter user sqlbox_read with encrypted password 'sqlbox_pw';" template1 # Datenbank: sqlbox psql -c "create database sqlbox with encoding 'unicode';" -U sqlbox template1 psql -c "alter user sqlbox nocreatedb;" template1 # Leserechte für sqlbox vergeben psql -c "grant select on all tables in schema public to sqlbox_read;" sqlbox # Reload Postgresql, e.g: /etc/init.d/postgresql-X.Y reload ---- Die KAPV-Datenbasis kann über das im Projektordner enthaltene Schema und die Daten erhalten werden. Diese sind bereits mittels XSLT konvertiert und in separaten SQL-Dateien abgespeichert: [source,sh] ---- psql -f oracle-conversion/kapv-schema.sql sqlbox psql -f oracle-conversion/kapv.sql sqlbox ---- Nun kann in Moodle die Konfiguration des Plugins vorgenommen werden. Als Administration wird die Datenbankkonfiguration über: +Einstellungen->Website-Administration->Plugins->Aktivitäten->sqlbox+ erreicht. Hier müssen Hostname, Datenbank, Nutzer und Passwort entsprechend der zuvor getätigten Konfiguration eingetragen werden. In dem Kurs, in dem die Tests aufgeführt werden sollen, muss nun die Editierung über +Einstellungen->Kurs-Administration->Bearbeiten einschalten+ aktiviert werden, sodass unterhalb jeder Sektion die Möglichkeit eingeblendet wird, eine Aktivität anzulegen. In der Aktivitätsliste wird ``SQLBox'' gewählt und eine Aufgabe mit Beschreibung und Referenz-Abfrage angelegt. Dieser Prozess wiederholt sich für jede zu stellende Aufgabe. Zusätzlich können die Testaufgaben automatisiert der Moodle-Instanz hinzugefügt werden. Dazu wird die der exportierte Aufgabendatenbestand von Nils Weber benutzt. Dieser ist in der Datei +oracle-conversion/lesson.xml+ zu finden. Ein XSLT-Programm (+oracle-conversion/oracle-conversion/lesson-add-to-moodle.xsl+) erstellt Kommandozeilenbefehle, die zur Erstellung ausgeführt werden müssen. Dazu wird das Kommandozeilen Programm curl benutzt, das HTTP-Anfragen erlaubt. Zu Erzeugung wird also das reguläre Admin-Interface von SQLBox automatisiert benutzt. Dazu muss im Script +oracle-conversion/create-kapv-in-moodle.sh+ die Moodle-Session (vom Cookie auszulesen) und der Session-Key (in den URLs enthalten) angepasst werden um es danach auszuführen. Außerdem müssen Course-, Section- und Modul-ID angepasst werden. [source,sh] ---- cd oracle-conversion sh create-kapv-in-moodle.sh ---- == Literatur * Nils Weber, Diplomarbeit, ``Entwicklung eines Webinterfaces fuer das Oracle-Datenbankpraktikum'', HS-Wismar, 2004 // vim: textwidth=80 ft=asciidoc :