Sunteți pe pagina 1din 18

La Mano Derecha del Administrador: El Diccionario de

Datos
J uan Carlos Soto Orjuela
Kindi E.U.

Introduccin

En muchas ocasiones todo Administrador de la Base de Datos (ABD) tiene la necesidad de
informacin con relacin a la Base de Datos que est administrando, siendo el Diccionario
de Datos (DD) su principal fuente. Hay una gran cantidad de informacin contenida en el
DD disponible para los ABD, pero antes de usarse se debe conocer lo mejor posible; para
de esta manera poder sacar el mximo provecho del mismo.

El DD es un conjunto de estructuras en C, tablas y vistas Oracle. Por su complejidad y
extensin, el DD se ha dividido, para su comprensin, en dos (2) grandes niveles de
objetos a saber: el privado y el pblico.



La Figura 1, muestra los diferentes componentes del DD.
Kindi e.u. 1996, 2011
e-mail jcsotoo@gmail.com

2

Componente Privado

Se denomina componente privado a todos aquellos grupos de objetos (tablas y/o vistas) que
conforman el DD que por su naturaleza slo deberan ser accesados y/o utilizados por
usuarios con gran conocimiento del DD, normalmente los ABD. Este componente esta, a su
vez integrado por los siguientes grupos de objetos:

Estructuras C o tablas X$
Vistas V$
Tablas *$

Estructuras C o tablas X$

Es el nivel ms bajo del DD, normalmente no se mencionan en ningn documento que
hable acerca del DD. Para ver su contenido un ABD tiene que hacerlo como internal o
como el usuario SYS, una vez este conectado de la manera indicada, se encuentra con el
problema de la no auto documentacin de los nombres de esta tablas, lo mismo que de sus
atributos; pero no importa despus de largos perodos de investigacin, tanteo y consulta
con otros ABDs, es posible conocer algo el contenido de estas tablas. Es de suponer que
por su importancia, Oracle haya decidido usar esas convenciones para nombrarlas.

No hay documentacin acerca de las tablas X$ provista por Oracle Corporation; sin
embargo es posible mediante la revisin, el anlisis del contenido de las mismas deducir su
utilidad en la creacin de las vistas V$(consultando la V$SQLAREAo ejecutando un
EXPLAIN PLAN a comandos SELECT ejecutados utilizando vistas V$). Existen algo ms
de 100 tablas X$.

Las tablas X$ son tablas virtuales o fijas, las cuales son creadas en memoria al momento
del inicio de la instancia y mantenidas en tiempo real guardando informacin de la
actividad de la Base de Datos desde el comienzo de la instancia.

El nico comando permitido sobre estas tablas es el SELECT presentandose un error si se
intenta ejecutar cualquier tipo de comando diferente al SELECT. Adicionalmente estas
tablas son demasiado cripticas. Asi mismo no es posible ejecutar el comando DESCRIBE
sobre las tablas X$ (hasta el Release 7.1), para poder ver las columnas asociadas a cada
tabla X$ se hace necesario realizar una consulta.

El nico usuario que puede hacer SELECT de esas tablas es SYS, pero no puede otorgar el
privilegio de SELECT sobre esas tablas a ningn usuario. La nica operacin disponible
para permitir acceso sobre estas tablas a usuarios diferentes a SYS es la creacin de vistas
sobre ellas y con esas vistas permitir el acceso, de la siguiente forma:

create view prueba$option as select * from x$option;
Kindi e.u. 1996, 2011
e-mail jcsotoo@gmail.com

3
create public synonym x$option for prueba$option;
grant select on x$option to system;

Algunas tablas X$ son mencionadas a continuacin, indicando la informacin que
almacenan:

