Plsql oracle DDL触发器
下面是我的问题。我想获取表中新创建的列,用于审计目的。因此,我创建了一个DDL触发器来捕获事件。但触发器不适用于已添加的列。已正确捕获Drop column事件,但未捕获add column。有人能帮我吗? 我尝试使用“模式上的更改后”TAT也不起作用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
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触发器中的列(并将其保存到某个“全局”区域,例如:包变量),并异步启动作业。在作业中,您可以将实际列与保存的集进行比较。我本人未尝试上述任何操作。他们说,需要异步作业,因为有时,新列在用户选项卡列中不可用,甚至在后触发器中也不可用。至少我在研究中发现了这一点。:)