Views

Inhaltsübersicht

 

Views. 1

10      Views. 1

10.1   Datendefinitionsanweisungen und Views. 2

10.1.1   Erstellen von Views. 2

10.1.2   Views löschen. 8

10.2   Abfragen in Views. 9

10.3   Ändern eines Views. 10

10.3.1   INSERT-Anweisung und View.. 11

10.3.2   UPDATE-Anweisung und View.. 14

10.3.3   DELETE-Anweisung und View.. 16

Aufgaben. 17

 

         

          

10  Views

 

 

         Dieses  Kapitel   ist  ausschließlich   den  Views  gewidmet.

         Die   Struktur  des  Kapitels  ähnelt  der  Beschreibung  der

         Basistabellen  aus den  Kapiteln 7  bis  9.  Zunächst  werden

         die Anweisungen  zur Datendefinition  beschrieben. Im zweiten

         Teil  werden  die  Anweisungen  SELECT,  UPDATE,  DELETE  und

         INSERT  erörtert, wobei die SELECT-Anweisung getrennt von den

         übrigen  drei behandelt wird. Im Unterschied zu Basistabellen

         gelten  bei Datenmanipulationsanweisungen  für  Views  einige

         Einschränkungen,   die  am  Ende  des  jeweiligen  Abschnitts

         erklärt werden.

 

Zurück zum Inhaltsverzeichnis

 

 

 

10.1    Datendefinitionsanweisungen und Views

 

 

         In  den   bisherigen   Kapiteln   sind   ausschließlich   die

         Basistabellen     erörtert    worden.    Eigenschaft    aller

         Basistabellen ist,  daß  sie  physikalisch  existieren.  Eine

         Basistabelle   enthält  also   Objekte,  die   alle  auf  der

         Platte  gespeichert sind.  Im  Unterschied  zu  Basistabellen

         belegen Views  keinen Speicherplatz.  Views werden  immer aus

         existierenden Basistabellen  abgeleitet, und das System trägt

         die  Eigenschaften jedes  Views in  die  Systemtabellen  ein.

         Lediglich  die Einträge  in den  verschiedenen Systemtabellen

         existieren physikalisch von einem View. Deswegen heißen Views

         auch virtuelle Tabellen.

 

         In der  Systemtabelle iiviews  befinden sich  die wichtigsten

         Einträge für  Views. iiviews  beinhaltet je  eine  Reihe  für

         jedes  im System  erstellte View. Diese Systemtabelle enthält

         mehrere  Spalten, von welchen die erste, table_name den Namen

         des Views  enthält. Die  zweite Spalte,  table_owner, enthält

         den Eigentümernamen  des Views.  Wichtig ist  auch die Spalte

         text_segment,  die die  SELECT-Anweisung beinhaltet,  die aus

         der CREATE VIEW-Anweisung übernommen wird.

 

Zurück zum Inhaltsverzeichnis

 

 

