Zitat von
Elvis:
Nicht zu schnell widersprechen!
(
)
Oh, doch!
Zitat von
Elvis:
Und ich hoffe, dass du in der Doku deiner Software hinterlegt hast, dass niemand einen Wert für die ID angibt, außer er hat ihn vorher zu Fuss aus dem Generator geholt.
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.
Das Holen der ID über
select GEN_ID(GEN_..._ID, 1) from rdb$database
erfolgt durch das Programm direkt vor dem Absetzen des Insert-Statements und ist in
keinem Fall dem Benutzer überlassen.
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 von
Elvis:
Natürlich braucht man den Trigger, er sollte die ID aber bedingungslos aus dem Generator setzen, auch wenn beim Insert schon ein Wert dafür angegeben wurde.
Dazu folgendes Szenario:
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
Zitat von
Elvis:
Hatte ich das wirklich so unverständlich geschrieben?
Nein, nicht unverständlich, aber ich denke, dass ich Recht habe.
Es ist also keine dunkle Ära, man muss nur die Augen aufmachen, damit es hell wird!
Schöne Pfingsten
alex