= Interaktives SQL E-Learning Module :author: Jan Klemkow, Benjamin Franzke :lang: de == 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 eine große Menge von Lehrbuechern welche alle Aspekte dieses Bereichs erläutern. Diese Lehrbuecher 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 bleiben nur die Moeglichkeiten 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 interaktives Online-Tutorial fuer 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 verschieden 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 alle Arten und alle Aspekte einer SQL-Anfrage konfrontiert wird. Somit bekommt der Student einen umfassenden Einblick in die Möglichkeiten, die sich mit SQL-Datenbanken ergeben. === 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. === Moodle-Module Moodle-Module. === Videos einbinden Für Moodle ist ein integriertes Video-Plugin verfügbar. == 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 Anhand des Aufgabentextes eine SQL-Anfrage formulieren welche diese Aufgabe löst. 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 Zeile gilt diese Aufgabe fuer den Studenten als Bestanden. Der Tutor kann den Lernfortschritt aller Studenten anhand einer Übersichtstabelle verfolgen. In dieser Tabelle werden alle SQLBox-Aufgaben sowie alle Benutzer einander gegenüber gestellt und zusätzlich der Gesamtfortschritt pro Benutzer angezeigt. 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. 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 & 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 konsistenen Datenbestand vorfinden. Da es dieses System einem Benutzer gestattet reale Anfragen an eine reale Datenbank zu stellen, koennte dieser den Bestand der Datenbank veraendern oder beschaedigen. Zudem koennen Aufgaben welche das Erstellen oder gezielte Veraendern von Tabellen nur einem einem Benutzer erfuellt werden. Aus diesem Grund ist es notwendig, dass Anfrage von der verschiedenen Benutzer von einander trennen werden. In den Folgenden Abschnitten werden verschieden Moeglichkeiten diskutiert und bewertet, die Trennung der Benutzer erlauben. ==== Transactions Eine Idee ist es, die Eingaben des Nutzers durch Transaktionen zu schützen, indem vor dem Ausführen der Nutzeranfrage eine Transaktion gestartet wird, 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 gestartet Transaktion beendet, den Datensatz manipuliert und dann eine neue Transaktion startet: [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 wuerden einen normalen Betrieb ermoeglichen, indem Fehlerhafte SQL-Anfragen wieder behoben werden. Es biete aber die Moeglichkeit der gezielten Stoerung durch boeswillige Benutzer. Diese koennte alle Tests unbrauchbar machen und damit einen normalen Lernbetrieb verhindern. ==== Separate Datenbank Um die Anfragen der Nutzer von einander zu trennen, gibt es ebenfalls die Moeglichkeit jedem Nutzer eine eigene Datenbank zur Verfuegung zu stellen. Somit koennte der Nutzer in den Test-Szenarien umfassende Aenderungen an der Datenbank vornehmen, ohne andere Nutzer dabei zu beeintraechtigen. Die Uebungen koennen dann nach einander so konstruiert werden, dass der Nutzer die Datenbank in eine bestimmte Richtung hin veraendert. Der groesste Nachteil liegt im erheblichen Verwaltungsaufwand. Es muss bestimmt werden fuer welche Moodle-Nutzer eine Datenbank angelegt wird. Zudem muss es Moeglichkeiten geben, die Datenbanken wieder zurueckzusetzen, sollte ein Nutzer die Datenbank in einen Zustand bringen, der keine erfolgreichen Test mehr erlaubt. Dabei muesste geklaert sein, in welchem Zustand diese geschehen muesste. Entweder in einen Zustand indem der Nutzer an der naechsten noch offenen Aufgabe weiter arbeiten kann, oder in eine Grundzustand, bei dem der Nutzer alle Aufgaben von neuem erfuellen muss. Alle diese Massnahmen wuerden den Entwicklungsaufwand enorm steigern. ==== Keine Schreibrechte Im einfachsten Fall, bekommen die Nutzer nur Lese-Rechte auf die Datenbank. Dieses hat den Vorteil, dass der Verwaltungsaufwand fuer das Modul, sowie der Speicherbedarf der Datenbank verringert wird. Mit dieser Variante, lassen sich hingegen nur +SELECT+-Anfragen stellen. Andere wichtige Anfragen, wie +UPDATE+, +DELETE+, +CREATE+ und +ALTER+ koennten dann nicht innerhalb mit der SQLBox erprobt werden. Dazu wird mit einem priviligierten 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 koennten das Risiko von fehlerhafen Anfragen fuer die Datenbank stark reduzieren. Da dieser Mechanismuss aber keinen Schutz vor gezielten Manipulationen bietet, ist er fuer eine Lernplattform mit vielen unbekannten Nutzern ungeeignet. Separate Datenbanken fuer 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 Verhaeltniss der anderen Loesungen. Aus disem Grund kommt diese Loesung unter den Umstaenden dieses Projekte nicht in Betracht. Eine Read-Only-Loesung indem es den Benutzern nur erlaubt wird +SELECT+-Anfragen zustellen schraenkt die Vielfalt der Aufgabenmoeglichkeiten ein, aber bietet sichere Trennung der Benutzer sowie einen geringen Entwicklungsaufwand fuer das Modul. Da er Hautpfokus beim Erlernen der SQL-Sprache auf den verschiedensten Moeglichkeiten von Anfragen liegt und das Anlegen von Tabelle und Spalten im Vergleich eher nebensaechlich zubetrachten ist, stellt sich diese Loesung am geeignetsten fuer das Problem der Benutzertrennung unter den aktuellen Umstaenden da. == Installation Das Modul verzeichnis (sqlbox/ im Projektordner) muss zunächst auf den Server in das mod Verzeichnis 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 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 die im Projekt enthaltenen Schemata und Daten erreicht, diese sind in separaten SQL-Datein 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. 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 Edititierung ü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 stellendene Aufgabe. Alternativ können die Testaufgaben automatisiert der Moodle instanz inzugefü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 notwendig sind. Dazu wir das Kommandozeilen Programm curl benutzt, das HTTP-Anfragen erlaubt. Zu Erzeugung wird also das reguläre Moodle-Formular benutzt. Dazu muss im Script +oracle-conversion/create-kapv-in-moodle.sh+ die MoodleSession (vom Cookie auszulesen) und der sesskey (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 // vim: textwidth=80 ft=asciidoc :