10.1.1   Erstellen von Views

 

 

         Jedes  View wird  mit der Anweisung CREATE VIEW erstellt. Die

         allgemeine Form dieser Anweisung ist:

 

                 CREATE VIEW view_name [(spalten_liste)]

                    AS select_anw

                    [WITH CHECK OPTION];

 

         view_name  ist der  Name des  neuerstellten Views. select_anw

         kennzeichnet  die SELECT-Anweisung,  mit der  die Auswahl der

         Reihen  und Spalten  aus der  Basistabelle durchgeführt wird.

         spalten_liste ist eine Liste der Namen der Viewspalten. Falls

         diese optionale Angabe ausgelassen wird, werden die Namen der

         Spalten  aus der  Projektion der SELECT-Anweisung übernommen.

         Die Angabe  "WITH CHECK OPTION" wird später in diesem Kapitel

         beschrieben.

 

         Die Erstellung  eines Views  kann aus  verschiedenen  Gründen

         erfolgen. In  umfangreicheren Datenbankanwendungen  enthalten

         einige  Basistabellen  eine  sehr  große  Anzahl  von  Reihen

         bzw.  Spalten. Für  den Benutzer,  der  z.B.  nur  mit  einem

         kleinen  Ausschnitt einer Basistabelle arbeitet, ist es nicht

         notwendig, alle Spalten der Basistabelle zu kennen. In diesem

         Fall ist  es sinnvoll,  ein View  zu erstellen,  das nur  die

         Teile  der Basistabelle  enthält, die  für den  Benutzer  von

         Bedeutung sind.

 

         Genauso  kann es  sinnvoll sein, ein View zu erstellen, falls

         man  gewissen Benutzern  den Zugriff  auf eine  oder  mehrere

         Spalten einer  Basistabelle untersagen  will. Dabei  kann  es

         sich um  die Spalte  mit den  Gehältern der  Mitarbeiter oder

         um die  Spalten mit den sicherheitsrelevanten Daten der Firma

         handeln.  (Dieser Aspekt  des Views  wird hier  nicht  weiter

         verfolgt; er wird ausführlich in Kapitel 14 erörtert.).

 

         Beispiel 10.1

 

         Erstellen Sie ein View, das alle Daten der Sachbearbeiter der

         Firma beinhaltet.

 

                   CREATE  VIEW v_sach_arb

                     AS SELECT m_nr, pr_nr, einst_dat

                          FROM arbeiten

                          WHERE aufgabe = 'Sachbearbeiter';

 

         In Beispiel  10.1 werden  mit der SELECT-Anweisung die Reihen

         der  Basistabelle arbeiten  ausgewählt, die  die Bedingung in

         der  WHERE-Klausel erfüllen.  Alle ausgewählten Reihen bilden

         das neuerstellte View v_sach_arb.

        

m_nr   

pr_nr

aufgabe        

einst_dat      

9031

p3   

Sachbearbeiter 

15-nov-1988    

28559

p2   

Sachbearbeiter 

01-feb-1989    

28559

p1                   

 

01-aug-1988    

9031

p1   

Gruppenleiter  

15-apr-1989    

2581

p3   

Projektleiter  

15-oct-1989    

29346

p2                   

 

15-dec-1987    

18316

p2                   

 

01-jun-1989    

25348

p2   

Sachbearbeiter 

15-feb-1989    

10102

p3   

Gruppenleiter  

01-jan-1989    

10102

p1   

Projektleiter  

01-oct-1988    

29346

p1   

Sachbearbeiter 

