powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Oracle [игнор отключен] [закрыт для гостей] / ORA-31603 при использовании DBMS_METADATA.DEG_DDL
19 сообщений из 44, страница 2 из 2
ORA-31603 при использовании DBMS_METADATA.DEG_DDL
    #39140188
uZverrr
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
SeaGate,

правильно ли понимаю:
1. при вызове функции от имени владельца я никак не получу данные объектов других схем
2. но если вызывать эту функцию от имени других пользователей, предоставив грант на EXECUTE, то конечно возможно (это проверил).

Но почему именно PACKAGE_BODY не выбирает?
А функции, процедуры, спецификации пакетов нормально берет.

ЗЫ: при выборе через функцию данных из all_source объекти типа PACKAGE_BODY тоже НЕ видит.
...
Рейтинг: 0 / 0
ORA-31603 при использовании DBMS_METADATA.DEG_DDL
    #39140230
Фотография SeaGate
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
uZverrr,

uZverrr1. при вызове функции от имени владельца я никак не получу данные объектов других схем
2. но если вызывать эту функцию от имени других пользователей, предоставив грант на EXECUTE, то конечно возможно (это проверил).

Но почему именно PACKAGE_BODY не выбирает?
А функции, процедуры, спецификации пакетов нормально берет.
Privileged user для DBMS_METADATA это SYS или пользователь, с ролью SELECT_CATALOG_ROLE.
Соответственно, если не SYS и definer rights, то да, по документации мы сами метаданные объектов не видим.
Касаемо того, почему не выбирает PACKAGE_BODY, а что-то выбирает: проше будет, если будет конкретный тест-кейс и версия.
Без этого сложно сказать.
Например, в первой попавшейся БД 11.2.0.3 запустил DBMS_METADATA.GET_DDL('PACKAGE', 'PKG_NAME', 'USER..') имея права на EXECUTE и получил ту же ошибку ORA-31603.
На нижнем уровне DBMS_METADATA делает запрос:
Код: plsql
1.
2.
PARSING IN CURSOR #139702392430560 len=204 dep=1 uid=236 oct=3 lid=236 tim=1451400028741414 hv=467340155 ad='41d602fe8' sqlid='2xajmwndxq2vv'
SELECT /*+rule*/ SYS_XMLGEN(VALUE(KU$), XMLFORMAT.createFormat2('FULL_PACKAGE_T', '7')), KU$.OBJ_NUM FROM SYS.KU$_FULL_PKG_VIEW KU$ WHERE KU$.SCHEMA_OBJ.NAME=:NAME1 AND  KU$.SCHEMA_OBJ.OWNER_NAME=:SCHEMA2


uid=236 - это SYS_CONTEXT('USERENV','CURRENT_USERID').
Запрос возвращает 0 строк:
Код: plsql
1.
FETCH #139702392430560:c=1000,e=369,p=0,cr=31,cu=0,mis=0,r=0,dep=1,og=3,plh=1091844984,tim=1451400028914129


Т.к. в коде KU$_FULL_PKG_VIEW, например:
Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
create or replace force view ku$_full_pkg_view of ku$_full_pkg_t
  with object identifier (obj_num) as
  select '1','1',
         oo.obj#,
         value(o),
         value(p),
         (select value(pb) from ku$_pkgbdy_view pb
          where oo.name  = pb.schema_obj.name
          and o.owner_name  = pb.schema_obj.owner_name)
  from   sys.ku$_edition_obj_view oo, ku$_edition_schemaobj_view o, ku$_pkg_view p
  where oo.type# = 9
    and oo.obj#  = o.obj_num
    and oo.obj#  = p.schema_obj.obj_num
         AND (SYS_CONTEXT('USERENV','CURRENT_USERID') IN (o.owner_num, 0) OR
              EXISTS ( SELECT * FROM sys.session_roles
                       WHERE role='SELECT_CATALOG_ROLE' ))


Т.е. проверка на то, что: пользователь владелец, SYS или имеет SELECT_CATALOG_ROLE.
Таким образом, в первой попавшейся 11.2.0.3 спецификации пакетов - не берет, что соответствует документации.
Поэтому и нужен тест кейс и версия, чтобы предметно посмотреть.
...
Рейтинг: 0 / 0
ORA-31603 при использовании DBMS_METADATA.DEG_DDL
    #39140287
