Die CONSTRAINT-Anweisung von VIRTUALTABLE
Mit “CONSTRAINT” werden Bedingungen definiert, denen ein
Datensatz der Virtab genügen muss. In der Virtab-View wirken
CONSTRAINTs als zusätzliche WHERE-Bedingungen, in dem
Prozeduren werden die übergebenen Spalten-Argumente
überprüft, ob sie allen CONSTRAINTs genügen.
Syntax:
Es gibt drei Formen der CONSTRAINT-Anweisung:
"CONSTRAINT" [ "NAME" constraint_name ] sql_expr [ "END" ]
"CONSTRAINT" [ "NAME" constraint_name ] "DEFAULT" virtab_colname
"=" sql_ausdruck [ "END" ]
"CONSTRAINT" [ "NAME" constraint_name ] "DEFAULT" virtab_colname
"IS NULL" [ "END" ]
"CONSTRAINT" [ "NAME" constraint_name ] "UNIQUE"
virtab_colname | "(" SQL-Bedingung ")"
[ "," virtab_colname | "(" SQL-Bedingung ")"...] [ "END" ]
NAME
Optional kann für ein Constraint ein Name vereinbart werden.
Das ist nötig, wenn das Constraint in abgeleiteteten Virtabs
modifiziert werden soll.
sql_expr
Für den SQL-Ausdruck gelten dieselben Regeln wie in der
“COLUMN ... DEFAULT”-Anweisung (Referenz hier)..
Insbesondere können alle SQL-Vergleichsoperatoren sowie AND,
OR etc. benutzt werden. Der Ausdruck muss aber ein boolsches
Ergebnis liefern (TRUE, FALSE oder NULL).
Auf die besondere Behandlung von NULL in SQL-Ausdrücken sei
hier hingewiesen: In SQL-Ausdrücken muss ein Vergleich auf
NULL mittels “... IS [ NOT ] NULL” erfolgen. “... =
NULL” liefert immer ein NULL, also FALSE.
DEFAULT
CONSTRAINT DEFAULT beschreibt eine Constraint, das nicht nur
eine einzelne Virtab-Spalte auf einen bestimmten Wert hin
überprüft, sondern diese Spalte auch auf diesen Wert setzt,
wenn der Anwender einen NULL-Wert übergeben hat.
“sql_ausdruck” muss dann die Form “virtab_colname =
sql_ausdruck” oder “virtab_colname IS NULL” haben.
UNIQUE
Mit CONSTRAINT UNIQUE kann eine Liste von Bedingungen
angegeben werden, die alle zusammen nur für einen Datensatz der Virtab-View erfüllt sein dürfen.
Diese Bedingungsliste besteht im einfachsten Fall aus
einer Liste von Virtabfeldern. In diesem Fall wird geprüft,
ob in der DB nohc ein Datensatz mit identischen Feldwerten
existiert. CONSTRAINT UNIQUE funktioniert dann wie
“CONSTRAINT UNIQUE(feld,feld,...)” des SQL92-Standards.
Anstelle eines Virtabfeldes kann in der Feldliste auch eine
Vergleichsbedingung benutzt werden. Diese wird als beliebige
SQL-Bedingung in “(...)” - Klammern angegeben. Innerhalb der
SQL-Bedingung können Spalten des neuen/geänderten Datensatzes
wie gehabt unter ihrem Virtab-Spaltennamen angesprochen
werden, Spalten der vorhandenen Datensätze in der Datenbank
müssen durch das Prefix “EXISTING.” gekennzeichnet werden.
Das UNIQUE-Constraint wird verletzt, wenn in der
Virtab-View mehr als ein Record gefunden wird, für den alle
gelisteten Bedingungen TRUE sind. (Daraus folgt, dass eine
konstant falsche Bedingung, etwa “(NULL)”, das ganze
CONSTRAINT wirkungslos macht.) Ein einfaches Virtabfeld
“vtcolumn” in der Liste ist übrigens die Kurzform für
folgende SQL-Bedingung:
( vtcolumn = EXISTING.vtcolumn
OR ( vtcolumn IS NULL AND EXISTING.vtcolumn IS NULL)
|
Die Virtab-VIEW wird nach Ausführen der INSERT- oder der UPDATE-Prozedur geprüft,
ob alle Records der View hinsichtlich der aufgelisteten Schlüsselfelder verschieden sind.
Ein UNIQUE-Constraint wirkt sich weder auf die View noch auf die DELETE-Prozedur aus .
Es können beliebig viele UNIQUE-Constraints angegeben werden.
UNIQUE-Constraints stellen eine Ergänzung zu den IDENTIFYING-Felder dar
.IDENTIFYING-Felder werden für Datenbanktabellen definiert und sichern so die
Eindeutigkeits der Schlüssel in der Datenbankschicht.
UNIQUE-Constraints können hingegen für jede Virtab verschieden definiert werden.
Ein Syntax-Beispiel: die Virtab DEPTS soll gegen mehrfache Einträge geschützt werden. Die
Eindeutigkeit soll aber nicht case-sensitiv sein:
CONSTRAINT UNIQUE zip_code,
( UPPER(street) = UPPER(EXISTING.street) ),
( UPPER(departement) = UPPER(EXISTING.departement) )
|
END
Mit “END” kann das CONSTRAINT-Statement abgeschlossen werden, wenn dies wegen
der Syntax des folgenden Befehls nötig werden sollte.
|