x$bh Contenido del Database Buffer Cache
x$kcbcbh Usada para simular alteracin del tamao del Database Buffer Cache
x$kcbrbh Usada para simular alteracin del tamao del Database Buffer Cache
x$kcbwait Estadsticas de espera dentro de la instancia
x$kcccf Archivos de control
x$kccdi Base de Datos
x$kccfn Archivos de datos
x$kcfio Estadsticas acceso a archivos de datos
x$kcvfhonl Backup en lnea
x$kdnssc Locks sobre los recursos del sistema
x$kglcursor Contenido de las reas de SQL
x$kglna Instrucciones SQL de gran tamao
x$kglstContenido de la Library Cache
x$kmmdi Despachadores definidos
x$kmmsg Estadsticas MTS
x$kmmsi Servidores compartidos
x$kqrst Estadsticas del Row Cache
x$ksmsd Estructura de la SGA
x$ksmsp Contenido del Shared Pool
x$ksmss Estadsticas de la SGA
x$ksppi Parmetros de la instancia
x$ksupr Procesos Oracle activos
x$ksusesta Estadsticas por sesin
x$ksusgsta Estadsticas del Sistema
x$option Opciones del Servidor instaladas
x$version Versiones de lo instalado

Dentro de las caractersticas ms relevantes se tiene:

Son tablas virtuales o fijas
Se crean al momento del startup
Mantienen informacin actualizada del estado de la Base de Datos actual y/o desde el
ultimo startup
Las tablas X$ no pueden ser modificadas de ninguna manera y su mantenimiento lo
desarrolla Oracle de manera automtica.
La informacin reside en la SGA
Solo se permite su acceso al usuario SYS
El nico comando SQL permitido es el SELECT
Kindi e.u. 1996, 2011
e-mail jcsotoo@gmail.com

4
Por necesidad, por naturaleza , los nombres de las columnas no son muy dicientes de su
contenido
La forma fcil de ver su informacin es mediante el uso de las vistas V$, de las cuales
se hablar mas adelante.
No es posible la creacin de ndices sobe ellas, para mejorar el acceso (hasta el Release
7.1).
Oracle Corporation previene que las tablas X$ pueden cambiar entre Releases.

Vistas V$

Las vistas V$ y V_$. (para casi toda vista V$ existe su correspondiente vista V_$) son los
verdaderos orgenes del DD; mucha de la informacin requerida por los ABD tiene que ver
con la informacin mostrada por estas vistas. Oracle crea las vistas V$ en la SGA,
permitiendo crear sobre esas vistas, otras vistas que permitan hacer claridad sobre el
contenido del DD.

Oracle crea vistas asociadas a las vistas V$ y a las tablas $, mediante el uso del archivo
catalog.sql.; luego de que el archivo catalog.sql es ejecutado, las vistas V$ son solo
disponibles para el usuario SYS. En este momento para que un usuario diferente a SYS
pueda tener acceso al contenido de las vistas V$, el usuario SYS debe dar permiso de
SELECT sobre ese grupo de objetos.

Si se esta interesado en ver informacin acerca de las vistas V$, una fuente es el "Oracle7
Server Reference Guide".

A continuacin se listan algunas vistas V$, mostrando el comando SELECT que sobre
tablas X$ se realiza para dar origen a la vista mencionada.

v$controlfile
select decode(bitand(cfflg,1),0,'',1,
'INVALID'),cfnam
from x$kcccf
/
v$datafile
select fe.indx+1,decode(bitand(fe.festa,
19),0,'OFFLINE',1,'SYSOFF',
2,'ONLINE',3,'SYSTEM',16,'RECOVER',
18,'RECOVER','UNKNOWN'),
decode(bitand(fe.festa, 12), 0,
'DISABLED',4,'READ ONLY',
12,'READ WRITE','UNKNOWN'),
to_number(fe.fecps),
fe.fecsz*fe.febsz, fn.fnnam
from x$kccfe fe,x$kccfn fn
Kindi e.u. 1996, 2011
e-mail jcsotoo@gmail.com

