next up previous contents index
Next: Anhang Up: Weitere Konzepte und Implementierungsdetails Previous: db_revoke_on_view($objekt, $user, $rechte="", $connection_name="default"):

Views und temporäre Tabellen

In Datenbanksystemen unterscheidet man die folgenden drei Ebenen:

1.
In der physischen Ebene ist festgelegt, wie die Daten physisch gespeichert sind und welche Zugriffsrechte bestehen. Dabei spielen der Datentyp und die Länge eines Attributs, der Aufbau der gespeicherten Datensätze, und Indexorganisation eine wichtige Rolle. Die Effizienz der physischen Ebene bestimmt maßgeblich das Leistungsverhalten des DBMS.
2.
In der logischen Ebene wird in einem Datenbankschema festgelegt, welche Daten gespeichert sind. Dadurch werden die Objekt- und Beziehungstypen sowie der Wertevorart beschrieben. Die Daten und Beziehungen werden dabei unabhängig von der tatsächlichen Speicherung betrachtet.
3.
Die Sichten stellen Teilmengen der Informationen bereit. Sie sind auf die Bedürfnisse der jeweiligen Benutzer bzw. Benutzergruppen abgestimmt. Insbesondere soll kein Benutzer Daten sehen, die er nicht sehen will (Übersichtlichkeit) oder nicht sehen darf (Datenschutz). [Skript Kriegel DBS I, Kemper/Eickler Datenbanksysteme]
Auch für die Datenbank der Workflow-Anwendung können verschiedene Benutzer bzw. Benutzergruppen identifiziert werden. Neben den Mitarbeitern des Lehrstuhls sollen auch Studenten und Tutoren auf die Datenbank zugreifen dürfen. Während den Mitarbeitern eine uneingeschränkte Sicht auf die Daten gewährt werden kann, sollen die anderen Benutzergruppen nur eine notwendige Teilmenge der Daten sehen. Für einen Tutor könnte man beispielsweise einen View auf einzelne Datentupel der Relation 'student_erhaelt_punkte' einrichten. Dies sollten nur Datentupel sein, die sich auf eine Aufgabe eines Übungsblatts oder einer Klausur beziehen, die der Tutor zu korrigieren hat. Schlecht wäre es, wenn der Tutor auch auf Klausuraufgaben Zugriff hätte, die er selber geschrieben hat.

Ein View wird in SQL mit Hilfe des Befehls 'CREATE VIEW <viewname> AS' erzeugt. Dabei ist an das Schlüsselwort 'AS' eine SELECT-Anfrage anzuhängen, die die Daten des Views definiert. Neben der Erzeugung des Views muss die Benutzung desselben für einen Benutzer autorisiert werden. Dazu dient das GRANT-Kommando. Mit diesem Kommando wird außerdem festgelegt, welche Zugriffsmöglichkeiten dem Benutzer gewährt werden sollen. Die üblichen Standardprivilegien sind SELECT, INSERT, UPDATE, DELETE und REFERENCES. Mit dem REFERENCES-Privileg erhält man die Möglichkeit Fremdschlüssel zu referenzieren.

Die getesteten DBMS MySQL, PostgreSQL und Interbase unterstützen Views nur teilweise oder gar nicht:

Wir haben versucht mit den Funktionen in der Library 'lib-view-control.inc.php' die beschriebenen Probleme der DBMS mit Views abzumildern. Mit Hilfe der Funktion 'view_create' können Write-Through-Views erzeugt werden. Die Parameter der Funktion sind in Tabelle [*] knapp dargestellt (genaueres und Informationen zu den anderen Funktionen siehe Quelltext). Bei Interbase und PostgreSQL werden dazu automatisch Trigger bzw. Rules generiert, im Falle MySQL wird versucht das View-Konzept mit temporären Tabellen nachzubilden. Bei der Definition des Views können auch Joins verwendet werden. Allerdings wird das Durchschreiben von Datenmanipulationen durch den View hindurch nur auf eine DB-Relation ermöglicht. Der Name dieser Relation muss der Funktion 'view_create' als Argument übergeben werden. Auch in unserem Konzept werden keine Aggregationen bzw. Gruppierungen unterstützt.


 
Tabelle:  Parameter der Funktion 'view_create'
english Parameter german english Beschreibung german
english id german english String, mandatory. Die Views müssen für jeden Workflow eindeutige IDs erhalten. Die View-Namen selber werden von der Anwendung generiert. german
english query_array german english Array, mandatory. Der Aufbau entspricht der Beschreibung in Abschnitt 4.3.4. german
english tabelle german english String, mandatory. Auf diese Tabelle sollen die Datenmanipulationen durchgeschrieben werden. german
english user german english String. Durch Komma getrennte Liste von Benutzernamen. (Gruppen werden durch das Schlüsselwort GROUP gekennzeichnet.) Für diese Benutzer werden standardmäßig Zugriffsrechte auf den View vergeben german
english rechte german english String oder Array. Durch Komma getrennte Liste der Zugriffsrechte. Bei der Verwendung der Array-Versionen können Benutzernamen als Keys verwendet werden. Die Zugriffsrechte im Value werden dann diesem Benutzer gewährt. Bei der Verwendung der String-Version, werden die Rechte den Benutzern im Parameter 'user' zugewiesen. german
english view_name german english String. Der Viewname wird normalerweise von der Anwendung generiert. Wem dies nicht gefällt kann hier den Viewnamen vorgeben. Dabei ist allerdings darauf zu achten, dass der Name noch nicht vergeben ist. german
english req german english Array. Attribut-Werte-Paare. Key: Attributname, Value: Wert. Diese Werte werden bei der Erzeugung neuer Tupel durch den View grundsätzlich verwendet. german

