Problème d'accès à une table de son propre schéma après ré-import

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.