|
|
|
ORA-31603 при использовании DBMS_METADATA.DEG_DDL
|
|||
|---|---|---|---|
|
#18+
SeaGate, правильно ли понимаю: 1. при вызове функции от имени владельца я никак не получу данные объектов других схем 2. но если вызывать эту функцию от имени других пользователей, предоставив грант на EXECUTE, то конечно возможно (это проверил). Но почему именно PACKAGE_BODY не выбирает? А функции, процедуры, спецификации пакетов нормально берет. ЗЫ: при выборе через функцию данных из all_source объекти типа PACKAGE_BODY тоже НЕ видит. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 29.12.2015, 16:58 |
|
||
|
ORA-31603 при использовании DBMS_METADATA.DEG_DDL
|
|||
|---|---|---|---|
|
#18+
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. uid=236 - это SYS_CONTEXT('USERENV','CURRENT_USERID'). Запрос возвращает 0 строк: Код: plsql 1. Т.к. в коде KU$_FULL_PKG_VIEW, например: Код: plsql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. Т.е. проверка на то, что: пользователь владелец, SYS или имеет SELECT_CATALOG_ROLE. Таким образом, в первой попавшейся 11.2.0.3 спецификации пакетов - не берет, что соответствует документации. Поэтому и нужен тест кейс и версия, чтобы предметно посмотреть. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 29.12.2015, 17:56 |
|
||
|
ORA-31603 при использовании DBMS_METADATA.DEG_DDL
|
|||
|---|---|---|---|
|
#18+
SeaGate, Перечитай мой ответ, особенно выделенное желтым: Код: plsql 1. Так-что повторю: Код: 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. SY. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 29.12.2015, 19:50 |
|
||
|
ORA-31603 при использовании DBMS_METADATA.DEG_DDL
|
|||
|---|---|---|---|
|
#18+
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. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 29.12.2015, 20:09 |
|
||
|
ORA-31603 при использовании DBMS_METADATA.DEG_DDL
|
|||
|---|---|---|---|
|
#18+
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 я в курсе. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 30.12.2015, 06:48 |
|
||
|
ORA-31603 при использовании DBMS_METADATA.DEG_DDL
|
|||
|---|---|---|---|
|
#18+
Ночь перекурил и вроде допонял кой-чего... Все делаем от имени USER1: 1. Код: plsql 1. Просто селект работает для объектов любой схемы. 2. Код: plsql 1. 2. 3. 4. 5. 6. 7. 8. Такой вариант (без authid current_user) выдает ошибку 31603 3. Код: plsql 1. 2. 3. 4. 5. 6. 7. 8. Такой вариант работает для любых посторонних схем. Итого: фактически вызов всегда идет от USER1, но получается, что при вызове функции у которой не прописано authid current_user, вызов происходит будто не от USER1 или не подхватываются гранты какие.... Не знаю как правильно это обозвать. Для такого варианта при наличии authid current_user тож вроде все работает: Код: plsql 1. 2. 3. 4. SeaGate, SY большое спасибо за участие. Надеюсь далее вопросов не возникнет. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 30.12.2015, 12:17 |
|
||
|
ORA-31603 при использовании DBMS_METADATA.DEG_DDL
|
|||
|---|---|---|---|
|
#18+
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. Чтобы заработало не под 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. С 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. uZverrrИтого: фактически вызов всегда идет от USER1, но получается, что при вызове функции у которой не прописано authid current_user, вызов происходит будто не от USER1 или не подхватываются гранты какие.... Не знаю как правильно это обозвать. Ну это конечно: ТОП №4 Хотя я что-то не вижу, где там явно написано, что сами роли владельца (а не выданные им права) не видны в definer rights program unit, поэтому вот документация, где это явно указано: Security Guide: How Roles Work in PL/SQL Blocks ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 30.12.2015, 16:20 |
|
||
|
ORA-31603 при использовании DBMS_METADATA.DEG_DDL
|
|||
|---|---|---|---|
|
#18+
Еще одна загадка... У пользователя есть роль SELECT_CATALOG_ROLE. Есть 2 функции: Код: plsql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. Код: plsql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. Результаты выполнения: Код: plsql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. Почему не видит тела пакетов без authid current_user? Хотя PACKAGE, FUNCTUIN и PROCEDURE видит. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 11.01.2016, 12:33 |
|
||
|
ORA-31603 при использовании DBMS_METADATA.DEG_DDL
|
|||
|---|---|---|---|
|
#18+
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. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 11.01.2016, 16:32 |
|
||
|
ORA-31603 при использовании DBMS_METADATA.DEG_DDL
|
|||
|---|---|---|---|
|
#18+
SY, ну так чем чужая кухня типа "тело пакета" отличается от функции или процедуры? Условно, если я фанатик чистых func&proc, то буду вести код не в пакетах, а отдельными func&proc. Получится, что так я весь код увижу и без authid current_user... Или тогда тут заморочка отдельная именно на тела пакетов... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 11.01.2016, 18:00 |
|
||
|
ORA-31603 при использовании DBMS_METADATA.DEG_DDL
|
|||
|---|---|---|---|
|
#18+
uZverrrПолучится, что так я весь код увижу и без authid current_user... Я ведь вроде понятно обьяснил: " В этом и прелесть пакета - "чужие" с execute могут выполнять и смотреть спецификацию (число, порядок, типы параметров, etc.) но не тело пакета - нечего "чужим" знать как там на кухне". SY. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 11.01.2016, 18:52 |
|
||
|
ORA-31603 при использовании DBMS_METADATA.DEG_DDL
|
|||
|---|---|---|---|
|
#18+
SY, ну теперь вроде окончательно понятно. Спасибо. Просто для выгрузки всех объектов хотелось весь код запихнуть в один пакет. но из-за тел пакетов походу это не прокатит. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 12.01.2016, 09:48 |
|
||
|
ORA-31603 при использовании DBMS_METADATA.DEG_DDL
|
|||
|---|---|---|---|
|
#18+
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. один пользователь имеет код, который извлекает. другие пользователи его вызывают для своих схем. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 12.01.2016, 10:28 |
|
||
|
ORA-31603 при использовании DBMS_METADATA.DEG_DDL
|
|||
|---|---|---|---|
|
#18+
Подскажите плиз: 1. Где найти список полей для DISABLE ключей, т.к. при отключении ключа связь с таблицей индексов пропадает. 2. И для FOREIGN ключей не могу найти где фиксируется список полей. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 03.03.2016, 11:58 |
|
||
|
ORA-31603 при использовании DBMS_METADATA.DEG_DDL
|
|||
|---|---|---|---|
|
#18+
Пробовал делать 2 запроса: Код: plsql 1. 2. и Код: plsql 1. 2. оба выдают сообщение "ORA-31603: object "AB_STATE_PKG" of type VIEW not found in schema <имя схемы>". Но дело в том, что представления с таким именем в схеме нет: Код: plsql 1. Этот запрос возвращает пустое множество. Код: plsql 1. А этот запрос возвращает 2 строки (спецификация и тело пакета). Но причём здесь пакет, когда я делаю запросы из user_views? Oracle Database 11g Enterprise Edition Release 11.2.0.4.0 - 64bit Production ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 12.01.2018, 13:43 |
|
||
|
ORA-31603 при использовании DBMS_METADATA.DEG_DDL
|
|||
|---|---|---|---|
|
#18+
Pastic, no_push_pred ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 12.01.2018, 14:30 |
|
||
|
ORA-31603 при использовании DBMS_METADATA.DEG_DDL
|
|||
|---|---|---|---|
|
#18+
-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 <имя схемы>" ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 12.01.2018, 16:30 |
|
||
|
ORA-31603 при использовании DBMS_METADATA.DEG_DDL
|
|||
|---|---|---|---|
|
#18+
Pastic, Код: plsql 1. 2. 3. 4. 5. 6. 7. 8. VIEW_NAMETST_INSTR ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 12.01.2018, 19:15 |
|
||
|
|

start [/forum/topic.php?fid=52&msg=39144840&tid=1884594]: |
0ms |
get settings: |
6ms |
get forum list: |
13ms |
check forum access: |
3ms |
check topic access: |
3ms |
track hit: |
136ms |
get topic data: |
6ms |
get forum data: |
2ms |
get page messages: |
31ms |
get tp. blocked users: |
1ms |
| others: | 201ms |
| total: | 402ms |

| 0 / 0 |
