CREATE VIEW erzeugt einen View. Ein View ist eine Tabelle, die nicht dauerhaft gespeichert ist, sondern deren Zeilen erst bei Bedarf bestimmt werden.
Der aktuelle Berechtigungsschlüssel muss Eigentümer des Schemas sein, für das der View erzeugt wird. Er muss das SELECT-Privileg für die verwendeten Tabellen und das EXECUTE-Privileg für die aufgerufenen UDFs besitzen.
CREATE VIEW
tabelle
{ [(
spalte ,...)] AS
abfrageausdruck [WITH CHECK OPTION] |
(
spalte ,...) AS VALUES
zeile ,... }
zeile ::= { (
ausdruck ,...) |
ausdruck }
tabelle
Name des neuen View. Der einfache Viewname muss innerhalb der Basistabellen- und Viewnamen des Schemas eindeutig sein. Der einfache Viewname kann durch einen Datenbank- und Schemanamen qualifiziert werden.
Wenn Sie die CREATE VIEW-Anweisung innerhalb einer CREATE SCHEMA-Anweisung verwenden, dürfen Sie den Viewnamen nur mit den Datenbank- und Schemanamen aus der CREATE SCHEMA-Anweisung qualifizieren.
(spalte ,...)
Name der Spalte im View. Die Viewspalten müssen bei abfrageausdruck nur dann benannt werden, wenn die Spalten der zu Grunde liegenden Tabellen nicht eindeutig benannt sind oder wenn Ergebnisspalten ohne Namen vorkommen.
(spalte ,...) nicht angegeben:
Es gelten die Spaltennamen des Abfrage-Ausdrucks.
AS abfrageausdruck
Abfrage-Ausdruck, der aus bereits bestehenden Basistabellen und Views die Tabelle erzeugt, die den neuen View bilden soll. Die Spalten des View besitzen denselben Datentyp wie die zu Grunde liegenden Spalten aus dem Abfrage-Ausdruck.
AS VALUES zeile ,...
Zeilen, die zusammen den neuen View bilden sollen. Alle Zeilen müssen dieselbe Anzahl von Spalten haben, und korrespondierende Spalten müssen verträgliche Datentypen haben (siehe Abschnitt „Verträglichkeit von Datentypen"). Sind mehrere Zeilen angegeben, so ergibt sich der Datentyp der Spalten des View aus den Regeln im Abschnitt „Datentyp der Ergebnisspalten bei UNION".
ausdruck
Jeder ausdruck in zeile muss einfach sein. Die Zeile besteht aus den Werten von ausdruck in der angegebenen Reihenfolge. Ein einzelner ausdruck liefert also eine Zeile mit einer Spalte.
Die Tabellen, die in abfrageausdruck und zeile genannt werden, müssen zur gleichen Datenbank gehören wie der View. abfrageausdruck und zeile dürfen keine Benutzervariablen und keine Fragezeichen als Platzhalter für unbekannte Werte enthalten. Werden im View Spalten benannt, so muss ihre Anzahl gleich der Anzahl der Spalten in der Tabelle von abfrageausdruck oder von zeile sein.
WITH CHECK OPTION
Sätze, die Sie über den View eingeben oder ändern, werden auf die Einhaltung der im Abfrage-Ausdruck definierten Bedingung geprüft. Der View muss änderbar sein.
Der Abfrage-Ausdruck darf multiple Spalten und UDFs nur in der SELECT-Klausel, nicht in der WHERE-Klausel enthalten.
WITH CHECK OPTION nicht angegeben:
Falls der View änderbar ist, können Sätze in den View eingefügt oder geändert werden, die die Bedingung im Abfrage-Ausdruck nicht erfüllen. Auf solche Sätze kann nicht über den View zugegriffen werden.
Privilegien für den View
Der aktuelle Berechtigungsschlüssel erhält das SELECT-Privileg für den View. Die GRANT-Berechtigung zur Weitergabe dieses Privilegs erhält er nur, wenn er die GRANT-Berechtigung für das SELECT-Privileg aller verwendeten Tabellen und die GRANT-Berechtigung für das EXECUTE-Privileg aller aufgerufenen UDFs besitzt.
Wenn der View änderbar ist, erhält der aktuelle Berechtigungsschlüssel die Privilegien IN-SERT, UPDATE und DELETE, falls er diese Privilegien für die zu Grunde liegende Basistabelle besitzt. Die GRANT-Berechtigung zur Weitergabe dieser Privilegien erhält er nur, wenn er die GRANT-Berechtigung für die entsprechenden Privilegien der zu Grunde liegenden Basistabelle besitzt.
Änderbarer View
Ein View ist änderbar, wenn abfrageausdruck angegeben ist und der zu Grunde liegende
Abfrage-Ausdruck änderbar ist (siehe Abschnitt „Änderbarkeit von Abfrage-Ausdrücken").
Beispiele
Das Beispiel definiert einen View der die fertigen Aufträge der Basistabelle AUFTRAG enthält.
CREATE VIEW fertig
AS SELECT * FROM auftrag WHERE fertigist IS NOT NULL
Das Beispiel definiert den View AUFERFASSUNG, der die Kundennamen und die dazugehörigen Auftragsnummern aus den Tabellen KUNDE und AUFTRAG heraussucht.
CREATE VIEW auferfassung AS SELECT firma, anr
FROM kunde, auftrag WHERE kunde.knr=auftrag.knr
Das Beispiel definiert den View WOCHENTAGE, der die Namen von Wochentagen enthält und jedem Wochentag eine Zahl zuordnet.
CREATE VIEW wochentage(nr, name) AS VALUES (1 , 'Montag') ,(2 , 'Dienstag') ,(3 , 'Mittwoch') ,(4 , 'Donnerstag') ,(5 , 'Freitag') ,(6 , 'Samstag') ,(7 , 'Sonntag')
Damit kann man für eine Spalte TAG_NR den Namen des Wochentages selektieren.
SELECT ..., (SELECT Name FROM wochentage WHERE nr = tag_nr)
Gegenüber der folgenden Version spart das nicht nur Schreibarbeit, sondern hat auch einen anderen Vorteil: Für eine andere Sprache muss man nur einen View austauschen und nicht mehrere SELECT-Ausdrücke ändern:
SELECT ..., CASE tag_nr WHEN 1 THEN 'Montag' WHEN 2 THEN 'Dienstag' WHEN 3 THEN 'Mittwoch' WHEN 4 THEN 'Donnerstag' WHEN 5 THEN 'Freitag' WHEN 6 THEN 'Samstag' WHEN 7 THEN 'Sonntag' END
Diesen Vorteil hat man selbstverständlich auch, wenn WOCHENTAGE eine Basistabelle mit diesem Inhalt ist. Allerdings erfolgt dann bei jeder Verwendung ein Zugriff auf dauerhaft gespeicherte Daten in einer Datei. Bei dem View werden nur Literale verwendet und es ist (ebenso wie beim CASE Ausdruck) kein solcher Zugriff notwendig.
Der View VIEW1 wählt aus der Tabelle AUFTRAG alle Auftragsnummern, Kundennummern, Soll-Termine der Fertigstellung und Auftragsstatusnummern aus, deren Soll-Termine vor dem angegebenen Datum liegen.
CREATE VIEW view1 AS SELECT anr,knr,fertigsoll,astnr
FROM auftrag WHERE fertigsoll < DATE'2014-05-01'
Auf den View VIEW1 wird ein zweiter View VIEW2 definiert. Dieser wählt Auftragsnummern, Kundennummern, Soll-Termine der Fertigstellung und Auftragsstatusnummern für Soll-Termine nach dem angegebenen Datum aus:
CREATE VIEW view2 AS SELECT anr,knr,fertigsoll,astnr
FROM view1 WHERE fertigsoll > DATE'2013-05-01'
Der View VIEW2 führt zu folgender Ergebnistabelle:
anr | knr | fertigsoll | astnr |
210 | 106 | 2014-04-01 | 3 |
211 | 106 | 2014-04-01 | 4 |
250 | 105 | 2014-03-01 | 2 |
In den View VIEW2 soll jetzt ein neuer Satz aufgenommen werden:
INSERT INTO view2 (anr,knr,fertigsoll,astnr)
VALUES (310,100,DATE '2014-06-01',5)
Der neue Satz wird aufgenommen, ist aber weder im VIEW1 noch im VIEW2 sichtbar. Der Satz erfüllt die WHERE-Bedingung in der Definition von VIEW2, nicht aber die WHERE-Bedingung in der Definition von VIEW1. Expandiert man in VIEW2 die Definition von VIEW1, dann ergibt sich
CREATE VIEW view2 AS SELECT view1.anr, view1.knr,view1.fertigsoll,view1.astnr FROM (SELECT auftrag.anr, auftrag.knr,auftrag.fertigsoll,auftrag.astnr FROM auftrag WHERE auftrag.fertigsoll < DATE '2014-05-01') AS view1 WHERE view1.fertigsoll > DATE '2013-05-01'
Es wird deutlich, dass die WHERE-Bedingung in VIEW1 auf die Definition von VIEW2 „vererbt“ wird, so dass der in AUFTRAG aufgenommene Satz auch in VIEW2 nicht sichtbar ist.
Wird VIEW2 um WITH CHECK OPTION erweitert, dann wird die INSERT-Anweisung abgewiesen, da nur Sätze aufgenommen werden, die die WHERE-Bedingung von VIEW1 erfüllen.
Die INSERT-Anweisung wird jedoch auch abgewiesen, wenn nur die Definition von VIEW2 um WITH CHECK OPTION erweitert wird. Der aufzunehmende Satz verstößt zwar nicht gegen die WHERE-Bedingung in der Definition von VIEW2, die INSERT-Anweisungwird jedoch abgewiesen, da der Satz die WHERE-Bedingung von VIEW1 nicht erfüllt.
Siehe auch
CREATE SCHEMA, DROP VIEW