Suite à un rafraichissement via un export/import j’ai rencontré un problème assez déconcertant …
Je ne peux plus faire de select sur ma propre table !
En effet, mon utilisateur obtient l’erreur suivante :
SQL>connect DEAPPRD/**** SQL> select * from VEH_VEHICULE; ORA-01031: privilèges insuffisants SQL> connect / as sysdba select * from DEAPPRD.VEH_VEHICULE; ORA-01031: privilèges insuffisants
Vous pouvez effectuer un certain nombre de vérifications pour comprendre :
– La casse
– La présence de synonyme pour la table en question
SQL> connect / as sysdba SQL> select * from all_objects where object_name='VEH_VEHICULE';
– L’appartenance de la table
SQL> connect / as sysdba SQL> select owner from dba_tables where table_name='VEH_VEHICULE'; SQL> select owner from dba_tables where table_name='VEH_VEHICULE'; OWNER ------------------------------ DEA_EXTRA DEA_CURRENT DEAPPRD SQL> connect DEAPPRD/**** SQL> select table_name from user_tables where table_name='VEH_VEHICULE'; TABLE_NAME ------------------------------ VEH_VEHICULE
On peut voir dans le cas présent que la table appartient bien au schéma DEAPPRD.
Or, un schéma à tous les droits sur les objets qu’il a créé.
Nous n’avons toujours pas accès aux données et pas d’explication, continuons les investigations …
La piste qui s’est révélée être la bonne :
Y-a-t-il des fonctions associées à certaines colonnes ou aux indexes de la table ?
SQL> connect DEAPPRD/**** SQL> select * from all_ind_expressions where table_name='VEH_VEHICULE'; INDEX_OWNER INDEX_NAME TABLE_OWNER TABLE_NAME COLUMN_EXPRESSION ------------------------------ ----------------------------------------------------------- ------------------------------ ------------------------------ -------------------------------------------------- DEAPPRD IDX_VEH_IMMATRICULATION_HASH DEAPPRD VEH_VEHICULE "DEA"."FORMAT_UTILS"."HASHKEY"("IMMATRICULATION")
Le problème vient de là :
La table possède des index basés sur des fonctions qui appartiennent à d’autres, et mon utilisateur n’a pas de droit sur ces fonctions,
les droits n’ayant pas été appliqués pendant l’import (fonctionnant normal).
Après avoir découvert cela, rien de plus simple pour le résoudre.
Il vous suffit d’ajouter un droit d’exécution sur la fonction, par exemple comme ceci :
SQL> connect / as sysdba SQL> grant execute any procedure to DEAPPRD;
Refaites votre select et vous pourrez voir le résultat correct.
J’espère que cette petite astuce vous fera gagner du temps la prochaine fois que vous rencontrerez cette anomalie.