2010-12-13 71 views
1

如果我这样做,一切都很好:为什么在匿名工作而不是在程序中工作?

declare 
    l_foo clob; 
begin 
select 
regexp_replace(
    dbms_metadata.get_ddl('USER', 'SCOTT', null) || 
    dbms_metadata.GET_GRANTED_DDL ('SYSTEM_GRANT', 'SCOTT') || 
    dbms_metadata.GET_GRANTED_DDL ('OBJECT_GRANT', 'SCOTT') || 
    dbms_metadata.GET_GRANTED_DDL ('ROLE_GRANT', 'SCOTT') 
,'"' || chr(10), '";' || chr(10)) 
into l_foo 
from dual; 
end; 
/

但是,如果我在过程中把这个包:

create procedure tests is 
    l_foo clob; 
begin 
select 
regexp_replace(
    dbms_metadata.get_ddl('USER', 'SCOTT', null) || 
    dbms_metadata.GET_GRANTED_DDL ('SYSTEM_GRANT', 'SCOTT') || 
    dbms_metadata.GET_GRANTED_DDL ('OBJECT_GRANT', 'SCOTT') || 
    dbms_metadata.GET_GRANTED_DDL ('ROLE_GRANT', 'SCOTT') 
,'"' || chr(10), '";' || chr(10)) 
into l_foo 
from dual; 
end; 
/

并执行程序“EXEC测试;”然后我捕捉到一个SCOTT类型的SCOTT,在SCOTT模式中找不到。

这是为什么,我该如何解决?

感谢 克里斯

回答

3

甲骨文Documentation状态:

在存储过程,函数,和 定义者权限包,角色(例如 为SELECT_CATALOG_ROLE)被禁用。 因此,这样一个PL/SQL程序可以 只能获取其 自己的模式中的对象的元数据。如果你想编写获取在不同的模式 对象的元数据 一个 PL/SQL程序(基于调用者的占有 SELECT_CATALOG_ROLE),你必须 程序调用者权利。

要做到这一点,您必须将authid添加到您的过程。

create procedure tests authid CURRENT_USER is 
    l_foo clob; 
begin 
select 
regexp_replace(
    dbms_metadata.get_ddl('USER', 'SCOTT', null) || 
    dbms_metadata.GET_GRANTED_DDL ('SYSTEM_GRANT', 'SCOTT') || 
    dbms_metadata.GET_GRANTED_DDL ('OBJECT_GRANT', 'SCOTT') || 
    dbms_metadata.GET_GRANTED_DDL ('ROLE_GRANT', 'SCOTT') 
,'"' || chr(10), '";' || chr(10)) 
into l_foo 
from dual; 
end; 
/

SQL> EXEC tests 

PL/SQL procedure successfully completed 
+0

啊哈,非常感谢! – chris 2010-12-13 20:34:42

相关问题