## CREATE VIEW-Anweisung (create_view_statement)

Die CREATE VIEW-Anweisung (create_view_statement) definiert eine View-Tabelle.

### View-Tabelle

Eine View-Tabelle ist eine Sicht auf eine existierende Tabelle: Teile der Tabelle werden verdeckt und andere Teile bleiben sichtbar. Sie können View-Tabellen verwenden, um längere SELECT-Anweisungen abzukürzen. Sie können mit Hilfe von View-Tabellen unwichtige oder vertrauliche Daten verbergen.

Eine View-Tabelle ist nie physisch vorhanden, sondern wird erst aus den Zeilen der zugrundeliegenden Basistabelle(n) gebildet, wenn in einer SQL-Anweisung diese View-Tabelle angegeben wird.

### Syntax

<create_view_statement> ::=
CREATE [OR REPLACE] VIEW <table_name> [(<alias_name>,...)] AS <query_expression> [WITH CHECK OPTION]

### Beispiele

SQL-Tutorial, View-Tabellen, Konzepte des Datenbanksystems, Objekte im Schema HOTEL

### Erläuterung

Wenn im View-Tabellennamen table_name kein Schema angegeben ist, wird implizit das aktuelle Schema angenommen. Der View-Tabellenname darf nicht mit dem Namen einer bereits existierenden Tabelle des Schemas übereinstimmen.

Die Ausführung der CREATE VIEW-Anweisung führt zur Ablage von Metadaten im Datenbankkatalog, die die View-Tabelle beschreiben.

Die View-Tabelle ist jederzeit identisch mit der Tabelle, die Sie als Ergebnis des QUERY-Ausdrucks query_expression erhalten würden. Der QUERY-Ausdruck darf keine Parameterspezifikation enthalten. Der QUERY-Ausdruck darf keine temporäre Tabelle und keinen Ergebnistabellennamen referenzieren.

Jeder Tabellenausdruck der QUERY-Spezifikation im QUERY-Ausdruck der CREATE VIEW-Anweisung darf keinen QUERY-Ausdruck enthalten.

Wenn eine durch den QUERY-Ausdruck selektierte Spalte vom Datentyp LONG ist, dann muss die FROM-Klausel genau einen Tabellennamen enthalten, dem genau eine Basistabelle zugrundeliegt.

#### Join-View-Tabelle

Eine Join-View-Tabelle ist eine View-Tabelle, deren FROM-Klausel mehr als eine Tabelle oder eine Join-Tabelle enthält.

#### Komplexe View-Tabelle

Eine View-Tabelle ist eine komplexe View-Tabelle, wenn sie eine der folgenden Bedingungen erfüllt:

● Die Definition der View-Tabelle enthält DISTINCT oder GROUP BY oder HAVING.

● Die CREATE VIEW-Anweisung enthält EXCEPT, INTERSECT oder UNION.

● Die im QUERY-Ausdruck der CREATE VIEW-Anweisung enthaltene Suchbedingung enthält eine Subquery.

● Die CREATE VIEW-Anweisung enthält einen Outer Join, also einen OUTER JOIN-Indikator outer_join_indicator in einem JOIN-Prädikat der Suchbedingung.

#### Änderbare View-Tabelle

Eine View-Tabelle heißt änderbar, wenn sie keine komplexe View-Tabelle ist und auf keiner komplexen View-Tabelle basiert.

#### Änderbare Join-View-Tabelle

Eine änderbare Join-View-Tabelle ist eine änderbare View-Tabelle, für die zusätzlich folgende Bedingungen erfüllt sein müssen:

● Jede der View-Tabelle zugrundeliegende Basistabelle besitzt einen vom Benutzer definierten Schlüssel.

● Zwischen den der View-Tabelle zugrundeliegenden Basistabellen müssen referentielle CONSTRAINT-Definitionen festgelegt sein.

● Es gibt genau eine der View-Tabelle zugrundeliegende Basistabelle, die nicht referenzierte Tabelle referenced_table einer referentiellen CONSTRAINT-Definition zu einer anderen der View-Tabelle zugrundeliegenden Basistabelle ist. Diese Tabelle ist die Schlüsseltabelle der View-Tabelle.

● Für jede der View-Tabelle zugrundeliegende Basistabelle gibt es eine Folge von referentiellen CONSTRAINT-Definitionen, so dass die jeweilige Basistabelle von der Schlüsseltabelle aus erreichbar ist.

● Die referentiellen CONSTRAINT-Definitionen müssen sich in der Suchbedingung der CREATE VIEW-Anweisung als JOIN-Prädikat widerspiegeln, d. h. die Bedingung "Schlüsselspalte = Fremdschlüsselspalte" muss für jede Spalte jeder referentiellen CONSTRAINT-Definition vorhanden sein.

