Plsql oracle DDL触发器

Plsql oracle DDL触发器,plsql,triggers,Plsql,Triggers,下面是我的问题。我想获取表中新创建的列,用于审计目的。因此,我创建了一个DDL触发器来捕获事件。但触发器不适用于已添加的列。已正确捕获Drop column事件,但未捕获add column。有人能帮我吗? 我尝试使用“模式上的更改后”TAT也不起作用 CREATE OR REPLACE TRIGGER trg_test BEFORE CREATE OR ALTER OR DROP ON SCHEMA DECLARE CURSOR get_column_name(i_owner IN

下面是我的问题。我想获取表中新创建的列,用于审计目的。因此,我创建了一个DDL触发器来捕获事件。但触发器不适用于已添加的列。已正确捕获Drop column事件,但未捕获add column。有人能帮我吗? 我尝试使用“模式上的更改后”TAT也不起作用

CREATE OR REPLACE TRIGGER trg_test
   BEFORE CREATE OR ALTER OR DROP ON SCHEMA
DECLARE
   CURSOR get_column_name(i_owner IN VARCHAR2,i_obj_name IN VARCHAR2)
   IS
      SELECT column_name
        FROM all_tab_columns
       WHERE owner = i_owner AND table_name = i_obj_name;

--   pcolumn_name   dba_tab_columns.column_name%TYPE;
BEGIN
   IF (    ora_dict_obj_type = 'TABLE'
       AND ora_sysevent IN ('ALTER')
       AND ora_dict_obj_owner = 'SYS'
      )
   THEN
      FOR x IN get_column_name(ora_dict_obj_owner ,ora_dict_obj_name)
      LOOP
         IF ora_is_drop_column (x.column_name)
         THEN
            dbms_output.put_line('Deleted column :' || x.column_name);
         END IF;
         IF ora_is_alter_column (x.column_name)
         THEN
            dbms_output.put_line('Newly added column :' || x.column_name);
         END IF;
      END LOOP;

   END IF;
END;
/

实际上,触发器被触发,唯一的问题是Oracle没有ora_is_new_列函数或类似的函数。至少我找不到任何东西

对于我的测试用例,当我执行一个“altertable aaa modify(colbbb…)时,ora_是_alter_列worked property”

我能想到的最佳替代方法是记录“ALTERTABLE语句”:

CREATE OR REPLACE TRIGGER ddl_trigger
BEFORE ALTER ON SCHEMA
DECLARE
 v_sql_text_list  dbms_standard.ora_name_list_t;
 v_sql_text_count binary_integer;
BEGIN
  v_sql_text_count := ora_sql_txt(v_sql_text_list);
  for v_i in 1..v_sql_text_count 
  loop
    dbms_output.put_line('sqltext(' || v_i || ')=' || v_sql_text_list(v_i));
  end loop;
END ddl_trigger;
/

谢谢有没有其他方法获取新添加的列?一种可能是分析触发器中捕获的DDL并提取列名(可以在同一sql中添加多个列,例如:alter table dll_trg_test add(descr2 varchar2(100个字符),descr3 varchar2(400个字符))modify(descr varchar2(1000个字符));另一种可能是捕获before触发器中的列(并将其保存到某个“全局”区域,例如:包变量),并异步启动作业。在作业中,您可以将实际列与保存的集进行比较。我本人未尝试上述任何操作。他们说,需要异步作业,因为有时,新列在用户选项卡列中不可用,甚至在后触发器中也不可用。至少我在研究中发现了这一点。:)