Фотография SY
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SeaGate,

Перечитай мой ответ, особенно выделенное желтым:

Код: plsql
1.
authid current_user



Так-что повторю:

Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
70.
71.
72.
73.
74.
75.
76.
77.
78.
79.
80.
81.
82.
83.
84.
85.
86.
87.
88.
89.
90.
91.
92.
93.
94.
95.
96.
97.
98.
99.
100.
101.
SQL> drop user u1 cascade;

User dropped.

SQL> create user u1 identified by u1
  2  default tablespace users
  3  quota unlimited on users
  4  /

User created.

SQL> grant create session,create procedure to u1
  2  /

Grant succeeded.

SQL> grant select_catalog_role to u1
  2  /

Grant succeeded.

SQL> create or replace
  2    package pkg1
  3      is
  4        procedure p1;
  5  end;
  6  /

Package created.

SQL> create or replace
  2    package body pkg1
  3      is
  4        procedure p1
  5          is
  6          begin
  7              null;
  8        end;
  9  end;
 10  /

Package body created.

SQL> connect u1/u1@pdb1sol12
Connected.
SQL> create or replace
  2    function f1
  3      return clob
  4      is
  5      begin
  6          return dbms_metadata.get_ddl(object_type=>'PACKAGE_BODY',name=> 'PKG1',schema=>'SCOTT');
  7  end;
  8  /

Function created.

SQL> select  f1
  2    from  dual
  3  /
ERROR:
ORA-31603: object "PKG1" of type PACKAGE_BODY not found in schema "SCOTT"
ORA-06512: at "SYS.DBMS_METADATA", line 6069
ORA-06512: at "SYS.DBMS_METADATA", line 8666
ORA-06512: at "U1.F1", line 5



no rows selected

SQL> create or replace
  2    function f1
  3      return clob
  4      authid current_user
  5      is
  6      begin
  7          return dbms_metadata.get_ddl(object_type=>'PACKAGE_BODY',name=> 'PKG1',schema=>'SCOTT');
  8  end;
  9  /

Function created.

SQL> set long 1000
SQL> select  f1
  2    from  dual
  3  /

F1
--------------------------------------------------------------------------------

  CREATE OR REPLACE EDITIONABLE PACKAGE BODY "SCOTT"."PKG1"
    is
      procedure p1
        is
        begin
            null;
      end;
end;


SQL> 



SY.
...
Рейтинг: 0 / 0
ORA-31603 при использовании DBMS_METADATA.DEG_DDL
    #39140292
Фотография SY
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SeaGateПоэтому и нужен тест кейс и версия, чтобы предметно посмотреть.

Что тут смотреть? Ты эмпирически (а мог-бы просто покурить доку) вывел "проверка на то, что: пользователь владелец, SYS или имеет SELECT_CATALOG_ROLE". Но затем тебя вдруг понесло "имея права на EXECUTE и получил ту же ошибку ORA-31603". Тут две проблемы. Первая как говорит дока и как ты эмпирически вывел - DBMS_METADATA не реагирует ни на какие привилегии - ты или owner, или sys или имеешь select_catalog_role. А можешь ты выполнять пакет или нет - по-барабану. Вторая - привилегия execute позволяет выполнять пакет, но не позволяет видеть текст (DBA/ALL_SOURCE.TEXT) пакета. Чтобы видеть текст (DBA/ALL_SOURCE.TEXT) чужого пакета требуется привилегия debug.

SY.
...
Рейтинг: 0 / 0
ORA-31603 при использовании DBMS_METADATA.DEG_DDL
    #39140426
Фотография SeaGate
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SY,
SYТы эмпирически (а мог-бы просто покурить доку) вывел "проверка на то, что: пользователь владелец, SYS или имеет SELECT_CATALOG_ROLE".

1. Я привык проверять то, про что я читаю.
2. К чему про "мог-бы просто покурить доку", если дока уже была изучена (все тома заново не успел прочитать, но Security Model по диагонали прочел):
SeaGatePrivileged user для DBMS_METADATA это SYS или пользователь, с ролью SELECT_CATALOG_ROLE.
Соответственно, если не SYS и definer rights, то да, по документации мы сами метаданные объектов не видим.

