Arbeiten mit Datenbanken

<< Serverkonfiguration und -management | Firebird 2 Schnellanleitung | Vermeidung von Datenverlust >>

Arbeiten mit Datenbanken

In diesem Abschnitt der Schnellanleitung lernen Sie:

  • wie man sich zu einer existierenden Datenbank verbindet,
  • wie man eine Datenbank erstellt,
  • und einige Dinge, die Sie über Firebird SQL wissen sollten.

Soweit Remoteverbindungen involviert sind, verwenden wir das empfohlene TCP/IP Protokoll.

Verbindungsstrings

Wenn Sie sich zu einer Datenbank verbinden oder eine Datenbank erstellen wollen, dann müssen Sie, neben anderen Dingen, einen Verbindungsstring angeben. Ein Verbindungsstring identifiziert eindeutig den Ort der Datenbank auf Ihrem Computer, im lokalen Netzwerk oder sogar im Internet.

Lokale Verbindungsstrings

Ein lokaler Verbindungsstring besteht aus dem Pfad und dem Dateinamen im nativen Format des Dateisystems auf der Servermaschine. Zum Beispiel:

  • Auf einem Linux oder anderen Unix-ähnlichen Servern:
/opt/firebird/examples/empbuild/employee.fdb
  • Auf einem Windows Server:
C:\Biology\Data\Primates\Apes\populations.fdb

Viele Client-Anwendungen erlauben auch die Verwendung von relativen Pfadangaben (z.B. ..\examples\empbuild\employee.fdb), allerdings sollten Sie diese mit Vorsicht verwenden, da es nicht immer klar ersichtlich ist, wie der Pfad letztendlich expandiert wird. Dass man eine Fehlermeldung bekommt ist ärgerlich genug, aber wenn Änderungen in einer anderen Datenbank durchgeführt werden als man dachte, kann dies katastrophal sein.

Anstatt des Dateipfades kann der lokale Verbindungsstring auch über einen Datenbankalias, der in aliases.conf definiert ist, angegeben werden. Das Format des Alias hängt nur davon ab, wie dieser in der Aliasdatei definiert ist und nicht vom Serverdateisystem. Beispiele sind:

  • zappa
  • blackjack.fdb
  • poker

Tipp: Ein Grund, dass eine lokale Verbindung fehlschlägt, kann der sein, dass das lokale Protokoll auf Ihrer Maschine nicht ordnungsgemäß funktioniert. Das Herausfinden der möglichen Ursachen, warum das lokale Protokoll nicht funktioniert, ist nicht Bestandteil dieser Schnellanleitung, aber man kann diesem Problemen immer so entgegenwirken, indem man localhost: dem Datenbankpfad oder dem Alias voranstellt, da man hiermit die lokale Verbindung in eine TCP/IP Verbindung ändert (siehe unten).

TCP/IP Verbindungsstrings

Ein TCP/IP Verbindungsstring besteht aus:

  1. einem Servernamen oder einer IP-Adresse
  2. einem Doppelpunkt (":")
  3. entweder dem absoluten Pfad + dem Dateinamen auf der Servermaschine, oder einem Alias, der auf der Servermaschine definiert ist.

Beispiele:

• Unter Linux/Unix:

 pongo:/opt/firebird/examples/empbuild/employee.fdb 

 bongo:fury

 112.179.0.1:/var/Firebird/databases/butterflies.fdb

 localhost:blackjack.fdb

• Unter Windows:

 siamang:C:\Biology\Data\Primates\Apes\populations.fdb

 sofa:D:\Misc\Friends\Rich\Lenders.fdb

 127.0.0.1:Borrowers

Beachten Sie, dass ein Verbindungsstring unter Verwendung eines Alias keine Auskunft darüber gibt, um welches Betriebssystem es sich am Server handelt. Und, Sie sollten sich darüber auch keine Gedanken machen müssen, weil die Client-Anwendung mit einem Linux Firebird Server genau so wie mit einem Windows Firebird Server kommunizieren kann. Eigentlich ist die Verwendung eines expliziten Datenbankpfads der einzige Grund, warum Sie über den Unterschied im Verbindungsstring kennen sollten.

Drittherstellerprogramme

