Mais quelle idée ? Quel intérêt ?
Les « tables » X$ contiennent les informations relatives à l’instance de base de données, à la session. Leur accès est réservé au compte SYS et pour cause : ces « tables » n’en sont en fait pas, il s’agit de structures mémoires consultables directement, elles ne sont donc pas stockées sur disque et initialisées à chaque démarrage de la base de données.
Comment accède-t-on à leur données ? Généralement au travers des vues dynamiques V_$ ou de leurs synonymes en V$ qui répondent à la pluspart des demandes que peut avoir un DBA. cependant, lors d’un audit par exemple on peut avoir besoin d’accéder aux paramètre cachés de l’instance ou de n’avoir accès qu’à une partie des données fournies par une vue et dès lors préférer les accès directs aux structures X$ plutôt qu’aux vues dynamiques.
Facile me direz-vous : il suffit de se connecter SYS et de faire directement le select …Bande de vilains, il vaut mieux éviter la connexion sys quand elle n’est pas absolument nécessaire, le compte a une capacité de nuisance bien trop importante. Bon alors se connecter SYS et donner le droit de select sur les structures … Impossible, la structure mémoire n’est pas à proprement parler un objet de la base et on ne peut pas « granter select » dessus » :
SQL> grant select on x$ksppsv to scott 2 / grant select on x$ksppsv to scott * ERREUR α la ligne 1 : ORA-02030: une sΘlection n'est autorisΘe que depuis des tables fixes/vues
Reste la solution de créer des vues plus réduites que les V_$… sur ces tables
Le script
Le script suivant, à lancer par SYS (obligatoirement) permet de créer automatiquement toutes ces vues (il en circule plusieurs version sur le net, j’ai repris celui de Steve Adams):
set termout off clear breaks clear columns clear computes set feed off verify off pages 0 echo off spool create_xviews.sql prompt set echo on termout on feed on select 'create or replace view SYS.V_X$'||substr(name, 3)|| ' as select * from '||name||';' from sys.v_$fixed_table where name like 'X$%'; spool off @create_xviews.sql set termout off feed off host rm -f create_xviews.sql host del create_xviews.sql
Exemple d’utilisation
Ne reste ensuite qu’à interroger ces vues : Par exemple
set lines 155 pages 1000 col name for a28 col value for a30 col description for a25 col INSTANCE for 99 heading "I#" SELECT INSTANCE , NAME , VALUE -- , DECODE (isdefault, 'TRUE', 'Y', 'N') AS "Default" -- , DECODE (isem, 'TRUE', 'Y', 'N') AS sesmod -- , DECODE (isym, 'IMMEDIATE', 'I','DEFERRED', 'D','FALSE', 'N') AS sysmod -- , DECODE (imod, 'MODIFIED', 'U','SYS_MODIFIED', 'S','N') AS modified -- , DECODE (iadj, 'TRUE', 'Y', 'N') AS adjusted -- , description FROM ( SELECT x.inst_id AS INSTANCE , x.indx + 1 , ksppinm AS NAME , ksppity , ksppstvl AS VALUE , ksppstdf AS isdefault , DECODE (BITAND (ksppiflg / 256, 1),1, 'TRUE','FALSE') AS isem , DECODE (BITAND (ksppiflg / 65536, 3),1, 'IMMEDIATE',2, 'DEFERRED','FALSE') AS isym , DECODE (BITAND (ksppstvf, 7), 1, 'MODIFIED','FALSE') AS imod , DECODE (BITAND (ksppstvf, 2), 2, 'TRUE', 'FALSE') AS iadj , ksppdesc AS description FROM sys.v_x$ksppi x , sys.v_x$ksppsv y WHERE x.indx = y.indx AND ksppstdf != 'TRUE') ORDER BY NAME;
Qui pourra donner le résultat suivant :
I# NAME VALUE --- ---------------------------- ------------------------------ 1 audit_file_dest D:APPADMSRVORACLEADMINORC LADUMP 1 audit_trail NONE 1 compatible 11.2.0.0.0 1 control_files D:APPADMSRVORACLEDATAORCL CONTROL01.CTL, D:APPADMSRV ORACLEFAST_RECOVERY_AREAORCL CONTROL02.CTL 1 db_block_size 8192 1 __db_cache_size 255852544 1 db_domain 1 db_name orcl 1 db_recovery_file_dest D:appadmsrvoraclefast_reco very_area 1 db_recovery_file_dest_size 4322230272 1 diagnostic_dest D:APPADMSRVORACLE 1 dispatchers (PROTOCOL=TCP) (SERVICE=orclXD B) 1 __java_pool_size 12582912 1 __large_pool_size 4194304 1 memory_target 1065353216 1 open_cursors 300 1 __oracle_base D:appadmsrvoracle 1 __pga_aggregate_target 369098752 1 processes 150 1 remote_login_passwordfile EXCLUSIVE 1 __sga_target 696254464 1 __shared_io_pool_size 0 1 __shared_pool_size 406847488 1 __streams_pool_size 4194304 1 undo_tablespace UNDOTBS1 1 _4031_sga_dump_interval 3000 26 ligne(s) sΘlectionnΘe(s). SQL> show user USER est "SCOTT"
On notera qu’on a ici la présence des paramètres cachés de configuration de la mémoire qui n’apparaitrons pas dans un classique show parameter ou dans un select sur v$parameter