Virtabs: alle Features

Über die bereits geschilderten Grundfunktionen hinaus haben die Virtabs folgende erweiterte Eigenschaften:

Kapselung der Schlüsselstruktur

Virtabs sind Datenbankobjekte, die wie Views verschiedene Tabellen über 1:n-Schlüssel verbinden, sich ansonsten aber wie reguläre Tabellen präsentieren. Die Mechanismen der Tabellenverknüpfung über Primärschlüssel-Fremdschlüssel-Paare werden dabei vollständig gekapselt.
Schon am Beispiel der Virtab depts wird deutlich, dass die numerische, technische Schlüsselreferenzstruktur, die aus Primär- und Fremdschlüsseln gebildet wird, von einer Virtab vollständig verborgen werden kann. Beim Zugriff auf die Datenbank über eine durch eine Virtab gebildete Sicht sind nur noch anwendungsbezogene, inhaltlich Bedeutung tragende Zweitschlüssel (im Beispiel regional_group und name) relevant, nicht aber die für das RDBMS optimalen numerischen Primärschlüssel (im Beispiel location_id, department_id und address_id). Die mehr technischen Aspekte des ER-Diagramms (Implementierung der Schlüsselstruktur) werden also von den Virtabs gekapselt.

Zweitschlüssel (Attribut “IDENTIFYING”)

Mehrere Spalten einer Tabelle können gemeinsam als Zweitschlüssel markiert werden, Virtab-Records sind dann auch über eine Kombination von Werten für diese Spalten lokalisierbar. Eine konkrete Virtab muss aber nicht alle IDENTIFYING-Felder jeder Basistabelle enthalten: die Virtab-Prozeduren prüfen zur Laufzeit, ob die Records in den Basistabellen mit den angegeben Spalten eindeutig lokalisiert werden können. Zweitschlüssel können bei UPDATE allerdings nicht geändert werden, wenn kein Primärschlüssel verwendet wird.

Schreibgeschützte Basistabellen (NOCHANGE)

Grundsätzlich kann über eine Virtab eine beliebige Menge von miteinander über Schlüsselverweise verknüpften Tabellen manipuliert werden. Es ist aber sinnvoll und auch möglich, innerhalb einer Virtab eine Menge von Tabellen anzugeben, die nicht verändert werden dürfen (z.B. reine Stammdaten). Sind alle Tabellen in einer Virtab schreibgeschützt, hat die Virtab nur noch die Funktionalität der klassischen View.
Mit depts _2 (vgl. 5.2.3) wird die Ausgangsfunktionalität von depts dahingehend eingeschränkt, dass mit dieser Virtab nur noch neue Abteilungen, nicht aber Geschäftsstellen angelegt bzw. modifiziert werden können.

Änderungszwang für Basistabellen (MUSTCHANGE)

Es ist möglich, innerhalb einer Virtab diejenigen Datenbanktabellen zu spezifizieren, die bei einer per Virtab ausgeführten Einfüge- oder Löschoperation geändert werden müssen, indem in diese Tabellen neue Records geschrieben oder existierende gelöscht werden können müssen. Das Standardverhalten der Virtabs gewährleistet dagegen dieses Verhalten nicht, weil es ausreicht, irgendwelche Datenbankinhalte, die von der Virtab angesprochen werden, einzufügen oder zu löschen. Der Versuch des Einfügens eines bereits komplett in der Datenbank vorliegenden Virtab-Records führt z.B. zur stillschweigenden Ignorierung dieser Operation, wenn nicht bestimmte Tabellen in der Virtab-Definition als MUSTCHANGE qualifiziert sind. Beim Löschen wird im Normalfall nicht das Löschen des gesamten Virtab-Records als erfolgreiche Ausführung der Operation gewertet, sondern bereits das erfolgreiche Löschen eines einzigen beteiligten Datenbankattributs. Über die MUSTCHANGE-Qualifizierung von Datenbanktabellen in einer Virtab erhält der Benutzer die Gewähr, dass er entsprechende Fehlermeldungen erhält, wenn die Operationen nicht entsprechend ausführbar sind.

Vorbelegen von Virtab-Spalten mit Werten (DEFAULT)

Für beliebige Spalten einer Virtab können mit Defaultwerten belegt werden. Dies können Konstanten, aber auch der Inhalt einer anderen Virtab-Spalte sein. Der Default wird verwendet, wenn bei einem schreibenden Zugriff ein NULL-Wert für die betreffende Spalte gesetzt ist. Mit depts_3 (vgl. 5.2.5) ist eine modifizierte Virtab definiert, die die Spalte regional_group automatisch mit 'New York' vorgibt. Im Unterschied zum Beispiel 6 ist es hier jedoch möglich, andere Werte als 'New York' zu übergeben bzw. abzufragen.
Das Schlüsselwort VALUE wirkt wie DEFAULT, es setzt aber die betreffende Virtab-Spalte auf jeden Fall auf den angegeben Wert.