SYА можешь ты выполнять пакет или нет - по-барабану.

1. Извини, может что-то я не увидел, но вот uZverrr пишет:
uZverrr2. но если вызывать эту функцию от имени других пользователей, предоставив грант на EXECUTE, то конечно возможно (это проверил).
...
Но почему именно PACKAGE_BODY не выбирает?
А функции, процедуры, спецификации пакетов нормально берет.

Что я трактую как: "есть execute", видит PACKAGE_SPEC, PACKAGE_BODY - не видит (ORA-31603).
Что не совпадает с документацией и моим, собранным на коленке, тестом.
Поэтому я и попросил предоставить тест кейс, чтобы проверить, что я правильно понимаю его задачу.
2. про "по-барабану" и почему я еще начал эмпирически проверять: да просто потому, что DBMS_METADATA не самая простая и беспроблемная часть ORACLE.
Особенно, начиная с 11g, когда представления словаря были доработаны с поддержкой EBR.
Например, вот один из первых моих багов 2012 года после адаптации EBR, с подобным я до сих пор сталкиваюсь в 11.2.0.4 с летним PSU (не на VIEW, уже на TYPE):
Bug 15922287 : DBMS_METADATA FOR A VIEW FAILED WITH ERROR ORA-1427
К слову, по этому багу было несколько итераций с предоставлением патчей. Видимо, громоздкий код DBMS_METADATA(и используемого ей кода) и/или плохие разработчики Oracle, что за несколько итераций не могут патч нормальный выкатить.
EBR это верхушка айсберга, просто из наболевшего. Баги оптимизатора с каждой версией прибывают/убывают и много чего еще из серии known unknowns и unknown unknowns.
Поэтому если я читаю про то, что DBMS_METADATA работает не так, как описано в документации, то я прошу предоставить пример.
SYПеречитай мой ответ, особенно выделенное желтым:
authid current_user

Прочитал, откровения не увидел. Про invoker rights, роль SELECT_CATALOG_ROLE и влияние на DBMS_METADATA я в курсе.
...
Рейтинг: 0 / 0
ORA-31603 при использовании DBMS_METADATA.DEG_DDL
    #39140553
uZverrr
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Ночь перекурил и вроде допонял кой-чего...
Все делаем от имени USER1:
1.
Код: plsql
1.
select dbms_metadata.get_ddl('PACKAGE_BODY','PKG_NAME', 'USER2') from dual;


Просто селект работает для объектов любой схемы.
2.
Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
create or replace function USER1.test(rc out sys_refcursor) return number  is
  Result number;
begin
  open rc for
  select dbms_metadata.get_ddl('PACKAGE_BODY','PKG_NAME', 'USER2') from dual;            

  return 1;
end test;


Такой вариант (без authid current_user) выдает ошибку 31603
3.
Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
create or replace function USER1.test(rc out sys_refcursor) return number authid current_user is
  Result number;
begin
  open rc for
  select dbms_metadata.get_ddl('PACKAGE_BODY','PKG_NAME', 'USER2') from dual;            

  return 1;
end test;


Такой вариант работает для любых посторонних схем.

Итого: фактически вызов всегда идет от USER1, но получается, что при вызове функции у которой не прописано authid current_user, вызов происходит будто не от USER1 или не подхватываются гранты какие.... Не знаю как правильно это обозвать.

Для такого варианта при наличии authid current_user тож вроде все работает:
Код: plsql
1.
2.
3.
4.
SELECT t.owner, t.type, t.name, dbms_metadata.get_ddl(decode(t.type,'PACKAGE BODY','PACKAGE_BODY',t.type), t.name, t.owner)
FROM all_source t
WHERE owner = 'USER2'
group by t.owner, t.type, t.name;



SeaGate, SY большое спасибо за участие. Надеюсь далее вопросов не возникнет.
...
Рейтинг: 0 / 0
ORA-31603 при использовании DBMS_METADATA.DEG_DDL
    #39140725
Фотография SeaGate
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
uZverrr,
uZverrrТакой вариант работает для любых посторонних схем.