01-apr-1989    

 

                       Abb.10-1 Die Basistabelle arbeiten

 

         Abbildung  10-1 zeigt  die Basistabelle  arbeiten, wobei  das

         View v_sach_arb grau unterlegt dargestellt ist.

 

         Jeder Anwender,  der ein View benutzt, arbeitet mit ihm genau

         wie mit  jeder anderen Basistabelle. Gewisse Einschränkungen,

         die  für  Views  gelten,  werden  im  Laufe  dieses  Kapitels

         nacheinander erörtert.

 

         Die  Abfragen, die  ein View  betreffen,  werden  tatsächlich

         auf  der zugrundeliegenden  Basistabelle  durchgeführt.  (Wir

         erinnern  noch einmal  daran, daß ein View physikalisch nicht

         existiert; es  existieren nur Einträge in Systemtabellen, die

         es definieren.). Folgende Abfrage auf das View v_sach_arb

 

                        SELECT m_nr

                           FROM v_sach_arb

                           WHERE pr_nr = 'p2';

 

         wird vom  System  auf  Grund  der  Definition  des  Views  in

         die Abfrage  auf die  zugrundeliegende Basistabelle  arbeiten

         umgewandelt:

 

                         SELECT m_nr

                            FROM arbeiten

                            WHERE pr_nr = 'p2'

                            AND aufgabe = 'Sachbearbeiter';

 

         Jedes  Ändern einer Basistabelle, aus der ein View abgeleitet

         ist, betrifft  automatisch auch das View. Genauso werden alle

         Änderungen  eines Views  automatisch auf die zugrundeliegende

         Basistabelle übertragen  und durchgeführt.  (Für  das  Ändern

         eines  Views gelten  gewisse Einschränkungen,  die  in  einem

         späteren Abschnitt dieses Kapitels beschrieben sind.).

 

         In  Beispiel 10.1  wurde ein  View erstellt,  in  dem  einige

         Reihen  aus  der  Basistabelle  arbeiten  ausgewählt  wurden.

         Genauso ist  es möglich,  einige Spalten   bzw. einige Reihen

         und  Spalten einer  Basistabelle auszuwählen  und ein View zu

         erstellen.

 

         Beispiel 10.2

 

         Leiten Sie  aus der Basistabelle projekt ein View ab, bei dem

         die Spalte mittel nicht sichtbar ist.

 

                    CREATE VIEW v_teil_pr

                      AS SELECT pr_nr, pr_name

                            FROM projekt;

 

         Das  View  v_teil_pr  beinhaltet alle Reihen der Basistabelle

         projekt, abgesehen von der Spalte mittel.

 

         Wie  aus  der  allgemeinen  Form  der  CREATE  VIEW-Anweisung

         ersichtlich,  ist die  Angabe der  Spaltennamen  eines  Views

         optional.  Falls die  Spaltennamen des  Views  identisch  mit

         den  Spaltennamen der  Basistabelle sein  sollen, können  sie

         weggelassen  werden. Diese  Eigenschaft ist  in Beispiel 10.1

         benutzt  worden. In  der Praxis ist dies auch meist der Fall.

         Andererseits ist  es  auch  möglich,  andere  Namen  für  die

         Spaltennamen  des Views zu vergeben.

 

         In zwei Fällen ist es sogar notwendig, die Spaltennamen eines

         Views explizit anzugeben, und zwar:

 

                 a) wenn eine Spalte in einem View aus einem Ausdruck

                    oder einer Aggregatfunktion abgeleitet ist;

                 b) wenn  Spaltennamen  in  einem View nicht eindeutig

                    sind.

 

         Beispiel 10.3

 

         Erstellen  Sie ein View, das folgende Spalten beinhaltet: Die

         Projektnummer und die Anzahl  der  dem  Projekt  zugehörenden

         Mitarbeiter.

 

                        CREATE VIEW v_arb_anzahl (pr_nr, anzahl)

                           AS SELECT pr_nr, COUNT(*)

                           FROM arbeiten

                           GROUP BY pr_nr;

 

         In   Beispiel  10.3   müssen  die   Spaltennamen  des   Views

         v_arb_anzahl  explizit angegeben  werden, weil die Projektion

         in  der   SELECT-Anweisung  die   Aggregatfunktion   COUNT(*)

         beinhaltet.

 

         Beispiel 10.4

 

         Erstellen  Sie ein  View,  das  alle  Daten  der  Mitarbeiter

         beinhaltet, deren Standort München ist.

 

           CREATE VIEW v_mch(m_nr,name,vorname,abt_nr,nr,aufg,stadt)

              AS SELECT mitarbeiter.*, abteilung.*

              FROM mitarbeiter, abteilung

              WHERE mitarbeiter.abt_nr = abteilung.abt_nr

              AND stadt = 'Muenchen';

 

         Die  Projektion beinhaltet  zwei Spalten mit demselben Namen:

         abt_nr. Deswegen ist es notwendig, die Spaltennamen des Views

         v_mch explizit  anzugeben. (Die  andere Möglichkeit  wäre die

         Benutzung eines  natürlichen Joins  in  der  SELECT-Anweisung

         anstatt  des Equijoins.  In dem  Fall wären alle Spaltennamen

         des Views eindeutig.).

 

         Die optionale  Angabe  "WITH  CHECK  OPTION"  in  der  CREATE

         VIEW-Anweisung  prüft alle  Reihen,  die  über  das  View  in

         der Basistabelle  eingefügt oder  geändert werden. Dabei wird

         die Bedingung  in der  SELECT-Anweisung innerhalb CREATE VIEW

         überprüft und,  falls sie nicht erfüllt ist, das Ändern  bzw.

         Einfügen der Reihen mit einer Fehlermeldung abgewiesen.

 

         Falls die  Angabe "WITH  CHECK  OPTION"  fehlt,  werden  alle

         Reihen  ohne Überprüfung  über das  View in  der Basistabelle

         eingefügt bzw.  geändert. Es  werden  also  auch  die  Reihen

         eingefügt   bzw.  geändert,   die  die   Bedingung   in   der

         SELECT-Anweisung   nicht  erfüllen.   Diese   Reihen   können

         anschließend  mit demselben  View nicht abgefragt werden. Die

         Beispiele 10.2 und 10.6 zeigen die Verwendng der Angabe "WITH

         CHECK OPTION".

 

         Die  SELECT-Anweisung   innerhalb  CREATE  VIEW  stellt  eine

         Unterabfrage  dar. Als  solche darf  sie  den  UNION-Operator

         und  die ORDER  BY-Klausel nicht  beinhalten.  Abgesehen  von

         diesen  beiden Einschränkungen  kann jede  mögliche Form  der

         SELECT-Anweisung benutzt werden.

 

         Ein  View kann nicht nur aus einer Basistabelle, sondern auch

         aus einem existierenden View abgeleitet werden.

 

         Beispiel 10.5

 

         Erstellen   Sie  ein  View,  das  die  Personalnummern  aller

         Sachbearbeiter in Projekt p2 beinhaltet.

 

                        CREATE VIEW v_p2_sach

                           AS SELECT m_nr

                           FROM v_sach_arb

                           WHERE pr_nr = 'p2';

 

         Für  die Erstellung  des Views  v_p2_sach haben wir ein schon

         existierendes  View v_sach_arb  (Beispiel 10.1) benutzt. Alle

         Abfragen auf  das View  v_p2_sach werden  vom System  in  die

         Abfragen auf die Basistabelle arbeiten umgewandelt.

 

         Die  SELECT-Anweisung innerhalb  CREATE VIEW kann Spalten aus

         zwei  oder mehreren  Basistabellen  beinhalten.  In  Beispiel

         10.4 sind  mit Hilfe  des  Join-Operators  die  Basistabellen

         mitarbeiter  und  abteilung  verknüpft  und  das  View  v_mch

         erstellt. Genauso  ist es  möglich, Basistabellen  mit  Views

         bzw. mehrere Views miteinander zu verknüpfen.

 

         Das   folgende   Beispiel   zeigt   die   Verknüpfung   einer

         Basistabelle mit einem View.

 

         Beispiel 10.6

 

         Erstellen   Sie  ein  View,  das  die  Personalnummern  aller

         Mitarbeiter  enthält, die  im Projekt  Apollo arbeiten. Diese

         Aufgabe  soll mit  Hilfe des  Views v_teil_pr (Beispiel 10.2)

         gelöst werden.

 

                        CREATE VIEW v_arb_teilpr

                           AS SELECT m_nr

                           FROM arbeiten, v_teil_pr

                           WHERE arbeiten.pr_nr = v_teil_pr.pr_nr

                           AND pr_name = 'Apollo';

 