Verstecken von vorbelegten Virtab-Spalten (INVISIBLE DEFAULT)

Spalten, für die Defaultwerte angegeben wurden, können zusätzlich versteckt werden. Sie sind dann nach außen hin nicht als Spalten sichtbar, bleiben aber bei Operationen mit der Virtab wirksam (vgl. 5.2.6). Die Datenbank wird also “unsichtbar” über die Virtab mit konstanten Werten belegt.

Ausdrücke als Virtab-Spalten (COLUMN CALCULATES)

Normalerweise ermöglicht eine Spalte einer Virtab den direkten Zugriff auf eine Spalte einer Basistabelle. Es können aber auch Virtab-Spalten definiert werden, die bei Abfragen das Ergebnis bestimmter SQL-Ausdrücke liefern (“calculated columns”). Bei INSERT-, UPDATE- und DELETE-Operationen werden Werte in diese Spalten dann ignoriert.

“Synthetische” Virtab-Spalten

Als Erweiterung von berechneten Spalten (CALCULATES) sind synthetische Virtab-Spalten ebenfalls unabhängig von den Basistabellen, zusätzlich können aber auch Schreibzugriffe auf diese Spalten ausgewertet werden. Dies geschieht, in dem bei der Abfrage mit SELECT und beim Schreiben mit INSERT, UPDATE und DELETE jeweils bestimmte stored procedures aufgerufen werden, die dann beliebiges Verhalten der Spalte implemenetiren können. Die Schreib/Lese-Konsistenz  sollte allerdings bewahrt werden. Die zugehörigen Schlüsselworte sind ONGET, ONINSERT, ONUPDATE und ONDELETE.

Prüfbedingungen (CONSTRAINT)

Da Virtabs tabellenübergreifende Objekte sind, lassen sich auch tabellenübergreifende Prüfbedingungen (Constraints) definieren. Constraints können beliebige SQL-Ausdrücke sein, die verschiedene Virtabspalten miteinander verknüpfen. Diese sind so implementiert, dass in einer Virtab bestimmte Bedingungen zwischen den Datenspalten bei jedem Prozeduraufruf eingehalten werden müssen, und die entsprechende View auch nur Datensätze liefert, die diesen Bedingungen entsprechen.
Das depts-Beispiel könnte zur zusätzlichen Virtab depts_5 modifiziert werden, die die Spalte regional_group automatisch zwingend mit 'New York' oder 'Boston' vorgibt (vgl. 5.2.7). Alle Operationen auf depts_5 würden dann immer nur solche Spalten aus department betreffen, deren locatation_id auf regional_group = 'New York' bzw. 'Boston' zeigt. Es findet also eine explizite thematische Vorauswahl statt.
Prüfbedingungen können auch mit (versteckten) Vorbelegungen kombiniert werden (vgl. 5.2.8).
 

Virtabs sind damit generell in der Lage, nicht nur bestimmte Spalten verschiedener Datenbanktabellen, sondern auch bestimmte Zeilen dieser Tabellen als neue, virtuelle Tabellen zu präsentieren. Virtab-Constraints garantieren dabei jedoch nur die Schreib- und Lesekonsistenz bzgl. jeweils einer Virtab, sie stellen keine RDBMS-Constraints dar. So dürfen z.B. die Vorbelegungen von Spalten die RDBMS-Constraints nicht verletzen.

Eine Besonderheit stellen Eindeutigkeits-Constraints (UNIQUE CONSTRAINTS) dar: Bei diesen wird nicht der aktuelle Datensatz geprüft, sondern es wird kontrolliert, ob alle Datensätze der Virtab-View hinsichtlich bestimmter Schlüsselfelder unterscheidliche Werte haben.

Mehrfach-Zugriff auf Tabellen (QUERY)

In einer Virtab ist es möglich, gleichzeitig mehrere Datensätze aus einer Tabelle in die interne Verknüpfungsstruktur einzubetten. Dies geschieht über den Mechanismus, dass innerhalb der Virtab für jede dieser multiplen Auswahlen eine gesonderte Abfrage (Query) definiert wird. Alle einzelnen Virtab-Queries müssen dabei aber durch eine Query verbunden sein, die Elemente jeder Teilquery beinhaltet.
Diese Funktionalität wird durch die Virtab letter_data (siehe 5.2.9) veranschaulicht, die man z.B. für die Ausgabe eines Briefkopfs mit Absender- und Empfängerdaten auf Basis einer Datenbankabfrage einsetzen könnte. Dies bedeutet zwangsläufig einen doppelten Zugriff auf address.
Sie benutzt im Kern die Tabellen der Angestellten (employee) und Kunden (customer), die beide auf (verschiedene) Einträge in address verweisen.
Diese Möglichkeit zum Mehrfachzugriff hat eine interessante Konsequenz: Informationen, die in mehreren Zeilen einer Datenbank-Tabelle stehen, können der Anwendung gegenüber als mehrere Spalten eines Datensatzes einer Virtab präsentiert werden.

