Как я могу получить полное определение (sql) системных представлений, таких как user_objects?

avatar
oramas
18 мая 2020 в 11:05
202
2
3

Я хочу получить полный код SQL для системных представлений, таких как USER_OBJECTS. Однако, когда я выполняю приведенный ниже запрос, он возвращает ошибку о том, что представление не найдено в схеме SYS.

select dbms_metadata.get_ddl('VIEW', 'USER_OBJECTS', 'SYS') from dual;

Когда я выполняю приведенный ниже запрос, он возвращает некоторые коды в столбце text_vc, но не весь код. Я не вижу таблицы и предложение where и т. д.

select * from ALL_VIEWS where VIEW_NAME  = 'USER_OBJECTS';

Но с этим запросом я вижу, что он находится в схеме SYS с таким именем. Итак, в чем причина того, что я не вижу весь запрос? И есть ли способ все это увидеть?

Источник
wolφi
18 мая 2020 в 12:39
0

Какая у вас версия Оракла?

Ответы (2)

avatar
wolφi
18 мая 2020 в 12:25
2

+1 за просмотр определений системных представлений!

Первая проблема (DBMS_METADATA пуста) связана с привилегиями. Согласно документации, обычные пользователи будут видеть только свои объекты. Вам понадобится роль SELECT_CATALOG_ROLE или EXP_FULL_DATABASE, чтобы видеть объекты других пользователей.

Вторая проблема (SQL неполный) связана с типом данных LONG, который, согласно Oracle, больше не должен использоваться. Тем не менее, Oracle по-прежнему использует его для определений представлений, значений по умолчанию, текста ограничений и т. д. Поскольку с ним очень сложно работать, представление ALL_VIEWS имеет исходный текст в столбце LONG и усеченный текст, в основном первые 4000 символов в столбце text_vc, предположительно для "текста в varchar".

РЕДАКТИРОВАТЬ:

Я полагаю, что вы используете Oracle 12, поскольку упоминаете столбец text_vc, который недоступен в Oracle 11. Предположительно, вы используете контейнерную базу данных. Если это так, ознакомьтесь с Архитектурой словаря данных в CDB. По-видимому, определение Oracle предоставляет такие вещи, как представления и пакеты, которые видны только в корневом контейнере. Вздох!!

avatar
Littlefoot
18 мая 2020 в 11:30
1

В SQL*Plus вы бы set long (я сократил вывод):

SQL> set pagesize 0
SQL> set long 10000
SQL>
SQL> select text from all_views where view_name = 'USER_OBJECTS';
select o.name, o.subname, o.obj#, o.dataobj#,
       decode(o.type#, 0, 'NEXT OBJECT', 1, 'INDEX', 2, 'TABLE', 3, 'CLUSTER',
                      4, 'VIEW', 5, 'SYNONYM', 6, 'SEQUENCE',
                      7, 'PROCEDURE', 8, 'FUNCTION', 9, 'PACKAGE',
                      11, 'PACKAGE BODY', 12, 'TRIGGER',
<snip>
from sys."_CURRENT_EDITION_OBJ" o
where o.owner# = userenv('SCHEMAID')
  and o.linkname is null
  and (o.type# not in (1  /* INDEX - handled below */,
                      10 /* NON-EXISTENT */)
       or
<snip>
union all
select l.name, NULL, to_number(null), to_number(null),
       'DATABASE LINK',
       l.ctime, to_date(null), NULL, 'VALID', 'N', 'N', 'N', NULL, NULL
from sys.link$ l
where l.owner# = userenv('SCHEMAID')


SQL>

Кроме того, ваш первый запрос работает в моей базе данных (11g XE) if Я подключен как SYS:

SQL> show user
USER is "SYS"
SQL> select dbms_metadata.get_ddl('VIEW', 'USER_OBJECTS', 'SYS') from dual;

DBMS_METADATA.GET_DDL('VIEW','USER_OBJECTS','SYS')
--------------------------------------------------------------------------------

  CREATE OR REPLACE FORCE VIEW "SYS"."USER_OBJECTS" ("OBJECT_NAME", "SUBOBJECT_N
AME", "OBJECT_ID", "DATA_OBJECT_ID", "OBJECT_TYPE", "CREATED", "LAST_DDL_TIME",
"TIMESTAMP", "STATUS", "TEMPORARY", "GENERATED", "SECONDARY", "NAMESPACE", "EDIT
ION_NAME") AS
  select o.name, o.subname, o.obj#, o.dataobj#,
       decode(o.type#, 0, 'NEXT OBJECT', 1, 'INDEX', 2, 'TABLE', 3, 'CLUSTER',
                      4, 'VIEW', 5, 'SYNONYM', 6, 'SEQUENCE',
                      7, 'PROCEDURE', 8, 'FUNCTION', 9, 'PACKAGE',
                      11, 'PACKAGE BODY', 12, 'TRIGGER',
<snip>
wolφi
18 мая 2020 в 11:49
0

get_ddl работает в 11, но не в 12.2, знаете почему?

Littlefoot
18 мая 2020 в 11:56
0

У меня нет 12.2, чтобы попробовать, @wolφi. У меня есть доступ к 12.2.0.1.0, и там все работает.

wolφi
18 мая 2020 в 12:04
0

я также на 12.2.0.1.0. Doc ID 2479803.1 говорит, что я заглянул не в тот контейнер. После alter session set container=cdb$root; все работает.