2010-01-29

Создание v$ представлений

То немногое полезное, что удалось подчерпнуть из книги Richard Niemiec Oracle database 10G Performance tuning tips and techniques.

fixed_tables, v$, gv$

При старте экземпляра исполняемый файл создает в SGA x$ таблицы. Некоторые из них доступны в NOMOUNT
SQL> select * from x$ksutm;
ADDR INDX INST_ID KSUTMTIM
-------- ---------- ---------- ----------
00000000 0 1 1733938708
некоторые в MOUNT
select * from x$kccfe;
select * from x$kccfe
*
ERROR at line 1:
ORA-01507: database not mounted
некоторые в open. Структура таблиц зашита в исполняемом файле(?). Перечень таблиц можно получить выполнив запрос
SELECT * FROM v$fixed_table WHERE TYPE ='TABLE'
На основе x$ таблиц строятся sys.gv$ представления. Их доступность в nomount/mount зависит от того, на основе чего построен запрос представления. Запросы к этим представлениям может делать только пользователь sys.
create or replace view gv$fixed_table as
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;
На основе sys.gv$ представлений строятся sys.v$ представления. Выглядит это так:
select latch#,name, hash from gv$latchname where inst_id = userenv('Instance')т.е. из sys.gv$ не выбирается колонка inst_id и добавляется условие фильтрации inst_id = userenv('Instance')

Посмотреть список sys.gv$ и sys.v$ представлений можно при помощи запроса
SELECT * FROM v$fixed_table WHERE TYPE ='VIEW'Какие запросы скрыты за представлениями можно при помощи запроса к вьюхе v$fixed_view_definition.

Для того, что бы дать возможность остальным пользователям посмотреть на данный из x$ таблиц делается следующее:
1. Создаются вьюхи с подчеркиванием sys.gv_$ и sys.v_$.
2. На вьюхи sys.gv_$ и sys.v_$ создаются публичные синонимы gv$ и v$.
Посмотреть это можно в catalog.sql (и 2 штуки в catldr.sql)
create or replace view v_$gcshvmaster_info as select * from v$gcshvmaster_info;
create or replace public synonym v$gcshvmaster_info for v_$gcshvmaster_info;
grant select on v_$gcshvmaster_info to select_catalog_role;

create or replace view v_$gcspfmaster_info as select * from v$gcspfmaster_info;
create or replace public synonym v$gcspfmaster_info for v_$gcspfmaster_info;
grant select on v_$gcspfmaster_info to select_catalog_role;
Для того, что бы дать конечному пользователю посмотреть v$, ему необходимо грантовать sys.v_$ представление.

Запрашивая v$ мы делаем запрос к публичному синониму!!!

Доступность V$ в режиме mount и nomount
Доступность представлений зависит от таблиц, на которых они построены (КО). Так, в режиме nomount для вышеприведнной таблицы x$ksutm, которая доступна мы получим:
SQL> select * from v$timer;
HSECS
----------
1733979624
А для недоступной таблицы x$kccfe:
SQL> select * from v$filestat;
select * from v$filestat
*
ERROR at line 1:
ORA-01507: database not mounted
У меня есть предположение, что в mount не доступны те таблицы, которые зависят от ораклового словаря. Попробуем в этом убедится.
Используя приложение С из вышеописанной книги, найдем представление, которое зависит от словаря V$SEGMENT_STATISTICS (зависит от obj$, user$, x$ksolsfts, ts$, ind$) и выполним к нему запрос в режиме MOUNT:

SQL> SELECT object_name FROM V$SEGMENT_STATISTICS WHERE ROWNUM <= 1;
SELECT object_name FROM V$SEGMENT_STATISTICS WHERE ROWNUM <= 1
*
ERROR at line 1:
ORA-00604: error occurred at recursive SQL level 2
ORA-01219: database not open: queries allowed on fixed tables/views only
При этом любое другое представление, не зависящее от словаря Oracle успешно работает:
SQL> SELECT NAME FROM V$DATABASE;
NAME
---------
DB1
SQL> SELECT instance_name FROM V$INSTANCE;
INSTANCE_NAME
----------------
db1