Salut,

J'essaye d'utiliser le package DBMS_ADVANCED_REWRITE mais impossible de le faire fonctionner.
Pour rappel, ce package permet d'intercepter un ordre SQL et de le remplacer par un autre. Par exemple si quelqu'un s'amuse à rechercher le nom des employés gagnant plus de 100 000€, je veux lui afficher le message "Requête interdite!".

Je travaille sur une édition Entreprise.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
SQL> select banner from v$version;
BANNER
--------------------------------------------------------------------------------
Oracle Database 11g Enterprise Edition Release 11.2.0.1.0 - 64bit Production
PL/SQL Release 11.2.0.1.0 - Production
CORE    11.2.0.1.0      Production
TNS for 64-bit Windows: Version 11.2.0.1.0 - Production
NLSRTL Version 11.2.0.1.0 - Production
J'ai donné au user HR les droits suivants.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
SQL> GRANT EXECUTE ON DBMS_ADVANCED_REWRITE to HR;
Autorisation de privilèges (GRANT) acceptée.
 
SQL> GRANT CREATE MATERIALIZED VIEW to HR;
Autorisation de privilèges (GRANT) acceptée.
Je me connecte comme HR et modifie ma session.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
SQL> connect HR
Entrez le mot de passe :
Connecté.
SQL> ALTER SESSION SET QUERY_REWRITE_INTEGRITY = TRUSTED;
Session modifiée.
Les paramètres semblent bien modifiés.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
SQL> show parameter rewrite
NAME                                 TYPE        VALUE
------------------------------------ ----------- ------------------------------
query_rewrite_enabled                string      TRUE
query_rewrite_integrity              string      TRUSTED
Je lance mon ordre SQL à remplacer puis je crée la requête équivalente qui doit remplacer la requête précédente.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
SQL> select name from emp;
NAME
--------------------------------------------------
DUBOIS
RUBIS
DUPONT
DUPAINT
RUPRAT
 
SQL> exec sys.dbms_advanced_rewrite.declare_rewrite_equivalence( 'new_query',  'select name from emp',  'select ''Forget it!'' from emp',   false);
Procédure PL/SQL terminée avec succès.
Et c'est le drame, quand je relance ma requête, celle-ci n'est pas remplacée...
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
SQL> select name from emp;
NAME
--------------------------------------------------
DUBOIS
RUBIS
DUPONT
DUPAINT
RUPRAT
Le résultat devrait être
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
SQL> select name from emp;
NAME
--------------------
Forget it!
Forget it!
Forget it!
Forget it!
Forget it!
Forget it!
Si vous savez pourquoi ça plante, j'attends vos remarques :-)