Firebird Dokumentation → Firebird Datenbank Dokumentation → Firebird Generatoren-Ratgeber → SQL-Befehle für Generatoren |
Der Name des Generators muss ein üblicher Bezeichner für DB-Objekte sein: 31 Zeichen Maximallänge, keine Sonderzeichen mit Ausnahme des Unterstrichs „_“ (es sei denn, man verwendet "delimited identifier", d.h. Bezeichner in Anführungsstrichen). Die SQL-Befehle für Generatoren sind unten aufgeführt. Ihre Verwendung wird detailliert im Abschnitt Verwendung der Generator-Befehle beschrieben.
DDL (Data Definition Language) - Befehle:
CREATE GENERATOR <name>; SET GENERATOR <name> TO <value>; DROP GENERATOR <name>;
DML (Data Manipulation Language) Befehle in Client-seitigem SQL:
SELECT GEN_ID( <GeneratorName>, <increment> ) FROM RDB$DATABASE;
DML Anweisungen in PSQL (Procedural SQL, verfügbar in Stored Procedures und Triggern):
<intvar> = GEN_ID( <GeneratorName>, <increment> );
Auch wenn die traditionelle Syntax weiter unterstützt wird, sind dies die für Firebird 2 bevorzugten Äquivalente der DDL-Befehle:
CREATE SEQUENCE <name>; ALTER SEQUENCE <name> RESTART WITH <value>; DROP SEQUENCE <name>;
Und für die DML-Befehle:
SELECT NEXT VALUE FOR <SequenceName> FROM RDB$DATABASE;
<intvar> = NEXT VALUE FOR <SequenceName>;
Derzeit unterstützt die neue Syntax ausschliesslich ein Inkrement von 1. Diese Einschränkung wird in einer zukünftigen Version aufgehoben. In der Zwischenzeit kann man die GEN_ID-Syntax nutzen, falls man einen anderen Inkrement benötigt.
Die Verfügbarkeit der Befehle und Funktionen hängt davon ab, wo man sie benutzt:
In Client-seitigem SQL – die Sprache, in der der Client mit dem Firebird-Server kommuniziert.
PSQL – Die Server-seitige Programmiersprache, die in Stored Procedures und Triggern verwendet wird.
CREATE GENERATOR <GeneratorName>;
Für Firebird 2 und höher bevorzugt:
CREATE SEQUENCE <SequenceName>;
Nicht möglich. Da man die Metadaten der Datanbank innerhalb von SPs und Triggern nicht ändern kann, kann man hier auch keine Generatoren erzeugen
Seit FB 1.5 und aufwärts kann man dies durch die Verwendung des EXECUTE STATEMENT-Features umgehen.
SELECT GEN_ID( <GeneratorName>, 0 ) FROM RDB$DATABASE;
Diese Syntax ist auch in Firebird 2 derzeit die einzige Option.
In Firebird's Kommandozeilen-Werkzeug isql gibt es zwei weitere Befehle zum Auslesen der aktuellen Generatorwerte::
SHOW GENERATOR <GeneratorName>; SHOW GENERATORS;
Der erstere zeigt den aktuellen Wert des angegeben Generators, letzterer tut dies für alle Nicht-System-Generatoren in der Datenbank.
Die für Firebird 2 bevorzugten Äquivalente sind, man ahnt es schon:
SHOW SEQUENCE <SequenceName>; SHOW SEQUENCES;
Nochmals der Hinweis: Diese SHOW-Befehle stehen nur in isql zur Verfügung. Anders als GEN_ID, können sie nicht in Client-seitigem SQL verwendet werden (es sei denn, die Client-Anwendung ist eine isql-Oberfläche oder Frontend).
<intvar> = GEN_ID( <GeneratorName>, 0 );
Firebird 2: Gleiche Syntax.
Genau wie das Ermitteln des aktuellen Werts wird dies mittels GEN_ID errecicht, diesmal aber mit einem Inkrement von 1. Firebird wird:
den aktuellen Generatorwert holen;
ihn um 1 inkrementieren (und speichern);
den inkrementierten Wert zurückliefern
SELECT GEN_ID( <GeneratorName>, 1 ) FROM RDB$DATABASE;
Die neue, für Firebird 2 empfohlene Syntax, ist völlig verschieden:
SELECT NEXT VALUE FOR <SequenceName> FROM RDB$DATABASE;
<intvar> = GEN_ID( <GeneratorName>, 1 );
Für Firebird 2 und höher bevorzugte Syntax:
<intvar> = NEXT VALUE FOR <SequenceName>;
SET GENERATOR <GeneratorName> TO <NewValue>;
Dies ist nützlich, um einen Generator auf einen anderen als den Standardwert 0, nach der Erzeugung vorzubelegen, z.B. in einem Skript, um die Datenbank zu erzeugen. Genau wie CREATE GENERATOR ist dies ein DDL- und kein DML-Befehl.
Für Firebird 2 und höher bevorzugte Syntax:
ALTER SEQUENCE <SequenceName> RESTART WITH <NewValue>;
GEN_ID( <GeneratorName>, <NewValue> - GEN_ID( <GeneratorName>, 0 ) );
Dies ist mehr ein mieser kleiner Trick um etwas zu tun, was man in SPs und Triggern niemals tun sollte: Generatoren (über-)schreiben. Sie sind zum Generieren (Lesen) und nicht zum Setzen (Schreiben) da.
DROP GENERATOR <GeneratorName>;
Für Firebird 2 und höher bevorzugte Syntax:
DROP SEQUENCE <SequenceName>;
Nicht möglich, es sei denn... (Gleiche Erklärung wie bei CREATE: man kann - oder besser: sollte keine Änderung an den Metadaten in PSQL vornehmen).
Einen Generator zu Löschen gibt den von ihm belegten Platz, für die Verwendung durch einen neuen Generator, nicht wieder frei. In der Praxis stört dies kaum, da kaum eine Datenbank die Zigtausend Generatoren braucht, die Firebird zulässt, so dass es immer noch genügend Platz für neue gibt. Sollte die Datenbank aber doch Gefahr laufen, die 32767er Grenze zu erreichen, kann man den verbrauchten Platz durch einen Backup-Restore-Zyklus wiedergewinnen. Dies wird die RDB$GENERATORS-Tabelle komprimieren, unter Zuweisung einer neuen, lückenlosen Reihe von IDs. Abhängig von der Situation kann die wiederhergestellte Datenbank unter Umständen auch weniger Seiten zur Speicherung der Generatorwerte brauchen.
Sowohl InterBase 6 und frühere als auch frühe Prä-1.0-Firebird-Versionen kennen keinen DROP GENERATOR-Befehl. Die einzige Möglichkeit zum Löschen eines Generators in diesen Versionen ist:
DELETE FROM RDB$GENERATORS WHERE RDB$GENERATOR_NAME = '<GeneratorName>';
...gefolgt von einem Backup und Restore.
In diesen Versionen war es durch die auf wenige hundert begrenzte Anzahl verfügbarer Generatoren wahrscheinlicher, dass man den Platz für gelöschte Generatoren durch Backup/Restore zurückgewinnen musste.
Firebird Dokumentation → Firebird Datenbank Dokumentation → Firebird Generatoren-Ratgeber → SQL-Befehle für Generatoren |