CREATE TABLE SPEND_STAT ( S_STATUS VARCHAR2(1), STAT_TXT VARCHAR2(15), PRIMARY KEY (S_STATUS) ENABLE ); 3.3. Implementierung in SQL DDL-Grundlagen Constraint-Verzögerung Implementierungs-Strategien DDL: Data Definition Language • Untermenge von SQL • Manipulation des Data Dictionary: – Tabellendefinition und –änderung CREATE TABLE, ALTER TABLE, DROP TABLE – Sichtendefinition und –änderung CREATE VIEW, ALTER VIEW, DROP VIEW – Definition und Änderung von Integritätsbedingungen (werden Tabellen zugeordnet) (c) schmiedecke 06 DbMz 8 - Implementierung 2 Tabellendefinition create table <tabname> (<spalte1> <datentyp> …, <spalte n><datentyp> ); Datentypen (Oracle-spezifisch) in Auswahl CHAR(length) Zeichenkette fester Länge VARCHAR2(length) Z. variabler Länge NUMBER(precision, scale) Gleitpunktzahl mit pr, Stellen und sc. Nachkommastellen INT Ganzzahl bis 38 Stellen DATE Zeitangabe Jahr - Sekunde CLOB, BLOB Character oder Binary Large Object BFILE Zeiger auf eine externe Datei (c) schmiedecke 06 DbMz 8 - Implementierung 3 Tabelle ändern oder löschen Spalte hinzufügen: alter table <tabname> add <spalte n+1> <datentyp>; Spaltentyp ändern: alter table <tabname> modify <spalte m> <datentyp>; Spalte entfernen: alter table <tabname> drop column <spalte m>; Tabelle löschen: drop table <tabname>; Tabelle umbenennen: rename <tabname> to <tabname-neu>; (c) schmiedecke 06 DbMz 8 - Implementierung 4 Schlüsseldefinition Primärschlüsseldefinition: create table <tabname> (<spalte1> <datentyp> ) [ [ constraint <constrname> ] primary key ], …, <spalte n> …. create table <tabname> create table <tabname> (<spalte1> <datentyp>, ..., <spalten><datenty>) [ [ constraint <constrname> ] primary key(<spalte1>,…,<spalte m>) ]; (c) schmiedecke 06 DbMz 8 - Implementierung 5 Schlüsseldefintion Fremdschlüsseldefinition ]; create table <tabname> (<spalte1> <datentyp> [ [ constraint <constrname> ] references <tabname> [<spalte>] ] , …, <spalte n> …. [ [constraint <constrname>] foreign key (<spalte1>,…,<spalte m>) references <tabname> [(<spalte1>,…<spalte m>)] (c) schmiedecke 06 DbMz 8 - Implementierung 6 Weitere Integritätsbedingungen (Constraints) Constraints: primary key foreign key check not null unique Constraint hinzufügen: alter table <tabname> add constraint [<constraint-name>] constraint Constraints ändern: ...drop constraint <constraint-name> disable constraint <constraint-name> enable constraint <constraint-name> (c) schmiedecke 06 DbMz 8 - Implementierung 7 Inkonsistente Zwischenzustände • Referentielle Integrität gefährdet bei: – INSERT: Eintrag eines "Kindes" vor dem "Vater" unzulässig – UPDATE: Ändern eines Primärschlüssels macht Referenzen ungültig – DELETE: Löschen des "Vaters" hinterlässt "Waisen" • Inkonsistente Zwischenzustände nicht immer vermeidbar: – Existenzabhängigkeit fordert "not null"-Fremdschlüssel – Was wird bei einer Spende zuerst eingetragen, der Spender oder die Konserve? – Problem auch bei abgeleiteten Attributen Spender (c) schmiedecke 06 (1,*) (1,1) Konserve DbMz 8 - Implementierung 8 Umgang mit inkonsistenten Zwischenzuständen • Spezifizierte "referentielle Aktionen" der DB: – Restriktives Vorgehen – automatische Anpassung • Verzögerte Bedingungsprüfung: – um inkonsistente Zwischenzustände zu "überbrücken" (c) schmiedecke 06 DbMz 8 - Implementierung 9 Referentielle Aktionen NO ACTION – Operation wird grundsätzlich zurückgewiesen RESTRICT (nicht in Oracle) – Ausführung nur, wenn keine tatsächlichen Referenzen vorhanden CASCADE – Änderung wird in die referenzierenden Datensätze übernommen SET NULL / SET DEFAULT (nicht in Oracle/MySQL) – referenzierender Fremdschlüssel wird auf null / Standardwert gesetzt (c) schmiedecke 06 DbMz 8 - Implementierung 10 Spezifikation referentieller Aktionen • Spezifikation erfolgt bei der FS-Definition on delete | update referentielleAktion create table spender (s_id number(6) primary key, erstspende number(6) not null, foreign key (erstspende) references konserve on delete set 999999 -- erfordert unlöschbaren Datensatz 999999 in konserve ); (So weder in MySQL noch in Oracle umsetzbar – nur NULL-Setzen möglich) (c) schmiedecke 06 DbMz 8 - Implementierung 11 Verzögerte Constraints-Prüfung Verzögerte Constraint-Prüfung (nicht in MySQL): – bedeutet, dass die Integritätsbedingung immer erst am Ende einer Transaktion (commit) geprüft wird. – muss bei der Constraint-Definition vorgesehen werden – ggf. Constraint löschen und neu defineren Verzögerte Constraint-Prüfung definieren: constraint <constraint-name> constraint deferrable [initially immediate | deferred] Verzögerung an/abschalten bezüglich der aktuellen Transaktion / Sitzung (ab Oracle 10g): set constraints <constraint-name>,…,<constraint-name> deferred; set constraints ALL immediate; (c) schmiedecke 06 DbMz 8 - Implementierung 12 Constraints deaktivieren • Constraints können beliebig ein- und ausgeschaltet werden (nur einzeln, nicht MySQL): alter table table { enable | disable } constraint <constraint-name>; • In MySQL kann die Überprüfung der referentiellen Integrität global an- und ausgeschaltet werden: set foreign_key_checks = 0; # ausschalten set foreign_key_checks = 1; # einschalten (c) schmiedecke 06 DbMz 8 - Implementierung 13 Einblick ins Data Dictionary (in Oracle) • Alle DDL-Befehle wirken aufs Data Dictionary • Dieses befindet sich in den Tabellen: – user_tabs – user_tab_columns – user_constraints • Lesen üben: Schreibe das DB-Schema aus dem DD ab! (c) schmiedecke 06 DbMz 8 - Implementierung 14 Einblick ins Data Dictionary • Tabellendefinitionen und aktueller Status nicht mehr trivial • Grundforderung: DD im DBMS mit gespeichert und mithilfe der Datenbanksprache abfragbar • Wie heißen die Tabellen des DD? (c) schmiedecke 06 DbMz 8 - Implementierung 15 DD-Views in Oracle Präfix: ALL_ / USER_ • • • • • • • • • USER_TABLES USER_TAB_COLUMNS USER_TAB_COMMENTS USER_COL_COMMENTS USER_CONSTRAINTS USER_DEPENDENCIES USER_INDEXES USER_ROLE_PRIVS USER_FREE_SPACE (c) schmiedecke 06 DbMz 8 - Implementierung 16 Benutzung • SELECT * FROM USER_TAB_COLS WHERE TAB_NAME = 'Spender'; • DESCRIBE TABLE 'Spender'; • SELECT Constraint_Name, Status, Deferrable FROM USER_CONSTRAINTS; (c) schmiedecke 06 DbMz 8 - Implementierung 17 DD-Ansichten in MySQL SHOW-Befehl SHOW [FULL] COLUMNS FROM tbl_name [FROM db_name] [LIKE 'pattern'] SHOW CREATE DATABASE db_name SHOW CREATE TABLE tbl_name SHOW DATABASES [LIKE 'pattern'] SHOW ENGINE engine_name {LOGS | STATUS } SHOW GRANTS FOR user SHOW INDEX FROM tbl_name [FROM db_name] SHOW [OPEN] TABLES [FROM db_name] [LIKE 'pattern'] SHOW TRIGGERS SHOW [GLOBAL | SESSION] VARIABLES [LIKE 'pattern'] (c) schmiedecke 06 DbMz 8 - Implementierung 18 Implementierungs-Strategien • Maßnahmen zum "unkomplizierten" Implementieren eines DB-Schemas: – Zuerst alle Tabellen definieren. – Danach alle Fremdschlüssel definieren – (in einem Script: ganz zuerst alle Tabellen löschen wiederholbare Ausführung) • Oder: – zuerst alle Fremdschlüssel deaktivieren am Schluss alle aktivieren (c) schmiedecke 06 DbMz 8 - Implementierung 19 Prototyp-Strategie • Maßnahme zum unkomplizierten Eintragen von Test-Datensätzen: – zuerst alle Constraints deaktivieren (disable) – nach dem Eintragen alle aktivieren (enable) (c) schmiedecke 06 DbMz 8 - Implementierung 20 (c) schmiedecke 06 DbMz 8 - Implementierung 21