5
where fe.fedup!=0
and fe.indx+1=fn.fnfno
and fn.fntyp=3
/
v$logfile
select fnfno, decode(fnflg,0,'',1,'INVALID',
2,'STALE',4,'DELETED','UNKNOWN'),
fnnam
from x$kccfn
where fnnam is not null
and fntyp=2
/
v$option
select parameter, value
from x$option
/
v$parameter
select indx+1,ksppinm,ksppity,ksppivl,ksppidf
from x$ksppi
where translate(ksppinm,'_','#') not like '#%'
/
v$sga
select ksmsdnam,ksmsdval
from x$ksmsd
/
v$sgastat
select ksmssnam,ksmsslen
from x$ksmss
where ksmsslen>1
/
v$sysstat
select ksusgstn,ksusdnam,ksusdcls,ksusgstv
from x$ksusgsta
/
v$waitstat
select decode(indx,1,'data block',
2,'sort block',3,'save undo block',
4,'segment header',
5,'save undo header',6,'free list',
7,'system undo header',
8,'system undo block',9,'undo header',
10,'undo block'), count,time
from x$kcbwait
where indx!=0
/
Kindi e.u. 1996, 2011
e-mail jcsotoo@gmail.com

6

Dentro de las caractersticas ms relevantes de las vistas V$, se tiene:

Las V$ son un conjunto de vistas que de manera adicional proporcionan informacin
del estado de la Base de Datos y del ambiente de la misma.
Informacin de las vistas V$ es usada para propsitos de afinamiento, recuperacin,
determinar contencin de recursos, entre otros tpicos.
La informacin es almacenada en la SGA y actualizada de manera dinmica, es decir,
cuando ocurran eventos que ameriten su actualizacin (eventos que modifican el
contenido de las tablas X$)
Oracle7 no proporciona mucha informacin acerca de la estructura de las vistas V$
Las vistas V$ son conocidas como tablas virtuales, tablas fijas, tablas V$, tablas de
desempeo dinmico, entre otros muchos nombres..
Oracle7 previene que el contenido de las vistas V$ puede cambiar en Release futuros.

Las vistas V$ pueden ser agrupadas segn la informacin que proporcionan

Nombre Descripcin Vista(s)
BackUp/Recovery Fechas, estado de archivos v$archive v$backup
v$recover_log v$recover_file

Caches Sobre objetos, cursores, diccionario,
etc.
v$db_object_cache v$librarycache
v$rowcache

Cursores/Instr. SQL Estadsticas, texto v$open_cursor v$sqlarea v$sqltext

Carga Directa Inf. Sobre la opcin de carga directa
del SQL*Loader

v$loadcstat v$loadstat

General Procesos background, Base de Datos
, archivos de datos, SGA, instancias,
versiones
v$bgprocess v$compatseg
v$database v$dbfile
v$enabledprivs v$instance
v$mystat v$pwfile_users
v$resource v$sgastat
v$type_size v$compatibility
v$controlfile v$datafile v$dblink
v$fixed_table v$license
v$option v$reqdist v$sga
v$timer v$version

E/S Archivos, estadsticas v$filestat v$waitstat

Latches v$latch v$latchholder
v$latchname
Locks v$lock v$_lock v$_lock1

Multi-Threaded / Servidores paralelos, colas, v$circuit v$dispatcher v$mts
Kindi e.u. 1996, 2011
e-mail jcsotoo@gmail.com

7
Parallel Server circuitos, servidores compartidos,
despachadores

v$queue v$shared_server v$thread
Estadsticas v$sysstat
v$system_cursor_cache
v$system_event

Consultas Paralelas Inf. Sobre la opcin de consultas en
paralelo
v$pq_sesstat v$pq_slave
v$pq_sysstat

Parmetros v$nls_parameter v$parameter
v$mls_parameter
v$nls_valid_values

Redo Logs Estadsticas, nombres, histricos v$log v$logfile v$loghist
v$log_hist

Segmentos de
Rollback/Undo
Nombres, estado, estadsticas,
transacciones

v$rollname v$rollstat v$transaction
Sesin Cursores, procesos, estadsticas v$access v$process v$session
v$session_cursor_cache
v$session_event v$session_wait
v$sesstat v$sess_io v$statname

Tablas *$

