Subject | Re: Triggers( after delete ) not working |
---|---|
Author | rj1102 |
Post date | 2004-04-28T14:09:41Z |
> I have this trigger:mycode =
>
> 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
> new.coll_nominativo;mycode =
> /* 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
> new.coll_nominativo;mycode =
> 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
> old.coll_nominativo;This works as designed:)
> end /* 1 */
> end
>
> The last works fine.
> I think there is a problem in.
> Anyone has hints?
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;