Die Rules bzw. Trigger, die bei Postgres und Interbase für Datenmanipulationen auf Views notwendig sind, werden in 'lib-view-control.inc.php' automatisch angelegt. Dabei richtet sich die Library nach den Rechten, die für einen View gelten sollen. Wird beispielsweise einem Benutzer das Update-Recht auf einen View erteilt, erzeugt die Library einen geeigneten Update-Trigger. Gleiches gilt für Insert und Delete. Eine wichtige Rolle spielen dabei die Primärschlüssel-Attribute der Relation, auf die die Datenmanipulationen durchgeschrieben werden. Diese können über den View nicht mit einem Update geändert werden, da sonst der Zusammenhang zwischen dieser Relation und dem View nicht mehr einfach herzustellen ist. Bei Insert-Operationen berücksichtigt der entsprechende Trigger außerdem ein Attribut-Werte-Array, das der Funktion 'view_create' übergeben werden kann. Damit können Werte für bestimmte Attribute fest vorgegeben werden, die beim Erzeugen eines neuen Tupels auf jeden Fall verwendet werden.

Da MySQL keine Views kennt, haben wir versucht mit temporären Tabellen ein Ersatz zu schaffen, den wir Pseudoviews genannt haben. Dabei kann die gleiche Schnittstelle für die Pseudoviews verwendet werden, wie bei den echten Views. D. h. die Funktionen 'view_create', 'view_drop' etc. sind auch bei MySQL verwendbar. Wer ganz bewusst Pseudoviews erzeugen will, z. B. auch bei der Verwendung des DBMS PostgreSQL, kann die Funktionen 'pseudoview_create' etc. aufrufen. Der Nachteil der Pseudoviews ist, dass kein automatischer und sofortiger Abgleich mit der Relation stattfindet, auf die die Datenmanipulationen durchgeschrieben werden sollen. Dies muss ``manuell'' mit Hilfe der Funktion 'pseudoview_update' ausgelöst werden. Diese Funktion wird auf jeden Fall vor dem Löschen des Pseudoviews aufgerufen. Existiert ein Pseudoview längere Zeit, ist es unter Umständen sinnvoll, einen Cron-Job einzurichten, der die Updates in bestimmten Zeitintervallen erledigt.

Die Funktion 'pseudoview_update' unterstützt zwei Abgleich-Arten:

1.
Beim normalen Datenabgleich wird zunächst eine zweite temporäre Tabelle entsprechend der View-Definition erzeugt. Durch Vergleich der beiden temporären Tabellen kann dann festgestellt werden, welche Datenmanipulationen auf der ersten durchgeführt wurden. Diese Veränderungen werden dann nachgeführt auf die Relation, die für das Durchschreiben der Datenmanipulationen vorgesehen ist.
2.
Darüber hinaus hat man bei den Pseudoviews die Möglichkeit, bei der Definition des Views die Option WITH CHECK zu verwenden. Dadurch wird sichergestellt, dass alle Datenmanipulationen den Vorgaben der View-Definition genügen. Dazu wird in der ersten Phase zunächst eine Kopie der Relation erzeugt, auf die die Datenmanipulationen durchgeschrieben werden sollen. Der Abgleich findet dann wie beim normalen Abgleich auf dieser Kopie statt. In der zweiten Phase wird auf Basis der Kopie nocheinmal eine temporäre Tabelle erzeugt, die jetzt im Gegensatz zur ursprünglichen Pseudoview-Tabelle nur noch Tupel enthält, die der View-Definition entsprechen. Mit dieser neuen temporären Tabelle wird ein zweiter normaler Datenabgleich vorgenommen, diesmal jedoch auf der originalen Durchschreibe-Tabelle.
Wie bei den echten Views können auch bei den Pseudoviews die Primärschlüssel-Attribute der Durchschreibetabelle nicht geändert werden.


next up previous contents index
Next: Anhang Up: Weitere Konzepte und Implementierungsdetails Previous: db_revoke_on_view($objekt, $user, $rechte="", $connection_name="default"):
Copyright Munich Network Management Team