Explizite Auswahl der Schlüsselstruktur zwischen Basistabellen (FOREIGNKEY / NOFOREIGNKEYS)

Im Normalfall erkennt die Virtab-Implementierung selbständig die Schlüsselstruktur, die nötig ist, um die Einträge aller in einer Virtab angesprochenen Tabellen eindeutig miteinander zu verbinden. Diese Automatik kann jedoch manuell beeinflusst werden. Bei komplexen Datenstrukturen und komplizierten Virtab-Anforderungen muss diese Funktionalität benutzt werden.
Diese Funktionalität wird ebenfalls in 5.2.9 dargestellt. Die FOREIGNKEY-Anweisung legt fest, welche Fremdschlüssel (ggf. welcher Teil-Query) in einer Virtab dazu benutzt werden sollen, Detail-Informationen zuzuordnen. Mit NOFOREIGNKEYS wird ausgedrückt, dass dem betreffenden (Teil-)Datensatz keine Detail-Informationen zugeordnet werden sollen, er also in der Virtab das Blatt eines Hierarchie-Teilbaumes darstellt (vgl. 5.2.10).

Rekursives Löschen

Das RDBMS beherrscht in der Regel eine Operation wie 'delete ... cascade', die alle Detaildatensätze eines zu löschenden Masterdatensatzes löscht. Die Delete-Prozedur der Virtabs implementiert das umgekehrte Verhalten: Ein Masterdatensatz kann erst (optional) gelöscht werden, wenn sein letzter Detaildatensatz gelöscht werden konnte.

“Optionale” Basistabellen (OPTIONAL)

Das Konzept der “optionalen” Basistabelle erweitert den Mechanismus des “OUTER JOIN” des SELECT-Statements auf die Schreibfähigkeiten der Virtabs.
Normalerweise muss in jeder Basistabelle der Virtab ein Record vorhanden sein. Andernfalls kann der Virtab-Record von der View nicht angezeigt werden, und die Lokalisierung bei UPDATE und DELETE schlägt fehl.
“Optionale” Basistabellen sind Datenbank-Tabellen, bei denen Records fehlen dürfen, ohne das die Virtab dies als Fehler wertet.
In der erzeugte Viewdefinition werden für solche Tabellen OUTER JOINS eingebaut, die Virtab-Prozeduren behandeln diesen Fall mit besonderer Logik.

Hints

Es kann nötig werden, die Performance der Virtab-View manuell zu beschleunigen. Zu diesem Zweck können mit der HINT-Anweisung Optimierungsregeln für die Virtab-View eingestellt werden.
Mit TABLEORDER kann eine bestimmte Tabellen-Reihenfolge in der FROM-Klausel der Virtab-View erzwungen werden.
Mit “TABLEORDER FOR <tablename>” kann eine Tabellenreihenfolge eingestellt werden, die mit <tablename> beginnt und dann nach den Master-Detail-Beziehungen ist. Dies ist die optimale Reihenfolge, wenn die Virtab-View beim SELECT-WHERE durch Spalten von <tablename> eingeschränkt wird.

Freie Views definieren mit VIRTUALTABLE CALCULATES

Manchmal ist es nötig, eine beliebige SQL-View als Virtab zu deklarieren (zum Beispiel, wenn die View aus einer Virtab abgeleitet wurde, oder um sie über ER2SQL erzeugen zu können).
Eine solche SQL-View wird mit VIRTUALTABLE <virtabname> CALCULATES <select-statement> definiert. Ein so erzeugte Virtab ist immer NOCHANGE, Prozeduren und Trigger werden für sie nie erzeugt.
Um für verschiedene Datenbanktypen verschiedenes SQL anzugegben, kann man die erweiterte Syntax “CALCULATES <dbcode>” benutzen.

Projektspezifische Features

In ER2SQL sind für spezielle Projekte individuelle Varianten der Code-Erzeugung eingebaut. Diese projektspezifischen Funktionen werden in den SQL-Code eingebaut, wenn für die Virtab ein “FEATURE <featurename>” definiert wurde.
Derzeit ist z.B. eine Zugriffsverwaltung als Teil der Virtab-Definitionen derart aktivierbar.