El otro grupo de objetos dentro del DD, componente privado, es el conjunto de las tablas $.
Estas tablas tienen nombres ms comprensibles que las anteriores (tablas X$), tales como
COL$, TS$, USER$ o TAB$. Este conjunto de tablas es creado por la ejecucin del archivo
sql.bsq. De la misma manera que con las tablas X$, se recomienda que solo sean usuarios
administradores (ABD) los que accesen estas tablas.

Algunas de las tablas $ se mencionan a continuacin, indicando la informacin contenida:

tab$ Tablas creadas
clu$ Cluster creados
fet$ Extensiones Libres
uet$ Extensiones usadas
seg$ Segmentos Creados
undo$ Rollback Segments creados
ts$ Tablespaces creados
file$ Archivos de la Base de Datos creados
obj$ Objetos creados
ind$ Indices creados
icol$ Columnas asociadas a los indices ceados
col$ Columnas definidas
Kindi e.u. 1996, 2011
e-mail jcsotoo@gmail.com

8
user$ Usuarios/Roles definidos
con$ Constraints definidos
ccol$ Columnas asociadas a los constraints
tsq$ Cuotas asignadas a cada usuario sobre tablespaces
syn$ Sinnimos creados
view$ Vistas creadas
seq$ Secuencias creadas
procedure$ Procedimientos creados
argument$ Descripcin de argumentos de procedimientos creados
trigger$ Triggers definidos a nivel Base de Datos
objauth$ Autorizacin de acceso a objetos Oracle
sysauth$ Autorizacin sobre el sistema Oracle
dependency$ Dependencias entre objetos
aud$ Registro de Auditoria

Componente pblico

Dentro de este grupo de objetos Oracle estn todas las vistas que sobre el componente
privado son creadas por los diferentes archivos cat*.sql, siendo el ms conocido el
catalog.sql, que crea vistas asociadas a las tablas X$, *$ y a las vistas V$ o V_$.

Vistas USER/ALL/DBA

Estas vistas son la manera ms amigable de observar la informacin contenida en el DD.
Son el grupo de objetos Oracle ms conocido, como alternativa de seguridad en el manejo
del DD por parte de los diferentes usuarios involucrados en el manejo del DD; por ello en
este articulo solo se hace mencin de algunos aspectos relevantes, sin entrar en detalle.

Las vistas estn divididas en tres (3) grandes grupos, a saber:

USER_ Muestran los objetos creados por el usuario que hace la consulta.
ALL_ Muestran los objetos a los cuales cada usuario tiene acceso, es decir todos los que
el ha creado como tambin aquellos sobre los cuales tiene permitido el acceso y no le
pertenecen.
DBA_ Muestran todos los objetos creados a nivel de la Base de Datos.

Como las vistas ALL_ y DBA_ muestran objetos pertenecientes a diferentes usuarios, en
ellas se debe estipular el propietario de cada objeto referenciado.

Normalmente toda vista DBA_, tiene su contraparte USER_ y ALL_, con contadas
excepciones que no ameritan la presencia de esas vistas, ejemplo dba_tablespaces,
dba_data_files, dba_rollback_segs.

Kindi e.u. 1996, 2011
e-mail jcsotoo@gmail.com

9
Como ejemplo de creacin de las vistas USER_, ALL_ y DBA_ se muestran las siguientes
instrucciones contenidas en el archivo catalog.sql.

