Umgang mit DB2 - Fakultät für Mathematik und Informatik
Transcrição
Umgang mit DB2 - Fakultät für Mathematik und Informatik
3 Benutzung von D B 2 25 3 Benutzung von D B 2 3.1 Grundlegende Konzepte System Instance(s) Database(s) Database partition group(s) Table space tables index(es) long data Figure 3. Relationships Among Some Database Objects AbbildungSchemas: 3.1: Übersicht der Struktur einer D B 2–Installation A schema is an identifier, such as a user ID, that helps group tables and other database objects. A schema can be (System) owned by anläßt individual, ownerbeschreiben: can Die Struktur einer D B 2–Installation auf einem Rechnersystem sich and wiethefolgt Es sind eine control access to the data and the objects within it. oder mehrere Instanzen (Exemplare, Instances) vorhanden. Diese sind völlig getrennt voneinander und es gibt keinen schema is entspricht also an object das in theeiner database. It may be created automatically Installation von D B 2 auf instanzübergreifenden Datenzugriff. ImA Prinzip mehrfachen vollständigen when the first object in a schema is created. Such an object can be anything diesem Rechnersystem. Die einzelnen Instanzen können individuell verwaltet und konfiguriert werden. that can be qualified by a schema name, such as a table, index, view, package, Jede Instanz kann mehrere Datenbanken (Databases) enthalten. Eine Datenbankpartition ist ein Teil einer Datenbank bestehend aus Daten, Indexstrukturen, und Log–Dateien. 6 AdministrationKonfigurations– Guide: Planning Eine Datenbank kann auf nur eine Datenbankpartition oder auf mehrere Datenbankpartitionen aufgeteilt (partitioniert) sein. Diese werden dann zu Datenbankpartitionsgrupppen (Database partition groups) zusammengefaßt. Partitionierte Datenbanken können auf mehrere Prozessoren oder Rechnersysteme verteilt werden. Dann können (transparent für den Benutzer) Anfragen und Datenmanipulationen automatisch parallelisiert werden. Ein Tabellenbereich (Table Space) ist ein Objekt, das der physischen Datenhaltung dient und auf verschiedene Speichermedien verteilt sein kann. Jedes Datenbankobjekt (Tabelle, Index, LOB–Daten) wird genau einem Tabellenbereich zugeordnet. 3 Benutzung von D B 2 26 3.2 Grundsätzliches Im Praktikum wird momentan IBM D B 2 Universal Database“ in der Version 8.1 auf dem Rechner ” sunpower.informatik.uni-tuebingen.de verwendet. Um mit dem DBMS zu arbeiten, muß man sich stets auf sunpower einloggen (mittels ssh/slogin). Die Dokumentation zu D B 2, das D B 2 Information Center“, steht unter der URL ” http://sunpower.informatik.uni-tuebingen.de/internes/db2/htmlcd/en US/index.htm zur Verfügung. Um das D B 2 Information Center“ sinnvoll verwenden zu können, benötigt man einen aktuellen Browser ” (z.B. Netscape 7.x oder Mozilla 1.x). Jede(r) Praktikumsteilnehmer(in) erhält in der Instanz db2inst1 eine Datenbank, die wie sein/ihr (UNIX–)Benutzername heißt und auf der er/sie das Datenbankadministrator–Recht erhält. 3.3 Der Command Line Processor (CLP) Innerhalb des Praktikums wird oft der zeilenorientierte Command Line Processor (CLP) von D B 2 benutzt, um S QL– Anweisungen und Anfragen ausführen zu lassen. Um die D B 2–Software und insbesondere den CLP nutzen zu können, muß man folgende Zeilen in ˜/.login oder ˜/.cshrc aufnehmen (Syntax für csh/tcsh): setenv DB2DIR /opt/IBM/db2/V8.1 setenv DB2INSTANCE db2inst1 setenv INSTHOME /db2/home/db2inst1 set path = ($path ${INSTHOME}/sqllib/bin ${INSTHOME}/sqllib/adm ${INSTHOME}/sqllib/misc) Diese Einstellungen sollten jedoch bereits automatisch vorgenommen werden (siehe auch Hinweise zu den Rechnern ” im Datenbankpraktikum“). Der CLP wird durch die Eingabe von db2 gestartet. Er erlaubt sowohl den Batchbetrieb als auch die interaktive Eingabe. In der Umgebungsvariable DB2OPTIONS kann man Default–Befehlszeilenoptionen für den CLP angeben (siehe CLP– Dokumentation). Setzt man die Umgebungsvariable LANG auf den Wert de, so erhält man deutsche Meldungen im CLP. 3.3.1 Wichtige Befehle des CLP • Der Befehl CONNECT TO Name veranlaßt den CLP, eine Verbindung zur Datenbank Name aufzubauen. DISCONNECT CURRENT beendet hingegen die aktuelle Verbindung zur Datenbank. • Mit TERMINATE beendet man eine CLP–Sitzung. Nicht QUIT verwenden, denn dies beendet zwar den CLP, nicht aber die Verbindung zur Datenbank! • Zeilen, die mit -- beginnen, werden als Kommentare betrachtet und vom CLP ignoriert. • Durch die Eingabe von ? Befehl erhält man Hilfe zum jeweiligen Befehl. Ebenso kann man zu den Warnungen und Fehlern ausführliche Beschreibungen erhalten, wenn man ein Fragezeichen gefolgt vom jeweiligen Code eingibt (Beispiel: ? SQL0104N). 3 Benutzung von D B 2 27 Ruft man den CLP mit der Option -t auf, so wird nicht das Zeilenende, sondern der Strichpunkt (;) verwendet, um das Ende einer Anweisung zu erkennen (nützlich zur Eingabe von Befehlen oder S QL–Anweisungen, die über mehrere Zeilen gehen). Der CLP unterscheidet in Befehlen und S QL–Anweisungen nicht zwischen Groß– und Kleinschreibung. 3.4 Benutzerkonzept und Berechtigungsstufen (Instanz) Das (für das Praktikum verwendete) Authentisierungskonzept von D B 2 sieht keine speziellen Datenbankbenutzer(namen) vor, sondern verwendet das Benutzerkonzept und die Authentisierungsmechanismen des Betriebssystems. Auf einer D B 2–Instanz gibt es drei Berechtigungsstufen für Benutzer: • SYSADM — Zugriff auf alle Daten und Ressourcen der Instanz • SYSCTRL — berechtigt zum Verwalten der Instanz; kein direkter Zugriff auf Daten möglich • SYSMAINT — weniger Berechtigungen als SYSCTRL; berechtigt z.B. dazu, Backups zu erstellen oder den Betrieb einer Datenbank zu beobachten (monitoring) 3.5 Verwalten von Datenbankberechtigungen Berechtigungen auf einer (der aktuellen) Datenbank werden in S QL mit dem GRANT– und dem REVOKE–Statement verwaltet. Mittels GRANT werden Berechtigungen (Rechte) erteilt, mittels REVOKE wieder entzogen. So gibt es verschiedene Rechte, die festlegen, was ein Benutzer oder eine Benutzergruppe mit der Datenbank machen darf. Diese Rechte und ihre Bedeutung kann man der folgenden Tabelle entnehmen: Recht BINDADD CONNECT CREATETAB CREATE EXTERNAL ROUTINE CREATE NOT FENCED ROUTINE IMPLICIT SCHEMA DBADM LOAD QUIESCE CONNECT Bedeutung Erzeugung neuer Packages Verbinden zur Datenbank (Benutzen von CONNECT) Anlegen von Tabellen Registrieren externer Routinen Registrieren von Routinen, die in der Prozeßumgebung des DBMS laufen Implizite Schemaerzeugung Datenbankadministrator–Recht Benutzung der LOAD–Utility Zugriff auf die Datenbank, solange sie sich im Zustand quiesce“ befindet ” Aus Kompatibilitätsgründen kann man statt CREATE NOT FENCED ROUTINE auch CREATE NOT FENCED (wie in älteren Versionen) verwenden. Erteilen von Datenbankberechtigungen mit dem GRANT–Statement: .-,-----------------------------. V | >>-GRANT----+-BINDADD-------------------+-+--ON DATABASE--------> +-CONNECT-------------------+ +-CREATETAB-----------------+ +-CREATE_EXTERNAL_ROUTINE---+ 3 Benutzung von D B 2 28 +-CREATE_NOT_FENCED_ROUTINE-+ +-IMPLICIT_SCHEMA-----------+ +-DBADM---------------------+ +-LOAD----------------------+ ’-QUIESCE_CONNECT-----------’ .-,---------------------------------. V | >--TO----+-+-------+--authorization-name-+-+------------------->< | +-USER--+ | | ’-GROUP-’ | ’-PUBLIC------------------------’ authorization-name ist hierbei der Name eines Benutzers (UNIX–Benutzername) oder einer Benutzergruppe (UNIX–Gruppenname); PUBLIC steht für alle Benutzer. Bemerkungen: • Ein Benutzer (eine Gruppe), dem (der) das DBADM–Recht verliehen wird, erhält automatisch auch alle anderen Berechtigungen auf der Datenbank. • Das Recht DBADM kann nicht an PUBLIC vergeben werden. • Während es zur Erteilung der meisten Rechte ausreicht, die Berechtigung DBADM oder die Berechtigungsstufe SYSADM zu besitzen, muß man für die Erteilung des DBADM–Rechts die Berechtigungsstufe SYSADM besitzen. • Die Rechte gelten immer nur für die Datenbank, zu der gerade eine Verbindung besteht; insbesondere muß beim Absetzen dieses Statements eine Verbindung zu einer Datenbank existieren. Jede(r) Praktikumsteilnehmer(in) erhält für seine/ihre Datenbank (d. h. für die Datenbank, die wie sein/ihr (UNIX–)Benutzername heißt) die Berechtigung DBADM. Entziehen von Datenbankberechtigungen mit dem REVOKE–Statement: .-,-----------------------------. V | >>-REVOKE----+-BINDADD-------------------+-+--ON DATABASE-------> +-CONNECT-------------------+ +-CREATETAB-----------------+ +-CREATE_EXTERNAL_ROUTINE---+ +-CREATE_NOT_FENCED_ROUTINE-+ +-IMPLICIT_SCHEMA-----------+ +-DBADM---------------------+ +-LOAD----------------------+ ’-QUIESCE_CONNECT-----------’ .-,---------------------------------. V | .-BY ALL-. >--FROM----+-+-------+--authorization-name-+-+--+--------+----->< | +-USER--+ | | ’-GROUP-’ | ’-PUBLIC------------------------’ • Wird einem Benutzer (einer Gruppe) das DBADM–Recht entzogen, so behält dieser Benutzer (diese Gruppe) evtl. andere vorhandene Rechte auf der Datenbank; sie werden nicht automatisch entzogen. 3 Benutzung von D B 2 29 • Um die Berechtigung DBADM zu entziehen, ist die Berechtigungsstufe SYSADM notwendig; beim Entziehen der anderen Berechtigungen genügt es, die Berechtigung DBADM oder die Berechtigungsstufe SYSADM zu besitzen. • Wird einem Benutzer (einer Gruppe) ein Recht entzogen, so muß dies nicht unbedingt bedeuten, daß er (sie) dieses Recht danach nicht mehr besitzt. Er (sie) könnte dieses Recht auch noch durch Zugehörigkeit zu einer Gruppe, die dieses Recht besitzt, besitzen oder von einem anderen Benutzer erhalten haben. Beispiele: • Folgendes Statement gibt allen Benutzern das Recht, sich mit der (aktuellen) Datenbank zu verbinden: GRANT CONNECT ON DATABASE TO PUBLIC • Folgendes Statement gibt dem Benutzer Karl die Rechte zum Verbindungsaufbau mit der Datenbank und zum Anlegen von Tabellen: GRANT CONNECT, CREATETAB ON DATABASE TO USER Karl • Mit einem Statement kann man auch mehreren Benutzern oder Benutzergruppen Rechte erteilen: GRANT CONNECT, IMPLICIT SCHEMA TO USER Karl, USER Gerd, GROUP Students • Entziehen des Rechtes zum Verbindungsaufbau für die Gruppe PUBLIC: REVOKE CONNECT ON DATABASE FROM PUBLIC Die aktuellen Datenbankberechtigungen kann man sich mit dem CLP–Kommando GET AUTHORIZATIONS anzeigen lassen. 4 Ausdrücke, Prädikate, Suchbedingungen 30 4 Ausdrücke, Prädikate, Suchbedingungen In diesem Kapitel werden grundlegende Sprachelemente, wie Ausdrücke, Prädikate und Suchbedingungen, kurz vorgestellt, die in S QL an vielen Stellen verwendet werden. Deutlich detaillierter sind diese Sprachelemente im Manual beschrieben. 4.1 Ausdrücke Ausdrücke (expressions) werden verwendet, um Werte zu spezifizieren. Sie besitzen die folgende Syntax: expression: .-operator--------------------------------. V | |----+-----+--+-function-------------------+-+------------------| +- + -+ +-(expression)---------------+ ’- - -’ +-constant-------------------+ +-column-name----------------+ +-host-variable--------------+ +-special-register-----------+ +-(scalar-fullselect)--------+ +-labeled-duration-----------+ +-case-expression------------+ +-cast-specification---------+ +-dereference-operation------+ +-OLAP-function--------------+ +-XML-function---------------+ +-method-invocation----------+ +-subtype-treatment----------+ ’-sequence-reference---------’ operator: |--+-CONCAT-------+---------------------------------------------| +- / ----------+ +- * ----------+ +- + ----------+ ’- - ----------’ Diese Syntaxdefinition ist rekursiv, da ein Ausdruck, der in Klammern eingeschlossen ist, selbst wieder als Operand in einem Ausdruck auftreten darf (expression). Statt CONCAT kann auch || zur Stringkonkatenation verwendet werden. 4 Ausdrücke, Prädikate, Suchbedingungen 31 Die einfachen Ausdrücke sind die folgenden: Attributname (column-name): Dieser kann durch einen Tabellennamen oder eine Tupelvariable qualifiziert werden. Beispiele: GEHALT, ANGEST.NAME D B 2 unterscheidet dabei nicht zwischen Groß– und Kleinschreibung. Durch die Verwendung von doppelten Anführungszeichen (") kann dies erzwungen werden (z.B. "Gehalt"). Konstante (constant): Ganze Zahlen (z.B. 5, -37), Dezimalzahlen (z.B. 2.7, -3.14), Fließkommazahlen (z.B. 12E3, 3.2E-12), Zeichenketten (z.B. ’Hello’), Datumswerte (z.B. ’12/25/1998’, ’25.12.1998’, ’1998-12-25’), Zeitwerte (z.B. ’13.50.00’, ’13:50’, ’1:50 PM’), Zeitstempelwerte (z.B. ’2001-01-05-12.00.00.000000’) usw. Skalarwertige Subquery (scalar-fullselect): Ist sichergestellt, daß eine Anfrage (Query, siehe später) einen skalaren Wert zurückliefert, so kann diese in Klammern eingeschlossen auch als Operand verwendet werden. Typumwandlung (cast-specification): Explizite Umwandlung in einen bestimmten Typ durch Verwendung des CAST–Operators. cast-specification: |--CAST--(--+-expression-------+--AS--data-type-----------------> +-NULL-------------+ ’-parameter-marker-’ >--+----------------------------------+--)----------------------| | | ’-SCOPE-------+-typed-table-name-+-’ ’-typed-view-name--’ Der angegebene Ausdruck (expression oder NULL) wird in einen Wert vom Typ data-type umgewandelt. Parametermarken (parameter-marker) und die SCOPE–Klausel werden später erläutert. Beispiele: CAST (NULL AS VARCHAR(20)), CAST (Gehalt*1.234 AS DECIMAL(9,2)) Auf die folgenden Operandenarten wird hier zunächst nicht näher eingegangen: • Hostvariablen (host-variable) dienen der Kommunikation zwischen einer Hostsprache und dem DBMS. Siehe Embedded S QL. • Dereferenzierungsoperationen (dereference-operation), Aufrufe von Methoden (method-invocation) und die Behandlung von Untertypen (subtype-treatment) sind nur im Zusammenhang mit strukturierten Typen sinnvoll und werden dort behandelt. • Die OLAP–Funktionen (OLAP-function) werden für das sog. On–Line Analytical Processing verwendet. Evtl. wird später noch auf diese Funktionen eingegangen. • X ML–Funktionen (XML-function) dienen dem Umgang mit X ML–basierten Daten. • In einer sequence-reference wird ein Wert von einer Sequenz ausgelesen. Sie werden bei den Sequenzen behandelt. 4.1.1 Zeitdauerwerte Bei arithmetischen Operationen mit Datums– oder Zeitwerten können Zeitdauerwerte (labeled-duration) benutzt werden. 4 Ausdrücke, Prädikate, Suchbedingungen 32 labeled-duration: |--+-function------+--+-YEAR---------+--------------------------| +-(expression)--+ +-YEARS--------+ +-constant------+ +-MONTH--------+ +-column-name---+ +-MONTHS-------+ ’-host-variable-’ +-DAY----------+ +-DAYS---------+ +-HOUR---------+ +-HOURS--------+ +-MINUTE-------+ +-MINUTES------+ +-SECOND-------+ +-SECONDS------+ +-MICROSECOND--+ ’-MICROSECONDS-’ In komplexen Ausdrücken dürfen Zeitdauerwerte nur verwendet werden, wenn der andere Operand im Ausdruck vom Typ TIME, TIMESTAMP oder DATE ist. Der Wert vor dem jeweiligen Schlüsselwort im Zeitdauerwert muß von einem (für dieses Schlüsselwort) sinnvollen Typ sein (Details siehe Handbuch). Beispiele: 5 DAYS, 1 HOUR, 1 YEAR. 4.1.2 Fallunterscheidungen Fallunterscheidungen in Ausdrücken sind in D B 2-SQL durch CASE–Ausdrücke (case-expression) möglich: case-expression: |--CASE--+-searched-when-clause-+-------------------------------> ’-simple-when-clause---’ .-ELSE NULL---------------. >--+-------------------------+--END-----------------------------| ’-ELSE--result-expression-’ searched-when-clause: .-----------------------------------------------------. V | |----WHEN--search-condition--THEN--+-result-expression-+-+------| ’-NULL--------------’ simple-when-clause: .-----------------------------------------------. V | |--expression----WHEN--expression--THEN--+-result-expression-+-+--| ’-NULL--------------’ Der Wert eines CASE–Ausdrucks (result-expression oder NULL) ergibt sich wie folgt: 4 Ausdrücke, Prädikate, Suchbedingungen 33 • Die Bedingungen (searched-when-clause) werden der Reihe nach ausgewertet. Ergebnis ist diejenige result-expression, die zum ersten Fall gehört, der zu true evaluiert. Ergibt keiner der Fälle true, so ist das Ergebnis über die ELSE–Klausel festgelegt. Wurde keine ELSE–Klausel angegeben, so ist das Ergebnis NULL. • Bei einer simple-when-clause wird der Ausdruck, der vor dem ersten WHEN steht, mit den Ausdrücken verglichen, die auf WHEN folgen. • Für result-expression darf nicht überall NULL stehen, damit ein Typ für diesen Ausdruck bestimmt werden kann. Die Typen von verschiedenen result-expression in einem CASE–Ausdruck müssen kompatibel sein. Wird ein CASE–Ausdruck in einer VALUES–, GROUP BY–, ORDER BY–Klausel oder in einem IN–Prädikat verwendet, so darf die search-condition einer searched-when-clause kein quantifiziertes Vergleichsprädikat, kein IN– Prädikat, welches ein fullselect verwendet, und kein EXISTS–Prädikat sein (siehe später). Beispiele: CASE WHEN wert > 1000 THEN ’Gross’ WHEN wert < 100 THEN ’Klein’ ELSE ’Mittel’ END CASE SUBSTR(workdept,1,1) WHEN ’A’ THEN ’Administration’ WHEN ’B’ THEN ’Human Resources’ WHEN ’C’ THEN ’Accounting’ END Manche Spezialfälle von CASE–Ausdrücken können auch über die beiden Funktionen NULLIF bzw. COALESCE formuliert werden (siehe später). 4.1.3 Registerwerte Registerwerte (special-register) sind spezielle Werte, die vom DBMS verwaltet und z.T. vom Benutzer verändert werden können und dann die Funktion des DBMS verändern. Mehrfache Verwendungen eines Registerwertes innerhalb einer Anfrage liefern alle den gleichen Wert. Folgende Tabelle zeigt die wichtigsten Registerwerte und ihre Bedeutung: Name CURRENT CURRENT CURRENT CURRENT CURRENT CURRENT USER DATE TIME TIMESTAMP TIMEZONE SCHEMA PATH Bedeutung Aktuelles Datum Aktuelle Uhrzeit Aktueller Zeitstempelwert Aktuelle Zeitzone Aktuelles Schema Aktueller S QL–Pfad Name des angemeldeten Benutzers Veränderbar Nein Nein Nein Nein Ja Ja Nein Der Wert von CURRENT SCHEMA kann via SET SCHEMA, der Wert von CURRENT PATH via SET PATH geändert werden (Details siehe später). 4 Ausdrücke, Prädikate, Suchbedingungen 34 Beispiele: SELECT lastname FROM employee WHERE DAYOFYEAR(birthdate) = DAYOFYEAR(CURRENT DATE) SELECT * FROM syscat.tables WHERE definer = USER Statt des Leerzeichens kann in den Namen der Registerwerte auch ein Underscore verwendet werden. 4.1.4 Funktionen In D B 2–SQL stehen drei Arten von Funktionen zur Verfügung: Skalare Funktionen: Sie werten eine Liste von skalaren Parametern aus und geben einen skalaren Wert zurück. Aggregatfunktionen: Sie werden auf Spalten (oder auf Ausdrücke, die solche Spalten enthalten) einer Gruppe bzw. einer Relation angewendet und geben einen skalaren Wert zurück. Sie werden nur in Anfragen (z.B. in der SELECT–Klausel) verwendet. Tabellenfunktionen: Sie geben eine Relation zurück und können nur in der FROM–Klausel verwendet werden. Für die ersten beiden Arten stellt das DBMS Funktionen bereit, die sofort verwendet werden können. Man kann für alle drei Arten benutzerdefinierte Funktionen erstellen, die dann an denselben Stellen wie die vom System bereitgestellten Funktionen verwendet werden können. Bei allen diesen Funktionen ist zu beachten, daß die von ihnen zurückgegebenen Datentypen von den Datentypen der Parameter abhängen (können), d.h. es kann mehrere gleichnamige Funktionen geben, die jedoch eine unterschiedliche Signatur besitzen (Overloading). Da in Ausdrücken nur Aufrufe (Auswertungen) von skalaren Funktionen verwendet werden können, werden diese im folgenden erläutert. Auf die anderen Arten von Funktionen wird später eingegangen. Unter anderem stehen folgende skalare Funktionen (function) zur Verfügung: Funktionen zur Typkonvertierung: BIGINT, BLOB, CHAR, CLOB, DATE, DBCLOB, DECIMAL, DREF, DOUBLE, FLOAT, GRAPHIC, INTEGER, LONG VARCHAR, LONG VARGRAPHIC, REAL, SMALLINT, TIME, TIMESTAMP, VARCHAR, VARGRAPHIC Beispiele: CHAR(salary, ’,’), TIME(’10:00’) Mathematische Funktionen: ABS, ACOS, ASIN, ATAN, CEIL, COS, COT, DEGREES, EXP, FLOOR, LN, LOG, LOG10, MOD, POWER, RADIANS, RAND, ROUND, SIGN, SIN, SQRT, TAN, TRUNC Beispiele: ROUND(salary,0), POWER(2,10) Funktionen zur Stringmanipulation: ASCII, CHR, CONCAT, DIFFERENCE, DIGITS, HEX, INSERT, LCASE, LEFT, LENGTH, LOCATE, LTRIM, POSSTR, REPEAT, REPLACE, RIGHT, RTRIM, SOUNDEX, SPACE, SUBSTR, UCASE, TRANSLATE Funktionen zur Datumsmanipulation: DAY, DAYNAME, DAYOFWEEK, DAYOFYEAR, DAYS, HOUR, JULIAN DAY, MICROSECOND, MIDNIGHT SECONDS, MINUTE, MONTH, MONTHNAME, QUARTER, SECOND, TIMESTAMP ISO, TIMESTAMPDIFF, WEEK, WEEK ISO, YEAR, VARCHAR FORMAT, TO DATE, TO CHAR Beispiele: MONTH(birthdate), DAYOFWEEK(CURRENT DATE) Systemnahe Funktionen: EVENT MON STATE, DBPARTITIONNUM, RAISE ERROR, TABLE NAME, TABLE SCHEMA, TYPE ID, TYPE NAME, TYPE SCHEMA Beispiel: RAISE ERROR(’70007’,’This sucks’) 4 Ausdrücke, Prädikate, Suchbedingungen 35 Sonstige Funktionen: COALESCE bzw. VALUE: Liefert das erste Argument, das nicht der NULL–Wert ist. VALUE(salary,0) liefert z. B. den Wert von salary, falls dieser nicht NULL ist, und sonst den Wert 0. GENERATE UNIQUE: Liefert einen 13 Byte langen Bit-String, der eindeutig in Bezug auf mehrfache Aufrufe dieser Funktion ist. NULLIF: Liefert einen NULL–Wert, wenn beide Argumente gleich sind, und sonst den Wert des ersten Arguments. Alle Funktionen sind detailliert im Manual beschrieben. Meistens gibt der Name einer Funktion einen Hinweis auf ihre Semantik. 4.2 Prädikate Prädikate (predicates) sind logische Tests, die in Suchbedingungen verwendet werden. Sie liefern die Wahrheitswerte true, false und unknown. Bemerkung: Wenn im folgenden von fullselect die Rede ist, so ist damit eine Anfrage gemeint, die eine Relation zurückliefert (siehe eine der nächsten Sitzungen). Folgende Prädikate sind möglich: Einfache Vergleichsprädikate für Ausdrücke: >>-expression--+++++’- = -------+----expression--------------------->< <> ------+ < -------+ > -------+ <= ------+ >= ------’ Beispiele: price > 100, name <> ’Fritz’ Vergleiche mit NULL–Werten ergeben unknown Vorsicht: Zeichen werden in D B 2 unter Verwendung von sog. collating sequences sortiert. Insbesondere wird bei der Installation, die für das Praktikum verwendet wird, nicht nach den ASCII–Werten sortiert. Die Zeichen sind stattdessen wie folgt geordnet: 0,1,2,. . . ,9,a,A,b,B,c,C,. . . ,x,X,y,Y,z,Z Zeichenketten werden dann entsprechend dieser Ordnung lexikographisch sortiert. BETWEEN–Prädikat: >>-expression--+-----+--BETWEEN--expression--AND--expression--->< ’-NOT-’ Dieses Prädikat dient der Bereichsüberprüfung. Beispiel: age BETWEEN 20 AND 29 NULL–Prädikat: >>-expression--IS--+-----+--NULL------------------------------->< ’-NOT-’ Dieses Prädikat dient zum Test auf den NULL–Wert (ergibt immer true oder false — niemals unknown). Beispiele: Telnr IS NULL, salary IS NOT NULL 4 Ausdrücke, Prädikate, Suchbedingungen 36 LIKE-Prädikat: >>-match-expression--+-----+--LIKE--pattern-expression----------> ’-NOT-’ >--+---------------------------+------------------------------->< ’-ESCAPE--escape-expression-’ Dieses Prädikat bewirkt einen Zeichenkettenvergleich mit Platzhaltern für ein ( ) bzw. beliebig viele (%) Zeichen. Dabei muß der Ausdruck match-expression zu einem String evaluieren. Als escape-expression kann ein Zeichen angegeben werden, mit dem die Platzhalterzeichen geschützt werden können. Beipiele: plz LIKE ’7207 ’, ort LIKE ’%ing%’ EXISTS–Prädikat: >>-EXISTS--(fullselect)---------------------------------------->< Es wird geprüft, ob die angegebene Anfrage mindestens ein Tupel zurückliefert. Ist dies der Fall, so ergibt das EXISTS–Prädikat true; wird kein Tupel zurückgeliefert, so ist das Ergebnis false. IN–Prädikat: >>-+-expression1--+-----+--IN--+-(fullselect1)-------------+-+->< | ’-NOT-’ | .-,---------------. | | | | V | | | | +-(------expression2---+--)-+ | | ’-expression2---------------’ | | .-,---------------. | | V | | ’-(------expression3---+--)--+-----+--IN--(fullselect2)---’ ’-NOT-’ Es wird geprüft, ob ein Wert (nicht) in einer Kollektion von Werten vorkommt. Dabei ist zu beachten, daß die Typen von expression1 und expression2 bzw. vom Ergebnis von fullselect1, sowie die Typen von expression3 mit den jeweils korrespondierenden Spalten im Ergebnis von fullselect2 kompatibel sein müssen. Bei NULL–Werten in der Kollektion ist es möglich, daß das IN–Prädikat den Wert unknown annimmt. TYPE–Prädikat: Da dieses Prädikat nur im Zusammenhang mit strukturierten Typen benutzt wird, wird es erst später erläutert. 4.2.1 Quantifizierte Vergleichsprädikate Quantifizierte Vergleichsprädikate besitzen die folgende Syntax: >>-+-expression1--+- = -------+--+-SOME-+--(fullselect1)-----+->< | | | +-ANY--+ | | +- <> ------+ ’-ALL--’ | | +- < -------+ | | +- > -------+ | | +- <= ------+ | | ’- >= ------’ | | .-,---------------. | | V | | 4 Ausdrücke, Prädikate, Suchbedingungen 37 ’-(------expression2---+--)-- = --+-SOME-+--(fullselect2)-’ ’-ANY--’ Dabei ist zu beachten, daß die Typen von expression1 und vom Ergebnis von fullselect1, bzw. die Typen von expression2 mit den jeweils korrespondierenden Spalten im Ergebnis von fullselect2 kompatibel sein müssen. Diese zweite Form der quantifizierten Vergleichsprädikate, bei der ein Tupel mit einer Menge von Tupeln verglichen wird, wird auch als Tupelprädikat bezeichnet. Bei Verwendung von ALL ist das Ergebnis des Prädikats • true, wenn das Ergebnis von fullselect1 keine Werte enthält oder für alle Werte im Ergebnis von fullselect1 der Vergleich true ergibt, • false, wenn der Vergleich für mindestens einen Wert im Ergebnis von fullselect1 false ergibt und • unknown, wenn der Vergleich für keinen Wert im Ergebnis von fullselect1 false aber mindestens einmal unknown ergibt. Bei Verwendung von SOME oder ANY ist das Ergebnis des Prädikats • true, wenn der Vergleich für mindestens einen Wert aus dem Ergebnis von fullselect1 true ergibt bzw. wenn der Vergleich für mindestens ein Tupel aus dem Ergebnis von fullselect2 true ergibt, • false, wenn die Ergebnisse von fullselect1 bzw. fullselect2 leer sind oder für alle Werte aus dem Ergebnis von fullselect1 der Vergleich false ergibt bzw. wenn der Vergleich für jedes Tupel aus dem Ergebnis von fullselect2 false ergibt und • unknown, wenn der Vergleich für keinen Wert aus dem Ergebnis von fullselect1 true aber mindestens einmal unknown ergibt bzw. wenn der Vergleich für jedes Tupel aus dem Ergebnis von fullselect2 nicht true ergibt und mindestens ein Vergleich unknown ergibt. Beispiele: department IN (’A00’,’D01’,’E21’) EXISTS (SELECT * FROM employee WHERE salary > 100000) 2000 < ALL (SELECT salary FROM employee) (’000010’,’CHRISTINE’) IN (SELECT empno, firstname FROM employee WHERE edlevel = 18) (’000010’,’CHRISTINE’) = ANY (SELECT empno, firstname FROM employee WHERE edlevel = 18) 4 Ausdrücke, Prädikate, Suchbedingungen 38 4.3 Suchbedingungen Eine Suchbedingung (search-condition) ist eine Bedingung, die für jedes Tupel einer Relation, für die sie ausgewertet wird, den Wert true, false oder unknown annimmt. search-condition: |--+-----+--+-predicate--+-------------------------------+-+----> ’-NOT-’ | ’-SELECTIVITY--numeric-constant-’ | ’-(search-condition)---------------------------’ .-------------------------------------------------------------------------. V | >---+--------------------------------------------------------------------+-+--| ’-+-AND-+--+-----+--+-predicate--+-------------------------------+-+-’ ’-OR--’ ’-NOT-’ | ’-SELECTIVITY--numeric-constant-’ | ’-(search-condition)---------------------------’ Hierbei steht predicate jeweils für ein Prädikat und search-condition für eine Suchbedingung. Geklammerte Suchbedingungen werden zuerst ausgewertet. Bei ungeklammerten Bedingungen gilt die folgende Regel: NOT bindet am stärksten, dann werden AND-Verknüpfungen ausgewertet, und am schwächsten bindet OR. Innerhalb boolscher Operatoren mit gleicher Bindungsstärke ist die Auswertungsreihenfolge nicht festgelegt. Der Wahrheitswert einer Suchbedingung errechnet sich gemäß folgender Tabelle (P und Q seien beliebige Prädikate): P true true true false false false unknown unknown unknown Q true false unknown true false unknown true false unknown P AND Q true false unknown false false false unknown false unknown P OR Q true true true true false unknown true unknown unknown Außerdem gilt: NOT (true) ergibt false, NOT (false) ergibt true und NOT (unknown) ergibt unknown. Über die SELECTIVITY–Klausel kann man die Selektivität des Prädikats angeben. Diese wird vom DBMS bei Optimierungen berücksichtigt. Sie darf nur bei benutzerdefinierten Prädikaten, d.h. bei Prädikaten, die den Aufruf einer benutzerdefinierten Funktion enthalten, angegeben werden. Der Wert der Selektivität numeric-constant muß dann zwischen 0 und 1 liegen. 5 Schemata 39 5 Schemata Ein Schema ist eine Sammlung von benannten Objekten (Tabellen, Sichten, Trigger, Funktionen,. . . ). Jedes Objekt in der Datenbank liegt in einem Schema. Objektnamen müssen innerhalb eines Schemas eindeutig sein. Schemata können jedoch nicht rekursiv angelegt werden, d.h. ein Schema kann kein anderes Schema enthalten. Ein Objekt in der Datenbank wird durch einen qualifizierten Namen identifiziert. Dieser besteht aus dem Namen des Schemas, in dem das Objekt liegt, gefolgt von einem Punkt und dem Objektnamen. Z. B. bezeichnet KUNDEN.ADRESSEN das Objekt ADRESSEN im Schema KUNDEN. Wird nur ein Objektname angegeben, so qualifiziert D B 2 diesen durch den Schemanamen, der im Register CURRENT SCHEMA abgelegt ist. Nach dem Verbinden mit der Datenbank enthält dieses Register zunächst den Benutzernamen. Den Wert dieses Registers kann man mit dem SET SCHEMA–Statement verändern: .-CURRENT-. .-=-. >>-SET--+---------+--SCHEMA--+---+--+-schema-name-----+-------->< +-USER------------+ +-host-variable---+ ’-string-constant-’ Beispiel: Folgende Statements setzen jeweils das Register auf den Wert prak: SET SCHEMA = prak SET CURRENT SCHEMA ’prak’ 5.1 Anlegen und Löschen von Schemata Es gibt zwei Arten, ein Schema zu erzeugen: explizit und implizit. Explizites Anlegen eines Schemas mit dem CREATE SCHEMA–Statement: >>-CREATE SCHEMA------------------------------------------------> >--+-schema-name------------------------------------+-----------> +-AUTHORIZATION--authorization-name--------------+ ’-schema-name--AUTHORIZATION--authorization-name-’ >--+--------------------------+-------------------------------->< | .----------------------. | | V | | ’---schema-SQL-statement-+-’ • Nur ein Benutzer mit der Berechtigung DBADM oder der Berechtigungsstufe SYSADM darf Schemata mit (fast) beliebigen Namen anlegen. • Ein anderer Benutzer darf nur ein Schema mit seinem Benutzernamen als Namen anlegen. • Der angegebene schema-name darf nicht mit SYS beginnen und höchstens 30 Zeichen lang sein. Ein Schema mit diesem Namen darf noch nicht existieren. 5 Schemata 40 • Wird nur der schema-name angegeben, so wird ein Schema mit diesem Namen angelegt, das dem aktuellen Benutzer gehört. • Wird nur AUTHORIZATION authorization-name angegeben, so wird ein Schema mit dem Namen authorization-name angelegt, das dem Benutzer authorization-name gehört. • Werden sowohl schema-name als auch authorization-name angegeben, so wird ein Schema mit dem Namen schema-name angelegt, das dem Benutzer authorization-name gehört. • Im schema-SQL-statement sind Statements zum Anlegen von Tabellen, Sichten und Indexen, sowie das COMMENT ON– und bestimmte GRANT–Statements möglich. Alle nicht vollständig qualifizierten Objektnamen werden durch das gerade angelegte Schema qualifiziert. Ein Benutzer, der über die Datenbankberechtigung IMPLICIT SCHEMA verfügt, kann ein Schema auch implizit erzeugen: • Dies geschieht dadurch, daß dieser Benutzer in einem (CREATE–)Statement ein Schema verwendet, das noch nicht existiert. • Dieses wird dann vom DBMS angelegt. Als Besitzer dieses impliziten Schemas wird immer SYSIBM eingetragen. • Insbesondere hat standardmäßig jeder Benutzer das Recht, in einem implizit angelegten Schema Objekte anzulegen! • Nur ein Benutzer mit der Berechtigung DBADM oder der Berechtigungsstufe SYSADM kann die Zugriffsrechte an solch einem Schema ändern. Löschen eines Schemas mit dem DROP–Statement: >>---DROP----SCHEMA----schema-name----RESTRICT------------>< Hierbei ist zu beachten, daß in dem zu löschenden Schema keine Objekte mehr existieren dürfen. Ein Benutzer muß Eigentümer des Schemas sein, oder mindestens die Datenbankberechtigung DBADM besitzen, um ein Schema zu löschen. 5.2 Verwalten von Schemaberechtigungen Erteilen von Schemaberechtigungen mit dem GRANT–Statement: .-,------------. V | >>-GRANT----+-ALTERIN--+-+--ON SCHEMA--schema-name--------------> +-CREATEIN-+ ’-DROPIN---’ .-,---------------------------------. V | >--TO----+-+-------+--authorization-name-+-+--------------------> | +-USER--+ | | ’-GROUP-’ | ’-PUBLIC------------------------’ >--+-------------------+--------------------------------------->< ’-WITH GRANT OPTION-’ 5 Schemata 41 • Um einem Benutzer (oder einer Benutzergruppe) Rechte an einem Schema zu erteilen, muß man diese Rechte mit der WITH GRANT OPTION erhalten haben, die Berechtigung DBADM oder die Berechtigungsstufe SYSADM besitzen. • Der Zusatz WITH GRANT OPTION bewirkt, daß der/die mit authorization-name bezeichnete(n) Benutzer die erhaltenen Rechte an dritte weitergeben darf/dürfen. • Folgende Schemarechte sind vorgesehen: Recht ALTERIN CREATEIN DROPIN Bedeutung Objekte im Schema ändern Objekte im Schema anlegen (evtl. sind noch weitere Rechte, wie z. B. CREATETAB, nötig) Objekte im Schema löschen Bei einem explizit angelegten Schema erhält der Besitzer des Schemas diese Rechte automatisch. Entziehen von Schemaberechtigungen mit dem REVOKE–Statement: .-,------------. V | >>-REVOKE----+-ALTERIN--+-+--ON SCHEMA--schema-name-------------> +-CREATEIN-+ ’-DROPIN---’ .-,---------------------------------. V | .-BY ALL-. >--FROM----+-+-------+--authorization-name-+-+--+--------+----->< | +-USER--+ | | ’-GROUP-’ | ’-PUBLIC------------------------’ Zum Entziehen von Schemaberechtigungen ist die Berechtigung DBADM oder die Berechtigungsstufe SYSADM notwendig. 6 Tabellen 42 6 Tabellen 6.1 Datentypen Data types built-in data types external data datetime signed numeric string DATALINK time TIME fixed length CHAR timestamp exact date approximate TIMESTAMP DATE character graphic varying length fixed length GRAPHIC floating point varying length binary BLOB varying length single precision double precision REAL DOUBLE VARCHAR CLOB VARGRAPHIC DBCLOB binary integer 16 bit 32 bit SMALLINT INTEGER decimal 64 bit packed BIGINT DECIMAL Figure 10. The DB2 Built-in Data Types Abbildung 6.1: Datentypen All data types include the null value. The null value is a special value that is distinct from all non-null values and thereby denotes the absence of a Abbildung 6.1 zeigt eine Übersicht der Although Datentypenall von D Btypes 2–S QLinclude und deren Diese (eingebauten) (non-null) value. data the Zusammenhänge. null value, columns Datentypen stellt das DBMS Nähere Angaben, Größe dieser Datentypen, sind im Manual beim definedzur as Verfügung. NOT NULL cannot containu.a. nullzur values. CREATE TABLE–Statement zu finden. Benutzerdefinierte und strukturierte Datentypen werden später behandelt. Related reference: Folgende Tabelle führt die Namen (Schlüsselwörter) der wichtigsten (eingebauten) Typen auf und erläutert deren Verv “User-defined types” on page 108 wendung. Chapter 2. Language elements 93 6 Tabellen Schlüsselwort SMALLINT INTEGER BIGINT REAL DOUBLE DECIMAL(p,s) CHAR(n) VARCHAR(n) BLOB(s F) DATE TIME TIMESTAMP DATALINK 43 Verwendung kleine ganze Zahl (Werte zwischen -32 768 und +32 767) ganze Zahl (Werte zwischen -2 147 483 648 und +2 147 483 647) große ganze Zahl (Werte zwischen -9 223 372 036 854 775 808 und +9 223 372 036 854 775 807) Fließkommazahl (einfache Genauigkeit, Wert 0 oder Werte zwischen -3.402E+38 und -1.175E-37 bzw. zwischen 1.175E-37 und 3.402E+38) Fließkommazahl (doppelte Genauigkeit, Wert 0 oder Werte zwischen -1.79769E+308 und -2.225E-307 bzw. zwischen 2.225E-307 und 1.79769E+308) Dezimalbruch der Länge p (max. 31), davon s Nachkommastellen String der Länge n (max. 254 Zeichen) String variabler Länge bis zu n Zeichen (max. 32672) Binary Large OBject: s steht für die Länge; F gibt die Einheit an: K (Kilobyte), M (Megabyte), G (Gigabyte); fehlt die Einheit, so wird Byte angenommen; max. 2 147 483 647 Byte (2 GB - 1) Datum Uhrzeit Zeitstempel Verweis auf Datei, die außerhalb der Datenbank liegt Für einige dieser Typen können auch synonyme Schlüsselwörter verwendet werden, z.B. DEC oder NUM oder NUMERIC statt DECIMAL. 6.1.1 NULL– und Defaultwerte Zu jedem Datentyp gehört ein NULL–Wert. Dieser ist von allen anderen Werten des Datentyps zu unterscheiden, da er nicht einen Wert an sich darstellt, sondern das Fehlen eines Wertes anzeigt (im Sinne von noch nicht (nicht mehr) bekannt, nicht anwendbar). Der Wert 0 im Attribut Gehalt eines Angestellten könnte z. B. bedeuten, daß der Angestellte ehrenamtlich tätig ist, während der NULL–Wert bedeuten könnte, daß das Gehalt (noch) nicht bekannt ist. Das DBMS bietet Prädikate an, die es z. B. in Anfragen erlauben, zu prüfen, ob ein NULL–Wert vorliegt oder eine andere Ausprägung des Datentyps. NULL–Werte führen dazu, daß Prädikate nicht nur zu den Wahrheitswerten wahr und falsch, sondern auch zu unknown evaluieren können (dreiwertige Logik). Defaultwerte sind Werte, die vom DBMS eingetragen werden, wenn für das betreffende Attribut kein Wert angegeben wird. Sie bieten die Möglichkeit, Attribute automatisch mit Daten zu versehen, z. B. eine bestimmte Konstante, der Name des Benutzers (USER), die aktuelle Uhrzeit (CURRENT TIME), das aktuelle Datum (CURRENT DATE) usw. Wird kein spezieller Defaultwert angegeben, so wird (sofern möglich) der NULL–Wert als Defaultwert verwendet. 6.2 Anlegen von Tabellen Zum Anlegen einer Tabelle ist eine der folgenden Berechtigungen nötig: • Berechtigungsstufe SYSADM oder DBADM–Recht • Rechte CREATETAB und IMPLICIT SCHEMA, falls kein Schema für die zu erstellende Tabelle angegeben wurde und das implizit verwendete Schema noch nicht existiert • Rechte CREATETAB und CREATEIN, falls das Schema der zu erstellenden Tabelle bereits existiert 6 Tabellen 44 6.2.1 CREATE TABLE–Statement Anlegen von Tabellen mit dem CREATE TABLE–Statement: >>-CREATE--TABLE--table-name------------------------------------> >--+-| element-list |----------------------------+--*-----------> | | ’-LIKE--+-table-name1-+--+------------------+-’ ’-view-name---’ ’-| copy-options |-’ >--+----------------------------------------------+--*----------> ’-IN--tablespace-name1--| tablespace-options |-’ >--*--+-------------------+--*--+-----------------------+------>< ’-VALUE COMPRESSION-’ ’-WITH RESTRICT ON DROP-’ • LIKE spezifiziert, daß die Attribute der Tabelle exakt dieselben Namen und dieselben Definitionen haben sollen wie in der identifizierten Tabelle table-name1 oder Sicht view-name. • Mit der IN–Klausel kann man angeben, in welchem Tabellenbereich die Tabelle angelegt werden soll, sowie noch weitere Optionen für dessen Verwendung angeben. • Wird VALUE COMPRESSION angegeben, so werden NULL–Werte und Werte der Länge 0 (z.B. leere Strings oder BLOBs) platzsparender abgelegt. Allerdings kann dadurch die Tabelle leichter fragmentieren. • Wird WITH RESTRICT ON DROP angegeben, so dürfen weder die Tabelle noch der Tablespace, in dem sie angelegt wird, später gelöscht werden (es muß dann die ganze Datenbank gelöscht werden). Das CREATE TABLE–Statement erlaubt noch viele weitere Optionen, die hier nicht behandelt werden können. Derjenige Benutzer, der eine Tabelle anlegt, erhält das CONTROL–Recht auf dieser Tabelle. Sonst werden zunächst keine Rechte vergeben. Die copy-options (welche nur im Zusammenhang mit LIKE verwendet werden können) spezifizieren, welche zusätzlichen Eigenschaften der zugrundeliegenden Tabellen– oder Sicht–Definition kopiert werden sollen. copy-options: |--*--+-------------------------------------+--*----------------> | .-COLUMN-. | ’-+-INCLUDING-+--+--------+--DEFAULTS-’ ’-EXCLUDING-’ .-COLUMN ATTRIBUTES-. .-EXCLUDING IDENTITY--+-------------------+-. >--+-------------------------------------------+--*-------------| | .-COLUMN ATTRIBUTES-. | ’-INCLUDING IDENTITY--+-------------------+-’ • Wird INCLUDING COLUMN DEFAULTS angegeben, so erhalten (nach Möglichkeit) die Attribute der neu angelegten Tabelle dieselben Defaultwerteinstellungen wie in der zugrundeliegenden Tabelle oder Sicht. Bei EXCLUDING COLUMN DEFAULTS ist dies nicht der Fall. Letzteres ist die Defaulteinstellung für diese Option, wenn die zugrundeliegende Tabelle eine Basistabelle oder eine temporäre Tabelle ist. 6 Tabellen 45 • Wird INCLUDING IDENTITY COLUMN ATTRIBUTES angegeben, werden (falls möglich) die Definitionen von IDENTITY–Attributen übernommen. Bei Verwendung von EXCLUDING IDENTITY COLUMN ATTRIBUTES ist dies nicht der Fall. Nähere Details, wann das Übernehmen der Definitionen möglich ist, sind im Manual beschrieben. Wird eine neue Tabelle nicht durch Übernehmen einer Tabellen– oder Sichtdefinition mittels LIKE angelegt, so muß eine element-list angegeben werden: element-list: .-,------------------------------. V | |--(----+-| column-definition |------+-+--)---------------------| +-| unique-constraint |------+ +-| referential-constraint |-+ ’-| check-constraint |-------’ Es werden Attribute (Spalten) definiert (column-definition) und Schlüssel– (unique-constraint), Fremdschlüssel– (referential-constraint) oder allgemeine Integritätsbedingungen (Check Constraints) angegeben (check-constraint). 6.2.2 Attribute Eine Attributdefinition wird wie folgt vorgenommen: column-definition: |--column-name--+--------------------+--------------------------> | | ’-| data-type |------’ >--+--------------------+---------------------------------------| ’-| column-options |-’ column-options: .-----------------------------------------------------------------------. V | |----+-------------------------------------------------------------------+-+--| +-NOT NULL----------------------------------------------------------+ +-| lob-options |---------------------------------------------------+ +-+-----------------------------+---| column-constraints |----------+ | ’-CONSTRAINT--constraint-name-’ | +-| generated-column-spec |-----------------------------------------+ ’-COMPRESS SYSTEM DEFAULT-------------------------------------------’ lob-options: .-LOGGED-----. .-NOT COMPACT-. |--*--+------------+--*--+-------------+--*---------------------| ’-NOT LOGGED-’ ’-COMPACT-----’ 6 Tabellen 46 column-constraints: |---+-+-PRIMARY KEY-+-----------------------------------------+---| | ’-UNIQUE------’ | +-| references-clause |-----------------------------------+ ’-CHECK--(--check-condition--)--| constraint-attributes |-’ Der Spalte mit dem Namen column-name wird der Datentyp data-type zugeordnet. Es sind folgende Optionen möglich: • Der Zusatz NOT NULL legt fest, daß für dieses Attribut keine NULL–Werte erlaubt sind. • Die Angabe der lob-options ist nur bei LOB–Datentypen zulässig: – Über [NOT] LOGGED kann angegeben werden, ob Änderungen an dieser (LOB–)Spalte mitgeloggt werden sollen [oder nicht]. – Über [NOT] COMPACT kann angegeben werden, ob die (LOB–)Spalte platzsparender gespeichert werden soll [oder nicht]. Die platzsparende Speicherung führt allerdings zu aufwendigeren Operationen, wenn der Inhalt dieser Spalte verändert wird. • Über CONSTRAINT kann einer Schlüssel–, Fremdschlüssel– oder Integritätsbedingung der Name constraint-name gegeben werden: – PRIMARY KEY definiert diese Spalte zu einem Primär–, UNIQUE zu einem Sekundärschlüssel. – Über references-clause kann diese Spalte als Fremdschlüssel definiert werden. – Mittels der CHECK–Klausel kann eine allgemeine Integritätsbedingung formuliert werden. – Für Details zu Schlüssel–, Fremdschlüssel– oder Integritätsbedingungen siehe auch Abschnitte 6.2.3 und 6.2.5, die sich auch auf solche Bedingungen beziehen, die aber nicht bei der Definition eines Attributs aufgeführt sind. • COMPRESS SYSTEM DEFAULT bewirkt, daß Defaultwerte etwas platzsparender abgelegt werden. Dies führt allerdings zu mehr Aufwand beim Einfügen und Löschen. Über die generated-column-spec kann man Defaultwerte angeben oder daß und wie Attributwerte automatisch vom System generiert werden sollen: generated-column-spec: |--+-| default-clause |-----------------------------------------------------+-| ’-GENERATED--+-ALWAYS-----+-AS-+-IDENTITY--+-------------------------+-+-’ ’-BY DEFAULT-’ | ’-| identity-attributes |-’ | ’-(--generation-expression--)-----------’ default-clause: .-WITH-. |--+------+--DEFAULT--+--------------------+--------------------| ’-| default-values |-’ identity-attributes: |--+---------------------------------------------------------+--| 6 Tabellen 47 | .-----------------------------------------------. | | V .-1----------------. | | ’-(-----------+-START WITH--+-numeric-constant-+---+-+--)-’ | .-1----------------. | +-INCREMENT BY--+-numeric-constant-+-+ | .-NO MINVALUE----------------. | +-+-MINVALUE--numeric-constant-+-----+ | .-NO MAXVALUE----------------. | +-+-MAXVALUE--numeric-constant-+-----+ | .-NO CYCLE-. | +-+-CYCLE----+-----------------------+ | .-CACHE--20---------------. | +-+-NO CACHE----------------+--------+ | ’-CACHE--integer-constant-’ | | .-NO ORDER-. | ’-+-ORDER----+-----------------------’ default-values: |--+-constant-------------------------------------------+-------| +-datetime-special-register--------------------------+ +-CURRENT SCHEMA-------------------------------------+ +-USER-----------------------------------------------+ +-NULL-----------------------------------------------+ ’-cast-function--(--+-constant------------------+--)-’ +-datetime-special-register-+ +-CURRENT SCHEMA------------+ ’-USER----------------------’ • Über die DEFAULT–Klausel kann man einen Defaultwert für ein Attribut angeben (vgl. Abschnitt 6.1.1). • Mittels GENERATED werden Attributwerte automatisch von D B 2 erzeugt. ALWAYS besagt, daß immer ein Attributwert generiert wird, wenn ein Tupel eingefügt wird, oder sich der Wert der generation-expression ändert. BY DEFAULT erzeugt nur einen Attributwert, wenn kein Wert angegeben wird. • Bei Verwendung von AS IDENTITY wird eine Sequenz für dieses Attribut definiert und vom DBMS angelegt. Es wird dann automatisch als NOT NULL definiert und darf keinen Defaultwert besitzen. Jede Tabelle kann nur ein solches Attribut haben. Dieses Attribut muß entweder einen der Ganzzahltypen oder DECIMAL mit 0 Nachkommastellen als Datentyp haben. • Jedes der identity-attributes darf maximal einmal angegeben werden. – START WITH gibt an, mit welchem Wert die Sequenz beginnen soll. Default ist hier MINVALUE für auf– und MAXVALUE für absteigende Sequenzen. – Der Betrag von INCREMENT BY gibt an, um wieviel sich die Werte der Sequenz unterscheiden. Ist die angegebene Konstante positiv, so handelt es sich um eine aufsteigende Sequenz, sonst eine absteigende. – MINVALUE und MAXVALUE geben Minimal– und Maximalwert der Sequenz an. Werden diese Optionen mit vorangestelltem NO angegeben, so wird der Minimal– oder Maximalwert des Datentyps des Attributs verwendet. – Wird NO CYCLE angegeben, so stoppt D B 2 mit der Generierung von Werten, wenn eine aufsteigende Sequenz am Maximum, bzw. eine absteigende am Minimum angekommen ist. – Bei CYCLE wird hingegen dann wieder von vorne (oder dem entsprechenden Maximal– oder Minimalwert) mit der Generierung begonnen. In diesem Fall können Werte mehrfach auftreten. 6 Tabellen 48 – Über die CACHE–Option kann man fordern, daß (bzw. wieviele) Werte für diese Spalte im Speicher vorgehalten werden sollen, um das Laufzeitverhalten zu verbessern. – Mittels [NO] ORDER gibt man an, ob die Werte in der Reihenfolge generiert werden sollen, in der sie angefordert werden [oder nicht]. • Mittels generation-expression kann man angeben, wie die Werte für dieses Attribut ermittelt werden sollen. Unter anderem kann man in diesem Ausdruck auf die Werte bereits definierter Attribute dieser Tabelle zugreifen. Die meisten dieser Optionen sind etwas komplexer als hier dargestellt. Genauere Angaben finden sich im Manual. 6.2.3 Schlüssel und Fremdschlüssel Schlüssel können, wenn sie nur aus einem Attribut bestehen, als Teil der Attributdefinition angegeben werden, oder (allgemeiner) über folgende Klausel definiert werden: unique-constraint: |--+-----------------------------+--+-UNIQUE------+-------------> ’-CONSTRAINT--constraint-name-’ ’-PRIMARY KEY-’ .-,-----------. V | >--(----column-name-+--)----------------------------------------| Mittels PRIMARY KEY wird ein Primärschlüssel für die Tabelle festgelegt: • Dieser besteht aus den angegebenen Attributen (besteht der Schlüssel nur aus einem Attribut, so kann man (wie oben gesehen), PRIMARY KEY direkt hinter dem jeweiligen Attribut (ohne weitere Zusätze) angeben). • Die Attribute, die in einem Schlüssel auftreten, dürfen keine NULL-Werte zulassen und können u. a. keine LONGDatentypen haben. • Das DBMS legt einen Index auf dem Primärschlüssel an. Dieser Index trägt entweder den Namen constraintname (falls dieser angegeben wurde) oder einen vom System generierten eindeutigen Namen. Mehr zu Indexen später. • Jede Tabelle kann nur einen Primärschlüssel besitzen. Mittels UNIQUE wird ein Sekundärschlüssel für die Tabelle festgelegt: • Dieser besteht aus den angegebenen Attributen (besteht der Schlüssel nur aus einem Attribut, so kann man (wie oben gesehen), UNIQUE direkt hinter dem jeweiligen Attribut (ohne weitere Zusätze) angeben). • Es gelten die gleichen Einschränkungen an die Attribute wie bei Primärschlüsseln. • Das DBMS legt wie bei einem Primärschlüssel einen entsprechenden Index an. • Es ist nicht möglich, einen Sekundärschlüssel auf den gleichen Attributen anzulegen, auf denen schon ein anderer Schlüssel angelegt wurde. 6 Tabellen 49 Diese Ausführungen gelten im Prinzip auch für die Schlüsselbedingungen, die bei der Attributdefinition angegeben werden. Fremdschlüssel werden verwendet, um zu erzwingen, daß ein Attribut bzw. eine Attributmenge einer abhängigen Tabelle nur Werte annehmen kann, die auch als Werte (bzw. Wertkombinationen) eines Schlüssels einer anderen Tabelle, auf die verwiesen wird, auftreten (Referentielle Integrität). Fremdschlüsselbeziehungen (Bedingungen zur Erhaltung der referentiellen Integrität): referential-constraint: |--+-----------------------------+--FOREIGN KEY-----------------> ’-CONSTRAINT--constraint-name-’ .-,-----------. V | >--(----column-name-+--)--| references-clause |-----------------| references-clause: |--REFERENCES--table-name--+-----------------------+------------> | .-,-----------. | | V | | ’-(----column-name-+--)-’ >--| rule-clause |--| constraint-attributes |-------------------| rule-clause: .-ON DELETE NO ACTION-----. .-ON UPDATE NO ACTION-. |--*--+-------------------------+--*--+---------------------+--*--| ’-ON DELETE--+-RESTRICT-+-’ ’-ON UPDATE RESTRICT--’ +-CASCADE--+ ’-SET NULL-’ • Besteht ein Fremdschlüssel nur aus einem Attribut, so kann dies direkt bei der Attributdefinition angegeben werden (siehe column-constraints). • Der Benutzer muß das REFERENCES–Recht auf der referenzierten Tabelle (mindestens auf den referenzierten Attributen) oder ein übergeordnetes Recht (wie CONTROL) auf dieser Tabelle, das DBADM–Recht oder die Berechtigungsstufe SYSADM besitzen. • Die Attribute (der zu definierenden Tabelle), deren Namen hinter dem Schlüsselwort FOREIGN KEY angegeben werden, verweisen als Fremdschlüssel auf die angegebenen Attribute der Tabelle table-name. • Die Tabelle table-name muß eine Basistabelle (mit CREATE TABLE erzeugt) sein. • Die angegebenen Attribute der Tabelle table-name müssen dort als (Primär– oder Sekundär–) Schlüssel definiert sein; nicht notwendigerweise in der angegebenen Reihenfolge. • Der Fremdschlüssel muß genau dieselbe Anzahl von Attributen wie der referenzierte Schlüssel besitzen. Attribute, die jeweils an derselben Stelle stehen, müssen kompatibel sein. Kein Attribut darf mehrfach auftreten. • Wird die Attributliste der referenzierten Tabelle table-name in der references-clause weggelassen, so muß diese einen Primärschlüssel besitzen. Anstelle der Attributliste wird dann die Attributliste dieses Schlüssels in der dort definierten Reihenfolge verwendet. 6 Tabellen 50 • In der rule-clause kann angegeben werden, ob und wie das DBMS auf das Löschen bzw. Ändern von Zeilen, auf die die Tabelle verweist, reagieren soll (Lösch– und Änderungsregeln). 6.2.4 Lösch– und Änderungsregeln Man kann hinter einer references-clause (die eine Fremdschlüsselbeziehung beschreibt) in der rule-clause angeben, wie verfahren werden soll, wenn in der in der references-clause als table-name angegebenen (Vater–)Tabelle T1 Tupel gelöscht (ON DELETE) oder geändert (ON UPDATE) werden sollen, die von Tupeln in dieser Tabelle T2 referenziert werden. Beim Löschen eines Tupels in T1, das in T2 noch referenziert wird, sind folgende Verfahren möglich: Option ON DELETE . . . NO ACTION RESTRICT CASCADE SET NULL Auswirkungen/Reaktion kein Tupel in T1 oder T2 wird gelöscht, Fehlermeldung wird ausgegeben bis auf sehr spezielle Ausnahmen dasselbe Tupel in T1 wird gelöscht, verweisende Tupel in T2 ebenfalls Tupel in T1 wird gelöscht, in den verweisenden Tupeln in T2 werden die Attribute des Fremdschlüssels auf NULL gesetzt, sofern möglich Wird zu einer Fremdschlüsselbeziehung keine Löschregel angegeben, so wird NO ACTION angenommen. Beim Ändern von Schlüsselattributen eines Tupels in T1 sind folgende Verfahren möglich: Option ON UPDATE . . . RESTRICT NO ACTION Auswirkungen/Reaktion Stimmt ein Tupel in T2 auf den Fremdschlüsselattributen mit den zu ändernden Attributwerten des Schlüssels in T1 überein, so wird die Operation zurückgewiesen, und alle Änderungen werden rückgängig gemacht Gibt es zu irgendeinem Tupel in T2 nach der Änderung in T1 kein auf den Fremdschlüsselattributen übereinstimmendes Tupel in T1, so wird die Operation zurückgewiesen, und alle Änderungen werden rückgängig gemacht Wird zu einer Fremdschlüsselbeziehung keine Änderungsregel angegeben, so wird NO ACTION angenommen. 6.2.5 Allgemeine Integritätsbedingungen Mittels sog. Check Constraints können allgemeine Integritätsbedingungen für Attributwerte formuliert werden: check-constraint: |--+-----------------------------+------------------------------> ’-CONSTRAINT--constraint-name-’ >--CHECK--(--check-condition--)--| constraint-attributes |------| 6 Tabellen 51 constraint-attributes: .-ENFORCED-----. .-ENABLE QUERY OPTIMIZATION--. |--*--+--------------+--*--+----------------------------+--*----| ’-NOT ENFORCED-’ ’-DISABLE QUERY OPTIMIZATION-’ • Die check-condition ist eine spezielle Suchbedingung: – Sie darf sich nur auf die Attribute der anzulegenden Tabelle beziehen. – Sie darf keine Subqueries, Aggregatfunktionen, benutzerdefinierte Funktionen oder Registerwerte enthalten. • Eine Check Constraint kann Teil einer Attributdefinition (siehe column-constraint) sein. Dann darf sich die check-condition nur auf dieses Attribut beziehen. • Check Constraints werden nicht auf Konsistenz geprüft. Es ist also möglich, eine Bedingung mehrfach bzw. widersprüchliche Bedingungen zu definieren. • Die Check Constraints werden überprüft, wenn Zeilen eingefügt oder verändert werden. • Eine Check Constraint gilt für eine bestimmte Zeile als erfüllt, wenn die check-condition für diese Zeile wahr oder unknown ist. • Die constraint-attributes geben an, ob das DBMS die Gültigkeit der Constraint überwachen soll [oder nicht] und ob die Constraint zur Anfrageoptimierung genutzt werden darf. 6.3 Verwalten von Tabellenberechtigungen 6.3.1 Erteilen von Tabellenberechtigungen Tabellenberechtigungen werden mit dem GRANT–Statement erteilt: .-PRIVILEGES-. >>-GRANT--+-ALL--+------------+---------------------------+-----> | .-,-----------------------------------------. | | V | | ’---+-ALTER---------------------------------+-+-’ +-CONTROL-------------------------------+ +-DELETE--------------------------------+ +-INDEX---------------------------------+ +-INSERT--------------------------------+ +-REFERENCES--+-----------------------+-+ | | .-,-----------. | | | | V | | | | ’-(----column-name-+--)-’ | +-SELECT--------------------------------+ ’-UPDATE--+-----------------------+-----’ | .-,-----------. | | V | | ’-(----column-name-+--)-’ .-TABLE-. >--ON--+-------+--+-table-name-----+----------------------------> 6 Tabellen 52 ’-view-name------’ .-,---------------------------------. V | >--TO----+-+-------+--authorization-name-+-+--------------------> | +-USER--+ | | ’-GROUP-’ | ’-PUBLIC------------------------’ >--+-------------------+--------------------------------------->< ’-WITH GRANT OPTION-’ • Das Statement ist sowohl auf Sichten (s. u.) als auch auf Basistabellen anwendbar. • Um ein solches GRANT–Statement abzusetzen, muß man die entsprechenden Berechtigungen besitzen und mit WITH GRANT OPTION erhalten haben (weitergeben dürfen), oder das CONTROL–Recht auf der Tabelle besitzen oder über das DBADM–Recht oder die Berechtigungsstufe SYSADM verfügen. • Um das CONTROL–Recht einer Tabelle/Sicht weiterzugeben, ist das DBADM–Recht oder die Berechtigungsstufe SYSADM nötig. • Der Zusatz WITH GRANT OPTION bewirkt, daß der/die mit authorization-name bezeichnete(n) Benutzer die erhaltenen Rechte an dritte weitergeben darf/dürfen. Erklärung der einzelnen Tabellenberechtigungen: Berechtigung ALL ALTER CONTROL DELETE INDEX INSERT REFERENCES SELECT UPDATE REFERENCES (L) UPDATE (L) Erklärung Alle Rechte außer CONTROL Ändern der Tabellendefinition (Neue Attribute, Trigger, Anlegen/Löschen von Primär– und Fremdschlüsseln, Check Constraints, Anlegen/Ändern des Kommentars) Alle Rechte; Weitergabe von Rechten (außer CONTROL); Löschen der Tabelle Löschen von Tupeln Anlegen von Indexen Einfügen von Tupeln Anlegen von Fremdschlüsselbeziehungen auf alle Attribute Zugriff auf Tupel; Anlegen von Sichten; Benutzung von EXPORT Ändern aller Attributwerte Anlegen von Fremdschlüsselbeziehungen auf die aufgeführten Attribute Ändern der Werte der aufgeführten Attribute Die Berechtigungen ALTER, INDEX und REFERENCES sind auf Sichten nicht anwendbar. 6.3.2 Entziehen von Tabellenberechtigungen Tabellenberechtigungen werden mit dem REVOKE–Statement entzogen: .-PRIVILEGES-. .-TABLE-. >>-REVOKE--+-ALL--+------------+-+--ON--+-------+---------------> | .-,--------------. | | V | | ’---+-ALTER------+-+--’ +-CONTROL----+ 6 Tabellen 53 +-DELETE-----+ +-INDEX------+ +-INSERT-----+ +-REFERENCES-+ +-SELECT-----+ ’-UPDATE-----’ >--+-table-name-+-----------------------------------------------> ’-view-name--’ .-,---------------------------------. V | .-BY ALL-. >--FROM----+-+-------+--authorization-name-+-+--+--------+----->< | +-USER--+ | | ’-GROUP-’ | ’-PUBLIC------------------------’ • Zum Entziehen von Rechten ist das CONTROL–Recht auf der Tabelle, bzw. das DBADM–Recht oder die Berechtigungsstufe SYSADM nötig. • Zum Entziehen des CONTROL–Rechtes und zum Entziehen von Rechten auf den Systemtabellen (s. u.) ist das DBADM–Recht oder die Berechtigungsstufe SYSADM nötig. 6.4 Beispiele CREATE TABLE EMPLOYEE (ID SMALLINT NOT NULL, NAME VARCHAR(9), DEPT SMALLINT CHECK (DEPT BETWEEN 10 AND 100), JOB CHAR(5) CHECK (JOB IN (’Sales’,’Mgr’,’Clerk’)), HIREDATE DATE, SALARY DECIMAL(7,2), PRIMARY KEY (ID), CONSTRAINT YEARSAL CHECK (YEAR(HIREDATE) >1986 OR SALARY > 40500) ) CREATE TABLE EMP_ACT (EMPNO CHAR(6) NOT NULL, PROJNO CHAR(6) NOT NULL, ACTNO SMALLINT NOT NULL, EMPTIME DECIMAL(5,2), EMENDATE DATE, CONSTRAINT EMP_ACT_UNIQ UNIQUE (EMPNO,PROJNO,ACTNO), CONSTRAINT FK_ACT_PROJ FOREIGN KEY (PROJNO) REFERENCES PROJECT (PROJNO) ) CREATE TABLE DEPT (DEPTNO SMALLINT NOT NULL GENERATED ALWAYS AS IDENTITY (START WITH 500 INCREMENT BY 1), 6 Tabellen 54 DEPTNAME VARCHAR(36) NOT NULL, MGRNO CHAR(6), ADMRDEPT SMALLINT NOT NULL, LOCATION CHAR(30) ) CREATE TABLE DEPT2 LIKE DEPT GRANT UPDATE (dept), REFERENCES ON TABLE employee TO USER karl REVOKE ALL ON TABLE employee FROM PUBLIC 6.5 Löschen von Tabellen Um eine Tabelle zu löschen, benötigt man eines der folgenden Rechte oder die Berechtigungsstufe SYSADM: • das CONTROL–Recht für die Tabelle • das DROPIN–Recht im Schema, das die Tabelle enthält • das DBADM–Recht Löschen einer Tabelle mit dem DROP–Statement: >>---DROP----TABLE----table-name------------------------>< Wird eine Tabelle gelöscht, so werden in allen Tabellen, die diese Tabelle referenzieren, die zugehörigen Fremdschlüsselbeziehungen gelöscht (Löschregeln werden dabei nicht ausgeführt). Alle Indexe, die auf der Tabelle bestehen, werden gelöscht. 6.6 Verändern von Tabellendefinitionen Man kann zu bzw. in einer Basistabelle nachträglich • Attribute hinzufügen, • Integritätsbedingungen (Schlüssel, Check Constraints oder Fremdschlüsselbeziehungen) löschen oder hinzufügen, • einige Einstellungen der Tabelle ändern, • die Länge von Attributen vom Typ VARCHAR vergrößern oder • die generation-expression von Attributen mit automatisch generierten Attributwerten verändern. Insbesondere können keine Attribute entfernt werden. Zum Ändern einer Tabellendefinition sind folgende Rechte nötig: • Das ALTER– oder CONTROL–Recht an der zu ändernden Tabelle oder das ALTERIN–Recht für das Schema, in dem die zu ändernde Tabelle liegt, das DBADM–Recht oder die Berechtigungsstufe SYSADM. 6 Tabellen 55 • Um eine Fremdschlüsselbeziehung anzulegen oder zu löschen, muß zusätzlich für die referenzierte Tabelle eines der folgenden Rechte vorliegen: REFERENCES (mind. für die referenzierten Attribute), CONTROL, DBADM oder die Berechtigungsstufe SYSADM. • Wird eine Schlüsselbedingung gelöscht, so muß für alle Tabellen, die die zugehörigen Attribute referenzieren, das ALTER– oder CONTROL–Recht oder das ALTERIN–Recht im Schema, das DBADM–Recht oder die Berechtigungsstufe SYSADM vorliegen, weil dort die entsprechenden Fremdschlüsselbedingungen gelöscht werden. Verändern von Tabellendefinitionen mit dem ALTER TABLE–Statement: >>-ALTER TABLE--table-name--------------------------------------> .--------------------------------------------------------------------. V .-COLUMN-. | >---+-ADD--+-+--------+--| column-definition |-+----------------------+-+->< | +-| unique-constraint |-------------+ | | +-| referential-constraint |--------+ | | +-| check-constraint |--------------+ | | ’-RESTRICT ON DROP------------------’ | +-ALTER-+-FOREIGN KEY-+-constraint-name-| constraint-alteration |-+ | ’-CHECK-------’ | | .-COLUMN-. | +-ALTER--+--------+--| column-alteration |------------------------+ +-DROP--+-PRIMARY KEY----------------------+----------------------+ | +-+-FOREIGN KEY-+--constraint-name-+ | | | +-UNIQUE------+ | | | | +-CHECK-------+ | | | | ’-CONSTRAINT--’ | | | ’-RESTRICT ON DROP-----------------’ | +-LOCKSIZE--+-ROW---+---------------------------------------------+ | ’-TABLE-’ | +-APPEND--+-ON--+-------------------------------------------------+ | ’-OFF-’ | | .-CARDINALITY-. | +-+-VOLATILE-----+--+-------------+-------------------------------+ | ’-NOT VOLATILE-’ | ’-+-ACTIVATE---+--VALUE COMPRESSION-------------------------------’ ’-DEACTIVATE-’ constraint-alteration: .-------------------------------------. V | |-----------+-+-ENABLE--+--QUERY OPTIMIZATION-+-+---------------| | ’-DISABLE-’ | ’-+-----+--ENFORCED---------------’ ’-NOT-’ column-alteration: |--column-name---------------------------------------------------> >--+-SET--+-DATA TYPE--+-VARCHAR-----------+--(--integer--)-+-+--| | | +-CHARACTER VARYING-+ | | | | ’-CHAR VARYING------’ | | 6 Tabellen 56 | ’-EXPRESSION AS--(--generation-expression--)------’ | +-COMPRESS--+-SYSTEM DEFAULT-+-----------------------------+ | ’-OFF------------’ | ’-| identity-alteration |----------------------------------’ identity-alteration: .-----------------------------------------. V | |-----------+-SET INCREMENT BY--numeric-constant--+-+-----------| +-SET--+-NO MINVALUE----------------+-+ | ’-MINVALUE--numeric-constant-’ | +-SET--+-NO MAXVALUE----------------+-+ | ’-MAXVALUE--numeric-constant-’ | +-SET--+-NO CYCLE-+-------------------+ | ’-CYCLE----’ | +-SET--+-NO CACHE----------------+----+ | ’-CACHE--integer-constant-’ | +-SET--+-NO ORDER-+-------------------+ | ’-ORDER----’ | ’-RESTART--+------------------------+-’ ’-WITH--numeric-constant-’ • Mit der DROP–Klausel können nur benannte Constraints gelöscht werden. Insbesondere können Constraints, die direkt bei einer Attributdefinition angegeben wurden, nicht gelöscht werden. Daraus folgt, daß man am besten alle Arten von Constraints unabhängig von den Attributen definiert und ihnen einen Namen gibt, um sie später (leichter) ändern zu können. • Bei der Verwendung der ADD–Klausel gelten dieselben Regeln wie bei den entsprechenden Klauseln des CREATE TABLE–Statements. • Wird eine Schlüsselbedingung hinzugefügt, so prüft das DBMS, ob bereits ein Index existiert, der dazu verwendet oder entsprechend geändert werden kann. Ist dies nicht der Fall, so wird ein neuer Index angelegt. • Die ADD COLUMN–Klauseln werden immer zuerst ausgeführt. • Via ADD RESTRICT ON DROP kann verhindert werden, daß die Tabelle oder der Tabellenbereich, in dem sie sich befindet, gelöscht werden kann. • Die ALTER–Klausel mit column-alteration kann auf Attribute vom Typ VARCHAR angewendet werden, wobei die angegebene Zahl die neue Größe festlegt, die größer sein muß als der aktuelle Wert. Außerdem kann damit auch die generation-expression für Attribute mit automatisch generierten Attributwerten geändert werden. • Werden Schlüsselbedingungen gelöscht, so hat dies Auswirkungen auf die zugehörigen Indexe (diese werden evtl. gelöscht) und Referenzen (Fremdschlüsselbeziehungen in anderen Tabellen, die solche Schlüssel referenzieren, werden gelöscht). • Wird eine Integritätsbedingung hinzugefügt, so werden die Daten der Tabelle sofort auf Einhaltung dieser Bedingung geprüft (falls nicht gerade die Prüfung aller Constraints abgeschaltet ist – siehe SET INTEGRITY). Erfüllen die Daten dabei die angegebene Bedingung nicht, so meldet das DBMS einen Fehler. • Die Bedeutung der Optionen bei constraint-alteration un identity-alteration ist dieselbe wie bei den ensprechenden Klauseln beim CREATE TABLE–Statement (siehe constraint-attributes und identity-attributes). Mittels RESTART WITH kann eine Sequenz neu gestartet werden. Als neuer 6 Tabellen 57 Startwert wird der angegebene Wert numeric-constant oder, falls keiner angegeben wurde, der ursprüngliche Startwert verwendet. • Mittels DROP RESTRICT ON DROP wird bei einer Tabelle, die nicht gelöscht werden darf, dieses Verbot zurückgenommen. • Über APPEND kann man bestimmen, ob neue Tupel stets am Ende der Tabelle eingefügt werden (ON) oder ob sie auch den Platz gelöschter Tupel einnehmen können (OFF). Letzteres ist die Standardeinstellung nach dem Anlegen der Tabelle. • Mithilfe der VOLATILE–Klausel kann man (zu Optimierungszwecken) angeben, ob die Anzahl der Tupel in der Tabelle stark schwankt oder nicht. • Mittels LOCKSIZE kann die Granularität von Sperren (siehe später) auf dieser Tabelle bestimmt werden: – ROW bedeutet tupelweises Sperren und ist die Defaulteinstellung dieser Option. – TABLE bedeutet, daß immer die ganze Tabelle gesperrt wird. Dies ist der Performanz zu–, der Nebenläufigkeit jedoch abträglich. • Mithilfe der VALUE COMPRESSION–Klausel kann die platzsparende Speicherung von NULL–Werten oder Werten der Länge 0 (vgl. CREATE TABLE–Statement) an– (ACTIVATE) oder abgeschaltet werden (DEACTIVATE). • Mit der COMPRESS–Klausel kann die effizientere Speicherung (vgl. CREATE TABLE–Statement) von Defaultwerten an– (SYSTEM DEFAULT) oder abgeschaltet werden (OFF). Beispiel: ALTER TABLE employee ALTER name SET DATA TYPE VARCHAR (20) ADD married CHAR(1) DROP CONSTRAINT yearsal 6.7 Sequenzen Sequenzen bieten die Möglichkeit, vom DBMS fortlaufende ganzahlige Werte generieren zu lassen. Sie arbeiten analog zu der Werterzeugung in IDENTITY–Spalten, können jedoch nicht für die automatische Attributwerterzeugung, sondern allgemein in Ausdrücken verwendet werden. 6.7.1 Anlegen von Sequenzen Anlegen einer Sequenz mit dem CREATE SEQUENCE–Statement: .-AS INTEGER----. >>-CREATE SEQUENCE--sequence-name--*--+---------------+--*------> ’-AS--data-type-’ >--+------------------------------+--*--------------------------> ’-START WITH--numeric-constant-’ .-INCREMENT BY 1-----------------. >--+--------------------------------+--*------------------------> ’-INCREMENT BY--numeric-constant-’ 6 Tabellen 58 .-NO MINVALUE----------------. >--+----------------------------+--*----------------------------> ’-MINVALUE--numeric-constant-’ .-NO MAXVALUE----------------. .-NO CYCLE-. >--+----------------------------+--*--+----------+--*-----------> ’-MAXVALUE--numeric-constant-’ ’-CYCLE----’ .-CACHE 20----------------. .-NO ORDER-. >--+-------------------------+--*--+----------+--*------------->< +-CACHE--integer-constant-+ ’-ORDER----’ ’-NO CACHE----------------’ • Es wird eine Sequenz mit dem Namen sequence-name angelegt. • Zum Anlegen einer Sequenz ist mindestens das CREATEIN–Recht im jeweiligen Schema nötig. • Der Erzeuger (DEFINER) einer Sequenz erhält das ALTER– und USAGE–Recht auf dieser Sequenz. • data-type gibt den Datentyp an, den die Werte dieser Sequenz besitzen. Folgende Datentypen sind möglich: SMALLINT, INTEGER, BIGINT, DECIMAL (ohne Nachkommastellen), sowie benutzerdefinierte spezialisierte Typen oder Referenztypen, deren Basistyp ein ganzahliger Typ ist. Der Default ist INTEGER. Die weiteren Optionen bewirken dasselbe wie bei IDENTITY–Attributen (siehe Abschnitt 6.2.2). 6.7.2 Löschen und Ändern von Sequenzen Löschen einer Sequenz mit dem DROP SEQUENCE–Statement: .-RESTRICT-. >>-DROP---SEQUENCE--sequence-name--+----------+---------------->< • Man muß entweder das DROPIN–Recht im jeweiligen Schema besitzen oder Erzeuger der Sequenz sein. • Die Sequenz sequence-name wird gelöscht. • Wird die Sequenz noch innerhalb eines Triggers, einer S QL–Funktion oder einer S QL–Methode in einem NEXT VALUE– oder PREVIOUS VALUE–Ausdruck verwendet, so kann die Sequenz nicht gelöscht werden. • Sequenzen, die vom System für ein IDENTITY–Attribut angelegt wurden, können nicht explizit gelöscht werden. Ändern einer Sequenz mit dem ALTER SEQUENCE–Statement: >>-ALTER SEQUENCE--sequence-name--------------------------------> .------------------------------------------------. V | >-----------+-RESTART--+------------------------+-+-+---------->< | ’-WITH--numeric-constant-’ | +-INCREMENT BY--numeric-constant------+ +-+-MINVALUE--numeric-constant-+------+ | ’-NO MINVALUE----------------’ | +-+-MAXVALUE--numeric-constant-+------+ 6 Tabellen 59 | ’-NO MAXVALUE----------------’ | +-+-CYCLE----+------------------------+ | ’-NO CYCLE-’ | +-+-CACHE--integer-constant-+---------+ | ’-NO CACHE----------------’ | ’-+-ORDER----+------------------------’ ’-NO ORDER-’ • Dabei darf jede Klausel höchstens einmal verwendet werden. • Man muß Erzeuger der Sequenz sein oder mindestens das ALTERIN–Recht im jeweiligen Schema besitzen. • Die einzelnen Klauseln besitzen dieselbe Bedeutung wie beim CREATE TABLE–Statement und sind in Abschnitt 6.2.2 beschrieben. • Das Ändern einer Sequenz hat keine Wirkung auf Werte, die bereits verwendet wurden. 6.7.3 Rechtevergabe bei Sequenzen Erteilen der Rechte auf einer Sequenz mit dem GRANT–Statement: >>-GRANT--USAGE--ON SEQUENCE--sequence-name--TO--PUBLIC-------->< • Das Recht zur Benutzung der Sequenz in Ausdücken (USAGE) kann nur an PUBLIC weitergegeben werden. • Man muß DEFINER der Sequenz sein, oder höherwertige Rechte besizten. Die Rechte auf einer Sequenz können nicht widerufen werden. 6.7.4 Verwendung von Sequenzen Auslesen von Werten aus einer Sequenz mit einem Sequenz–Referenz–Ausdruck (sequence-reference): sequence-reference: |--+-| nextval-expression |-+-----------------------------------| ’-| prevval-expression |-’ nextval-expression: |--NEXT VALUE FOR--sequence-name--------------------------------| prevval-expression: |--PREVIOUS VALUE FOR--sequence-name----------------------------| • Die Sequenz sequence-name wird referenziert. • Bei NEXT VALUE FOR wird ein neuer Wert der Sequenz berechnet, und dieser wird als Ergebnis des Ausdrucks zurückgegeben. • Bei PREVIOUS VALUE FOR wird der letzte in derselben Applikation generierte Wert der Sequenz zurückgegeben. Insbesondere bedeutet das, daß in der Applikation vorher NEXT VALUE FOR benutzt worden sein muß. 6 Tabellen 60 • Bei mehrmaliger Verwendung des PREVIOUS VALUE FOR–Ausdrucks in einem Statement ergeben alle diese Ausdrücke denselben Wert. • NEXT VALUE FOR– oder PREVIOUS VALUE FOR–Ausdrücke dürfen nur an den folgenden Stellen verwendet werden: – In der SELECT–Klausel eines Select–Statements oder eines SELECT INTO–Statements, wenn dieses kein DISTINCT, GROUP BY, ORDER BY, UNION, INTERSECT oder EXCEPT enthält, – in der VALUES– oder der SELECT–Klausel eines INSERT–Statements, – In der SET–Klausel eines UPDATE–Statements mit Ausnahme einer SELECT–Klausel eines Fullselect in einem Ausdruck dieser SET–Klausel, – in einem SET–Statement für Variablen (mit Ausnahme der SELECT–Klausel eines Fullselect in einem Ausdruck; in einem Trigger darf nur NEXT VALUE, nicht aber PREVIOUS VALUE benutzt werden), – in einem VALUES INTO–Statement (mit Ausnahme der SELECT–Klausel eines Fullselect in einem Ausdruck), – im Rumpf eines CREATE PROCEDURE–Statements oder – in der triggered-action innerhalb eines CREATE TRIGGER–Statements (hier darf nur NEXT VALUE verwendet werden). • NEXT VALUE FOR– oder PREVIOUS VALUE FOR–Ausdrücke dürfen an den folgenden Stellen nicht verwendet werden: – In der Joinbedingung eines FULL OUTER Joins, – als Defaultwert eines Attributs in einem CREATE TABLE– oder einem ALTER TABLE–Statements, – in einer automatisch generierten Spalte in einem CREATE TABLE– oder einem ALTER TABLE–Statement, – in der Bedingung einer CHECK–Constraint, – in einem CREATE TRIGGER–Statement (NEXT VALUE darf hier verwendet werden) oder – in einem CREATE VIEW–, CREATE METHOD– oder CREATE FUNCTION–Statement. • Ein NEXT VALUE–Ausdruck darf an den folgenden Stellen nicht auftreten: – In einem CASE–Ausdruck, – in der Parameterliste einer Aggregatfunktion, – in einer Subquery in einem anderen Kontext als oben explizit erlaubt, – in einem Select–Statement, das im äußersten SELECT ein DISTINCT, GROUP BY, UNION, INTERSECT oder EXCEPT enthält, – in einer (verschachtelten) Tabellendefinition innerhalb einer FROM–Klausel, – in der Parameterliste einer Funktion, – in der WHERE–Klausel des äußersten Select–Statements, eines DELETE– oder UPDATE–Statements, – in der ORDER BY–Klausel des äußersten Select–Statements, – in der SELECT–Klausel des Fullselects eines Ausdrucks in der SET–Klausel eines UPDATE–Statements oder 6 Tabellen – in einem IF–, WHILE–, DO ... thode oder Funktion). 61 UNTIL– oder CASE–Statement in einer S QL–Routine (Prozedur, Me- • Falls ein Statement fehlschlägt, wird ein generierter Wert trotzdem als verbraucht betrachtet. Es gelten noch weitere Einschränkungen, die im Manual dokumentiert sind. Beispiele: -- Anlegen einer Sequenz CREATE SEQUENCE order_seq START WITH 1 INCREMENT BY 1 NO MAXVALUE NO CYCLE CACHE 24 -- Verwundung von Werten einer Sequenz beim Einfuegen INSERT INTO order(orderno, custno) VALUES (NEXT VALUE FOR order_seq, 123456); -- Verwundung von Werten einer Sequenz beim Aendern UPDATE order SET orderno = NEXT VALUE FOR order_seq WHERE custno = 123456; -- Auslesen von Werten einer Sequenz VALUES (NEXT VALUE FOR order_seq)