Zurück zum Inhaltsverzeichnis

 

 

 

10.1.2   Views löschen

 

 

         Mit der Anweisung

 

                        DROP VIEW view_name

 

         wird ein existierendes View gelöscht. Das Löschen eines Views

         bedeutet das Entfernen aller Einträge aus Systemtabellen, die

         im Zusammenhang mit dem View stehen.

 

         Beispiel 10.7

 

                        DROP VIEW v_arb_anzahl;

 

         In  diesem  Beispiel  wird  das  View  v_arb_anzahl,  das  in

         Beispiel 10.3 erstellt wurde, gelöscht.

 

         Wenn ein  View  gelöscht  wird,  werden  auch  alle  aus  ihm

         abgeleiteten Views gelöscht.

 

         Beispiel 10.8

 

                        DROP VIEW v_sach_arb;

 

         Das  Löschen   des  Views   v_sach_arb  verursacht  auch  das

         implizite Löschen  des Views  v_p2_sach (siehe Beispiele 10.1

         und 10.5).

 

Zurück zum Inhaltsverzeichnis

 

 

 

10.2     Abfragen in Views

 

 

         Wie  wir schon  im vorherigen  Abschnitt gezeigt  haben, wird

         jede Abfrage  auf ein  View vom  System in eine entsprechende

         Abfrage auf die zugrundeliegende Basistabelle umgewandelt.

 

         Beispiel 10.9

 

         Erstellen Sie  ein View  mit den  Personalnummern  und  Namen

         aller  Mitarbeiter, die  der Abteilung  a2 angehören.  Danach

         wählen   Sie  die   Mitarbeiter  aus,  deren  Namen  mit  dem

         Buchstaben "M" beginnen.

 

                        CREATE VIEW v_a2_mit

                           AS SELECT m_nr, m_name

                           FROM mitarbeiter

                           WHERE abt_nr = 'a2';

 

                        SELECT m_name

                           FROM v_a2_mit

                           WHERE m_name LIKE 'M%';

 

         Das Ergebnis ist:

 

