Firebird Documentation Index → Firebird 2 Schnellanleitung → 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.
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.
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
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).
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.
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.
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;↵
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.
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.
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.
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.
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.
Um eine Datenbank interaktiv mit der
isql Kommandoshell zu erstellen, gehen Sie
in das Firebird's 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
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';↵
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 datto 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.
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.
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
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.
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!
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 voran:
'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, Expressions involving NULL, über das Verketten von Ausdrücken mit
NULL
.
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!
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 nicht-begrenzten Bezeichnern. Somit ist es kein Problem, dass Schlüsselwörter von einer alten Datenbank verwendet werden, sofern Sie dafür eine Notwendigkeit sehen.
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.
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.
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.
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.
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 NULL
s
involviert sind oder nicht.
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)
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.
Firebird Documentation Index → Firebird 2 Schnellanleitung → Arbeiten mit Datenbanken |