L
o
a
d
i
n
g
.
.
.

ホーム

お知らせ

製品・ソリューション

サービス

導入事例・パートナー

EXEM Academy・ブログ

会社情報

採用情報

2018.07.26

Ddl trigger

目次

  • 1. DDL Triggerとは
  • 2. 使用例
  • 3. 関連情報


  • 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 
    

PHP Code Snippets Powered By : XYZScripts.com