m_name              

Meier               

                                

           (1 row)

 

         Die SELECT-Anweisung aus Beispiel 10.9 wird vom System in die

         folgende Form umgewandelt:

 

                        SELECT m_name

                           FROM mitarbeiter

                           WHERE m_name LIKE 'M%'

                           AND abt_nr = 'a2';

 

         Für  alle Abfragen auf Views gilt folgendes: Jede Abfrage auf

         ein View ist gültig, falls die zugrundeliegende  Abfrage  auf

         die  Basistabelle  gültig  ist.

 

Zurück zum Inhaltsverzeichnis

 

 

 

10.3     Ändern eines Views

 

 

         In   diesem  Abschnitt   wird   die   Verwendung   der   drei

         SQL-Anweisungen   -  INSERT,  UPDATE  und  DELETE  auf  Views

         erörtert.  Grundsätzlich gilt  für all diese Anweisungen, daß

         sie nur eingeschränkt auf Views angewendet werden können.

 

Zurück zum Inhaltsverzeichnis

 

 

 

10.3.1   INSERT-Anweisung und View

 

 

         Das Einfügen der Reihen eines Views bedeutet das tatsächliche

         Einfügen der entsprechenden Reihen in  der  zugrundeliegenden

         Basistabelle.

 

         Beispiel 10.10

 

                        CREATE VIEW v_abt_teil

                          AS SELECT abt_nr, abt_name

                                FROM abteilung;

 

                        INSERT INTO v_abt_teil

                            VALUES ('a4', 'Test');

 

         In  Beispiel  10.10  wurde  ein  View  aus  der  Basistabelle

         abteilung   erstellt,  in   dem  die  ersten  beiden  Spalten

         dieser  Basistabelle  ausgewählt  wurden.  Die  anschließende

         INSERT-Anweisung  weist diesen  Spalten die  Werte  'a4'  und

         'Test'   zu,  während   die  nicht  angegebene  Spalte  stadt

         der   Basistabelle  den  NULL-Wert  zugewiesen  bekommt.  Die

         INSERT-Anweisung wird  ordnungsgemäß durchgeführt,  weil  die

         Spalte stadt NULL-Werte zuläßt.

 

 

         Beispiel 10.11

 

                        CREATE VIEW v_pr_teil

                          AS SELECT pr_name, mittel

                                FROM projekt;

 

                        INSERT INTO v_pr_teil

                           VALUES ('Luna', 2286000.00);

 

         Beispiel  10.11 wird  nicht ordnungsgemäß  durchgeführt.  Die

         INSERT-Anweisung weist  den Spalten  pr_name und  mittel  die

         Werte Luna  und 2286000.00  zu, während  die nicht angegebene

         Spalte   pr_nr  der  Basistabelle  den  NULL-Wert  zugewiesen

         bekommt.  Dies   wird  vom  System  mit  einer  Fehlermeldung

         abgewiesen, weil die Spalte pr_nr keine NULL-Werte erlaubt.

 

 

         Beispiel 10.12

 

              CREATE VIEW v_arb_1988

              AS SELECT m_nr, pr_nr, einst_dat

               FROM arbeiten

              WHERE einst_dat BETWEEN '01-jan-1988' AND '31-dec-1988'

                    WITH CHECK OPTION;

 

              INSERT INTO v_arb_1988

                 VALUES (22334, 'p2', '15-apr-1989');

 

         In  Beispiel   10.12  wird   die  Rolle   der   "WITH   CHECK

         OPTION"-Angabe   gezeigt.  In   der  INSERT-Anweisung  dieses

         Beispiels   wird  überprüft,  ob  der  Datenwert  der  Spalte

         einst_dat  ('15-apr-1989') die Bedingung in der WHERE-Klausel

         der SELECT-Anweisung  erfüllt. Da  dies nicht  der Fall  ist,

         wird die INSERT-Anweisung mit einer Fehlermeldung abgewiesen.

 

         Beispiel 10.13

 

           CREATE VIEW v_arb_1988

            AS SELECT m_nr, pr_nr, einst_dat

             FROM arbeiten

             WHERE einst_dat BETWEEN '01-jan-1988' AND '31-dec-1988';

 

             INSERT INTO v_arb_1988

                VALUES (22334, 'p2', '15-apr-1989');

 

             SELECT *

                FROM v_arb_1988;

 

         Das Ergebnis ist:

        

