Thema: Delphi Primarykey, wie vergeben

Einzelnen Beitrag anzeigen

Elvis

Registriert seit: 25. Nov 2005
Ort: München
1.909 Beiträge
 
Delphi 2010 Professional
 
#16

Re: Primarykey, wie vergeben

  Alt 16. Sep 2006, 20:34
Einfach in IBExpert autoinc in der Columns view anklicken. Dort legt er für dich die Trigger an.

Ansonsten kann ich dir bei Firebird 2 nur empfehlen nicht auf alles zu hören, ws die alten FB-Hasen sagen.

Firebird 2 hat eine returning clause, das heißt du kannst dir direkt aus einem INSERT den neuen PrimaryKey holen, den ein Trigger besetzt hat.
Dadurch kannst du die Lücke schließen, die der Standard-Trigger aus IBExpert (also auch Hansas) offen lässt.
In diesem klassischen IB/FB-PK-Trigger wird nur dann der PK aus dem Generator geholt wenn kein Wert für den PK angegeben wurde.
IMHO ist das ziemlich fehleranfällig, da später eine Kollision entstehen kann.

Stell' dir vor, dein Generator steht auf 3. Bei einem INSERt wird jetzt aber eine 5 für den PK eingefügt.
Der blauäugige Trigger von oben wird den Wert in deine Tabelle lassen und alles scheint Friede-Freude-Eierkuchen.
Jetzt werden noch 2 Datensätze angelegt, bei denen kein Wert für den PK angegeben wurde.
  1. Generatorwert 3 + 1 -> 4 als PK in die Tabelle -> ok
  2. Generatorwert 4 + 1 -> 5 in die Tabelle -> kaboom!
    5 wurde vorhin schon eingefügt!

Oki, was machen?
Du lässt dir natürlich weiterhin den Trigger von IBExpert anlegen. (Man ist ja faul )
IBExpert lässt dich aber direkt den Code editeren und du löschst die Zeile mit dem "if :new.blabla is null then" einfach raus.

Ein INSERT sieht jetzt so aus:
SQL-Code:
INSERT INTO DeineTabelle
(
  SomeField
)
VALUES
(
  :SomeField
)
RETURNING ID INTO :ID
Solange der Trigger läuft kannst du dir nun sicher sein immer einen korrekten PK einzufügen und du bekommst in auch direkt bei einem INSERT zuück.

Zitat von BenjaminH:
Was bedeutet
Code:
SET TERM ^ ;
und wofür sind die ganzen ^
Du legst am Anfang eines Skriptes fest was der Statement seperator ist.
Jedesmal wenn dieser String auftaucht wird das Schnipselchen davor als einzelnes Statement abgesetzt.
Robert Giesecke
I’m a great believer in “Occam’s Razor,” the principle which says:
“If you say something complicated, I’ll slit your throat.”
  Mit Zitat antworten Zitat