Virtabs: Syntax der Datenbank-Definition

Syntax der Basistabellen-Definition:

In diesem Abschnitt des Definitionsfiles muss für jede in eine Virtab einzubeziehende Datenbank-Tabelle eine exakte Kopie der Datenbank-Definition angegeben werden.

Für jede Tabelle muss die Beschreibung nach folgendem Muster erfolgen:

 "TABLE" [ schema "." ] tablename
  ["TABLESPACE" tablespace_name]
  ["SMALL"]
  ["INDEXED"]
  ["NOCHANGE"]
  "COLUMN" colname "DATATYPE" [schema "."] oracle_datatype
     [ "PRIMARYKEY" | "PRIMARYKEY2" |
       "IDENTIFYING" | "IDENTIFYING"  "NULL"]
     [ "NOCHANGE" ]
     [ "NULL" ]
     [ "NOT NULL" ]
     [ "UNIQUE" ]
     [ "INDEXED" ]
     [ "CASEINSENSITIVE" ]
     [ "INFO" info_text ]
  "COLUMN" colname .......
  "COLUMN" colname .......
 ";"

Die Tabellen- und Spaltennamen müssen wie in der Datenbank geschrieben erscheinen, ohne Schema-Prefix. Viele Attribute beinflussen nur die Erzeugung des Datenbank-SQL, aber nicht die Funktion der Virtabs.

Tabellen-Attribute

SCHEMA

Datenbanktabellen müssen nicht dem Schema angehören, unter dem die Virtabs übersetzt werden. In diesem Fall muss dem Tabellennamen das Schemaprefix vorangestellt werden.

ACHTUNG: derzeit müssen sich alle Tabellen im Namen unterscheiden, auch, wenn zwei Tabellen gleichen Namens zu verschiedenen Schemas gehören!

TABLESPACE

Wenn “tablespace_name” angegeben wurde, wird die Tabelle selbst im Tablespace “data_<tablespace_name>” angelegt. Indexstrukturen werden in “idx_<tablespace_name>” angelegt.

SMALL

die “SMALL”-Option bewirkt die Implementierung der Tabelle mit der CACHE-Option, was für häufig abgefragte Tabellen den Zugriff optimiert. Für Fremdschlüsselverweise auf mit “SMALL” generierte Tabellen (mit dann jeweils sehr vielen identischen Mastereinträgen) wird in Zukunft ein BITMAP-Index erzeugt. Beides ist aktuell nur für die Datenbankdefinition selbst relevant, nicht aber für produzierte Virtabs.

INDEXED

“INDEXED” markiert Tabellen, die nach ihrem Primärkey sortiert gespeichert werden (ORACLE: “ORGANIZATION INDEX”).

NOCHANGE

“NOCHANGE” markiert Tabellen, die von keiner Virtab verändert werden können (Stammdaten, die mit anderen Mechanismen gepflegt werden).

INFO

Mit “INFO” kann ein beliebiger Text angegeben werden. Im SQL-Code für CREATE TABLE wird dieser Text als SQL-Kommentar mit ausgeben.

Spalten-Attribute:

DATATYPE

“oracle_datatype” ist der Oracle-Datentyp der Spalte, wie in der Datenbank angegeben: also “char(30)” oder “number(12,5)”. Auch anwendungspezifische Typen (“MDSYS.SDO_GEOMETRY”) sind erlaubt.

PRIMARYKEY, PRIMARYKEY2

“PRIMARYKEY” markiert den Primärschlüssel, ist somit nur für eine Spalte in einer Tabelle erlaubt. Für diese Spalte muss ein Numerngenerator (SEQUENCE) mit dem Namen “SEQ_<colname>” in der Datenbank vorhanden sein.

“PRIMARYKEY2” markiert eine Schlüsselspalte, die ebefalls als Primärkey genutzt werden kann (alternativer Primärkey), für die aber keine Sequenzwerte generiert werden.

IDENTIFYING

“IDENTIFYING” ist für mehrere Spalten erlaubt und markiert alle Spalten des Zweitschlüssels, der datenbankseitig über eine entsprechende UNIQUE-Bedingung ausgedrückt wird.
“IDENTIFYING NULL” bedeutet, dass in der Datenbank auch der Wert NULL als gültiger Schlüsselwert anzusehen ist. Dies ist vor allem relevant bei zusammengesetzten Schlüsseln, bei denen nicht immer alle Felder NOT NULL sind.
Normalerweise wird eine Schlüsselspalte mit einem NULL-Wert bei der Record-Lokalisierung ignoriert.

Erweiterte Spalten-Attribute:

NOCHANGE

