2017-12-20 4 views
1

Ich versuche einen Trigger auf firebird 2.5 zu erstellen, um eine Spalte zu aktualisieren, wenn eine andere Spalte aktualisiert wird. Ich habe eine einfache Beispieltabelle für meine Versuche erstellt.Versuchte Aktualisierung des schreibgeschützten Spaltenfehlers bei AFTER UPDATE-Trigger

create tablea (estado char(1), fl_previa_laudo char(1)); 

Und mein Trigger ist wie folgt aus:

create trigger ATUALIZA_PREVIA_AI for TABLEA 
active after update position 0 
as 
begin 

if(old.estado in ('3', '4', '7', '8')) then 
    new.fl_previa_laudo = 'T'; 
else 
    new.fl_previa_laudo = 'F'; 
end; 

Und wenn ich den Auslöser es gibt einen Fehler aus:

can't format message 13:849 -- message file C:\Windows\firebird.msg not found. attempted update of read-only column.

Antwort

1

Sie versuchen, eine Spalte in einem AFTER UPDATE Trigger zu ändern aber das ist nicht möglich. Wenn Sie einen Wert ändern möchten, müssen Sie einen BEFORE UPDATE Trigger verwenden. Siehe Firebird documentation on triggers, speziell (Hervorhebung von mir):

The NEW and OLD variables are subject to some rules:

  • In all triggers, the OLD value is read-only
  • In BEFORE UPDATE and BEFORE INSERT code, the NEW value is read/write, unless it is a COMPUTED BY column
  • In INSERT triggers, references to the OLD variables are invalid and will throw an exception
  • In DELETE triggers, references to the NEW variables are invalid and will throw an exception
  • In all AFTER trigger code, the NEW variables are read-only

Mit anderen Worten, ein before update Trigger können Sie Werte ändern, bevor die Zeile beibehalten wird, während ein after update Trigger ausgelöst wird, nachdem der Reihe beibehalten wurde, so dass Sie Siehe die endgültigen Werte.

+0

Es funktioniert !!! Vielen Dank Alter!!! –

+0

@diegopereira Wenn meine Antwort zur Lösung Ihres Problems beigetragen hat, dann akzeptieren Sie bitte meine Antwort, indem Sie auf die Schaltfläche "Akzeptieren" (Häkchen) klicken. –

Verwandte Themen