Bonjour,

Je voudrais identifier quelles sont les colonnes qui sont utilisées dans un Select.

Par exemple savoir que les colonnes COL1, COL2 et COL10 ont été accédées par l'ordre SQL suivant
Code : Sélectionner tout - Visualiser dans une fenêtre à part
SELECT COL1, COL2, COL10 FROM TAB1;
et pas les autres colonnes de ma table (COL1 à COL20).

Comme il n'y a pas de trigger sur Select je suis un peu embêté pour tracer ces ordres.
Je pourrais utiliser DBMS_FGA pour tracer l'ordre SQL mais je vais avoir ça : exemple avec la table DEPT.

Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
/* Script de creation d'un audit avec resultats en XML et prise en compte du SELECT. */
BEGIN
	DBMS_FGA.ADD_POLICY (
		object_schema      =>  'USER01',
		object_name        =>  'DEPT',
		policy_name        =>  'AUDIT04',
		statement_types    =>  'SELECT',
		audit_trail        =>   DBMS_FGA.XML + DBMS_FGA.EXTENDED,
		audit_column_opts  =>   DBMS_FGA.ANY_COLUMNS);
END;
/
 
Test de Select
	SQL> select loc from dept;
	LOC
	-------------
	NEW YORK
	DALLAS
	CHICAGO
	BOSTON
 
Vérification de l'audit du Select.
	SQL> select policy_name, OBJECT_SCHEMA, OBJECT_NAME, SQL_TEXT from 	V$XML_AUDIT_TRAIL;
 
	POLICY_NAME     OBJECT_SCHEMA     OBJECT_NAME     SQL_TEXT
	-------------------------------------------------------------------------------------------------------------------------
	AUDIT04                USER01		   DEPT	           	          select loc from dept
Dans SQL_TEXT j'ai l'ordre SQL mais je voudrais seulement les colonnes.
Je pourrais utiliser INSTR, SUBSTR pour isoler la chaîne de caractères entre SELECT et FROM mais c'est lourd puis après il faudra séparer les noms des colonnes en sa basant sur les virgules... mais bon, c'est une possibilité.


Si vous avez une idée plus simple, je suis preneur.