Subject Re: Triggers( after delete ) not working
Author rj1102
> I have this trigger:
>
> CREATE TRIGGER ASSUNZIONI_AIUD0 FOR ASSUNZIONI
> ACTIVE AFTER INSERT OR UPDATE OR DELETE POSITION 0
> AS
> declare data_assunzione date;
> begin
> -- select first date from a table
> select first 1 data_assunzione from assunzioni
> where coll_nominativo = new.coll_nominativo
> order by data_assunzione desc
> into :data_assunzione;
> -- write the date in another table
> update personale set data_assunzione = :data_assunzione where
mycode =
> new.coll_nominativo;
> /* coll_nominativo is the foreign key */
> end
>
> It works ONLY After Insert and after update.
> In after DELETE it fails:
> So I had change it into:
>
> CREATE TRIGGER ASSUNZIONI_AIUD0 FOR ASSUNZIONI
> ACTIVE AFTER INSERT OR UPDATE OR DELETE POSITION 0
> AS
> declare data_assunzione date;
> begin
> if ( ( inserting ) or ( updating ) ) then begin /* 1 */
> select first 1 data_assunzione from assunzioni
> where coll_nominativo = new.coll_nominativo
> order by data_assunzione desc
> into :data_assunzione;
> --
> update personale set data_assunzione = :data_assunzione where
mycode =
> new.coll_nominativo;
> end /* 1 */
> if ( deleting ) then begin /* 1 */
> select first 1 data_assunzione from assunzioni
> where coll_nominativo = old.coll_nominativo
> order by data_assunzione desc
> into :data_assunzione;
> --
> update personale set data_assunzione = :data_assunzione where
mycode =
> old.coll_nominativo;
> end /* 1 */
> end
>
> The last works fine.
> I think there is a problem in.
> Anyone has hints?

This works as designed:)
For a delete the old values are always NULL by design.

You can short cut your code like:

CREATE TRIGGER ASSUNZIONI_AIUD0 FOR ASSUNZIONI
ACTIVE AFTER INSERT OR UPDATE OR DELETE POSITION 0
AS
declare data_assunzione date;
declare nominativo integer = case when deleting then
old.coll_nominativo else new.coll_nominativo end;
begin
select first 1 data_assunzione from assunzioni
where coll_nominativo = coll_nominativo
order by data_assunzione desc
into :data_assunzione;

update personale set data_assunzione = :data_assunzione
where mycode = nominativo;
end;