Firebird Trigger, die Aktualisierung anderer Felder der Tabelle
Ist es möglich (ich nehme an: ja), um die Aktualisierung anderer Tabelle von trigger (Firebird 2.5).
Ich habe zum Beispiel eine Tabelle X mit trigger nach dem update so:
begin
if (new.CODE<>old.CODE) then
BEGIN
post_event 'CODE_CHANGE';
UPDATE Y SET CODE=10 WHERE ID=1;
END
end
oder
begin
if (new.CODE<>old.CODE) then
BEGIN
post_event 'CODE_CHANGE';
EXECUTE STATEMENT ('UPDATE Y SET CODE=10 WHERE ID=1');
END
end
aber es funktioniert nicht (Tabelle Y nicht ändern).
Vollständige definition der trigger (zum besseren Verständnis)
SET TERM ^^ ;
CREATE TRIGGER ABC FOR X ACTIVE AFTER INSERT OR UPDATE OR DELETE POSITION 0 AS
begin
if (new.CODE<>old.CODE) then
BEGIN
post_event 'CODE_CHANGE';
EXECUTE STATEMENT ('UPDATE Y SET CODE=10 WHERE ID=1');
END
post_event 'CHANGE';
end ^^
Und zweites problem: wie zu geben, parameter zu AKTUALISIEREN, Befehl (für Tabelle Y) - ich meine, ich möchte anstelle des Wertes "10" im obigen code setzen neue.CODE (neuer Wert von Tabelle X) so etwas wie dieses:
UPDATE Y SET CODE=new.CODE WHERE ID=1
Danke für die Ratschläge.
Artik
- Sie enthalten nur die trigger-Körper, was ist die vollständige definition des triggers (z.B. ist das ein VOR-oder ein AFTER UPDATE-trigger). Ich bin nicht sicher, ob es eine Rolle spielt, aber das beste ist, vollständig zu sein.
- Danke, ich setzen (Bearbeiten meine Frage) vollständige definition meiner trigger.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Ja, können Sie Bearbeiten eine Tabelle aus einem trigger, du bist nicht beschränkt auf die Tabelle, die verbunden ist mit dem trigger. Die Frage ist also, warum nicht Ihre
UPDATE
- Anweisung in der dem trigger funktionieren? Ich sehe drei Möglichkeiten:if (new.CODE<>old.CODE) then
- Anweisung. Wenn entwedernew
oderold
Wert dercode
istNULL
diethen
Teil nicht laufen. Finden Sie die Firebird Null Guide für die vollständige Erklärung. Lösung hier wäre, die NutzungDISTINCT
- operator. Natürlich, wenn diecode
Wert hat sich nicht verändert, dann wird die if-Anweisung "nicht" zu, aber das sollte klar sein 🙂 Auch, wenn Sie erhalten dieCODE_CHANGE
Fall können Sie sicher sein, dass, wenn staement läuft.Beachten Sie auch, dass in multi-action-Abzug der NEUE wäre
NULL
wenn der trigger ausgelöst wird durchDELETE
und die ALT wäreNULL
wenn der trigger ausgelöst wird durchINSERT
. Also der Auslöser funktioniert nur wie erwartet, in die Falle der UPDATE-Anweisung. Sie wahrscheinlich wollen, um es zu teilen, die in drei unterschiedliche Auslöser.where
Teil der update fehlschlägt, dh es ist kein Datensatz in der Tabelle Y mit der ID = 1. Mögliche Lösung ist die VerwendungUPDATE-ODER INSERT
- Anweisung.commit
die Transaktion? Wenn Sie Rollen Sie zurück, alle änderungen in allen Tabellen wird ein Rollback ausgeführt, nicht nur in der "Haupt-Tabelle".Als Ihrer zweiten Frage - ja, deine UPDATE-Anweisung sieht OK, es gilt nur der Einsatz von Triggern Kontext-Variablen in eine beliebige Anweisung. Sie können auch andere Variablen) in der Anweisung durch ein Präfix mit Doppelpunkt, dh
NEW
undOLD
Kontext-Variablen mit Doppelpunkt, ist es nur erforderlich, für den "gewöhnlichen" Variablen. Auch bitte immer nach der Fehlermeldung, so haben wir nicht zu quess was es ist.