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:
- einem Servernamen oder einer IP-Adresse
- einem Doppelpunkt (":")
- 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.
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 nimmtisql
an, dass die Anweisung in der nächsten Zeile fortgesetzt wird und erwartet Ihre weitere Eingabe, indem sichSQL>
aufCON>
ä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 demCON>
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 Benutzerfirebird
) 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.
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 derCONNECT
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 Benutzerfirebird
) 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.
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:
- und alles großgeschrieben wurde,
- und kein Schlüsselwort ist, und
- 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.
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ückeNULL
ist und der Andere nicht; - Zwei Ausdrücke sind nicht unterschiedlich (
NOT DISTINCT
), falls diese die gleichen Werte besitzen oder wenn beide AusdrückeNULL
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 NULL
s involviert sind oder nicht.
Mehr über NULL
s
Eine Fülle an weiteren Informationen über das Verhalten von NULL
, kann im Firebird Null Guide gefunden werden. Dieser befindet sich hier:
https://www.firebirdsql.org/manual/nullguide.html (HTML)
https://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 >>