Wie bereits unter Sichten erläutert, bietet eine Sicht eine alternative Betrachtungsweise für die Daten in einer oder mehreren Tabellen. Durch das Erstellen von Sichten können Sie die Informationen einschränken, die für unterschiedliche Benutzer sichtbar sein sollen. Die folgende Abbildung verdeutlicht die Beziehung zwischen Sichten und Tabellen.
In Abbildung 2 schränkt die Sicht View_A den Zugriff ausschließlich auf die Spalten AC1 und AC2 der Tabelle TABLE_A ein.
Die Sicht View_AB läßt den Zugriff auf die Spalte AC3 in der Tabelle TABLE_A und die Spalte BC2 in der Tabelle TABLE_B zu.
Durch das Erstellen der Sicht View_A schränken Sie den Zugriff ein, der für Benutzer auf die Tabelle TABLE_A möglich sein soll. Mit der Sicht VIEW_AB beschränken Sie den Zugriff auf bestimmte Spalten in beiden Tabellen.
Abbildung 2. Beziehung zwischen Tabellen und Sichten
Die folgende Anweisung erstellt eine Sicht der nicht zur Abteilungsleitung ('Mgr') gehörenden Mitarbeiter der Abteilung 20 in der Tabelle STAFF, wobei die Angaben über Gehalt und Provision aus der Basistabelle nicht angezeigt werden.
CREATE VIEW STAFF_ONLY AS SELECT ID, NAME, DEPT, JOB, YEARS FROM STAFF WHERE JOB <> 'Mgr' AND DEPT=20
Nachdem die Sicht erstellt wurde, zeigt die folgende Anweisung den Inhalt der Sicht an:
SELECT * FROM STAFF_ONLY
Diese Anweisung erzeugt das folgende Ergebnis:
ID NAME DEPT JOB YEARS ------ --------- ------ ----- ------ 20 Pernal 20 Sales 8 80 James 20 Clerk - 190 Sneider 20 Clerk 8
In einem weiteren Beispiel wird anhand der Tabellen STAFF und ORG eine Sicht erstellt, die die Namen aller Abteilungen sowie den Namen des jeweiligen Abteilungsleiters auflistet. Diese Sicht wird durch die folgende Anweisung erstellt:
CREATE VIEW DEPARTMENT_MGRS AS SELECT NAME, DEPTNAME FROM STAFF, ORG WHERE MANAGER = ID
Mit Hilfe der Klausel WITH CHECK OPTION können Sie beim Erstellen einer Sicht zusätzliche Integritätsbedingungen für Einfügungen und Aktualisierungen einer Tabelle über eine Sicht angeben. Diese Klausel weist den Datenbankmanager an, alle Aktualisierungen oder Einfügungen, die für die Sicht vorgenommen werden, dahingehend auszuwerten, ob sie der Definition der Sicht entsprechen, sowie alle Aktualisierungen und Einfügungen zurückzuweisen, bei denen dies nicht der Fall ist. Wenn Sie diese Klausel übergehen, werden Einfügungen und Aktualisierungen nicht mit der Definition der Sicht abgeglichen. Ausführliche Informationen zur Funktionsweise von WITH CHECK OPTION finden Sie im Abschnitt über die Anweisung CREATE VIEW des Handbuchs SQL Reference.
Wie die Anweisung SELECT werden auch die Anweisungen INSERT, DELETE und UPDATE so auf eine Sicht angewendet, als ob es sich um eine echte Tabelle handelte. Die Anweisungen bearbeiten die Daten in der/den zugrundeliegenden Basistabelle(n). Sobald Sie erneut auf die Sicht zugreifen, wird sie daher anhand der aktuellsten Basistabelle(n) ausgewertet. Wenn Sie die Klausel WITH CHECK OPTION nicht verwenden, werden die unter Verwendung einer Sicht geänderten Daten unter Umständen bei wiederholten Zugriffen auf die Sicht nicht angezeigt, da die Daten möglicherweise nicht mehr mit der ursprünglichen Definition der Sicht übereinstimmen.
Im folgenden Beispiel wird eine Aktualisierung auf die Sicht FIXED_INCOME angewendet:
CREATE VIEW FIXED_INCOME (LNAME, DEPART, JOBTITLE, NEWSALARY) AS SELECT NAME, DEPT, JOB, SALARY FROM PERS WHERE JOB <> 'Sales' WITH CHECK OPTION
UPDATE FIXED_INCOME SET NEWSALARY = SALARY * 1.10 WHERE LNAME = 'Li'
Die Aktualisierung in der vorherigen Sicht entspricht (mit Ausnahme der Prüfoption) dem Aktualisieren der Basistabelle PERS:
UPDATE PERS SET SALARY = SALARY * 1.10 WHERE NAME = 'Li' AND JOB <> 'Sales'
Bitte beachten Sie, daß aufgrund der Erstellung der Sicht mit WITH CHECK OPTION für die Integritätsbedingung JOB <> 'Sales' in der Anweisung CREATE VIEW FIXED_INCOME die folgende Aktualisierung nicht zulässig ist, sobald der Mitarbeiter 'Limoges' in die Verkaufsabteilung ('Sales') wechselt:
UPDATE FIXED_INCOME SET JOBTITLE = 'Sales' WHERE LNAME = 'Limoges'
Durch Ausdrücke wie beispielsweise SALARY + COMM oder SALARY * 1.25 definierte Spalten können nicht aktualisiert werden. Wenn Sie eine Sicht definieren, die eine oder mehrere solcher Spalten enthält, erhält der Eigner das Zugriffsrecht UPDATE für diese Spalten nicht. Anweisungen INSERT sind für Sichten mit solchen Spalten nicht zulässig. Anweisungen DELETE können jedoch ausgeführt werden.
Bei einer angenommenen Tabelle PERS, in der keine Spalten als NOT NULL definiert sind, könnten Sie Zeilen sogar dann über die Sicht FIXED_INCOME in die Tabelle PERS einfügen, wenn die Sicht nicht die Spalten ID, YEARS, COMM oder BIRTHDATE aus der zugrundeliegenden Tabelle PERS enthält. Spalten, die in der Sicht nicht angezeigt werden, würden in diesem Fall auf NULL bzw. den Standardwert gesetzt.
In der Tabelle PERS ist jedoch die Spalte ID als NOT NULL definiert. Wenn Sie versuchen, eine Zeile über die Sicht FIXED_INCOME einzufügen, versucht das System, in alle Spalten der Tabelle PERS, die in der Sicht "nicht sichtbar" sind, Nullwerte einzufügen. Da die Spalte ID in der Sicht nicht enthalten ist und Nullwerte in dieser Spalte nicht zulässig sind, läßt das System das Einfügen über die Sicht nicht zu.
Angaben zu Regeln und Einschränkungen für das Ändern von Sichten können Sie dem Abschnitt über die Anweisung CREATE VIEW des Handbuchs SQL Reference entnehmen.