Почему Ths работает в анонимных, но не в процедуре?

StackOverflow https://stackoverflow.com/questions/4433014

  •  09-10-2019
  •  | 
  •  

Вопрос

Если я сделаю следующее, все в порядке:

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 Tests»; Затем я ловлю объект Скотта типа пользователя, не найден в Schema Scott.

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

Спасибо Крис

Это было полезно?

Решение

Оракуль Документация состояния:

В хранящихся процедурах, функциях и функциях-правовых пакетах, ролях (например, SELECT_CATALOG_ROLE) отключены. Поэтому, Такая программа PL / SQL может только метаданные для объектов в собственной схеме. Отказ Если вы хотите написать программу PL / SQL, которая извлекает метаданные для объектов в другой схеме (на основе владения invoker 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
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top