Einzelnen Beitrag anzeigen

Robert_G
(Gast)

n/a Beiträge
 
#12

Re: Autowerte bei Firebird setzen

  Alt 10. Jun 2005, 19:41
Zitat von marabu:
Ich habe immer einen solchen Trigger - und benutze ihn dann nicht. Der Trigger dient bei mir nur der Unterstützung von bulk-load Operationen. Den ID für single record inserts hole ich mir vom Generator und setze ihn in der Anwendung. Auf diese Weise habe ich die ID für meinen Programm-Kontext. Echte AutoInc-Felder machen bei primary key Feldern mehr Probleme als Freude.
Interssant ist die Geschichte von Interbase. eines der ersten "Features", die Borland in IB nach der Übernahme "eingebaut" hatte, war das Entfernen von rüggabewerten aus DML Statements...
Seitdem muss man tatsächlich so vorgehen, wie du es beschrieben hast. In Ora mache ich es meist so:

Delphi-Quellcode:
create or replace trigger X_PkTrig
 before INSERT or UPDATE ON SomeSchema.X
 -- rename New and Old, they could be used as table or column names ...
  REFERENCING New AS New$Rec Old AS Old$Rec
  for each row
begin
  if Inserting then
    -- get next value from sequence
    SELECT SomeSchema.X_PkSeq.NextVal
    INTO :New$Rec.ID
    FROM dual;
  elsIf Updating then
    -- prevent changes of ID
    :New$Rec.ID := :Old$Rec.ID;
  end if;
end SomeSchema.X_PkTrig;
Die ID bekomme ich so:
insert into X (a,b) values (:a,:b) returning id into :id; Wenn man die Cache size der sequence passend wählt macht es sich auch in großen bulk inserts nicht wirklich bemerkbar.
Das schöne an der Methode ist, dass ich sie komplett automatisch ablaufen lassen kann. (Also die Erzeugung von Trigger/Sequence)

btw: Seit wann kann FB Bulk DML?
  Mit Zitat antworten Zitat