Это идет вразрез с документацией и, к сожалению, я не могу это воспроизвести в ближайшей 12.1.0.2.
Ниже пример, который это демонстрирует:

Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
70.
71.
72.
73.
74.
75.
76.
77.
78.
79.
80.
81.
82.
83.
84.
85.
86.
87.
88.
89.
90.
91.
92.
93.
94.
95.
96.
97.
98.
99.
100.
101.
102.
103.
104.
105.
106.
107.
108.
109.
110.
111.
112.
113.
114.
115.
116.
117.
SQL> drop user user1 cascade;

User dropped.

SQL> drop user user2 cascade;

User dropped.

SQL> drop user user3 cascade;

User dropped.

SQL>
SQL> grant connect to user1 identified by user1;

Grant succeeded.

SQL> grant create procedure to user1;

Grant succeeded.

SQL>
SQL> grant connect to user2 identified by user2;

Grant succeeded.

SQL> grant create procedure to user2;

Grant succeeded.

SQL>
SQL> grant connect to user3 identified by user3;

Grant succeeded.

SQL>
SQL> conn user2/user2
Connected.
SQL>
SQL> create or replace package pkg_name
  2  is
  3    procedure p;
  4  end;
  5  /

Package created.

SQL>
SQL> create or replace package body pkg_name
  2  is
  3    procedure p
  4    is
  5    begin
  6      null;
  7    end;
  8  end;
  9  /

Package body created.

SQL>
SQL> conn user1/user1
Connected.
SQL>
SQL> create or replace function USER1.test(rc out sys_refcursor) return number
  2    authid current_user
  3  is
  4    Result number;
  5  begin
  6    open rc for
  7    select dbms_metadata.get_ddl('PACKAGE_BODY','PKG_NAME', 'USER2') ddl from dual;
  8
  9    return 1;
 10  end test;
 11  /

Function created.

SQL>
SQL> grant execute on test to user3;

Grant succeeded.

SQL>
SQL> conn user3/user3
Connected.
SQL>
SQL> select * from session_roles;

ROLE
--------------------------------------------------------------------------------
CONNECT

SQL> select authid from all_procedures where owner='USER1' and object_name='TEST';

AUTHID
------------
CURRENT_USER

SQL>
SQL> var rc refcursor
SQL>
SQL> set autop on long 100000
SQL>
SQL> exec dbms_output.put_line( user1.test(:rc))

PL/SQL procedure successfully completed.

ERROR:
ORA-31603: object "PKG_NAME" of type PACKAGE_BODY not found in schema "USER2"
ORA-06512: at "SYS.DBMS_METADATA", line 6069
ORA-06512: at "SYS.DBMS_METADATA", line 8666
ORA-06512: at line 1



no rows selected



Чтобы заработало не под SYS и владельцем пакета нужно выдать вызывающему пользователю SELECT_CATALOG_ROLE:

Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
70.
71.
72.
73.
74.
75.
76.
77.
78.
79.
80.
81.
82.
83.
84.
85.
86.
87.
88.
89.
90.
91.
92.
93.
94.
95.
96.
97.
98.
99.
100.
101.
102.
103.
104.
105.
106.
107.
108.
109.
110.
111.
112.
113.
114.
115.
116.
117.
118.
119.
120.
121.
122.
123.
124.
125.
SQL> drop user user1 cascade;

User dropped.

SQL> drop user user2 cascade;

User dropped.

SQL> drop user user3 cascade;

User dropped.

SQL>
SQL> grant connect to user1 identified by user1;

Grant succeeded.

SQL> grant create procedure to user1;

Grant succeeded.

SQL> grant connect to user2 identified by user2;

Grant succeeded.

SQL> grant create procedure to user2;

Grant succeeded.

SQL>
SQL> grant connect to user3 identified by user3;

Grant succeeded.

SQL> grant select_catalog_role to user3;

Grant succeeded.

SQL>
SQL> conn user2/user2
Connected.
SQL>
SQL> create or replace package pkg_name
  2  is
  3    procedure p;
  4  end;
  5  /

Package created.

SQL>
SQL> create or replace package body pkg_name
  2  is
  3    procedure p
  4    is
  5    begin
  6      null;
  7    end;
  8  end;
  9  /

Package body created.