m_nr   

pr_nr

einst_dat

28559

p1   

01-aug-1988     

10102

p1   

01-oct-1988     

9031

p3   

15-nov-1988     

                                      

      (3 rows)

 

         Beispiel 10.13  unterscheidet sich  von  Beispiel  10.12  nur

         durch  die  fehlende  Angabe  "WITH  CHECK  OPTION"  und  der

         zusätzlichen   SELECT-Anweisung.  In   diesem  Beispiel  wird

         die  INSERT-Anweisung  ordnungsgemäß   durchgeführt  und  die

         angegebene  Reihe in der Basistabelle arbeiten eingefügt. Die

         anschließende SELECT-Anweisung wählt, wie das Ergebnis zeigt,

         die neu  eingefügte Reihe  nicht aus,  weil sie  mit dem View

         v_arb_1988 nicht abgefragt werden kann.

 

         Falls das Einfügen der Reihen in der zugrundeliegenden Basis-

         tabelle mit Hilfe eines Views durchgeführt wird, gelten dafür

         folgende Einschränkungen:

 

         a)  das View  darf nur  aus einer einzigen Tabelle abgeleitet

             werden;

         b)  keine  Spalte des  Views darf  aus einer Aggregatfunktion

             abgeleitet werden;

         c)  keine Spalte  des Views darf aus einer skalaren Funktion,

             einer   Konstanten  oder  einem  arithmetischen  Ausdruck

             abgeleitet werden;

         d)  die  SELECT-Anweisung  innerhalb  CREATE  VIEW  darf  die

             Angabe DISTINCT nicht enthalten;

         e)  die SELECT-Anweisung innerhalb CREATE VIEW darf die GROUP

             BY-Klausel nicht enthalten.

 

         Beispiel 10.14

 

                   CREATE VIEW v_pr_sum(summe)

                      AS SELECT SUM(mittel)

                            FROM projekt;

 

                   SELECT *

                      FROM v_pr_sum;

 

         Das Ergebnis ist:

 

