Zitat von
alex517:
Zitat von
Elvis:
Nicht zu schnell widersprechen!
(
)
Oh, doch!
Gibst nicht auf was?
Zitat von
alex517:
Zitat von
Elvis:
Natürlich braucht man den Trigger, er sollte die ID aber bedingungslos aus dem Generator setzen, auch wenn beim Insert schon ein Wert dafür angegeben wurde.
Dazu folgendes Szenario:
Ich generiere eine NEUE Rechnung (Rech) mit Rechnungsposten (RPosten) im Formular.
Da Rech- und RPosten-Daten in einer Transaktion gespeichert werden müssen, benötige ich vorher die ID der Rechnung, um diese
in den RPosten-Daten als Link(FK) auf die Rech eintragen zu können. Ich hole mir, wie oben beschrieben, explizit eine neu ID, und gebe diese beim Insert sowohl der Rechnung als auch den RPosten mit.
Fertig!
Also die Rechungsposten haben einen FK auf die Rechung? Das heißt die Rechung muss existieren bevor du den Rechnungsposten einfügen kannst? Wenn du jetzt mit Ja/Ja antwortest, dann war das kein Grund diese potentielle Schlüsselverletzung im Trigger zu lassen.
Pseudo code:
Delphi-Quellcode:
using transaction := deineConnection.BeginTransaction() do
begin
using command := connection.CreateCommand() do
begin
command.CommandText := 'INSERT INTO Rechungen(blabla) VALUES(:Blabla) RETURINNG ID';
command.Parameters.Add('Blabla', 1);
var rechungsId := command.ExecuteScalar() as Integer;
command.CommandText := 'INSERT INTO RechungsPostenen(Rechung) VALUES(:Rechung) RETURNING ID';
command.Parameters.Add('Rechung', rechungsId);
var rechungsPostenId := command.ExecuteScalar() as Integer;
...
end;
transaction.Commit();
end;
Zitat:
Äh.., natürlich nur wenn der Trigger nicht einfach bedingungslos der Rechnung eine andere ID verpasst.
Aber den Trigger habe ja ich angelegt und nicht Elvis
Zitat:
Zitat von
Elvis:
Hatte ich das wirklich so unverständlich geschrieben?
Nein, nicht unverständlich, aber ich denke, dass ich Recht habe.
Kann gar nicht sein....
Zitat:
Es ist also keine dunkle Ära, man muss nur die Augen aufmachen, damit es hell wird!
Ganz genau!
Zitat von
mkinzler:
IMHO sind alle Lösungen, welche auf Generatoren aufsetzen gleich gut. Seien es jetzt durch Einsatz eines Triggers, einer SP, direkt im Statement oder dem Einsatz von clientseitiger Komponenten, welche darauf aufsetzen (TZSequence usw.)
Wenn ich 2 Lösungen für ein Problem habe, und die eine mindestens ein weiteres Problem bewirken kann, ohne Vorteile zu bringen...
Dann können nicht beide Lösungen gleich gut sein.