Hier noch meine angepasste Funktion aus meinem Übungsprojekt. (fehlt noch etwas Sicherheit, aber denke erstmal sicher genug)
Legt für die angegebene Tabelle einer Firebird-Datenbank einen individuellen Generator (Sequenz) an. Wird dann von einer Trigger-Funktion als AutoIncrement für das angegebene Feld verwendet. (Hoffe soweit richtig formuliert)
Das ganze wird nach 'CREATE TABLE...' aufgerufen und nimmt an, das pro Tabelle nur ein Autoincremet-Feld nötig ist.
Delphi-Quellcode:
procedure FireBirdAutoInc(
const zConnection: TZConnection; Table, forField :
String);
var
zQuery : TZQuery;
Column : Integer;
begin
{ TODO :
Prüfen, ob bereits eine Sequenz/Generator mit ensprechendem Namen existiert
Prüfen, ob erfolgreich }
zQuery := TZQuery.Create(Application);
try
with zQuery
do
begin
// Verbindung festlegen und prüfen
Connection := zConnection;
if Assigned(Connection)
and Connection.Connected
then
begin
// Generator erzeugen
SQL.Text := '
CREATE GENERATOR '+Table+'
_AUTOINC;';
ExecSQL;
// Generator mit Spalte verbinden
SQL.Text := '
SET GENERATOR '+Table+'
_AUTOINC TO 0';
ExecSQL;
// Trigger definieren
SQL.Clear;
SQL.Add('
CREATE TRIGGER AUTOINC_TRG for '+Table);
SQL.Add('
active before insert position 0';
SQL.Add('
as');
SQL.Add('
begin');
SQL.Add('
new.'+forField+'
= gen_id( '+Table+'
_AUTOINC, 1 );');
SQL.Add('
end');
ExecSQL;
end;
// if Assigned...
end;
// with zQuery do
finally
zQuery.Free;
end;
end;
Etwas unsicher bin ich nur noch, ob "zQuery.Connection.GetColumnNames" auch immer die richtige Reihenfolge der Spalten übergibt. Also ob die ermittelte "Column" sicher ist.