实例讲解如何查找某个对象的定义情况
2008-03-13 11:34
作者:Curitis
来源:赛迪网
[摘要] 在实际的工作中,我们经常需要查找某个对象的定义的情况,本文中我们将针对不同类型的对象分别进行讲解:
[关键字]
查找
对象
定义
在实际的工作中,我们经常需要查找某个对象的定义的情况,本文中我们将针对不同类型的对象分别进行讲解:
一、V$视图和X$视图
普通的用户不能访问V$视图:
SQL> conn lunar/lunar@test1
已连接。
SQL> select * from user_sys_privs;
USERNAME PRIVILEGE ADMIN_OPTION
---------- -------------- ------------
SQL> select * from user_role_privs;
USERNAME GRANTED_ROLE ADMIN_OPTION DEFAULT_ROLE OS_GRANTED
----------- --------------- ------------ ------------ ----------
LUNAR CONNECT NO YES NO
LUNAR RESOURCE NO YES NO
PUBLIC PLUSTRACE NO YES NO
SQL> select count(*) from v$fixed_table;
select count(*) from v$fixed_table
ORA-00942: 表或视图不存在
必须授权:
SQL> conn /@test1 as sysdba
已连接。
SQL> grant select on v_$fixed_table to lunar;
授权成功。
SQL> conn lunar/lunar@test1
已连接。
SQL>
我们可以发现,得到授权的普通用户仍然只能访问V$开头的视图,而不能直接访问V_$开头的视图,因为实际上V$视图是V_$视图的公有同义词(PUBLIC SYNONYM)要想访问V_$必须带上SYS.V_$。
例如:
SQL> select count(*) from v$fixed_table;
COUNT(*)
----------
912
SQL> select count(*) from v_$fixed_table;
select count(*) from v_$fixed_table
ORA-00942: 表或视图不存在
SQL> select count(*) from sys.v_$fixed_table;
COUNT(*)
----------
912
SQL>
与此同时,也可以授予用户SELECT any table权限,这样这个用户就可以访问所有的V$视图:
SQL> grant select any table to lunar;
授权成功。
SQL> select * from user_role_privs;
USERNAME GRANTED_ROLE ADMIN_OPTION DEFAULT_ROLE OS_GRANTED
------------ --------------------- ------------ ------------ ----------
LUNAR CONNECT NO YES NO
LUNAR RESOURCE NO YES NO
PUBLIC PLUSTRACE NO YES NO
SQL> select * from user_sys_privs;
USERNAME PRIVILEGE ADMIN_OPTION
------------ ----------------------- ------------
LUNAR SELECT ANY TABLE NO
SQL> select count(*) from v$fixed_table;
COUNT(*)
----------
912
SQL> select * from v$fixed_table where rownum<2;
NAME OBJECT_ID TYPE TABLE_NUM
---------- ---------- ----- ----------
X$KQFTA 4294950912 TABLE 0
SQL> select * from v_$fixed_table where rownum<2;
select * from v_$fixed_table where rownum<2
ORA-00942: 表或视图不存在
SQL> select * from sys.v_$fixed_table where rownum<2;
NAME OBJECT_ID TYPE TABLE_NUM
---------- ---------- ----- ----------
X$KQFTA 4294950912 TABLE 0
SQL>
通过查询V$FIXED_TABLE视图,我们可以看到大部分V$视图和一些X$视图(还有一些Oracle未公开的视图不在其中)。
有人要问,那么这些V$视图又是有什么组成的呢?
通过查询V$FIXED_VIEW_DEFINITION视图,我们可以看到这些V$视图的创建语句:
SQL> conn /@test1 as sysdba
已连接。
SQL> grant select any table to lunar;
授权成功。
SQL> conn lunar/lunar@test1
已连接。
SQL>
SQL> set heading off echo off long 50000 pages 10000
SQL> select * from v$fixed_view_definition where view_name='V$FIXED_TABLE';
V$FIXED_TABLE
select NAME , OBJECT_ID , TYPE , TABLE_NUM from GV$FIXED_TABLE
where inst_id = USERENV('Instance')
SQL>
select NAME , OBJECT_ID , TYPE , TABLE_NUM
from GV$FIXED_TABLE
where inst_id = USERENV('Instance')
那么这个GV$FIXED_TABLE视图的定义又是怎样的呢?
SQL> select * from v$fixed_view_definition where view_name='GV$FIXED_TABLE';
GV$FIXED_TABLE
select inst_id,kqftanam, kqftaobj, 'TABLE', indx from x$kqfta union all select
inst_id,kqfvinam, kqfviobj, 'VIEW', 65537 from x$kqfvi union all select
inst_id,kqfdtnam, kqfdtobj, 'TABLE', 65537 from x$kqfdt
SQL>
select inst_id,kqftanam, kqftaobj, 'TABLE', indx from x$kqfta
union all
select inst_id,kqfvinam, kqfviobj, 'VIEW', 65537 from x$kqfvi
union all
select inst_id,kqfdtnam, kqfdtobj, 'TABLE', 65537 from x$kqfdt