catch-img

DDL Trigger - 日本エクセム株式会社 Oracle 技術情報


目次[非表示]

  1. 1.基本情報
  2. 2.使用例
    1. 2.1.DDL Triggerを利用してのDDL追跡
  3. 3.関連情報


基本情報

 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



CONTACT

他社に頼らず自社でデータベースを監視・運用をしませんか?
MaxGaugeがサポートします

お役立ち資料は
こちらから

不明点がある方は、
こちらからお問い合わせください

お電話でのお問い合わせはこちら

平日 10時~18時

人気記事ランキング

タグ一覧