DBMS_ADVANCED_REWRITE ne marche pas
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:
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:
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:
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:
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:
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:
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:
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 :-)