summe        

281500,000

                     

       (1 row)

 

         Beispiel  10.14 zeigt,  warum keine  Spalte eines  Views  aus

         einer Aggregatfunktion  abgeleitet werden  darf. Wie  aus dem

         Ergebnis des Beispiels ersichtlich, ist jede INSERT-Anweisung

         mit dem View v_pr_sum sinnlos.

 

Zurück zum Inhaltsverzeichnis

 

 

 

10.3.2   UPDATE-Anweisung und View

 

 

         Das  Ändern   der  Datenwerte   eines  Views   bedeutet   das

         tatsächliche  Ändern   der  entsprechenden   Datenwerte   der

         zugrundeliegenden Basistabelle.

 

         Beispiel 10.15

 

         Erstellen  Sie ein View, das Personalnummer und Aufgabe aller

         Mitarbeiter in Projekt p1 beinhaltet. Ändern Sie anschließend

         die Aufgabe  aller  Projektleiter  in  den  NULL-Wert.

 

                   CREATE VIEW v_arb_p1

                      AS SELECT m_nr, aufgabe

                            FROM arbeiten

                            WHERE pr_nr = 'p1';

 

                   UPDATE var_arb_p1

                      SET aufgabe = NULL

                      WHERE aufgabe = 'Projektleiter';

 

         Die  UPDATE-Anweisung in  Beispiel 10.15  wird vom  System in

         folgende Anweisung umgewandelt:

 

                   UPDATE arbeiten

                      SET aufgabe = NULL

                      WHERE pr_nr = 'p1'

                      AND aufgabe = 'Projektleiter';

 

         Die  Angabe  "WITH CHECK OPTION" ist für die UPDATE-Anweisung

         auf dieselbe Weise wie für die INSERT-Anweisung wirksam.

 

         Beispiel 10.16

 

                   CREATE VIEW v_pr_100

                      AS SELECT pr_nr, mittel

                            FROM projekt

                            WHERE mittel > 100000

                            WITH CHECK OPTION;

 

                   UPDATE v_pr_100

                      SET mittel = 92500

                      WHERE pr_nr = 'p2';

 

         Die UPDATE-Anweisung  in Beispiel 10.16 wird abgewiesen, weil

         der geänderte  Datenwert der  Spalte mittel in Projekt p2 die

         WHERE-Bedingung nicht erfüllt.

 

         Falls  das Ändern  der Datenwerte  in  der  zugrundeliegenden

         Basistabelle  mit Hilfe eines Views durchgeführt wird, gelten

         für dieses View dieselben Einschränkungen wie für die

         INSERTAnweisung.

 

         Beispiel 10.17

 

                   CREATE VIEW v_pr_usd (pr_nr, mittel_usd)

                      AS SELECT pr_nr, mittel * 0.55

                            FROM projekt

                            WHERE mittel > 100000;

 

                   SELECT *

                      FROM v_pr_usd;

 

         Das Ergebnis ist:

         

pr_nr      

mittel_usd   

p3           

102575,0000

                                     

           (1 row)

 

         Beispiel  10.17 zeigt,  warum keine  Spalte eines  Views  aus

         einem arithmetischen  Ausdruck abgeleitet  werden  darf.  Das

         View   v_pr_usd  beinhaltet   alle  Reihen  der  Basistabelle

         projekt, deren  Mittel größer als DM 100.000 sind. Zusätzlich

         dazu  enthält dieses  View eine  Spalte mittel_usd,  die  aus

         der  Spalte   mittel  durch  Multiplizieren  abgeleitet  ist.

         (Die  Geldmittel sind  damit statt  in DM in US$ angegeben.).

         Aus  dem Ergebnis  der anschließenden  SELECT-Anweisung  wird

         offensichtlich, daß  jede  UPDATE-Anweisung  mit  der  Spalte

         mittel_usd nicht möglich ist.

 