● In der CREATE VIEW-Anweisung muss von jeder referentiellen CONSTRAINT-Definition entweder die Primärschlüssel- oder die Fremdschlüsselspalte als selektierte Spalte enthalten sein, jedoch nicht beide.

● Die View-Tabelle muss mit WITH CHECK OPTION definiert sein.

Weitere Detailinformationen dazu finden Sie in Änderbare Join-View-Tabelle.

#### Privilegien

Der Benutzer muss das SELECT-Privileg für alle Spalten besitzen, die in der View-Definition vorkommen. Der Benutzer ist Eigentümer der View-Tabelle und besitzt mindestens das SELECT-Privileg dafür. Er darf das SELECT-Privileg für alle Spalten der View-Tabelle, die sich aus Spalten ableiten, für die er das Recht zur Weitergabe des SELECT-Privilegs besitzt, vergeben.

Das INSERT-, UPDATE- und DELETE-Privileg besitzt der Benutzer nur dann, wenn er die entsprechenden Privilegien für die der View-Tabelle bzw. Join-View-Tabelle zugrundeliegenden Tabellen besitzt, und wenn es sich um eine änderbare View-Tabelle bzw. Join-View-Tabelle handelt. Diese Privilegien darf er nur dann weitergeben, wenn er für alle der View-Tabelle bzw- Join-View-Tabelle zugrundeliegenden Tabellen das Recht besitzt, das jeweilige Privileg weiterzugeben.

Siehe auch:

INSERT-/UPDATE/DELETE-Privileg für Eigentümer der View-Tabelle

Privilegienspezifikation (priv_spec)

#### OR REPLACE

Wenn OR REPLACE nicht angegeben wird, darf der Tabellenname table_name nicht mit dem Namen einer existierenden View-Tabelle übereinstimmen.

Wenn OR REPLACE angegeben ist, darf der Tabellenname mit dem Namen einer existierenden View-Tabelle übereinstimmen. Die Definition der existierenden View-Tabelle wird in diesem Fall durch die neue Definition ersetzt. Das Datenbanksystem versucht dabei, vergebene Privilegien der existierenden View-Tabelle an die neue View-Definition anzupassen, so dass die Privilegierung der View-Tabelle normalerweise erhalten bleibt. Bei Konflikten, die das Datenbanksystem nicht entscheiden kann, erfolgt ein impliziter Entzug von Privilegien. Bei großen Unterschieden zwischen den beiden View-Definitionen kann die CREATE VIEW-Anweisung in folgendem Fall scheitern: Die CREATE VIEW-Anweisung einer auf der existierenden View-Tabelle basierenden View-Tabelle ist auf der neuen View-Definition nicht mehr fehlerfrei ausführbar.

#### Alias-Namen (alias_name)

Die Spaltennamen der View-Tabelle müssen eindeutig sein. Ist das in der durch den QUERY-Ausdruck erzeugten Ergebnistabelle nicht der Fall, müssen Alias-Namen vergeben werden, die die Spaltennamen der View-Tabelle definieren. Die Anzahl der Alias-Namen muss gleich der Anzahl der Spalten der durch den QUERY-Ausdruck erzeugten Ergebnistabelle sein. Wenn keine Alias-Namen angegeben sind, dann werden die Spaltennamen der durch den QUERY-Ausdruck erzeugten Ergebnistabelle für die View-Tabelle übernommen. Die Spaltenbeschreibungen der View-Tabelle werden von den entsprechenden Spalten des QUERY-Ausdrucks übernommen. Die FROM-Klausel des QUERY-Ausdrucks kann eine oder mehrere Tabellen enthalten.

#### WITH CHECK OPTION

Wenn die CREATE VIEW-Anweisung eine WITH CHECK OPTION enthält, dann muss der Eigentümer der View-Tabelle das INSERT-, UPDATE- oder DELETE-Privileg für die View-Tabelle besitzen.

Die Angabe von WITH CHECK OPTION bewirkt, dass durch die INSERT- oder UPDATE-Anweisung auf der View-Tabelle keine Zeilen erzeugt werden können, die anschließend nicht mehr über die View-Tabelle selektierbar sind, d.h. resultierende Zeilen müssen die Suchbedingung der View-Tabelle erfüllen.

Die CHECK OPTION wird vererbt, d.h. wenn eine View-Tabelle V mit WITH CHECK OPTION definiert wurde und V in der FROM-Bedingung einer änderbaren View-Tabelle V1 vorkommt, dann lassen sich über V1 nur Zeilen einfügen oder ändern, die über V selektiert werden können.