SQL>
SQL> conn user1/user1
Connected.
SQL>
SQL> create or replace function USER1.test(rc out sys_refcursor) return number
  2    authid current_user
  3  is
  4    Result number;
  5  begin
  6    open rc for
  7    select dbms_metadata.get_ddl('PACKAGE_BODY','PKG_NAME', 'USER2') ddl from dual;
  8
  9    return 1;
 10  end test;
 11  /

Function created.

SQL>
SQL> grant execute on test to user3;

Grant succeeded.

SQL>
SQL> conn user3/user3
Connected.
SQL>
SQL> select * from session_roles;

ROLE
--------------------------------------------------------------------------------
CONNECT
SELECT_CATALOG_ROLE
HS_ADMIN_SELECT_ROLE

SQL> select authid from all_procedures where owner='USER1' and object_name='TEST';

AUTHID
------------
CURRENT_USER

SQL>
SQL> var rc refcursor
SQL>
SQL> set autop on long 100000
SQL>
SQL> exec dbms_output.put_line( user1.test(:rc))

PL/SQL procedure successfully completed.


DDL
--------------------------------------------------------------------------------

  CREATE OR REPLACE EDITIONABLE PACKAGE BODY "USER2"."PKG_NAME"
is
  procedure p
  is
  begin
    null;
  end;
end



С definer rights можно решить задачу, например, с помощью CBAC (Code Based Access Control, 12c):

Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
70.
71.
72.
73.
74.
75.
76.
77.
78.
79.
80.
81.
82.
83.
84.
85.
86.
87.
88.
89.
90.
91.
92.
93.
94.
95.
96.
97.
98.
99.
100.
101.
102.
103.
104.
105.
106.
107.
108.
109.
110.
111.
112.
113.
114.
115.
116.
117.
118.
119.
120.
121.
122.
123.
124.
125.
126.
127.
128.
129.
SQL> drop user user1 cascade;

User dropped.

SQL> drop user user2 cascade;

User dropped.

SQL> drop user user3 cascade;

User dropped.

SQL>
SQL> grant connect to user1 identified by user1;

Grant succeeded.

SQL> grant create procedure to user1;

Grant succeeded.

SQL> grant select_catalog_role to user1 with delegate option;

Grant succeeded.

SQL>
SQL> grant connect to user2 identified by user2;

Grant succeeded.

SQL> grant create procedure to user2;

Grant succeeded.

SQL>
SQL> grant connect to user3 identified by user3;

Grant succeeded.

SQL>
SQL> conn user2/user2
Connected.
SQL>
SQL> create or replace package pkg_name
  2  is
  3    procedure p;
  4  end;
  5  /

Package created.

SQL>
SQL> create or replace package body pkg_name
  2  is
  3    procedure p
  4    is
  5    begin
  6      null;
  7    end;
  8  end;
  9  /

Package body created.

SQL>
SQL> conn user1/user1
Connected.
SQL>
SQL> create or replace function USER1.test(rc out sys_refcursor) return number
  2    --authid current_user
  3  is
  4    Result number;
  5  begin
  6    open rc for
  7    select dbms_metadata.get_ddl('PACKAGE_BODY','PKG_NAME', 'USER2') ddl from dual;
  8
  9    return 1;
 10  end test;
 11  /

Function created.

SQL>
SQL> grant select_catalog_role to function test;

Grant succeeded.

SQL>
SQL> grant execute on test to user3;

Grant succeeded.

SQL>
SQL> conn user3/user3
Connected.
SQL>
SQL> select * from session_roles;

ROLE
--------------------------------------------------------------------------------
CONNECT

SQL> select authid from all_procedures where owner='USER1' and object_name='TEST';

AUTHID
------------
DEFINER

SQL>
SQL> var rc refcursor
SQL>
SQL> set autop on long 100000
SQL>
SQL> exec dbms_output.put_line( user1.test(:rc))

PL/SQL procedure successfully completed.


DDL
--------------------------------------------------------------------------------

  CREATE OR REPLACE EDITIONABLE PACKAGE BODY "USER2"."PKG_NAME"
is
  procedure p
  is
  begin
    null;
  end;
end;



uZverrrИтого: фактически вызов всегда идет от USER1, но получается, что при вызове функции у которой не прописано authid current_user, вызов происходит будто не от USER1 или не подхватываются гранты какие.... Не знаю как правильно это обозвать.