Zurück zum Inhaltsverzeichnis

 

 

 

10.3.3   DELETE-Anweisung und View

 

 

         Das Löschen der Reihen einer Basistabelle kann auch mit Hilfe

         eines abgeleiteten Views durchgeführt werden.

 

         Beispiel 10.18

 

                   CREATE VIEW v_arb_p1

                      AS SELECT m_nr, aufgabe

                            FROM arbeiten

                            WHERE pr_nr = 'p1';

 

                   DELETE FROM v_arb_p1

                      WHERE aufgabe = 'Sachbearbeiter';

 

         Die DELETE-Anweisung in Beispiel 10.18 wird vom INGRES-System

         in folgende Anweisung umgewandelt:

 

                   DELETE FROM arbeiten

                      WHERE pr_nr = 'p1'

                      AND aufgabe = 'Sachbearbeiter';

 

         Wie  für  das Ändern und Einfügen gelten auch für das Löschen

         der Reihen mit Hilfe eines Views einige Einschränkungen:

 

         a)  das  View  darf nur aus einer einzigen Tabelle abgeleitet

             werden;

         b)  keine  Spalte  des  Views darf aus einer Aggregatfunktion

             abgeleitet werden;

         c)  die SELECT-Anweisung innerhalb CREATE VIEW darf die GROUP

             BY-Klausel nicht enthalten;

         d)  die  SELECT-Anweisung  innerhalb  CREATE  VIEW  darf  die

             Angabe DISTINCT nicht enthalten.

 

         Im  Unterschied  zur INSERT- und UPDATE-Anweisung erlaubt die

         DELETE-Anweisung die Verwendung solcher Views, die aus  einem

         arithmetischen  Ausdruck,  einer skalaren Funktion oder einer

         Konstante abgeleitet sind.

 

         Beispiel 10.19

 

                       CREATE VIEW v_pr_mult(mult_f)

                          AS SELECT mittel* 0.55

                                FROM projekt;

 

                       DELETE FROM v_pr_mult;

 

         Mit  der DELETE-Anweisung  werden  alle  Reihen  der  Tabelle

         projekt, die dem View v_pr_mult zugrunde liegt, gelöscht.

 

Zurück zum Inhaltsverzeichnis

 

 

 

Aufgaben

 

A.10.1 Erstellen Sie  ein View,  das die Daten aller Mitarbeiter

             enthält, die im Jahr 1988 eingestellt worden sind.

 

A.10.2 Erstellen Sie  ein View,  das die Daten aller Mitarbeiter

             enthält, die der Abteilung a3 angehören.

 

A.10.3 Erstellen Sie  ein View,  das Namen  und  Vornamen  aller

             Mitarbeiter beinhaltet, die im Projekt p3 arbeiten.

 

A.10.4 Überprüfen  Sie, ob  Ihre Lösung  der Aufgabe  A.10.3 ein

             View darstellt,  das modifizierbar ist. Ist das nicht der

             Fall, erstellen Sie ein solches View.

 

A.10.5 Erstellen  Sie ein  View, das  Personalnummer und Aufgabe

             aller   Mitarbeiter  enthält,   die  im   Projekt  Merkur

             arbeiten.

 

A.10.6 Erstellen Sie  ein View,  das Namen  und  Vornamen  aller

             Mitarbeiter  enthält, deren  Personalnummer  kleiner  als

             10000 ist. Das View soll die WHERE-Klausel jeder UPDATE-

             bzw. DELETE-Anweisung überprüfen.

 

A.10.7 Schreiben Sie  für das  in  A.10.6  erstellte  View  eine

             INSERT-Anweisung,  die vom INGRES-System akzeptiert wird,

             und eine DELETE-Anweisung, die abgewiesen wird.

 

 

Zurück zum Inhaltsverzeichnis