“NOCHANGE” markiert schreibgeschützte Spalten, die von den Virtabs nie geändert werden (nicht implementiert).

NULL

“NULL” heisst, dass in der Datenbankdefinition kein “NOT NULL” Constraint für die Spalte erzeugt wird. Nur in Zusammenhang mit “IDENTIFYING NULL” beinflusst es die Virtab-Funktionalität.

NOT NULL

“NOT NULL” heisst, dass in der Datenbankdefinition ein “NOT NULL” Constraint für die Spalte erzeugt wird. Die Virtab-Funktionalität wird nicht beeinflusst.

UNIQUE, INDEXED

“UNIQUE”: Für die Spalte wird ein UNIQUE-Constraint erzeugt (keine Auswirkung auf Virtabs).

“INDEXED”: Die Spalte soll indiziert werden (keine Auswirkung auf Virtabs)

 CASEINSENSITIVE

Die Gross/Kleinschreibung der Werte in dieser Spalte soll beliebig sein. ER2SQL reagiert darauf wie folgt (Beispiel für ORACLE):

  • Wenn INDEXED angegeben ist, wird der Index “function-based” auf “NLS_UPPER(column)” gesetzt. Ähnliches gilt für “UNIQUE”.
  • Der UNIQUE-Index für IDENTIFYING-Spalten wird ebenfalls auf 
    “NLS_UPPER(column)” gesetzt.
  • Die Such-Cursoren für IDENTIFYING-Spalten suchen case-unabhängig.

Achtung: In der von ER2SQL erzeugten Datenbankdefintion wird eine CASEINSENSITIVE-Spalte nicht direkt indiziert, es gibt nur noch einen Index auf “NLS_UPPER(column)”. Anwender dürfen daher in den WHERE-Klauseln ihrer SELECT-Anweisungen nur noch mit “NLS_UPPER(column)” verwenden, sonst wird für die Abfrage kein Index genutzt.
 

Beschreibung der 1:n- Beziehungen in der Datenbank

In diesem Abschnitt werden alle Fremdschlüssel-Primärschlüssel-Referenzen zwischen verschiedenen Datenbank-Tabellen angegeben (soweit sie für die Virtabs nötig sind). Es können 1:n, 1:0/1 und 1:1-Beziehungen verwendet werden. Die 1:1-Beziehung ist dabei im wesentlichen als 1:n-Beziehung implementiert, mit etwas anderer Semantik.

Für jede Referenz muss die Beschreibung nach folgendem Muster aufgebaut sein:

"LINK" mastertable ( "1:N" | "1:1" | "1:0/1" ) detailtable "BY" foreignkey [ "TO" primarykey2 ] [ "ON DELETE CASCADE" ]";"

  • “foreignkey” ist die Spalte in “detailtable”, die auf den Primärschlüssel von mastertable zeigt.
  • Der Primärkey von mastertable wird nicht erwähnt. Soll stattdessen der Link auf den alternativen Primärkey geführt werden, muss man “TO primarykey2” hinzugefügen.
  • “1:N” gibt an, dass es mehrere Records in “detailtable” geben darf, die den gleichen Record in “mastertable” referenzieren.. Dies ist der Normalfall.
  • “1:1” gibt an, dass nur ein Record in “detailtable” einen Record in “mastertable” referenzieren darf. Es werden jeweils Paare von records miteinander verbunden. Diese Art der Referenz erzwingt ein UNIQUE auf “foreignkey”, und ermöglicht es ER2SQL bessere Lokalisierungsstrategien, zu nutzen. Beim Löschen eines Records aus “detailtable” wird geprüft, ab der Record aus “mastertable” auch gelöscht wird.
  • “1:0/1” ist ein Mittelding aus “1:1” und “1:N”: “foreignkey” muss auch UNIQUE sein, das Löchen des Records aus “detailtable” erwzingt aber kein Löschen aus “mastertable”.
  • Mit “TO” wird ein anderer Primärkey in mastertable angegeben, falls nicht die mit PRIMARYKEY markierte Spalte referenzeirt werden soll. Es kann nur PRIMARYKEY2 genannt werden.
  • ON DELETE CASCADE bewirkt, dass Detailtabellen automatisch gelöscht werden, wenn ein Master gelöscht wird.
     
  •  

[Referenz] [ER2SQL cmdline] [DB-Voraussetzungen] [Definitionsfile-Aufbau] [Syntax: TABLE und LINK] [Syntax: VIRTUALTABLE] [Syntax: TABLE] [Syntax: COLUMN] [Syntax: CONSTRAINT] [Syntax: USES, MODIFY, ...] [Fehler von ER2SQL] [Laufzeitfehler] [Syntax-Hervorhebung] [SQL-Objekt-Namen]