Generatoren / Sequenzen

Forum für neue Firebird-Anwender.

Moderator: thorben.braun

Antworten
Firethustra
Beiträge: 5
Registriert: Mi 20. Jan 2021, 19:45

Hallo und guten Abend!

Ich habe mal paar Fragen zu Generatoren.

Wie kann ich über den SQL-Befehl "Create Table" die Verwendung eines zuvor selbst erzeugten Generators/Sequenz und eines Triggers für Autoincrement-Aufgaben verwenden? Wenn ich auf Linux oder Windows mit Flamerobin unter Properties einen Generator und einen Trigger erzeugen lassen will, dann erscheint die Meldung wie auf dem Screenshot:
Flamerobin.png
Flamerobin.png (165.48 KiB) 10547 mal betrachtet
Can not get Domain Info. Deswegen wollte ich Generator und Trigger vorab erstellen und dann per Create Table mitgeben. Den Teil der Frage konnte ich mir aber gerade selber beantworten. Man erzeugt die Tabelle mit ihrer PK-Spalte, dann den Generator und zum Schluß den Trigger zur Spalte und Generator. Aber warum funktioniert es nicht mit Flamerobin?

Ich wüsste nämlich gerne welcher Generator zu welcher Tabelle bzw. zu welchem PK-der Tabelle gehört, denn ich würde gerne nach Tests ggf. Bereinigungen durchführen und die PK's in den Tabellen neu starten...

Ab Firebird 3 geht wohl auch "generated by default as identity". Das erzeugt eine Sequenz mit Namen RDB$1, RDB$2 usw. Gibt es hier die Möglichkeit die RDB$-Kennzeichnungen umzubenennen, damit sie besser zu den PK's der Tabellen dargestellt werden können? Wenn das nicht geht: Wie bekomme ich heraus welche RDB$-Sequenz zu welcher Tabelle gehört?

Vielen Dank und viele Grüße

Firethustra
bfuerchau
Beiträge: 582
Registriert: Mo 7. Mai 2018, 18:09
Kontaktdaten:

Ein Generator ist nicht an eine Tabelle gebunden, denn mit der Funktion "Next Value For GeneratorName" erhältst du die nächste Nummer.
https://firebirdsql.org/refdocs/langref ... uefor.html

Somit machst du im
Insert MyTable (GeneratorFeld, F1, ....) values(Next Value For GeneratorName, Wert1, ...)
deinen Insert. Es hindert dich niemand, einen anderen Wert zu schreiben oder den Generator für mehrere Tabellen oder auch Zwecke zu verwenden.
Alternativ gibts noch die Function Gen_Id().
https://firebirdsql.org/refdocs/langref ... en_id.html

https://firebirdsql.org/file/documentat ... geber.html

Die Identity-Spalte ab 3.0 (wie in anderen DBM's auch) ist da erheblich einfacher.
Einziger Punkt: beim Insert ist die Spalte wegzulassen.

https://www.firebirdsql.org/file/docume ... table.html
Firethustra
Beiträge: 5
Registriert: Mi 20. Jan 2021, 19:45

Vielen Dank für die Antworten.

Als ich angefangen hatte mich mit Firebird zu beschäftigen und nach Autoincrement für den Primärschlüssel gegoogelt habe bin ich hier: https://www.firebirdsql.org/file/docume ... geber.html in Kapitel 4 fündig geworden auch einen Trigger zu erzeugen.

Arbeiten die Systeminternen Generatoren (RDB$1, etc.) auch mit Triggern zusammen? Sprich: Wird bei Erzeugung von RDB$1 auch ein Trigger miterzeugt?

Habe ich das richtig Verstanden, dass es einfach nur "bequemer" ist den Systeminternen Generator zu nutzen, weil man die Identity-Spalte beim Insert weglassen kann?

Vielen Dank!
Benutzeravatar
martin.koeditz
Beiträge: 506
Registriert: Sa 31. Mär 2018, 14:35

Guten Morgen,

bei Nutzung der Identity-Spalte werden intern ebenfalls Generator und Trigger erzeugt. Dabei wird also das gleiche Prozedere durchgeführt, wie sonst manuell. Dabei kann der Name jedoch nicht angepasst werden.

Bei Identity-Spalten ist das Ziel nur eine eindeutige Kennung zu erhalten. Also wird mit 1 inkrementiert und dieser Wert zugewiesen. Dies entspricht GEN_ID(<Sequenzname>, 1).
Wenn du spezielle Sequenzen nutzen möchtest (z.B. GEN_ID(<Sequenzname>, 5)), musst du selbst einen passenden Trigger entwerfen.

Warum Flamerobin hier einen Fehler meldet, kann ich dir leider nicht sagen.

Wie bfuerchau schon geschrieben hat: ein Generator / eine Sequenz hält nur einen Wert. Dieser kann mittels GEN_ID() manipuliert werden. Generatoren laufen außerhalb von Transaktionen. Geänderte Werte können somit nicht per Rollback zurückgenommen werden.

Wenn weitere Fragen bestehen, gerne melden.
Martin Köditz
SynDesk SW GmbH
Antworten