Vererben von Virtab-Eigenschaften

Häufig ist es nötig, ähnliche Virtabs mit leicht verschiedenen Eigenschaften zu konstruieren (Varianten mit und ohne Primärschlüssel für Basistabellen, mit und ohne bestimtme Basistabellen-Spalten, eine vorhandene Virtab um noch eine Basistabelle erweitern).
Mit dem Schlüsselwort MODIFIES kann eine Virtab von einer anderen Virtab abgeleitet werden. Mit der Anweisung USES kann die Basistabellen-Struktur einer oder mehrerer anderen Virtab in eine neue Virtab eingebaut werden.
In beiden Fällen brauchen dann nur noch die Unterschiede zu den derart benutzten Basis-Virtabs definiert zu werden. Ausgetestetete Basis-Virtabs können so in anderer Virtabs “eingesetzt” werden, was den Entwicklungsprozess beschleunigt.
Spalten aus Basis-Virtabs, die in abgeleiteten Virtabs unsichtbar sein sollen, werden mit dem Attribut PRIVATE gekennzeichnet.
Durch den Vererbungs-Mechanismus lassen sich Virtab-Hierarchien aufbauen, die den Klassenhierarchien aus objektorientierten Programmiersprachen entsprechen. Die USES Anweisung ermöglicht dabei Mehrfachvererbung, wie in C++.

Virtabs als Basis-Tabellen: “VR-Diagramm”

Ein weiterer Weg, Virtabs auf anderen Virtabs aufzubauen, ist der, alle definierten Virtabs als reguläre Basistabellen der benutzten Datenbank zu deklarieren (“Option “autovr”). Nach der Verarbeitung einer Virtab durch ER2SQl wird diese dann der Datenbankbeschreibung hinzugefügt und kann von nachfolgenden Virtabs benutzt werden.
Diese Virtabs werden dann (konsequenterweise) in einem “virtuellen ER-Diagramm” (“VR-Diagramm”) untereinander verknüpft. Primär-, Zweit- und Fremdschlüssel werden ausdrücklich neu definiert, sodass ein Cluster von Virtabs de fakto eine neue Datenbankdefinition bildet.

Gegenseitige Beeinflussungen verschiedener Virtabs

Da Virtabs naturgemäß denormalisierte Objekte sind (d.h. Daten applikationsspezifisch gebündelt repräsentieren), sind bestimmte Datenfelder der Ursprungsdatenbank in der Regel immer über diverse Virtabs zugreifbar. Beim Entwurf und der Nutzung der Virtabs muss daher ständig auf die Nutzung oder Vermeidung von 'Seiteneffekten', d.h. auf den Einfluss von Virtabs einer Applikation auf Daten anderer Applikationen geachtet werden. Die Datenbestände, die von verschiedenen Virtabs einer Datenbank repräsentiert werden, sind immer potentiell miteinander verknüpft.

Schemata und Rechtekontrolle

Virtabs sind frei bezüglich der verwendeten Datenbankschemata, dadurch kann wie gewohnt mit der User- und Schemastruktur der Datenbank gearbeitet werden.
Im einfachsten Fall werden keine Schemata verwendet, dann liegen die SQL-Objekte (View, Procedures) der Virtab im Schema des DB-Users, der die erzeugten SQL-Skripte ausführt.
Für jede Virtab kann aber das Schema angegeben werden, in dem die zugehörigen SQL-Objekte angelegt werden. Jede Virtab kann ausserdem Datenbanktabellen aus verschiedenen anderen Schemata nutzen. Dadurch lassen sich Schema-übergreifende Virtabs konstruieren. Optional wird für jede Virtab ein PUBLIC SYNONYM erzeugt, für das einer bestimmten Rolle Zugriffsrechte gewährt werden. Hat diese Rolle keinen Zugriff auf das Schema der Virtab-Objekte, ist der Zugriff auf Datenbankinhalte nur noch über Virtabs möglich.

Reports

ER2SQL gibt bei Bedarf verschiedene Reports über die eingelesenen Virtabs aus. Dabei handelt es sich einerseits um eine Übersicht der Virtabs und ihrer Spaltenattribute, andererseits um eine vollständige Darstellung der internen Struktur der Virtabs zu Debugzwecken.

 

[Virtabs] [Positionierung] [Schreibbare Views?] [Schreibbare Views!] [Feature-Überblick] [Virtabs entwickeln] [Unterstützte Datenbanken] [Referenz] [Konzepte] [Application-Interfaces] [Struktur der Demo-DB] [Guided tour] [Beispiel-Code]