![]() |
Re: Firebird : Tabelle erstellen mit AutoInc-Feld
Das steht in Deinem ersten Beitrag, sofern man die überflüssige SP weg lässt. Mehr ist es nicht. Es gilt allerdings, die ID nicht selber einzutragen. Das muss dann schon der Trigger machen, damit auch die MGA greift.
|
Re: Firebird : Tabelle erstellen mit AutoInc-Feld
Ich hätte noch 2 Fragen noch dazu :
1.) Verstehe ich das richtig, wenn ich diesen Teil weglasse
SQL-Code:
Dann kann ich dem Problem aus dem Weg gehen, welches Elvis angesprochen hat ?
SET TERM ^ ;
create procedure sp_gen_produkte_id returns (id integer) as begin id = gen_id(gen_produkte_id, 1); suspend; end ^ SET TERM ; ^ 2.) Und was ist zum Teufel eine Multi-Generationen-Architektur (MGA) ? |
Re: Firebird : Tabelle erstellen mit AutoInc-Feld
Ja, wegen der MGA sollte gar kein Problem entstehen. Die SP ist ein Ersatz für einen vor FB 2.0 nicht vorhandenen Trigger, der auch Rückgabewerte liefert. Werden die überhaupt gebraucht ? Im Normalfall überlässt man die IDs der DB und basta.
|
Re: Firebird : Tabelle erstellen mit AutoInc-Feld
Der Trigger liefert immer noch keinen Rückgabewert, sondern das Insert-Statement. Man kann aber die ID auch vom Client setzen, solange man den Generator verwendet
|
Re: Firebird : Tabelle erstellen mit AutoInc-Feld
Zitat:
|
Re: Firebird : Tabelle erstellen mit AutoInc-Feld
Zitat:
|
Re: Firebird : Tabelle erstellen mit AutoInc-Feld
Hi,
Zitat:
Ich habe generell folgende Vorgehensweise: 1. Alle Tabellen haben ein PK-Feld "ID". 2. Diese ID wird ggf. durch einen Trigger, wie RWarnecke ihn schon verwendet, gesetzt
SQL-Code:
3. Wenn es das Programm noch vor dem Absetzen eines Statements eine neue ID erfordert, z.B. für ein Insert
create trigger produkte_bi for produkte
active before insert position 0 as begin if (new.id is null) then new.id = gen_id(GEN_PRODUKTE_ID,1); end bei Master-Detail Verknüpfungen, so wird diese neue ID vorher explizit durch das Programm geholt. Das kann mittels der verwendeten Komponenten (bei mir FIBPlus) erfolgen oder über eine eigene Query mit folgendem Statement (FIBPlus macht auch nichts anderes):
SQL-Code:
Ich brauche also keine extra SP und ein "konsistentes Handling von generator-basierten Pks"
select GEN_ID(GEN_PRODUKTE_ID, 1) from RDB$DATABASE
ist auch auch vor FB 2.0 gewährleistet. Unter FB2.x kann Rückgabe der ID wie Elvis schrieb mit "INSERT .. RETURNING ID" verfolgen. Damit entfällt der Punkt 3. Den Trigger würde ich aber immer beibehalten. alex |
Re: Firebird : Tabelle erstellen mit AutoInc-Feld
Zitat:
Zitat:
Zitat:
Ansonsten schreibt einer eine 1000 rein und irgendwann, 3 Wochen später, will dein Programm über den friemeligen "Generator abfragen & Wert beim Insert mitgeben"-Weg einen Datensatz einfügen und es knallt! Nun, irgendwann musste der Generator ja die 1000 erreichen. :mrgreen: Zitat:
Hatte ich das wirklich so unverständlich geschrieben? :gruebel: |
Re: Firebird : Tabelle erstellen mit AutoInc-Feld
Zitat:
|
Re: Firebird : Tabelle erstellen mit AutoInc-Feld
Zitat:
Zitat:
SQL-Code:
erfolgt durch das Programm direkt vor dem Absetzen des Insert-Statements und ist in keinem Fall dem Benutzer überlassen.
select GEN_ID(GEN_..._ID, 1) from rdb$database
Da die neue ID durch den selben Generator erzeugt wird, der auch im Trigger Verwendung findet, kann es niemals vorkommen, dass die IDs doppelt vergeben werden. Der Vorgang der ID-Vergabe ist also in beiden Fällen (Trigger/select GEN_ID(..)) identisch, er wird nur falls notwendig in das Programm vorverlegt. Zitat:
Ich generiere eine NEUE Rechnung (Rech) mit Rechnungsposten (RPosten) im Formular. Da Rech- und RPosten-Daten in einer Transaktion gespeichert werden müssen, benötige ich vorher die ID der Rechnung, um diese in den RPosten-Daten als Link(FK) auf die Rech eintragen zu können. Ich hole mir, wie oben beschrieben, explizit eine neu ID, und gebe diese beim Insert sowohl der Rechnung als auch den RPosten mit. Fertig! Äh.., natürlich nur wenn der Trigger nicht einfach bedingungslos der Rechnung eine andere ID verpasst. Aber den Trigger habe ja ich angelegt und nicht Elvis :wink: Zitat:
Es ist also keine dunkle Ära, man muss nur die Augen aufmachen, damit es hell wird! :mrgreen: Schöne Pfingsten alex :cheers: |
Alle Zeitangaben in WEZ +1. Es ist jetzt 15:44 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz