2010-12-13 68 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

相關問題