数据库上的 Oracle ddl 触发器
Posted
技术标签:
【中文标题】数据库上的 Oracle ddl 触发器【英文标题】:Oracle ddl trigger on database 【发布时间】:2020-11-30 09:07:21 【问题描述】:我有关于我的 ddl 触发器的问题:
create or replace trigger audit_ddl_db_trg after ddl on database
begin
DECLARE
n number;
stmt varchar2(4000);
sql_text ora_name_list_t;
begin
dbms_output.put_line(ora_sql_txt(sql_text));
n := ora_sql_txt(sql_text);
IF nvl(n,200)=200 THEN
Raise_application_error(-20001, 'ora_sql_txt does not catch any statement. sql_txt is not initialized');
ELSE FOR i IN 1..n LOOP
stmt := stmt || sql_text(i);
END LOOP;
dbms_output.put_line(stmt);
END IF;
IF ora_sysevent <> 'TRUNCATE'
THEN
if (ora_sysevent='TRUNCATE')
then
null; -- I do not care about truncate
else
insert into audit_ddl(date_of_change,osuser,current_user,host,terminal,owner,object_type,object_name,ora_sysevent,sqltext)
values(
systimestamp,
sys_context('USERENV','OS_USER') ,
sys_context('USERENV','CURRENT_USER') ,
sys_context('USERENV','HOST') ,
sys_context('USERENV','TERMINAL') ,
ora_dict_obj_owner,
ora_dict_obj_type,
ora_dict_obj_name,
ora_sysevent,
stmt
);
end if;
end if;
end;
end;
Trigger 可以正确捕获所有内容,我的表中确实填充了所有内容,但我确实有与列 current_user 相关的问题。无论我在数据库中使用哪个用户模式来进行更改,它都会写入 SYS.如何使用已在表上进行更改的正确用户填充此内容?
谢谢!
【问题讨论】:
【参考方案1】:sys_context('USERENV','CURRENT_USER')
根据 oracle 文档返回权限当前处于活动状态的数据库用户的名称。
您可以使用SESSION_USER
代替CURRENT_USER
。
【讨论】:
以上是关于数据库上的 Oracle ddl 触发器的主要内容,如果未能解决你的问题,请参考以下文章