Identifier les colonnes d'un Select
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:
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:
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.