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.
J'ai donné au user HR les droits suivants.
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
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> 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.
Les paramètres semblent bien modifiés.
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.
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 SQL> show parameter rewrite NAME TYPE VALUE ------------------------------------ ----------- ------------------------------ query_rewrite_enabled string TRUE query_rewrite_integrity string TRUSTED
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
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.
Le résultat devrait être
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
Si vous savez pourquoi ça plante, j'attends vos remarques :-)
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!
Partager