remark
remark FAMILY "TABLES"
remark CREATE TABLE parameters.
remark
create or replace view USER_TABLES
(TABLE_NAME, TABLESPACE_NAME, CLUSTER_NAME,
PCT_FREE, PCT_USED,
INI_TRANS, MAX_TRANS,
INITIAL_EXTENT, NEXT_EXTENT,
MIN_EXTENTS, MAX_EXTENTS, PCT_INCREASE,
BACKED_UP, NUM_ROWS, BLOCKS, EMPTY_BLOCKS,
AVG_SPACE, CHAIN_CNT, AVG_ROW_LEN,
DEGREE, INSTANCES, CACHE)
as
select o.name, ts.name, co.name,
t.pctfree$, t.pctused$,
t.initrans, t.maxtrans,
s.iniexts * ts.blocksize, s.extsize * ts.blocksize,
s.minexts, s.maxexts, s.extpct,
decode(t.modified, 0, 'Y', 1, 'N', '?'),
t.rowcnt, t.blkcnt, t.empcnt, t.avgspc, t.chncnt, t.avgrln,
lpad(decode(t.spare1, 0, '1', 1, 'DEFAULT', to_char(t.spare1)), 10),
lpad(decode(mod(t.spare2, 65536), 0, '1', 1, 'DEFAULT',
to_char(mod(t.spare2, 65536))), 10),
lpad(decode(floor(t.spare2 / 65536), 0, 'N', 1, 'Y', '?'), 5)
from sys.ts$ ts, sys.seg$ s, sys.obj$ co, sys.tab$ t, sys.obj$ o
where o.owner# = userenv('SCHEMAID')
and o.obj# = t.obj#
and t.clu# = co.obj# (+)
and t.ts# = ts.ts#
and t.file# = s.file# (+)
and t.block# = s.block# (+)
/
create or replace view ALL_TABLES
(OWNER, TABLE_NAME, TABLESPACE_NAME, CLUSTER_NAME,
PCT_FREE, PCT_USED,
INI_TRANS, MAX_TRANS,
INITIAL_EXTENT, NEXT_EXTENT,
MIN_EXTENTS, MAX_EXTENTS, PCT_INCREASE,
BACKED_UP, NUM_ROWS, BLOCKS, EMPTY_BLOCKS,
AVG_SPACE, CHAIN_CNT, AVG_ROW_LEN,
DEGREE, INSTANCES, CACHE)
Kindi e.u. 1996, 2011
e-mail jcsotoo@gmail.com

10
as
select u.name, o.name, ts.name, co.name,
t.pctfree$, t.pctused$,
t.initrans, t.maxtrans,
s.iniexts * ts.blocksize, s.extsize * ts.blocksize,
s.minexts, s.maxexts, s.extpct,
decode(t.modified, 0, 'Y', 1, 'N', '?'),
t.rowcnt, t.blkcnt, t.empcnt, t.avgspc, t.chncnt, t.avgrln,
lpad(decode(t.spare1, 0, '1', 1, 'DEFAULT', to_char(t.spare1)), 10),
lpad(decode(mod(t.spare2, 65536), 0, '1', 1, 'DEFAULT',
to_char(mod(t.spare2, 65536))), 10),
lpad(decode(floor(t.spare2 / 65536), 0, 'N', 1, 'Y', '?'), 5)
from sys.user$ u, sys.ts$ ts, sys.seg$ s, sys.obj$ co, sys.tab$ t, sys.obj$ o
where o.owner# = u.user#
and o.obj# = t.obj#
and t.clu# = co.obj# (+)
and t.ts# = ts.ts#
and t.file# = s.file# (+)
and t.block# = s.block# (+)
and (o.owner# = userenv('SCHEMAID')
or o.obj# in
(select oa.obj#
from sys.objauth$ oa
where grantee# in ( select kzsrorol
from x$kzsro
)
)
or /* user has system privileges */
exists (select null from v$enabledprivs
where priv_number in (-45 /* LOCK ANY TABLE */,
-47 /* SELECT ANY TABLE */,
-48 /* INSERT ANY TABLE */,
-49 /* UPDATE ANY TABLE */,
-50 /* DELETE ANY TABLE */)
)
)
/
create or replace view DBA_TABLES
(OWNER, TABLE_NAME, TABLESPACE_NAME, CLUSTER_NAME,
PCT_FREE, PCT_USED,
INI_TRANS, MAX_TRANS,
INITIAL_EXTENT, NEXT_EXTENT,
MIN_EXTENTS, MAX_EXTENTS, PCT_INCREASE,
BACKED_UP, NUM_ROWS, BLOCKS, EMPTY_BLOCKS,
AVG_SPACE, CHAIN_CNT, AVG_ROW_LEN,
Kindi e.u. 1996, 2011
e-mail jcsotoo@gmail.com

11
DEGREE, INSTANCES, CACHE)
as
select u.name, o.name, ts.name, co.name,
t.pctfree$, t.pctused$,
t.initrans, t.maxtrans,
s.iniexts * ts.blocksize, s.extsize * ts.blocksize,
s.minexts, s.maxexts, s.extpct,
decode(t.modified, 0, 'Y', 1, 'N', '?'),
t.rowcnt, t.blkcnt, t.empcnt, t.avgspc, t.chncnt, t.avgrln,
lpad(decode(t.spare1, 0, '1', 1, 'DEFAULT', to_char(t.spare1)), 10),
lpad(decode(mod(t.spare2, 65536), 0, '1', 1, 'DEFAULT',
to_char(mod(t.spare2, 65536))), 10),
lpad(decode(floor(t.spare2 / 65536), 0, 'N', 1, 'Y', '?'), 5)
from sys.user$ u, sys.ts$ ts, sys.seg$ s, sys.obj$ co, sys.tab$ t, sys.obj$ o
where o.owner# = u.user#
and o.obj# = t.obj#
and t.clu# = co.obj# (+)
and t.ts# = ts.ts#
and t.file# = s.file# (+)
and t.block# = s.block# (+)
/