Ну это конечно:
ТОП №4
Хотя я что-то не вижу, где там явно написано, что сами роли владельца (а не выданные им права) не видны в definer rights program unit,
поэтому вот документация, где это явно указано: Security Guide: How Roles Work in PL/SQL Blocks
...
Рейтинг: 0 / 0
ORA-31603 при использовании DBMS_METADATA.DEG_DDL
    #39144455
uZverrr
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Еще одна загадка...
У пользователя есть роль SELECT_CATALOG_ROLE.
Есть 2 функции:
Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
create or replace function getSource return varchar2 is
  result varchar2(1000);
begin
  for c in (select v.type, count(*) cnt
              from (select t.owner, t.type
                      from all_source t
                     where t.TYPE in ('PACKAGE BODY', 'PACKAGE')
                     group by t.owner, t.type) v
             group by v.type) loop
    result := result || c.type || '-' || c.cnt || chr(13);
  end loop;
  return result;
end getSource;


Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
create or replace function getSource1 return varchar2 authid current_user is
  result varchar2(1000);
begin
  for c in (select v.type, count(*) cnt
              from (select t.owner, t.type
                      from all_source t
                     where t.TYPE in ('PACKAGE BODY', 'PACKAGE')
                     group by t.owner, t.type) v
             group by v.type) loop
    result := result || c.type || '-' || c.cnt || chr(13);
  end loop;
  return result;
end getSource1;



Результаты выполнения:
Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
SQL> select getsource from dual;
GETSOURCE
--------------------------------------------------------------------------------
PACKAGE-40
PACKAGE BODY-1

SQL> select getsource1 from dual;
GETSOURCE1
--------------------------------------------------------------------------------
PACKAGE-40
PACKAGE BODY-40

SQL> 


Почему не видит тела пакетов без authid current_user?
Хотя PACKAGE, FUNCTUIN и PROCEDURE видит.
...
Рейтинг: 0 / 0
ORA-31603 при использовании DBMS_METADATA.DEG_DDL
    #39144746
Фотография SY
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
uZverrr,

Ты опять путаешь мягкое с тёплым. SELECT_CATALOG_ROLE разрешает выборку из DBA_XXX data dictionary views. А для ALL_XXX/USER_XXX он по-барабану. Чтобы видеть чужое в ALL_SOURCE необходим EXECUTE. Он дает возможность видеть "чужую" процедуру, функцию и спецификацию пакета. В этом и прелесть пакета - "чужие" с execute могут выполнять и смотреть спецификацию (число, порядок, типы параметров, etc.) но не тело пакета - нечего "чужим" знать как там на кухне. Для того что-бы видеть "чужую" кухню требуется DEGUG. Так-что у тебя владелец процедуры getsource скорее всего имеет доступ к "кухне" через роль. А роли с DEFINER RIGHTS игнорируются. Посему работает только getsource с AUTHID CURRENT_USER который роли не игнорирует.

SY.
...
Рейтинг: 0 / 0
ORA-31603 при использовании DBMS_METADATA.DEG_DDL
    #39144840
uZverrr
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
SY,
ну так чем чужая кухня типа "тело пакета" отличается от функции или процедуры?
Условно, если я фанатик чистых func&proc, то буду вести код не в пакетах, а отдельными func&proc.

Получится, что так я весь код увижу и без authid current_user...

Или тогда тут заморочка отдельная именно на тела пакетов...
...
Рейтинг: 0 / 0
ORA-31603 при использовании DBMS_METADATA.DEG_DDL
    #39144891
Фотография SY
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
uZverrrПолучится, что так я весь код увижу и без authid current_user...


Я ведь вроде понятно обьяснил: " В этом и прелесть пакета - "чужие" с execute могут выполнять и смотреть спецификацию (число, порядок, типы параметров, etc.) но не тело пакета - нечего "чужим" знать как там на кухне".

SY.
...
Рейтинг: 0 / 0
ORA-31603 при использовании DBMS_METADATA.DEG_DDL
    #39145147
uZverrr
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
SY,
ну теперь вроде окончательно понятно. Спасибо.
Просто для выгрузки всех объектов хотелось весь код запихнуть в один пакет. но из-за тел пакетов походу это не прокатит.
...
Рейтинг: 0 / 0
ORA-31603 при использовании DBMS_METADATA.DEG_DDL
    #39145183
