2010-12-13 2 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 типа USER, не найденный в схеме SCOTT.

Почему это и как мне обойти?

Благодарность Chris

ответ

3

Oracle Documentation состояние:

В хранимых процедурах, функциях и пакетов определитель-права, роли (такие, как SELECT_CATALOG_ROLE) отключено. Поэтому такая программа PL/SQL может получать только метаданные для объектов в своей собственной схеме. Если вы хотите написать PL/SQL программы, которая извлекает метаданные для объектов в другой схеме (на основании владения заклинателя о SELECT_CATALOG_ROLE), вы должны сделать Программу invokers-права.

Для этого вам необходимо добавить 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

aha, большое спасибо! – chris

Смежные вопросы