Run DDL statement in a DDL trigger

oracle prevents running a DDL statement in a DDL trigger. if you try to run a ddl statement in DDL trigger error ORA-30511 will thrown from Oracle.

ORA-00604: error occurred at recursive SQL level 1
ORA-30511: invalid DDL operation in system triggers

In my case I try to give grant privilege to user B when user A creates table. but 30511 error block me. After some googling this blog rescued me. Anyway I will also share the solution on my blog, here it is:

create or replace procedure execute_grant(v_ddl in varchar2)
 is
 begin
 
   execute immediate v_ddl;
 
 end;
 /


create or replace trigger ddl_trigger_test
  after create on A.SCHEMA
  declare
    v_ddl   varchar2(4000);
    v_job   number;
  begin
    if ora_dict_obj_owner = 'A' and ora_dict_obj_type = 'TABLE' then
      v_ddl := 'grant select,insert,update,delete on ' || ora_dict_obj_owner || '.' || ora_dict_obj_name || ' to B';
    end if;

  --create a one time running job
    dbms_job.submit(job => v_job, what =>  'execute_grant(''' || v_ddl || ''');', nextdate => sysdate+(5/24/60/60), interval => null);
	
  end;
  /

if you want to create a dbms_schedular job please use this notation for a one time running job

  begin
    dbms_scheduler.create_job 
    (  
      job_name      =>  'One_Time Running Job',  
      job_type      =>  'PLSQL BLOCK',  
      job_action    =>  'execute_grant(''' || v_ddl || ''');',  
      start_date    =>  sysdate + (5/24/60/60),  
      enabled       =>  TRUE,  
      auto_drop     =>  TRUE,  
      comments      =>  'one time running job');
  end;
  /

and maybe you want to create trigger for ddl operation on view, procedure, e.g. this link give you an idea for events and objects that you can use in ddl trigger.

Leave a comment