TRIGGER after alter on database и вьюха all_tab_columns

ORAngutang
Дата: 19.11.2009 19:49:45
в триггере:
CREATE OR REPLACE TRIGGER MYS.tr_dll_ws_a after alter on database
...

обращение к:
 select * from all_tab_columns where...

происходит ещё к старым данным (до изменения ALTER TABLE!), хотя триггер и _AFTER_!. (т.е. очевидно что т.н. неявный DDL-сommit происходит после срабатывания триггера)

Как можно обойти сию проблему? т.е. счиатать уже измененные столбцы! (автономная транзакция? старт функционала по джобу?)

____________________________________________________________
сейчас работаю на: Oracle 11.1.0.7.0, 64bit, standard edition, SLES-10. APEX 3.2
ORAngutang
Дата: 19.11.2009 19:51:34
P.S. парзовать ora_sql_txt не предлагать! ;-)
Andrey.L
Дата: 19.11.2009 19:57:08
ORAngutang,

Проблема еще с Oracle 8i.
По-моему проскакивало, что позже в 9i ее починили.
Похоже, проблема опять всплыла ...
ORAngutang
Дата: 20.11.2009 13:00:55
Andrey.L
ORAngutang,

Проблема еще с Oracle 8i.
По-моему проскакивало, что позже в 9i ее починили.
Похоже, проблема опять всплыла ...


кто ещё в теме?
-2-
Дата: 20.11.2009 13:07:08
ORAngutang,

create or replace TRIGGER on_new_table_trigger
after create
on database
/**
* --
*/
declare
   reaction_name on_new_table_actions.name%type;
   exec_sql varchar2(4000);
   cursor reaction_cursor is 
         select * 
           from on_new_table_actions
           where regexp_like(ora_sysevent, action_type)
              and regexp_like(ora_dict_obj_type, obj_type_rex)
              and regexp_like(ora_dict_obj_owner, obj_owner_rex)
              and regexp_like(ora_dict_obj_name, obj_name_rex)
              and state = 'A'
           order by name; 
   function substitution(str varchar2, marker varchar2, value varchar2) return varchar2
   is
      s varchar2(4000);
   begin
      s := str;
      s := replace(s, '${'||marker||'}', value);
      s := replace(s, '${'''||marker||'''}', ''''||replace(value,'''','''''')||'''');
      s := replace(s, '${"'||marker||'"}', '"'||replace(value,'"','""')||'"');
      return s;
   end substitution;
   
   procedure write_err(err varchar2)
   is
   pragma autonomous_transaction;
   begin
      update on_new_table_actions
         set last_failure_date = sysdate, 
             last_failure_text = 'sysevent='||ora_sysevent||', object='||ora_dict_obj_name||' error='||err,
             last_done_sql = exec_sql
         where name = reaction_name;
      commit;
   end;
begin
   for reaction in reaction_cursor loop
      reaction_name := reaction.name;
      exec_sql := reaction.do_actions;
      exec_sql := substitution(exec_sql, 'ora_sysevent', ora_sysevent);
      exec_sql := substitution(exec_sql, 'ora_dict_obj_type', ora_dict_obj_type);
      exec_sql := substitution(exec_sql, 'ora_dict_obj_owner', ora_dict_obj_owner);
      exec_sql := substitution(exec_sql, 'ora_dict_obj_name', ora_dict_obj_name);
      if trim(exec_sql) is not null then
         update on_new_table_actions
            set last_done_sql = exec_sql
            where name = reaction_name;
         dbms_scheduler.create_job (
               job_name    =>  dbms_scheduler.generate_job_name('ON_NEW_TABLE$'), 
               job_type    =>  'PLSQL_BLOCK',
               job_action  =>  exec_sql,
               start_date  => systimestamp,
               enabled     => true,
               comments    => 'ACTION: '||exec_sql);
      end if;
   end loop;
exception
   when others then
      write_err(sqlerrm);
end grants_on_new_table; 
ORAngutang
Дата: 20.11.2009 16:46:44
-2-,

премного благодарствую-с! (навело на восхитительную мысль которая уже успешно работает!) ;-)