Это 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
, как я уже сказал, мощный. Будьте осторожны с тем, что вы делаете. Я надеюсь, что у вас есть база данных, чтобы сэкономить, как я; Ничего особенного не произойдет, если я что-то напортачу, в нем нет важных данных. Не играйте в игры на производственных базах.