eev
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
uZverrrSY,
ну теперь вроде окончательно понятно . Спасибо.
Просто для выгрузки всех объектов хотелось весь код запихнуть в один пакет. но из-за тел пакетов походу это не прокатит . http://docs.oracle.com/database/121/SUTIL/GUID-EE2AA635-EA83-4265-9727-E9C659842CEF.htm#SUTIL1624 Note:
To access objects that are not in your own schema you must have the SELECT_CATALOG_ROLE role . However , roles are disabled within many PL/SQL objects (stored procedures, functions, definer's rights APIs). Therefore, if you are writing a PL/SQL program that will access objects in another schema (or, in general, any objects for which you need the SELECT_CATALOG_ROLE role), then you must put the code in an invoker's rights API.
один пользователь имеет код, который извлекает. другие пользователи его вызывают для своих схем.
...
Рейтинг: 0 / 0
ORA-31603 при использовании DBMS_METADATA.DEG_DDL
    #39184636
uZverrr
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Подскажите плиз:
1. Где найти список полей для DISABLE ключей, т.к. при отключении ключа связь с таблицей индексов пропадает.
2. И для FOREIGN ключей не могу найти где фиксируется список полей.
...
Рейтинг: 0 / 0
Период между сообщениями больше года.
ORA-31603 при использовании DBMS_METADATA.DEG_DDL
    #39583291
Фотография Pastic
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Пробовал делать 2 запроса:
Код: plsql
1.
2.
select view_name from user_views
where dbms_lob.instr(dbms_metadata.get_ddl(object_type => 'VIEW', name => view_name), '@')>0;



и

Код: plsql
1.
2.
select view_name from user_views
where instr(dbms_metadata.get_ddl(object_type => 'VIEW', name => view_name), '@')>0;



оба выдают сообщение "ORA-31603: object "AB_STATE_PKG" of type VIEW not found in schema <имя схемы>". Но дело в том, что представления с таким именем в схеме нет:

Код: plsql
1.
select * from user_views where view_name='AB_STATE_PKG'



Этот запрос возвращает пустое множество.

Код: plsql
1.
select * from user_objects where OBJECT_NAME='AB_STATE_PKG'



А этот запрос возвращает 2 строки (спецификация и тело пакета).

Но причём здесь пакет, когда я делаю запросы из user_views?

Oracle Database 11g Enterprise Edition Release 11.2.0.4.0 - 64bit Production
...
Рейтинг: 0 / 0
ORA-31603 при использовании DBMS_METADATA.DEG_DDL
    #39583319
Фотография -2-
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Pastic,

no_push_pred
...
Рейтинг: 0 / 0
ORA-31603 при использовании DBMS_METADATA.DEG_DDL
    #39583390
Фотография Pastic
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
-2-,

select /*+ no_push_pred(uv) */ view_name from user_views uv
where dbms_lob.instr(dbms_metadata.get_ddl(object_type => 'VIEW', name => view_name), '@')>0;

select /*+ no_push_pred(uv) */ view_name from user_views uv
where instr(dbms_metadata.get_ddl(object_type => 'VIEW', name => view_name), '@')>0;

- всё тоже самое: "ORA-31603: object "AB_STATE_PKG" of type VIEW not found in schema <имя схемы>"
...
Рейтинг: 0 / 0
ORA-31603 при использовании DBMS_METADATA.DEG_DDL
    #39583494
merch
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Pastic,
Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
create or replace view tst_instr as select '@' str from dual; 

with view_list(view_name, rn) as
(
 select /*+ materialize*/ view_name, rownum from user_views uv
)
select view_name from view_list
where dbms_lob.instr(dbms_metadata.get_ddl(object_type => 'VIEW', name => view_name), '@') > 0;




VIEW_NAMETST_INSTR
...
Рейтинг: 0 / 0
ORA-31603 при использовании DBMS_METADATA.DEG_DDL
    #39584245
Фотография Pastic
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
merch, да, шаманство сработало. Спасибо.
...
Рейтинг: 0 / 0
19 сообщений из 44, страница 2 из 2
Форумы / Oracle [игнор отключен] [закрыт для гостей] / ORA-31603 при использовании DBMS_METADATA.DEG_DDL
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]