Ddl trigger

目次

DDL Triggerとは

 

DDL Triggerを用いてDDL追跡することができます。

 

使用例

 

DDL Triggerを利用してのDDL追跡

 

DDL Trigger内で使用可能なコンテキスト情報は、次のような一連の関数でアクセス可能です。

・ora_sysevent
・ora_login_user
・ora_dict_obj_type
・ora_dict_obj_owner
・ora_dict_obj_name
・ora_sql_txt

DDL Triggerを利用してDDLを追跡する方法は、以下のMetalink Noteを参照してください。

HOW TO CAPTURE ALL THE DDL STATEMENTS

CREATE TABLE DDL_ACTIONS 
( 
    counter number(38) 
    ,user_name VARCHAR2(4000) 
    ,ddl_date VARCHAR2(26) 
    ,ddl_type VARCHAR2(4000) 
    ,object_type VARCHAR2(4000) 
    ,owner VARCHAR2(4000) 
    ,object_name VARCHAR2(4000) 
    ,sqltext CLOB 
); 


create or replace trigger DDLTrigger 
AFTER DDL ON DATABASE 
declare 
  l_cnt BINARY_INTEGER := 0; 
  l_len integer := 0; 
  l_no integer := 1; 
  l_s varchar2(32767) := ''; 
  l_sql_text ora_name_list_t; 
BEGIN 
  l_cnt := ora_sql_txt(l_sql_text); 
  for i in 1..l_cnt loop 
    if l_cnt = 1 then 
      insert into DDL_ACTIONS 
      ( 
        counter 
        ,user_name 
        ,ddl_date 
        ,ddl_type 
        ,object_type 
        ,owner 
        ,object_name 
        ,sqltext 
      ) 
      VALUES 
      ( 
        i 
        ,ora_login_user 
        ,to_char(systimestamp,'yyyy.mm.dd hh24:mi:ss.FF') 
        ,ora_sysevent 
        ,ora_dict_obj_type 
        ,ora_dict_obj_owner 
        ,ora_dict_obj_name 
        ,l_sql_text(i) 
      ); 
    else 
      if l_len + length(l_sql_text(i)) > 32767 then 
        -- insert 
        insert into 
        DDL_ACTIONS 
        ( 
        counter 
        ,user_name 
        ,ddl_date 
        ,ddl_type 
        ,object_type 
        ,owner 
        ,object_name 
        ,sqltext 
        ) 
        VALUES 
        ( 
        l_no 
        ,ora_login_user 
        ,to_char(systimestamp,'yyyy.mm.dd hh24:mi:ss.FF') 
        ,ora_sysevent 
        ,ora_dict_obj_type 
        ,ora_dict_obj_owner 
        ,ora_dict_obj_name 
        ,l_s 
        ); 
        l_len := length(l_sql_text(i)); 
        l_s := l_sql_text(i); 
        l_no := l_no + 1; 
      else 
        -- concat 
        l_s := l_s||l_sql_text(i); 
        l_len := l_len + length(l_sql_text(i)); 
      end if; 
    end if; 
  end loop; 
  
  if l_s != '' then 
    insert into DDL_ACTIONS 
    ( 
      counter 
      ,user_name 
      ,ddl_date 
      ,ddl_type 
      ,object_type 
      ,owner 
      ,object_name 
      ,sqltext 
      ) 
    VALUES 
    ( 
      l_no 
      ,ora_login_user 
      ,to_char(systimestamp,'yyyy.mm.dd hh24:mi:ss.FF') 
      ,ora_sysevent 
      ,ora_dict_obj_type 
      ,ora_dict_obj_owner 
      ,ora_dict_obj_name 
      ,l_s 
    ); 
  end if; 
end;
/ 

 

関連情報

 

1.Executing DDL in the DDL trigger