Beachte Sie bitte, dass Drittherstellerprogramme deren eigenen Anforderungen für die Zusammensetzung des Verbindungsstrings haben. Schlagen Sie hierfür die Online-Dokumentation dieser Produkte nach, wie man zu einem gültigen Verbindungsstring kommt.

zurück zum Seitenanfang

Verbinden zu einer existierenden Datenbank

Eine Beispieldatenbank employee.fdb befindet sich im examples/empbuild Unterverzeichnis Ihrer Firebird Installation. Sie können diese Datenbank zu Testzwecken verwenden.

Falls Sie die Beispieldatenbank verschieben oder kopieren, stellen Sie sicher, dass sie sich auf einer Festplatte befindet, die physisch mit der Servermaschine verbunden ist. Dateifreigaben, gemappte Laufwerke oder (unter Unix) ein gemountetes SMB (Samba) Dateisystem wird nicht funktionieren. Die selbe Regel gilt für jede Datenbank, die Sie erstellen oder verwenden wollen.

Um sich zu einer Firebird Datenbank verbinden zu können, benötigen Sie einen Benutzer und ein gültiges Passwort. Um mit Objekten innerhalb der Datenbank zu arbeiten - wie zum Beispiel Tabellen, Views, usw. - benötigen Sie auch explizite Berechtigungen auf diesen Objekten, außer Sie sind der Eigentümer (Sie sind der Eigentümer eines Objekts, falls Sie dieses erstellt haben) oder Sie sind mit SYSDBA verbunden. In der Beispieldatenbank employee.fdb wurde PUBLIC (= jeder, der sich mit der Datenbank verbindet) ausreichende Berechtigungen erteilt, um Daten einzusehen und zu ändern.

Zur Vereinfachung werden wir hier SYSDBA und das Passwort masterkey verwenden. Zusätzlich, um in den Beispielen nicht den rechten Rand des Dokumentes zu erreichen, werden wir mit lokalen Datenbanken und relativen Pfaden arbeiten. Selbstverständlich können Sie das hier Gelernte auch auf Remote-Datenbanken anwenden, einfach durch Angabe eines TCP/IP Verbindungsstrings.

Verbinden mit isql

Firebird kommt mit einem Tool namens isql (Interactive SQL Utility). Sie können dieses Tool auf unterschiedliche Arten verwenden, um sich mit einer Datenbank zu verbinden. Eine Verwendungsart sehen Sie unten, nämlich in einem interaktiven Modus. Gehen Sie in das bin Unterverzeichnis Ihrer Firebird Installation und geben Sie isql (Windows) oder ./isql (Linux) auf der Kommandozeile ein.