Para una descripcin de estos objetos, se puede consultar el Oracle7 Server Reference
Guide.
Kindi e.u. 1996, 2011
e-mail jcsotoo@gmail.com

12
Ejemplo 1

Ver todos los privilegios asociados a un usuario,
especificando el origen del mismo

Dentro del Diccionario de Datos Oracle
(DD) se tiene una vista que nos permite ver
que privilegios, a nivel sistema, le han sido
asignados a un usuario de manera directa
(USER_SYS_PRIVS) y cuales le han sido
asignados mediante el uso de roles o de
manera directa (SESSION_PRIVS), con
las siguientes caracteristicas:

No se especifica el origen de cada
privilegio.

No se puede determinar, ni mostrar, si
un privilegio ha sido recibido por ms
de una via ( de manera directa, de un
usuario con capacidad de otorgar
privilegios; o por medio de un role)

Accesando el Diccionario de Datos, se crea
una vista (SESSION_SYS_PRIVS) con
capacidad de mostrar la siguiente
informacin:

Privilegios asignados de manera directa
al usuario

Privilegios dados al usuario por medio
de roles, ya sean estos roles asignados
directamente al usuario o a roles
asignados al mismo.

Origen de cada privilegio

Es decir la vista satisface los
requerimientos planteados en la Figura 2..

Kindi e.u. 1996, 2011
e-mail jcsotoo@gmail.com

