书名书名书名书名书名书名书名书名书名书名书名书名书名书名
·2·
X$表的本质上是一系列的 C 结构体,是 Oracle 数据库的运行基础,在数据库启动时由
Oracle 应用程序动态创建。这部分表对数据库来说至关重要,所以 Oracle 不允许 SYSDBA 之
外的用户直接访问,显示授权不被允许。
如果显式授权会收到如下错误:
SQL> grant select on x$ksppi to eygle;
grant select on x$ksppi to eygle
*
ERROR at line 1:
ORA-02030: can only select from fixed tables/views
Oracle 的解释是:
ORA-02030 can only select from fixed tables/views
Cause: An attempt is being made to perform an operation other than a retrieval from a fixed
table/view.
Action: You may only select rows from fixed tables/views.
一句话,这些对象你最好只是查询。
发现、观察、研究 X$表的一个好办法是借用 Oracle 的 AUTOTRACE 功能,当我们查询
一些常用视图的时候,我们可以通过 AUTOTRACE 功能发现这些 View 的底层表。
以下是 Oracle10gR2 中的一个示例:
SQL> set autotrace trace explain
SQL> select * from v$parameter;
Execution Plan
----------------------------------------------------------
Plan hash value: 1128103955
------------------------------------------------------------------------------
| Id | Operation | Name | Rows | Bytes | Cost (%CPU)| Time |
------------------------------------------------------------------------------
| 0 | SELECT STATEMENT | | 1 | 926 | 1 (100)| 00:00:01 |
|* 1 | HASH JOIN | | 1 | 926 | 1 (100)| 00:00:01 |
|* 2 | FIXED TABLE FULL| X$KSPPI | 1 | 249 | 0 (0)| 00:00:01 |
| 3 | FIXED TABLE FULL| X$KSPPCV | 100 | 67700 | 0 (0)| 00:00:01 |
------------------------------------------------------------------------------
Predicate Information (identified by operation id):
---------------------------------------------------
1 - access("X"."INDX"="Y"."INDX")
filter(TRANSLATE("KSPPINM",'_','#') NOT LIKE '#%' OR
"KSPPSTDF"='FALSE' OR BITAND("KSPPSTVF",5)>0)
2 - filter("X"."INST_ID"=USERENV('INSTANCE') AND
TRANSLATE("KSPPINM",'_','#') NOT LIKE '##%')
这些研究和探索是极有趣味的,如果你能就此深入下去,一定能够时常发现意外的收获。
评论