[In den folgenden Beispielen bedeutet # "drücken von Enter"]

 C:\Program Files\Firebird\Firebird_2_0\bin>isql# 

Use CONNECT or CREATE DATABASE to specify a database:

 SQL>CONNECT ..\examples\empbuild\employee.fdb user SYSDBA password masterkey;#

Wichtig:

  • In isql muss jede SQL Anweisung mit einem Strichpunkt abgeschlossen werden. Wenn Sie Enter drücken und die Zeile nicht mit einem Strichpunkt abgeschlossen wurde, dann nimmt isql an, dass die Anweisung in der nächsten Zeile fortgesetzt wird und erwartet Ihre weitere Eingabe, indem sich SQL> auf CON> ändert. Dies ermöglicht Ihnen das Aufteilen von langen Anweisungen auf mehrere Zeilen. Falls Sie nach der Anweisung Enter drücken, und Sie den Strichpunkt vergessen haben, dann geben Sie den Strichpunkt einfach nach dem CON> Prompt ein und drücken Sie nochmals die Enter Taste.
  • Falls Sie Classic Server unter Linux laufen lassen, dann wird versucht, dass eine schnelle direkte lokale Verbindung aufgebaut wird, wenn der Datenbankpfad mit keinem Hostnamen beginnt. Dies wird fehlschlagen, wenn Ihr Linux Login nicht die erforderlichen Berechtigungen auf der Datenbankdatei besitzt. Verbinden Sie sich in diesem Fall mit localhost:<path>. Hiermit wird der Serverprozess (mit Firebird 2 läuft der Serverprozess gewöhnlich mit dem Benutzer firebird) die Datenbankdatei öffnen. Andererseits wird eine netzwerkähnliche Verbindung fehlschlagen, wenn ein Benutzer die Datenbank im Classic Lokal Modus erstellt hat und der Server nicht die erforderlichen Zugriffsberechtigungen auf diese Datenbankdatei besitzt.

Anmerkung: Optional können Sie den Pfad, den Benutzernamen und/oder das Passwort in einfachen (') oder doppelten (") Hochkommas einschließen. Wenn der Pfad Leerzeichen beinhaltet, dann müssen Sie Hochkommas verwenden.

An diesem Punkt angelangt, wird Sie isql darüber informieren, dass Sie mit der Datenbank verbunden sind:

 Database: ..\examples\empbuild\employee.fdb, User: sysdba
 SQL>

Sie können nun mit der employee.fdb Datenbank experimentieren. Mit isql können Sie Daten abfragen, Informationen über Metadaten abrufen, Datenbankobjekte erstellen, Skripte laufen lassen und vieles mehr.

Um zur Kommandozeile zurück zu kommen, geben Sie den folgenden Befehl ein:

 SQL>QUIT;#

Sie können auch EXIT anstatt von QUIT verwenden. Der Unterschied hierbei liegt darin, dass mit EXIT eine offene Transaktion committed wird und somit die Änderungen bestätigt werden, bevor isql verlassen wird.

Verbinden mit einem graphischen Client

Graphische Client-Tools setzen in der Regel für Sie den CONNECT String unter Verwendung des Servers, des Pfades (oder eines Alias), des Benutzernamens und des Passworts selbst zusammen. Verwenden Sie dazu die in den vorangegangen Abschnitten diskutierten Elemente.

Hinweise:

  • Es ist nicht ungewöhnlich, dass solche Tools den vollständigen Server + Pfad/Alias als einen Verbindungsstring erwarten, so wie das bei isql der Fall ist.
  • Erinnern Sie sich, dass Dateinamen und Kommandos unter Linux und anderen "Unix-ähnlichen" Plattformen case-sensitiv sind.

zurück zum Seitenanfang

Eine Datenbank mit isql erstellen

Es existieren mehrere Wege für das Erstellen einer Datenbank mit isql. Hier werden wir uns einen einfachen Weg ansehen, wie man eine Datenbank interaktiv erstellt, obwohl für ernsthafte Datenbankarbeiten, diese Änderungen in Skripten durchgeführt werden sollten.

Starten von isql

Um eine Datenbank interaktiv mit der isql Kommandoshell zu erstellen, gehen Sie in das Firebird bin Unterverzeichnis und geben Sie isql (Windows) oder ./isql (Linux) ein:

 C:\Program Files\Firebird\Firebird_2_0\bin>isql#

Use CONNECT or CREATE DATABASE to specify a database.

Die CREATE DATABASE Anweisung

Nun können Sie eine neue Datenbank interaktiv erstellen. Nehmen wir an, dass Sie eine Datenbank mit dem Namen test.fdb, in einem Verzeichnis data auf Ihrer Festplatte D erstellen wollen:

 SQL>CREATE DATABASE 'D:\data\test.fdb' page_size 8192#
 CON>user 'SYSDBA' password 'masterkey';#

Wichtig:

  • In der CREATE DATABASE Anweisung ist es verpflichtend, dass Sie den Pfad, den Benutzernamen und das Passwort mit einfachen oder doppelten Hochkommas umschließen. Dies ist unterschiedlich zu der Verwendungsart in der CONNECT Anweisung.
  • Falls Sie Classic Server unter Linux verwenden und Ihr Datenbankpfad nicht mit einem Hostnamen beginnt, dann wird versucht, mit dem gerade angemeldeten Benutzer die Datenbank als Eigentümer zu erstellen. Dies kann, oder auch nicht, das sein, was Sie wollen (denken Sie daran, dass die anderen Benutzer die entsprechenden Berechtigungen für diese Datenbankdatei benötigen). Wenn Sie localhost: dem Pfad voranstellen, so wird der Serverprozess (läuft bei Firebird 2 gewöhnlich unter dem Benutzer firebird) die Datei erstellen und er wird auch der Eigentümer dieser Datei.

Die Datenbank wird erstellt und nach wenigen Momenten wird der SQL Prompt wieder angezeigt. Sie sind nun mit der neuen Datenbank verbunden und können einige Testobjekte in dieser Datenbank anlegen.

Um nun zu überprüfen, ob auch wirklich eine Datenbank vorhanden ist, geben Sie die folgende Abfrage ein:

 SQL>SELECT * FROM RDB$RELATIONS;#

Obwohl Sie bis dato noch keine Tabellen erstellt haben, wird der Bildschirm eine Fülle an Daten anzeigen! Diese Abfrage selektiert alle Datensätze in der Systemtabelle RDB$RELATIONS, wo Firebird die Metadaten für Tabellen und Views speichert. Eine "leere" Datenbank ist somit nicht wirklich leer. Diese beinhaltet eine Menge an Systemtabellen und anderen Objekten. Die Systemtabellen werden wachsen, sobald Sie mehr Benutzerobjekte in der Datenbank anlegen.

Um wieder zur Kommandozeile zu gelangen, geben Sie QUIT oder EXIT ein. Siehe dazu auch das vorangegangene Kapitel.

zurück zum Seitenanfang

Firebird SQL

Jedes Datenbankmanagementsystem hat ihre Eigenheiten in der Art und Weise, wie es SQL implementiert. Firebird hält sich hier mehr an den SQL Standard, als dies die meisten anderen RDBMSe es tun. Entwickler, die von Produkten, die weniger standard-konform sind, auf Firebird migrieren, nehmen fälschlicherweise an, dass sich Firebird in bestimmten Situationen sonderbar verhält.

Division eines Integers durch einen Integer

Firebird entspricht dem SQL Standard durch Abschneiden des Ergebnisses (Quotient) einer Integer/Integer Berechnung auf den nächstkleineren Integer. Dies kann seltsame Ergebnisse nach sich ziehen, solange Sie darüber nicht Bescheid wissen.

So ist zum Beispiel die folgende Berechnung in SQL korrekt:

 1 / 3 = 0

Falls Sie von einem RDBMS kommen, das eine Integer/Integer Division auf einen Fließkomma-Quotienten auflöst, so müssen Sie jeden davon betroffenen Ausdruck dahingehend ändern, dass ein Fließkomma- oder skalierter numerischer Datentyp für entweder den Dividend, den Divisor, oder für beide verwendet wird.

Zum Beispiel: Die Berechnung oben könnte dahingehend verändert werden, um ein Ergebnis ungleich null zu erzeugen:

 1.000 / 3 = 0.333

Dinge, die Sie über Strings wissen müssen

String-Begrenzungszeichen

Strings in Firebird werden durch ein Paar von einfachen Hochkommas abgegrenzt: 'Ich bin ein String' (ASCII Code 39, und nicht 96). Falls Sie frühere Versionen von Firebird's Verwandten InterBase® verwenden, dann können Sie sich vielleicht erinnern, dass doppelte und einfache Hochkommas als String-Begrenzungszeichen austauschbar waren. Doppelte Hochkommas können in Firebird SQL Anweisungen nicht als String-Begrenzungszeichen verwendet werden.

Hochkommas in Strings

Falls Sie ein Hochkomma innerhalb eines Firebird Strings benötigen, dann können Sie das durch Voranstellen eines weiteren einfachen Hochkommas erreichen.

Der folgende String wird einen Fehler produzieren:

 'Joe's Emporium'

da der Parser das Hochkomma antrifft und den String als 'Joe' interpretiert, gefolgt von einigen unbekannten Schlüsselwörtern. Um daraus einen gültigen String zu machen, müssen Sie zwei einfache Hochkommas verwenden:

 'Joe''s Emporium'

Es handelt sich hier nicht um ein doppeltes Hochkomma, sondern um zwei einfache Hochkommas!

Verkettung von Strings

Das Verkettungssymbol in SQL sind doppelte "Pipe" Symbole (ASCII 124, in einem Paar mit keinem Leerzeichen dazwischen). Das "+" Symbol in SQL ist ein arithmetischer Operator und wird einen Fehler nach sich ziehen, wenn Sie versuchen, diesen für die Verkettung von Strings zu verwenden.

Der folgende Ausdruck stellt den String Reported by: an ein Feld:

 'Reported by: ' || LastName

Firebird wird einen Fehler melden, falls das Ergebnis der String-Verkettung die maximale Größe eines (VAR)CHAR von 32 Kb überschreitet. Falls nur das potentielle Ergebnis – basierend auf den Variablen oder der Feldgröße – zu lang ist, dann bekommen Sie nur eine Warnung, aber die Aktion wird durchgeführt. (In pre-2.0 Firebird würde dies ebenfalls einen Fehler melden und die Ausführung stoppen.)

Beachten Sie auch den Abschnitt unten, Ausdrücke mit NULL, über das Verketten von Ausdrücken mit NULL.

Begrenzte Bezeichner (delimited identifiers)

Vor dem SQL-92 Standard war es nicht erlaubt, Schlüsselwörter einer Sprache, case-sensitive Bezeichner oder Bezeichner mit Leerzeichen, als Objektnamen (Bezeichner) in einer Datenbank zu verwenden. SQL-92 definierte diesbezüglich einen neuen Standard, der alle diese Eigenschaften erlaubt, vorausgesetzt, dass die Bezeichner innerhalb doppelter Hochkommas (ASCII 34) definiert und immer mit doppelten Hochkommas referenziert werden.

Der Grund für diese Änderung war eine Erleichterung bei der Migration von Nicht-Standard RDBMSe zu standard-konformen RDBMSe zu erreichen. Der Nachteil davon ist der, dass, wenn Sie doppelte Hochkommas für die Definition eines Bezeichners verwendet haben, dieser case-sensitive ist und immer mit doppelten Hochkommas angesprochen werden muss.

Firebird erlaubt hier jedoch eine Vereinfachung in bestimmten Situationen. Falls der Bezeichner, der in doppelten Hochkommas definiert:

  1. und alles großgeschrieben wurde,
  2. und kein Schlüsselwort ist, und
  3. keine Leerzeichen besitzt,

... dann kann der Bezeichner in SQL ohne Hochkommas und case-insensitiv angesprochen werden. Aber, sobald Sie doppelte Hochkommas verwenden, spielt die Großschreibung wieder eine Rolle!

Warnung: Beachten Sie jedoch: Falls Sie eine Tabelle TESTTABLE und TestTable haben, die beide mit doppelten Hochkommas angelegt wurden, und Sie die folgende Abfrage ausführen:

 SQL>select * from TestTable;

... dann bekommen Sie die Datensätze von TESTTABLE und nicht von TestTable zurück!

Solange Sie keinen trifftigen Grund für die Verwendung von begrenzten Bezeichnern haben, empfehlen wir Ihnen, diese zu vermeiden. Firebird akzeptiert eine Mischung aus begrenzten und nichtbegrenzten Bezeichnern. Somit ist es kein Problem, dass Schlüsselwörter von einer alten Datenbank verwendet werden, sofern Sie dafür eine Notwendigkeit sehen.

Warnung: Einige Datenbank Administrationstools erzwingen per Default doppelte Hochkommas für alle Bezeichner. Versuchen Sie ein Tool zu verwenden, das die optionale Verwendung von doppelten Hochkommas erlaubt.

zurück zum Seitenanfang

Ausdrücke mit NULL

In SQL ist NULL kein Wert. Es ist eine Bedingung oder ein Zustand einer Dateneinheit, dessen Wert unbekannt ist. Weil unbekannt, kann NULL nicht wie ein Wert behandelt werden. Wenn Sie nun versuchen arithmetische Operationen mit NULL durchzuführen, oder wenn NULL mit Werten anderer Ausdrücke vermischt wird, dann wird das Ergebnis dieser Operationen fast immer NULL sein. Dies wird nicht null oder leer oder ein "leerer String" sein, und es wird sich auch nicht wie einer dieser Werte verhalten.

Unten sind ein paar Beispiele angeführt, was Sie als Ergebnis erhalten, wenn Sie mit NULL Berechnungen und Vergleiche durchführen.

Die folgenden Ausdrücke geben alle NULL zurück:

  • 1 + 2 + 3 + NULL
  • not (NULL)
  • 'Home ' || 'sweet ' || NULL

Für den ersten Ausdruck haben Sie vermutlich 6 als Ergebnis erwartet. Home sweet beim dritten Beispiel, aber wie bereits erwähnt: NULL ist nicht mit der Zahl 0 oder einem Leerstring vergleichbar.

Der folgende Ausdruck:

  • FirstName || ' ' || LastName

wird NULL zurückgeben, falls entweder FirstName oder LastName NULL ist. Sonst werden beide Namen mit einem Leerzeichen miteinander verkettet, sogar wenn eine der beiden Variablen ein leerer String ist.

Tipp: Betrachten Sie NULL als UNBEKANNT. Somit machen die seltsamen Resultate wieder Sinn! Falls der Wert von Number unbekannt ist, dann ist das Ergebnis von '1 + 2 + 3 + Number' ebenfalls unbekannt (und somit NULL). Falls der Inhalt von MyString unbekannt ist, dann ist 'MyString || YourString' ebenfalls NULL (sogar wenn YourString nicht-NULL) ist, usw ...

Sehen wir uns nun die folgenden PSQL (Procedural SQL) Beispiele mit IF-Bedingungen etwas näher an:

  • if (a = b) then
    MyVariable = 'Equal';
    else
    MyVariable = 'Not equal';

Nach Ausführen dieses Codes, wird MyVariable 'Not equal' sein, falls beide a und b NULL sind. Der Grund dafür ist, dass 'a = b' NULL ist, falls zumindest eine der beiden ebenfalls NULL ist. Falls das Ergebnis einer if-Anweisung NULL ist, dann verhält sich das wie false: das heißt, der 'then' Block wird übersprungen und der 'else' Block wird ausgeführt.

Warnung: Obwohl sich der Ausdruck in diesem Fall wie false verhält, ist dieser trotzdem NULL. Wenn Sie nun versuchen mit einem not() eine Negation des Ausdrucks durchzuführen, dann bekommen Sie wiederum NULL und nicht true als Ergebnis!

  • if (a <> b) then
    MyVariable = 'Not equal';
    else
    MyVariable = 'Equal';

Hier wird MyVariable gleich 'Equal' sein, falls a NULL ist und b nicht, oder umgekehrt. Die Erklärung hierfür ist identisch zu der im vorherigen Beispiel.

Das DISTINCT Schlüsselwort kommt uns hier zu Hilfe!

Firebird 2 implementiert eine neue Verwendung des DISTINCT Schlüsselworts, das Ihnen einen Test auf (Un)Gleicheit unter Berücksichtigung von NULL ermöglicht. Die Semantik sieht wie folgt aus:

  • Zwei Ausdrücke sind unterschiedlich (DISTINCT), falls diese unterschiedliche Werte besitzen oder wenn einer der beiden Ausdrücke NULL ist und der Andere nicht;
  • Zwei Ausdrücke sind nicht unterschiedlich (NOT DISTINCT), falls diese die gleichen Werte besitzen oder wenn beide Ausdrücke NULL sind.

Beachten Sie: Falls keiner der beiden Ausdrücke NULL ist, dann verhält sich DISTINCT wie der "<>" Operator, und NOT DISTINCT wie der "=" Operator.

DISTINCT und NOT DISTINCT geben immer true oder false zurück und nie NULL.

Unter Verwendung von DISTINCT, kann das erste PSQL Beispiel wie folgt geändert werden:

 if (a is not distinct from b) then
   MyVariable = 'Equal';
 else
   MyVariable = 'Not equal';

Und das zweite Beispiel:

 if (a is distinct from b) then
   MyVariable = 'Not equal';
 else
   MyVariable = 'Equal';

Diese Versionen werden Ihnen die Ergebnisse liefern, die man sich erwarten würde, unabhängig davon, ob NULLs involviert sind oder nicht.

Mehr über NULLs

Eine Fülle an weiteren Informationen über das Verhalten von NULL, kann im Firebird Null Guide gefunden werden. Dieser befindet sich hier:

http://www.firebirdsql.org/manual/nullguide.html (HTML)
http://www.firebirdsql.org/pdfmanual/Firebird-Null-Guide.pdf (PDF)

Anmerkung: Zum Zeitpunkt des Verfassens dieser Schnellanleitung wird der Firebird Null Guide für Firebird 2 erweitert. Die neue Version wird vermutlich im Oktober oder November 2006 erhältlich sein.

Siehe auch:
Datenbank registrieren
Datenbank erzeugen

zurück zum Seitenanfang
<< Serverkonfiguration und -management | Firebird 2 Schnellanleitung | Vermeidung von Datenverlust >>