Hallo zusammen,
mir geht es gerade ähnlich wie moelski. Ich habe zuerst von
Paradox auf
MsSQL umgestellt und teste jetzt Firebird. Beim Transferieren einer
Paradox-Tabelle zu Firebird wurde automatisch u.a. ein Trigger
SQL-Code:
SET TERM ^ ;
ALTER TRIGGER TRIG_DIAS_BI INACTIVE
BEFORE INSERT POSITION 0
AS BEGIN
IF(NEW."ID" IS NULL) THEN NEW."ID" = GEN_ID("GEN_DIAS_ID",1);
END^
SET TERM ; ^
angelegt. Der funktioniert innerhalb FlameRobin auch einwandfrei. Wenn ich jetzt aber in einer Delphianwendung per UniDac TUniQuerry.Insert einen Datensatz anlege und per TUniQuerry.post speichere, kommt die Fehlermeldung dass das Feld ID keinen Wert hat (ID = primarykey = integer = not null). Bei Verwendung von
MsSQL passiert das nicht. Wie kann/muss ich das Programm jetzt aufbauen, dass es sowohl mit Firebird als auch
MsSQL läuft. Der Ansatz
Zitat von
RWarnecke:
Den nächsten Wert eines Triggers kannst Du mit dem folgenden
SQL-Befehl Abfragen
SELECT NEXT VALUE FOR <generator_name> FROM RDB$DATABASE;
Im Feld Gen_ID findest Du dann den nächsten Wert vom Trigger.
ist bei
MsSQL nicht notwendig. Und den Zusatz
Zitat von
RWarnecke:
Edit2 : Aber aufpassen, wenn der SELECT-Befehl ausgeführt wird, dann wird der Trigger angestossen und um eins erhöht. Ich habe dann nochmal den Befehl ALTER SEQUENCE <generator_name> RESTART WITH <ergebnis aus select - 1>;
ausgeführt, damit der Trigger wieder auf dem alten Wert steht.
verstehe ich auch nicht ganz. Ich möchte ja, dass der neue Wert gesperrt ist. Nicht dass ein anderer Anwender ihn auch vergibt.
Wie muss ich das ganze gestalten, dass ich den Code für alle Tabellen einer
DB verwenden kann ohne mich jedes mal aufs neue damit auseinanderzusetzen.
Eiegntlich fehlt mir nur so eine Art Refresh, der nach dem Insert-Befehl mein ID-Feld mit dem generierten Wert belegt. Und der so, dass er sowohl mit
MsSQL und Firebird arbeitet.
Mein Hauptjob ist die Steuerung komplexer Maschinen und die
DB nur ein notwendiges Übel.
Viele Dank für jegliche Unterstützung
Gerd