Your Browser is not longer supported

Please use Google Chrome, Mozilla Firefox or Microsoft Edge to view the page correctly
Loading...

{{viewport.spaceProperty.prod}}

CREATE VIEW - View erzeugen

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