oracle 10g ddl审计:dbms_metadata上的递归sql发生ora-00604错误

时间:2015-07-10 19:37:59

标签: plsql triggers oracle10g

我想审核应用程序团队在数据库中创建的所有新表。 dba_audit_trail的sql_text列为空,因此我创建了一个过程并触发。

CREATE TABLE bhattd.ddl_logger (
obj_operation varchar2(25),
obj_owner     varchar2(25),
obj_name      varchar2(25),
obj_type      varchar2(25),
obj_text      clob,
obj_when      timestamp);

CREATE OR REPLACE PROCEDURE get_ddl (o_name varchar2, o_owner varchar2, l_sysevent varchar2) authid current_user IS
count_tab number;
BEGIN
SELECT COUNT(*) INTO count_tab FROM sys.dba_tables WHERE table_name = o_name and owner = o_owner;
IF count_tab = 1 THEN
INSERT INTO bhattd.ddl_logger VALUES (l_sysevent, o_owner, o_name, 'TABLE', sys.dbms_metadata.get_ddl('TABLE',o_name,o_owner), systimestamp);
END IF;
END;

第一个问题:如果我在自己的架构(bhattd)中创建一个表,那么该过程可以在没有" authid current_user"的情况下工作。如果我执行

get_ddl('S_UCM_PRIVACY','SIEBEL','CREATE');

然后它失败,除非我包括" authid current_user"在过程定义中,即使我有DBA角色。为什么会这样?

接下来,我创建了触发器:

CREATE OR REPLACE TRIGGER ddl_trigger1 AFTER CREATE ON DATABASE
DECLARE
l_sysevent varchar2(25);
BEGIN
SELECT ora_sysevent INTO l_sysevent FROM dual;
IF ( l_sysevent = 'CREATE' )
THEN
BEGIN
bhattd.get_ddl(ora_dict_obj_name,ora_dict_obj_owner,l_sysevent);
END;
END IF;
END;

现在,如果我尝试在架构" SCOTT"下创建一个表,我会收到此错误:

ORA-00604: error occurred at recursive SQL level 1
ORA-31603: object "T1" of type TABLE not found in schema "SCOTT"
ORA-06512: at "SYS.DBMS_SYS_ERROR", line 105
ORA-06512: at "SYS.DBMS_METADATA", line 2806
ORA-06512: at "SYS.DBMS_METADATA", line 4333
ORA-06512: at line 1
ORA-06512: at "BHATTD.GET_DDL", line 8
ORA-06512: at line 8

第二个问题:我认为它应该没有" authid current_user"基于定义者的权利。然后在添加" authid current_user"之后,我认为这应该基于调用者的权限(我有DBA角色,包括在dbms_metadata上执行,加上我拥有表,过程和触发器) 。为什么会这样?

提前感谢您的回复。

0 个答案:

没有答案