13
SCRIPT:
/*
|| Uso del Diccionario de Datos para crear vistas que pueden ser necesarias
|| en un momento dado, por ejemplo,
|| ver todos los privilegios asociados a un usuarios, ya sean estos otorgados
|| de manera directa o mediante el uso de roles (SESSION_SYS_PRIVS)
||
|| Para averiguar esto, normalmente se debe consultar
|| USER_SYS_PRIVS Privilegios dados directamente a un usuario por un DBA
|| SESSION_PRIVS Privilegios otorgados a un usuario, mostrando de manera
|| indiferente si el privilegio ha sido dado de manera directa
|| o mediante un role.
|| SESSION_ROLES Roles asignados a un usuario.
|| DBA_SYS_PRIVS Privilegios dados a usuarios o roles
*/
create or replace view SESSION_SYS_PRIVS
(GRANTEE,TYPE,PRIVILEGE, ADMIN_OPTION)
as
select u.name
,'ROLE'
,spm.name
,decode(min(option$),1,'YES','NO')
from sys.system_privilege_map spm, sys.sysauth$ sa, user$ u
where sa.grantee#=u.user# and sa.privilege#=spm.privilege
and sa.grantee# in (
select u.user#
from x$kzsro,user$ u
where kzsrorol!=userenv('SCHEMAID')
and kzsrorol!=1
and u.user#=kzsrorol)
group by u.name,spm.name
union
select decode(sa.grantee#,1,'PUBLIC','*******')
,'DBA'
,spm.name
,decode(min(option$),1,'YES','NO')
from sys.system_privilege_map spm, sys.sysauth$ sa
where (sa.grantee# =userenv('SCHEMAID') or sa.grantee# =1)
and sa.privilege# =spm.privilege
group by decode(sa.grantee#,1,'PUBLIC','*******'),spm.name;
grant select on SESSION_SYS_PRIVS to public;
drop public synonym SESSION_SYS_PRIVS;
create public synonym SESSION_SYS_PRIVS for SYS.SESSION_SYS_PRIVS;

Kindi e.u. 1996, 2011
e-mail jcsotoo@gmail.com

14
/*
|| Ver todos los privilegios asociados a un usuarios, ya sean estos otorgados
|| de manera directa o mediante el uso de roles (SESSION_TAB_PRIVS)
*/
CREATE OR REPLACE FORCE VIEW SYS.session_tab_privs (grantee,
owner, table_name, grantor, PRIVILEGE, grantable, HIERARCHY)
AS
SELECT ue.NAME, u.NAME, o.NAME, ur.NAME, tpm.NAME,
DECODE (MOD (oa.option$, 2), 1, 'YES', 'NO'),
DECODE (BITAND (oa.option$, 2), 2, 'YES', 'NO')
FROM SYS.objauth$ oa,
SYS."_CURRENT_EDITION_OBJ" o,
SYS.user$ u,
SYS.user$ ur,
SYS.user$ ue,
table_privilege_map tpm,
(SELECT user#
FROM x$kzsro, user$ u
WHERE kzsrorol != USERENV ('SCHEMAID')
AND kzsrorol != 1
AND u.user# = kzsrorol) sr
WHERE oa.obj# = o.obj#
AND oa.grantor# = ur.user#
AND oa.grantee# = ue.user#
and sr.user#=oa.grantee#
AND oa.col# IS NULL
AND oa.privilege# = tpm.PRIVILEGE
AND u.user# = o.owner#
union
SELECT ue.NAME, u.NAME, o.NAME, ur.NAME, tpm.NAME,
DECODE (MOD (oa.option$, 2), 1, 'YES', 'NO'),
DECODE (BITAND (oa.option$, 2), 2, 'YES', 'NO')
FROM SYS.objauth$ oa,
SYS."_CURRENT_EDITION_OBJ" o,
SYS.user$ u,
SYS.user$ ur,
SYS.user$ ue,
table_privilege_map tpm
WHERE oa.obj# = o.obj#
AND oa.grantor# = ur.user#
AND oa.grantee# = ue.user#
AND oa.col# IS NULL
AND u.user# = o.owner#
AND oa.privilege# = tpm.PRIVILEGE
AND USERENV ('SCHEMAID') IN (oa.grantor#, oa.grantee#, o.owner#);
Kindi e.u. 1996, 2011
e-mail jcsotoo@gmail.com

15

grant select on session_tab_privs to public;
drop public synonym SESSION_TAB_PRIVS;
create public synonym SESSION_TAB_PRIVS for SYS.SESSION_TAB_PRIVS;

Kindi e.u. 1996, 2011
e-mail jcsotoo@gmail.com

16

Ejemplo 2

Uso del Diccionario para resolver un problema, la
migracin o el encadenamiento de registros

/*
|| El problema de la migracion o el encadenamiento de registros dentro de una tabla, se
|| presenta cuando un registro no puede ser almacenado de manera completa dentro de un
|| mismo bloque de datos Oracle, debiendo ser almacenado en mas de un bloque. Estos
|| problemas se presentan cuando sobre las tablas se presenta mucha actividad de
|| actualizacion.
|| La solucion a estos problemas radica de manera esencial en volver a realizar la insercin
|| de el (los) registro(s) a la tabla. Una de las alternativas, cuando el nmero de registros es
|| pequeo es el presente script; el cual consta de lo siguiente:
||
|| 1- Generacin es estadisticas para los objetos de un usuario
|| incluyendo Tablas, indices y clusters
*/
set echo off term off pause off feedback off heading off pagesize 0
spool analyze1.sql
select 'analyze '||segment_type||' '||
segment_name||' compute statistics;'
from user_segments where segment_type in ('TABLE','CLUSTER','INDEX');
spool off
set echo on term on pause on feedback on heading on pagesize 22
start analyze1
/*
|| 2- Creacion de la tabla CHAINED_ROWS
|| lugar en el cual se almacenara la informacion de los registros que presenten migracion
|| o encadenamiento
*/
start ?/rdbms/admin/utlchain
set echo off term off pause off feedback off heading off pagesize 0
spool analyze1.sql
/*
|| 3- Almacenar en CHAINED_ROWS la informacion de los registros problema
*/
select 'Analyze table '||table_name||
' list chained rows into chained_rows;'
from user_tables where chain_cnt > 0;
spool off
set echo on term on pause on feedback on heading on pagesize 22
Kindi e.u. 1996, 2011
e-mail jcsotoo@gmail.com

17
start analyze1
/*
|| 4- Creacion de las tablas que albergaran los registros problema
*/
set echo off term off pause off feedback off heading off pagesize 0
spool analyze1.sql
select 'Drop table '||table_name||'_tmp;'||chr(10)||
'Create table '||table_name||'_tmp'||chr(10)|| 'as'||chr(10)||
'Select * from '||table_name||chr(10)||
'where rowid in (select head_rowid'||chr(10)||
' from chained_rows'||chr(10)||
' where table_name ='||
chr(39)||table_name||chr(39)||');'
from user_tables where chain_cnt > 0;
/*
|| 5- Borrado de los registros problema de las tablas originales
*/
select 'Delete from '||table_name||chr(10)||
'where rowid in (select head_rowid'||chr(10)||
' from chained_rows'||chr(10)||
' where table_name ='||
chr(39)||table_name||chr(39)||');'
from user_tables where chain_cnt > 0;
spool off
set echo on term on pause on feedback on heading on pagesize 22
start analyze1
/*
|| 6- Insercion de los registros en las tablas origen
*/
set echo off term off pause off feedback off heading off pagesize 0
spool analyze1.sql
select 'Insert into '||table_name||chr(10)||
'Select * from '||table_name||'_tmp;'
from user_tables where chain_cnt > 0;
select 'Drop table '||table_name||'_tmp;'
from user_tables where chain_cnt > 0;
spool off
set echo on term on pause on feedback on heading on pagesize 22
start analyze1
set echo off term off pause off feedback off heading off pagesize 0
spool analyze1.sql
/*
|| 7- Borrado de las estadisticas de los objetos asociados al usuario
*/
select 'analyze '||segment_type||' '||segment_name||' delete statistics;'
Kindi e.u. 1996, 2011
e-mail jcsotoo@gmail.com

18
from user_segments where segment_type in ('TABLE','CLUSTER','INDEX');
spool off
set echo on term on pause on feedback on heading on pagesize 22
start analyze1

Conclusiones
La intencin de este artculo fue la de mostrar el como Oracle implementa el DD y el
mostrar como es posible mediante el conocimiento del DD obtener informacin que antes
era vedada a los usuarios ABD.

Con el conocimiento del Diccionario de Datos (DD), especialmente las vistas V$ y las
tablas X$ y $ es posible aumentar la capacidad de realizar consultas al DD que nos
permitan ver informacin que no es posible ver mediante el uso de las vistas
USER/ALL/DBA provistas por Oracle. De igual manera es posible mejorar las consultas
que actualmente se realizan usando las vistas USER/ALL/DBA creando consultas directas
a las tablas X$ y $.

En caso de cualquier duda o necesidad de ampliar la informacin contenida en este articulo,
lo mismo que de realizar correcciones al mismo, por favor hacer llegar sus comentarios a
jcsotoo@gmail.com.

S-ar putea să vă placă și