Невозможно выбрать из SYS.TABLES - таблица или представление не существует - PullRequest
1 голос
/ 03 марта 2020

Я прочитал, что

USER_TABLES is tables which you own
ALL_TABLES is tables which own, and tables owner by other users, which you have been granted explicit access to
DBA_TABLES is all tables in the database
All three are views of the underlying SYS tables

На основании вышеизложенного и упоминания SYS.TABLES в Oracle Документах я попытался

 select * from SYS.TABLES;

, но это привело к ошибке что таблица или представление не существует. Я пытался использовать как SYS, так и другое имя пользователя.

Вопрос 1: Является ли SYS.TABLES допустимой таблицей в Oracle 11g?

Вопрос 2: Если да, является ли SYS.TABLES базовой таблицей для представления DBA_TABLES?

Вопрос 3: Если да, какие привилегии мне нужно выбрать из SYS.TABLES?

Вопрос 4: Как найти базовый столбец и таблицы для представления, такого как DBA_TABLES?

Я отредактировал вопрос. Извините за беспорядок, который я вызвал ранее.

1 Ответ

3 голосов
/ 03 марта 2020

Это 11 г (XE, хотя, не берите в голову это).

Если вам интересно узнать о SYS объектах, принадлежащих вам, подключитесь так:

SQL> select * from v$version where rownum = 1;

BANNER
--------------------------------------------------------------------------------
Oracle Database 11g Express Edition Release 11.2.0.2.0 - 64bit Production

SQL> connect sys as sysdba
Enter password:
Connected.

1.

Существует ли TABLES? Нет.

SQL> desc tables;
ERROR:
ORA-04043: object tables does not exist

Но, TAB делает:

SQL> desc tab;
 Name                                      Null?    Type
 ----------------------------------------- -------- ----------------------------
 TNAME                                     NOT NULL VARCHAR2(30)
 TABTYPE                                            VARCHAR2(7)
 CLUSTERID                                          NUMBER

2.

Чтобы выяснить, что на самом деле DBA_TABLES:

SQL> select owner, object_type from dba_objects where object_name = 'DBA_TABLES';

OWNER                          OBJECT_TYPE
------------------------------ -------------------
SYS                            VIEW
PUBLIC                         SYNONYM

4.

ОК, это вид. Из какого запроса он сделан?

SQL> set long 20000
SQL> select text from dba_views where view_name = 'DBA_TABLES';

TEXT
--------------------------------------------------------------------------------
select u.name, o.name,
       decode(bitand(t.property,2151678048), 0, ts.name,
              decode(t.ts#, 0, null, ts.name)),
       decode(bitand(t.property, 1024), 0, null, co.name),
       decode((bitand(t.property, 512)+bitand(t.flags, 536870912)),
              0, null, co.name),
       decode(bitand(t.trigflag, 1073741824), 1073741824, 'UNUSABLE', 'VALID'),
<snip>
from sys.user$ u, sys.ts$ ts, sys.seg$ s, sys.obj$ co, sys.tab$ t, sys.obj$ o,
     sys.obj$ cx, sys.user$ cu, x$ksppcv ksppcv, x$ksppi ksppi,
     sys.deferred_stg$ ds
where o.owner# = u.user#
  and o.obj# = t.obj#
  and bitand(t.property, 1) = 0
  and bitand(o.flags, 128) = 0
  and t.bobj# = co.obj# (+)
  and t.ts# = ts.ts#
<snip>

(Это довольно длинный запрос, поэтому я отобразил только некоторые его части; теперь, когда вы знаете, как это сделать, сделайте это самостоятельно для получения дополнительной информации).

TAB, с другой стороны, гораздо проще:

SQL> select text from dba_views where view_name = 'TAB';

TEXT
---------------------------------------------------------------
select o.name,
      decode(o.type#, 2, 'TABLE', 3, 'CLUSTER',
             4, 'VIEW', 5, 'SYNONYM'), t.tab#
  from  sys.tab$ t, sys."_CURRENT_EDITION_OBJ" o
  where o.owner# = userenv('SCHEMAID')
  and o.type# >=2
  and o.type# <=5
  and o.linkname is null
  and o.obj# = t.obj# (+)

Вы бы использовали тот же принцип для "таблиц", указанных в предложении FROM, например,

SQL> select owner, object_type from dba_objects where object_name = 'TAB$';

OWNER                          OBJECT_TYPE
------------------------------ -------------------
SYS                            TABLE

Так что - да, это конец. TAB$ - финальная таблица, за ней ничего нет.

3.

Если вы подключены как SYS, вам не нужны никакие дополнительные привилегии. SYS владеет базой данных, это босс , он может сделать что угодно .

Для других пользователей владелец предоставляет привилегии, например (все еще подключенный как SYS):

SQL> grant select on tab$ to scott;

Grant succeeded.

SQL> grant select on x$ksppcv to scott;
grant select on x$ksppcv to scott
                *
ERROR at line 1:
ORA-02030: can only select from fixed tables/views


SQL>

Это должно быть, я полагаю.


Просто примечание: SYS, как я уже сказал, мощный. Будьте осторожны с тем, что вы делаете. Я надеюсь, что у вас есть база данных, чтобы сэкономить, как я; Ничего особенного не произойдет, если я что-то напортачу, в нем нет важных данных. Не играйте в игры на производственных базах.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...