21. Fehler und deren Beseitigung

Ziele

Einführung

Häufige Fehler

Logische Fehler

Probleme mit Daten vermeiden

Zusammenfassung

Fragen & Antworten

Workshop



Ziele

Willkommen zum einundzwanzigsten und letzten Tag dieses Kurses. Die heutige Lektion zeigt Ihnen ...



Einführung

Heute lernen Sie verschiedene Fehler kennen, die sowohl dem Einsteiger als auch dem Profi beim Einsatz von SQL unterlaufen können. Fehler lassen sich nie völlig vermeiden. Wenn man aber mit einem weiten Bereich von Fehlern vertraut ist, kann man sie in einer möglichst kurzen Zeit auflösen.


Die Beispiele arbeiten mit Personal Oracle8. Die angesprochenen Fehler können bei Ihrer konkreten Implementierung hinsichtlich Numerierung und Benennung abweichen. Die SQL-Anweisungen wurden mit SQL*Plus ausgeführt. Die Einstellungen ECHO und FEEDBACK sind auf ON gesetzt, damit die Anweisungen zu sehen sind.

Denken Sie daran, daß bestimmte Fehler unmittelbar zu Fehlermeldungen führen, während sich andere Fehler in der Logik verstecken und erst im weiteren Verlauf in Form ernsthafter Probleme zutage treten. Mit einem geübten Blick für das Detail lassen sich zwar viele Probleme vermeiden, trotzdem wird man immer wieder über Fehler stolpern.



Häufige Fehler

Dieser Abschnitt beschreibt häufige Fehler, die man bei der Ausführung aller Arten von SQL-Anweisungen erhält. Viele Fehler sind einfach zu erkennen, daß man sich wahrscheinlich nur ärgert, sie übersehen zu haben, während andere, scheinbar offensichtliche Fehler auf eine falsche Spur führen.



Tabelle oder View nicht vorhanden

Wenn eine Fehlermeldung darauf hinweist, daß die angesprochene Tabelle nicht existiert, scheint auf den ersten Blick alles klar zu sein. Dazu folgendes Beispiel:


SQL> @tables.sql


SQL> spool tables.lst
SQL> set echo on
SQL> set feedback on
SQL> set pagesize 1000
SQL> select owner|| '.' ||table_name
2 from sys.dba_table
3 where owner = 'SYSTEM'
4 order by table_name;
5 /
from sys.dba_table
*
FEHLER in Zeile 2:
ORA-00942: Tabelle oder View nicht vorhanden


Beachten Sie das Sternchen unter dba_table. Der korrekte Tabellenname lautet sys.dba_tables. Es wurde also ein s im Tabellennamen vergessen.

Was hat eine derartige Fehlermeldung aber zu bedeuten, wenn man genau weiß, daß die Tabelle existiert? In diesem Fall kann ein Sicherheitsproblem vorliegen - die Tabelle existiert zwar, aber man hat keinen Zugriff darauf. Der Datenbank-Server gibt uns damit höflich zu verstehen: »Sie haben keine Berechtigung, auf diese Tabelle zuzugreifen!«


Bevor sich bei Ihnen Panik breitmacht, sollten Sie umgehend prüfen, ob die Tabelle existiert oder nicht. Melden Sie sich - wenn möglich - mit einem DBA-Konto oder dem Schemakonto an. Oftmals stellt man fest, daß die Tabelle existiert und der Benutzer nicht die geeigneten Zugriffsprivilegien hat.


Benutzername oder Kennwort ungültig

SQL*Plus: Release 8.0.3.0.0 - Production on Di Dez 16 0:58:48 1997

(c) Copyright 1997 Oracle Corporation. All rights reserved.

Benutzernamen eingeben: rplew
Kennwort eingeben: *******


FEHLER:
ORA-01017: invalid username/password; logon denied

Benutzernamen eingeben:


Diese Fehlermeldung erscheint, wenn man entweder den falschen Benutzernamen oder das falsche Kennwort eingegeben hat. Geben Sie den Benutzernamen bzw. das Kennwort noch einmal ein. Falls der erneute Versuch scheitert, sollten Sie Ihr Kennwort zurücksetzen lassen. Wenn Sie sicher sind, daß Benutzername und Kennwort stimmen, dann vergewissern Sie sich, ob Sie sich überhaupt bei der richtigen Datenbank anmelden, falls Sie Zugriff auf mehrere Datenbanken haben.


