Hallo,
ich beschäftige mich erst seit einigen Tagen richtig mit
SQL-Datenbanken (FireBird via Zeos). Gerade bei Funktionen, die "innerhalb" der Datenbank ablaufen, hapert es bei mir noch arg mit Wissen und Verständnis.
Ich hab' mir jetzt eine Funktion gebaut (via
DP-Tutorial), die für eine Tabelle in einer FireBird-Datenbank ein AutoIncrement-Feld definiert. Das funktioniert auch soweit gut:
Delphi-Quellcode:
procedure FireBirdAutoInc(
const zConnection: TZConnection; Table, forField :
String);
var
zQuery : TZQuery;
Column : Integer;
begin
{ TODO : Spalten-Nummer anhand Feldnahme ermitteln, statt der statischen 0 }
Column := 0;
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 SetID_AUTOINC;';
ExecSQL;
// Generator mit Spalte verbinden
SQL.Text := '
SET GENERATOR SetID_AUTOINC TO '+IntToStr(Column);
ExecSQL;
// Trigger definieren
SQL.Clear;
SQL.Add('
CREATE TRIGGER AUTOINC_TRG for '+Table);
SQL.Add('
active before insert position '+IntToStr(Column));
SQL.Add('
as');
SQL.Add('
begin');
SQL.Add('
new.'+forField+'
= gen_id( SetID_AUTOINC, 1 );');
SQL.Add('
end');
ExecSQL;
end;
end;
finally
zQuery.Free;
end;
end;
Bei meinem nächsten Übungsprojekt sollen jetzt mehrere Tabellen einer Datenbank ein Autoincrement-Feld bekommen. Da sind mir jetzt ein paar Fragen gekommen, mangels Wissen zu Generator/Trigger. Das Tutorial ist darauf, soweit ich es nicht übersehen habe, auch nicht eingegangen:
"Generator" scheint Global zu sein, also nicht direkt an die Tabelle gebunden, andererseits aber an eine Spaltennummer.
- Wann muss ich einen Generator setzen? Für jedes Autoincrement-Feld jeder Tabelle oder nur einmal, wenn alle Autoincrement-Felder in den verschiedenen Tabellen den gleichen Namen und/oder Spalte haben?
- Wenn nur einmal, wie kann ich ermitteln ob er schon existiert? Ist Abfrage der Systemtabelle RDB$GENERATORS dafür richtig?
- Der Trigger nimmt direkt Bezug auf eine Spalte einer bestimmten Tabelle und muss für jedes einzelne Autoincrement-Feld individuell gesetzt werden?
Hoffe die Antworten sind nicht allzu offensichtlich schon irgendwo hier bereit gelegen, gefunden hab' ich die bisher nicht.
Dokumentationen zu Firebird gibt es massig, sind aber arg zerstückelt. Auch stark auf bereits erfahrene Firebird-Anwender zugeschnitten. Vielleicht hab' ich bisher aber auch nur noch nicht das richtige gefunden.