Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Oracle SQL trigger on update of column

Tags:

sql

oracle

I'm trying to create a trigger for my table which automatically adds a published date based on when a certain flag is set to 'Y'

I don't have much experience with creating triggers but so far this is what i've got

  create or replace
  TRIGGER ADD_CREATE_DT 
  after UPDATE of approved ON articles 
  for each row
  BEGIN
  :new.create_dt := sysdate where approved = 'Y';
  END;

I get this error when updating the column

trigger 'USER.ADD_CREATE_DT' is invalid and failed re-validation

Any ideas?

Thanks

like image 631
Jamie Taylor Avatar asked Nov 02 '11 14:11

Jamie Taylor


3 Answers

Use the WHEN clause:

create or replace
  TRIGGER ADD_CREATE_DT 
  after UPDATE of approved ON articles 
  for each row
  when (new.approved = 'Y')
  BEGIN
  :new.create_dt := sysdate;
  END;

Or use IF:

create or replace
  TRIGGER ADD_CREATE_DT 
  after UPDATE of approved ON articles 
  for each row
  BEGIN
  if :new.approved = 'Y' then
   :new.create_dt := sysdate;
  end if;
  END;

In this case, WHEN is more appropriate and efficient.

like image 153
Tony Andrews Avatar answered Oct 20 '22 05:10

Tony Andrews


create or replace
  TRIGGER ADD_CREATE_DT 
  after UPDATE of approved ON articles 
  for each row
  BEGIN
    IF :NEW.approved = 'Y' THEN
      :new.create_dt := sysdate;
    END IF;
  END;
like image 36
schurik Avatar answered Oct 20 '22 03:10

schurik


I don't know What version of Oracle do you use? In Oracle 10g I got the following error:

ORA-04084: cannot change NEW values for this trigger type
04084. 00000 -  "cannot change NEW values for this trigger type"
*Cause:    New trigger variables can only be changed in before row
           insert or update triggers.
*Action:   Change the trigger type or remove the variable reference.

It does not allow to change the field on AFTER triggers.

like image 22
Jeff_Alieffson Avatar answered Oct 20 '22 05:10

Jeff_Alieffson