Hi,
Zitat von
Elvis:
Vor Firebird 2.0 war kein konsistentes Handling von generator-basierten Pks möglich.
Erst die neue Returning-Clause erlaubt es.
Das ist nicht richtig!
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:
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
3. Wenn es das Programm noch vor dem Absetzen eines Statements eine neue ID erfordert, z.B. für ein Insert
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):
select GEN_ID(GEN_PRODUKTE_ID, 1) from RDB$DATABASE
Ich brauche also keine extra SP und ein "konsistentes Handling von generator-basierten Pks"
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