Schlüsselwort FROM nicht angegeben

SQL> @tblspc.sql


SQL> spool tblspc.lst
SQL> set feedback on;
SQL> set pagesize 1000;
SQL> select substr(tablespace_name,1,15) a,
2 substrfile_name,1,45) c, bytes
3 from sys.dba_data_files
4 order by tablespace_name;
substrfile_name,1,45) c, bytes
*
FEHLER in Zeile 2:
ORA-00923: Schlüsselwort FROM nicht an erwarteter Stelle gefunden
SQL> spool off
SQL>


Dieser Fehler kann in die Irre führen. Das Schlüsselwort FROM ist vorhanden, es fehlt aber die linke Klammer zwischen substr und file_name auf Zeile 2. Dieser Fehler kann auch durch ein fehlendes Komma zwischen den Spaltennamen in der SELECT-Anweisung verursacht werden. Wenn in der SELECT-Anweisung nach einem Spaltennamen kein Komma folgt, sucht der Abfrageprozessor automatisch nach dem Schlüsselwort FROM. Die korrigierte Anweisung sieht wie folgt aus:

SQL> select substr(tablespace_name,1,15) a,
2 substr(file_name,1,45) c, bytes
3 from sys.dba_data_files
4 order by tablespace_name;



Gruppenfunktion nicht zulässig

SQL> select count(nachname), vorname, telefon
2 from mitarbeiter
3 group by count(nachname), vorname, telefon
4 /


group by count(nachname), vorname, telefon
*
FEHLER in Zeile 3:
ORA-00934: Gruppenfunktion ist hier nicht zulässig


Wie bei jeder Gruppenfunktion darf man COUNT nicht in der GROUP BY-Klausel verwenden. In der GROUP BY-Klausel lassen sich nur Spaltenfunktionen und nichtgruppierende Funktionen wie SUBSTR angeben.

Die Funktion COUNT wird auf Gruppen in der Abfrage ausgeführt.

Die korrigierte Anweisung mit der richtigen Syntax lautet:


SQL> select count(nachname), vorname, telefon
2 from mitarbeiter
3 group by nachname, vorname, telefon;



Spaltenname ungültig

SQL> @tables.sql


SQL> spool tables.lst
SQL> set echo on
SQL> set feedback on
SQL> set pagesize 1000
SQL> select owner|| '.' ||tablename
2 from sys.dba_tables
3 where owner = 'SYSTEM'
4 order by table_name
5 /
select owner|| '.' ||tablename
*
FEHLER in Zeile 1:
ORA-00904: Ungültiger Spaltenname
SQL> spool off
SQL>


In Zeile 1 ist die Spalte tablename nicht korrekt geschrieben. Der richtige Spaltenname lautet table_name. Es fehlt lediglich der Unterstrich. Die korrekten Spaltennamen lassen sich über den Befehl DESCRIBE anzeigen. Dieser Fehler kann auch auftreten, wenn man in einer SELECT-Anweisung eine Spalte mit dem falschen Tabellennamen qualifiziert.


Schlüsselwort fehlt

SQL> create view ma_view
2 select * from mitarbeiter_tbl
3 /


select * from mitarbeiter_tbl
*
FEHLER in Zeile 2:
ORA-00905: Schlüsselwort fehlt


Hier stimmt die Syntax nicht. Dieser Fehler tritt auf, wenn man ein obligatorisches Wort in einer syntaktischen Konstruktion ausläßt. Auch ein optionaler Teil eines Befehls kann ein bestimmtes Schlüsselwort erfordern. Im Beispiel fehlt das Schlüsselwort AS. Die Anweisung sollte folgendermaßen aussehen:

SQL> create view ma_view as
2 select * from mitarbeiter_tbl
3 /



Linke Klammer fehlt

SQL> @lklammer.sql


SQL> insert into personal_tbl values
2 '303785523','SMITH','JOHN','JAY','MALE','10.01.50')
/
'303785523','SMITH','JOHN','JAY','MALE','10.01.50')
*
FEHLER in Zeile 2:
ORA-00906: Linke Klammer fehlt


In Zeile 2 fehlt eine Klammer vor der Sozialversicherungsnummer. Die richtige Syntax sieht folgendermaßen aus:

SQL> insert into personal_tbl values
2 ('303785523','SMITH','JOHN','JAY','MALE','10.01.50')
3 /



Rechte Klammer fehlt

SQL> @rklammer.sql


SQL> spool rklammer.lst
SQL> set echo on
SQL> set feedback on
SQL> set pagesize 1000
SQL> select substr(tablespace_name,1,15 a,
2 substr(file_name,1,45) c, bytes
3 from sys.dba_data_files
4 order by tablespace_name;
select substr(tablespace_name,1,15 a,
*
FEHLER in Zeile 1:
ORA-00907: Rechte Klammer fehlt
SQL> spool off
SQL>


In Zeile 1 fehlt die rechte Klammer des substr-Ausdrucks. Die korrekte Syntax sieht folgendermaßen aus:

SQL> select substr(tablespace_name,1,15) a,
2 substr(file_name,1,45) c, bytes
3 from sys.dba_data_files
4 order by tablespace_name;



Komma fehlt

SQL> @komma.sql


SQL> spool komma.lst
SQL> set echo on
SQL> set feedback on
SQL> insert into personal_tbl values
2 ('303785523' 'SMITH','JOHN','JAY','MALE','10.01.50')
3 /
('303785523' 'SMITH','JOHN','JAY','MALE','10.01.50')
*
FEHLER in Zeile 2:
ORA-00917: Komma fehlt


In Zeile 2 fehlt ein Komma zwischen der Sozialversicherungsnummer und SMITH.


Spalte nicht eindeutig definiert

SQL> @mehrd


SQL> spool mehrd.lst
SQL> set echo on
SQL> set feedback on
SQL> select g.svn, name, m.adresse, m.telefon
2 from mitarbeiter m,
3 gehalt g
4 where m.svn = g.svn;
select g.svn, name, m.adresse, m.telefon
*
FEHLER in Zeile 1:
ORA-00918: Spalte nicht eindeutig definiert
SQL> spool off
SQL>


In Zeile 1 wurde der Spaltenname nicht richtig definiert. Die Tabellen haben die Aliase m und g erhalten. Entscheiden Sie sich, aus welcher Tabelle der Name kommen soll, und schreiben Sie den entsprechenden Alias vor name.


SQL-Befehl nicht korrekt beendet

SQL> create view ma_tbl as
2 select * from mitarbeiter
3 order by name
4 /


order by name
*
FEHLER in Zeile 3:
ORA-00933: SQL-Befehl wurde nicht korrekt beendet


Warum wurde dieser Befehl nicht richtig beendet? Eine SQL-Anweisung kann man doch mit / abschließen. Hier haben wir es wieder mit einer Meldung zu tun, die auf eine falsche Fährte führt. Eine ORDER BY-Klausel darf man nicht in einer CREATE VIEW-Anweisung verwenden. Geben Sie statt dessen eine GROUP BY-Klausel an. Im vorliegenden Fall sucht der Abfrageprozessor nach einem Abschlußzeichen (Semikolon oder Schrägstrich) vor der ORDER BY-Klausel, weil der Prozessor annimmt, daß die ORDER BY-Klausel nicht Bestandteil der Anweisung CREATE VIEW ist. Da vor dem ORDER BY kein Abschlußzeichen erscheint, erhält man diesen Fehler zurück und keinen Fehler, der auf das ORDER BY verweist.


Ausdruck fehlt

SQL> @ausdr.sql


SQL> spool ausdr.lst
SQL> set echo on
SQL> set feedback on
SQL> set pagesize 1000
SQL> select owner|| '.' ||table,
2 from sys.dba_tables
3 where owner = 'SYSTEM'
4 order by table_name
5 /
select owner|| '.' ||table,
*
FEHLER in Zeile 1:
ORA-00936: Ausdruck fehlt


Beachten Sie das Komma nach table auf der ersten Zeile. Der Abfrageprozessor sucht demzufolge nach einer weiteren Spalte in der SELECT-Klausel und erwartet noch nicht die FROM-Klausel.


Anzahl der Argumente reicht nicht aus

SQL> @argum.sql


SQL> spool argum.lst
SQL> set echo on
SQL> set feedback on
SQL> set pagesize 1000
SQL> select substr(tablespace_name,1,15) a,
2 decode(substr(file_name,1,45)) c, bytes
3 from sys.dba_data_files
4 order by tablespace_name;
decode(substr(file_name,1,45)) c, bytes
*
FEHLER in Zeile 2:
ORA-00938: Anzahl der Argumente reicht für Funktion nicht aus
SQL> spool off
SQL>


Für die DECODE-Funktion sind nicht genügend Argumente angegeben. Prüfen Sie Ihre Implementierung hinsichtlich der passenden Syntax.


Nicht genügend Werte

SQL> @werte.sql


SQL> spool werte.lst
SQL> set echo on
SQL> set feedback on
SQL> insert into mitarbeiter values
2 ('303785523','SMITH','JOHN')
3 /
insert into mitarbeiter values
*
FEHLER in Zeile 1:
ORA-00947: Anzahl der Werte reicht nicht aus
SQL> spool off
SQL>


Es fehlt ein Spaltenwert. Führen Sie einen DESCRIBE-Befehl für die Tabelle aus, um die fehlende Spalte zu ermitteln. Daten lassen sich nur dann gezielt einfügen, wenn man auch die zugehörigen Spalten auflistet. Das nächste Beispiel zeigt eine entsprechende Anweisung:

SQL> set echo on
SQL> set feedback on
SQL> insert into mitarbeiter (svn, name, vorname)
2 values('303785523','SMITH','JOHN')
3 /

1 Zeile wurde erstellt.



Verstoß gegen Integritätsregel - übergeordneten Schlüssel nicht gefunden

SQL> insert into gehalt values
2 ('123456789','SMITH');
3 /


insert into gehalt values
*
FEHLER in Zeile 1:
ORA-02291: Verstoß gegen Integritätsregel (SYS.FK_NAME). Übergeordn. Schlüssel nicht gefunden


In diesem Beispiel dient MITARBEITER als übergeordnete Tabelle mit der Spalte NAME als Primärschlüssel. In der Tabelle GEHALT ist die Spalte NAME als Fremdschlüssel definiert. Der Fehler entsteht, weil der angegebene Name (SMITH) noch nicht in der Tabelle MITARBEITER enthalten ist und somit kein Bezug auf den Primärschlüssel hergestellt werden kann. Untersuchen Sie in diesem Fall die übergeordnete Tabelle (hier MITARBEITER), ob die Daten korrekt eingetragen sind. Fehlen diese, müssen Sie zunächst die Daten in der übergeordneten Tabelle ergänzen, bevor Sie Daten in die untergeordnete Tabelle (hier GEHALT) einfügen.


Oracle nicht verfügbar

SQL*Plus: Release 8.0.3.0.0 - Production on Di Dez 16 3:19:0 1997

(c) Copyright 1997 Oracle Corporation. All rights reserved.

FEHLER:
ORA-01034: ORACLE not available
ORA-09243: smsget: error attaching to SGA
OSD-04101: Ungültige SGA: SGA ist nicht initialisiert


Benutzernamen eingeben:


Hier haben Sie versucht, sich in SQL*Plus anzumelden. Die Datenbank ist aber wahrscheinlich heruntergefahren. Prüfen Sie den Status der Datenbank. Vergewissern Sie sich auch, daß Sie sich mit der richtigen Datenbank verbinden wollen, falls Sie auf mehrere Datenbanken Zugriff haben.


Eingefügter Wert zu groß für Spalte

SQL> @wert.sql


SQL> spool wert.lst
SQL> set feedback on
SQL> insert into gehalt values
2 ('303785523','SMITH-JOHNSON OF HAMPSHIRE','JOHN');
('303785523','SMITH-JOHNSON OF HAMPSHIRE','JOHN')
*
FEHLER in Zeile 2:
ORA-01401: Eingefügter Wert zu groß für Spalte
SQL> spool off
SQL>


Der mit dem Sternchen gekennzeichnete Wert ist zu groß für die Spalte. Ermitteln Sie mit dem DESCRIBE-Befehl (im Beispiel DESC GEHALT) die Definition der Spalte. Gegebenenfalls können Sie mit einem ALTER TABLE-Befehl die Spaltenbreite erweitern.


Servicename kann nicht aufgelöst werden

SQL> connect rplew/xxxx@database1


FEHLER:
ORA-12154: TNS:Der Servicename konnte nicht aufgelöst werden.

Achtung: Sie sind nicht mehr mit ORACLE verbunden.


Die Verbindung zur Datenbank ist fehlgeschlagen. Entweder haben Sie den Namen der Datenbank falsch eingegeben, oder der Name ist nicht in der Datei TNSNAMES.ORA verzeichnet. Prüfen Sie, ob die Datei TNSNAMES.ORA vorhanden, an der richtigen Stelle gespeichert und zugänglich ist.


Berechtigungen nicht zureichend

SQL> grant select on personal to frank;


grant select on personal to frank
*
FEHLER in Zeile 1:
ORA-01749: An/von sich selbst können Sie keine Berechtigungen erteilen/entziehen


SQL> grant select on gehalt to ron;


grant select on gehalt to ron
*
FEHLER in Zeile 1:
ORA-01031: Unzureichende Berechtigungen


Dieser Fehler tritt auf, wenn man Privilegien (Berechtigungen) an die Tabelle eines anderen Benutzers zuteilen möchte und selbst nicht über die entsprechenden Privilegien verfügt. Damit man Privilegien auf die Tabelle eines anderen Benutzers übertragen kann, muß man Eigentümer der Tabelle sein. Wenn Sie in Oracle ein Privileg mit der Option WITH ADMIN OPTION erhalten, können Sie das angegebene Privileg an andere Benutzer übertragen. Überprüfen Sie Ihre Implementierung hinsichtlich der Privilegien, die Sie für die Gewährung eines Privilegs benötigen.


Ungültige Zeichen in einer Anweisung

Sonderzeichen können die Fehlersuche in einer SQL-Anweisung erschweren. Ungültige Zeichen treten zum Beispiel auf, wenn man die (æ_)-Taste während der Eingabe einer Anweisung in den Puffer oder in eine Datei benutzt. Je nach Interpretation der Tastaturcodes kann die (æ_)-Taste zu ungültigen Zeichen in der Anweisung führen, selbst wenn diese Zeichen nicht sichtbar sind.



Datei kann nicht angelegt werden

Dieser Fehler hat eine Reihe von Ursachen. Häufig ist der angegebene Datenträger voll, oder es sind nicht die geeigneten Berechtigungen für das Dateisystem vorhanden. Im ersten Fall kann man überflüssige Dateien löschen. Wenn die Sicherheitseinstellungen für das Netzlaufwerk nicht in Ordnung sind, nehmen Sie die erforderlichen Korrekturen vor. Da dieser Fehler mehr das Betriebssystem als Oracle selbst betrifft, sollten Sie sich mit Ihrem Systemadministrator in Verbindung setzen.



Logische Fehler

Die bisher behandelten Fehler in SQL-Anweisungen haben direkt zu Fehlermeldungen geführt. Die meisten dieser Fehler sind auf den ersten Blick zu erkennen und problemlos zu beseitigen. Als nächstes gehen wir auf Fehler ein, die mehr (oder weniger) logischer Natur sind.



Reservierte Wörter in SQL-Anweisung

SQL> select sysdate DATE
2 from dual;


select sysdate DATE
*
FEHLER in Zeile 1:
ORA-00923: Schlüsselwort FROM nicht an erwarteter Stelle gefunden


In diesem Beispiel erwartet der Abfrageprozessor nicht das Wort DATE, da es ein reserviertes Wort ist. Nach dem Namen der Pseudospalte SYSDATE steht kein Komma. Demzufolge erwartet der Prozessor als nächstes Element die FROM-Klausel.

SQL> select sysdate "DATE"
2 from dual;


DATE
--------
15.12.97


Reservierte Wörter lassen sich als normale Bezeichner »umfunktionieren«, wenn man sie in Anführungszeichen einschließt. Damit kann man im Beispiel das reservierte Wort DATE als Alias für eine Spalte verwenden. In einem deutschen Programm hätte man zwar ohnehin die Bezeichnung DATUM gewählt, man sollte aber nicht davon ausgehen, daß deutsche Bezeichnungen durchgängig gefahrlos sind. Lektion 12 hat dazu ein Beispiel mit dem Schlüsselwort ALTER gebracht, das in Verbindungen wie ALTER TABLE zu finden ist.

Eine Liste der reservierten Wörter sollten Sie Ihrer Datenbankdokumentation entnehmen, da sich die reservierten Wörter zwischen den einzelnen Implementierungen unterscheiden.

Außer bei zusammengesetzten Bezeichnungen (wie PREIS PRO STÜCK) und reservierten Wörtern sind Anführungszeichen für den Aliasnamen einer Spalte nicht unbedingt erforderlich. Im folgenden Beispiel kann man auf die Anführungszeichen verzichten, da HEUTE kein reserviertes Wort ist.


SQL> select sysdate HEUTE
2 from dual;


HEUTE
--------
15.12.97



DISTINCT bei Auswahl mehrerer Spalten

SQL> select distinct(stadt), distinct(plz)
2 from adressen;


select distinct(stadt), distinct(plz)
*
FEHLER in Zeile 1:
ORA-00936: Ausdruck fehlt


Eine Stadt kann durchaus mehrere Postleitzahlen haben. In der Regel sollte man mit dem Befehl DISTINCT nur auf einer ausgewählten Spalte arbeiten.


Löschen einer nicht bezeichneten Tabelle

Geben Sie beim Löschen einer Tabelle immer


Die riskante Syntax für das Löschen einer Tabelle lautet:


Die nächste Anweisung ist wesentlich sicherer, da sie den Eigentümer der zu löschenden Tabelle angibt.


Beim Löschen sollte man eine Tabelle immer qualifizieren, auch wenn dieser Schritt nicht unbedingt erforderlich ist. Lösen Sie niemals einen DROP TABLE-Befehl aus, ohne zuerst die Benutzer-ID zu überprüfen, über die Sie sich in der Datenbank angemeldet haben.


Öffentliche Synonyme in einer Datenbank mit mehreren Schemata

Synonyme erleichtern den Benutzern das Leben. Allerdings öffnen Synonyme Tabellen, die eventuell nicht alle Benutzer sehen sollen. Lassen Sie Vorsicht walten, wenn Sie öffentliche Synonyme vergeben, insbesondere in einer Umgebung mit mehreren Schemata.



Das gefürchtete kartesische Produkt

SQL> select a.svn, p.nachname
2 from adressen a,
3 personal p;


SVN NACHNAME
--------- ---------------
303785523 SMITH
313507927 SMITH
490552223 SMITH
312667771 SMITH
420001690 SMITH
303785523 JONES
313507927 JONES
490552223 JONES
312667771 JONES
420001690 JONES
303785523 OSBORN
313507927 OSBORN
490552223 OSBORN
312667771 OSBORN
420001690 OSBORN
303785523 JONES
313507927 JONES
490552223 JONES
312667771 JONES
420001690 JONES

16 Zeilen ausgewählt.


Dieses Ergebnis entsteht, wenn man die Tabellen in der WHERE-Klausel nicht verknüpft. Beide Tabellen enthalten jeweils 4 Zeilen. In der Ergebnismenge sollten daher ebenfalls nur 4 Zeilen erscheinen. Statt dessen erhält man 16 Zeilen. Durch die fehlende Verknüpfung in der WHERE-Klausel wird jede Zeile in der ersten Tabelle mit jeder Zeile in der zweiten Tabelle kombiniert. Die Gesamtzahl der Zeilen ergibt sich aus dem Produkt der Zeilenzahlen beider Tabellen, im Beispiel also 4 Zeilen mal 4 Zeilen gleich 16 Zeilen. Dieses Demonstrationsbeispiel verhält sich demnach noch harmlos. Normalerweise enthalten die Tabellen in einer echten Datenbank wesentlich mehr als 4 Datenzeilen, vielleicht Tausende oder Millionen von Zeilen. In diesen Fällen brauchen Sie die Multiplikation gar nicht erst zu probieren, da die Abfrage sicherlich sofort aus dem Ruder läuft.



Verletzung von Eingabestandards

Die Einhaltung gewisser Standards bei der Eingabe bezeichnet man auch als Qualitätssicherung



Dateisysteme

Informieren Sie sich in der Dokumentation zu Ihrem Datenbanksystem, welche Vorschriften oder Empfehlungen für die Struktur des Dateisystems bestehen. Wenn Sie die entsprechenden Konventionen nicht einhalten, kann das zu schwer auffindbaren Fehlern führen.



Speicherparameter bei großen Tabellen

Die Standardparameter zur Speicherung von Tabellen unterscheiden sich zwar in den einzelnen Implementierungen, gewöhnlich sind die Bereiche aber ziemlich klein bemessen. Wenn man eine große oder dynamische Tabelle erstellt und dabei die Standardparameter für die Speicherung zugrunde legt, führt das mit der Zeit zu stark fragmentierten Tabellen, die als Bremse der Datenbankleistung wirken. Durch eine entsprechende Planung der zu erstellenden Tabellen läßt sich dieser Effekt vermeiden. Das folgende Beispiel verwendet die Optionen der Speicherparameter von Oracle.


SQL> create table test_tbl
2 (ssn number(9) not null,
3 name varchar2(30) not null)
4 storage
5 (initial extent 100M
6 next extent 20M
7 minextents 1
8 maxextents 121
9 pctincrease 0};



Objekte im Bereich der Systemtabellen

Die folgende Anweisung zeigt eine Tabelle, die im Tabellenbereich SYSTEM erzeugt wurde. Obwohl diese Anweisung keinen Fehler zurückgibt, führt sie wahrscheinlich in der Zukunft zu Problemen.


SQL> create table test_tbl
2 (ssn number(9) not null,
3 name varchar2(30) not null)
4 tablespace SYSTEM
5 storage
6 (initial extent 100M
7 next extent 20M
8 minextents 1
9 maxextents 121
10 pctincrease 0};


Die im folgenden Beispiel dargestellten Korrekturen sollen das genannte Problem vermeiden:


SQL> create table test_tbl
2 (ssn number(9) not null,
3 name varchar2(30) not null)
4 tablespace linda_ts
5 (initial extent 100M
6 next extent 20M
7 minextents 1
8 maxextents 121
9 pctincrease 0};


Oracle speichert im Tabellenbereich SYSTEM normalerweise nur Objekte, deren Eigentümer SYSTEM ist, beispielsweise Tabellen des Systemkatalogs. Falls Sie dynamische Tabellen in diesem Tabellenbereich unterbringen und diese Tabellen wachsen, wird unter Umständen der freie Platz zerstört oder zumindest aufgefüllt. Die Datenbank kann dadurch abstürzen und in einen nicht wiederherstellbaren Zustand gelangen. Speichern Sie deshalb die Anwendung und die Benutzertabellen in separat ausgewiesenen Tabellenbereichen.


Fehler bei der Komprimierung großer Sicherungsdateien

Wenn man umfangreiche Exportoperationen durchführt und die Dateien nicht komprimiert, kann es zu einem Platzmangel bei der Zwischenspeicherung der Dateien kommen. Komprimieren Sie daher immer die zu exportierenden Dateien. Wenn Sie archivierte Protokolldateien auf der Festplatte statt auf Band speichern, können und sollten diese Dateien aus Platzgründen komprimiert werden.



Fehler bei der Planung der Systemressourcen

Bereits vor dem Erstellen der Datenbank sollten Sie die Systemressourcen einplanen. Ansonsten ist mit einer verminderten Leistung der Datenbank zu rechnen. Bestimmend für die Kalkulation der Systemressourcen ist der Einsatzzweck der Datenbank. Es ist also die Frage zu beantworten, ob die Datenbank für Transaktionen, als Data-Warehouse oder lediglich für Abfragen vorgesehen ist. Die Aufgaben der Datenbank beeinflussen die Anzahl und Größe von Rollback-Segmenten. Die Anzahl der Datenbankbenutzer geht in die Größenbemessung der Tabellenbereiche USERS und TEMP ein. Haben Sie genug Platz, um größere Tabellen aufzuteilen? Tabellen und Indizes sollten auf separaten Geräten gespeichert werden, um den Konkurrenzbetrieb der Laufwerke zu vermindern. Gleiches gilt für die Protokolle zur Wiederherstellung und die Tabellenbereiche für Daten. Die genannten Punkte stellen nur eine kleine Auswahl der Probleme dar, mit denen man es in bezug auf die Systemressourcen zu tun hat.



Probleme mit Daten vermeiden

Ihr Datenverarbeitungszentrum sollte ein eingerichtetes Sicherungssystem haben. Bei kleinen bis mittleren Datenbanken kann man die zusätzlichen Vorsichtsmaßnahmen mittels EXPORT vornehmen, um eine Sicherung der Daten zu gewährleisten. Von den Exportdateien sollte man Kopien anlegen und sie an einem anderen sicheren Platz aufbewahren. Denken Sie daran, daß es sich um große Dateien mit entsprechendem Platzbedarf handeln kann.



Suchen nach doppelten Datensätzen in der Datenbank

Wenn Ihre Datenbank perfekt geplant ist, sollten Sie keine Probleme mit doppelten Datensätzen haben. Duplikate lassen sich vermeiden, indem man mit Einschränkungen, Fremdschlüsseln und eindeutigen Indizes arbeitet.



Zusammenfassung

Viele verschiedene Arten von Fehlern - im wörtlichen Sinne Hunderte - können Ihnen und Ihren Daten im Wege stehen. Zum Glück sind die meisten Fehler nicht gefährlich und lassen sich leicht beseitigen. Allerdings gibt es auch das andere Extrem. Eine Fehlerkorrektur ist mit Umsicht vorzunehmen, weil sich der Fehler fortpflanzen kann, wenn man nicht die Wurzel des Problems beseitigt. Wenn Ihnen Fehler unterlaufen, was mit Sicherheit passiert, sollten Sie diese als lehrreiche Erfahrung ansehen.


Es empfiehlt sich, ein gewissenhaftes Protokoll zu allen aufgetretenen Fehlern anzulegen. Insbesondere bei ungewöhnlichen Fehlerbildern ist eine derartige Fehlerdatei eine unschätzbare Quelle für die Fehlersuche.

Tag 21 bietet Ihnen lediglich eine Kostprobe der häufigsten Fehler in Personal Oracle8. Eine vollständige Fehlerliste und Vorschläge zur Lösung sollten Sie in der Dokumentation zu Ihrer Datenbank finden.


Fragen & Antworten

Frage:

Es klingt so, als ob sich jeder Fehler beheben ließe. Warum sich also Gedanken machen?

Antwort:

Ja. Die meisten Fehler lassen sich leicht beheben. Aber angenommen, Sie löschen eine Tabelle in einer Produktionsumgebung. Vielleicht brauchen Sie Stunden oder Tage, um die Datenbank wiederherzustellen. Die Datenbank ist in dieser Zeit nicht betriebsbereit, und es fallen Überstunden an, um den Fehler zu beseitigen. Ihr Chef wird darüber nicht gerade glücklich sein.

Frage:

Gibt es todsichere Tips, wie man Fehler vermeidet?

Antwort:

Es liegt in der Natur des Menschen, Fehler zu machen. Allerdings lassen sich viele Fehler durch Training, Konzentration, Selbstvertrauen, eine gute Einstellung und eine streßfreie Arbeitsumgebung vermeiden.


Workshop


Kontrollfragen

1. Ein Benutzer ruft an und sagt: »Ich kann mich nicht in der Datenbank anmelden. Gestern lief alles noch wunderbar. Als Fehlermeldung erhalte ich den Hinweis auf ein ungültiges Kennwort. Können Sie mir helfen?« Welche Schritte sind in diesem Fall zu unternehmen?


2. Warum sollte man Tabellen mit einer Speicherklausel und Angaben zum Tabellenbereich erstellen?



Übungen

1. Angenommen, Sie haben sich in der Datenbank als SYSTEM angemeldet und möchten eine Tabelle namens HISTORY in Ihrem Schema löschen. Ihre reguläre Benutzer-ID lautet JSMITH. Wie sieht die korrekte Syntax aus, um diese Tabelle zu löschen?


2. Korrigieren Sie den folgenden Fehler:


SQL> select sysdate DATE
2 from dual;


select sysdate DATE
*
FEHLER in Zeile 1:
ORA-00923: Schlüsselwort FROM nicht an erwarteter Stelle gefunden