Oracle
 sql >> Base de données >  >> RDS >> Oracle

la table ou la vue oracle n'existe pas à l'intérieur de la procédure stockée

Très probablement, le problème est que la subvention a été effectuée via un rôle. Les privilèges accordés à un utilisateur ne sont pas disponibles dans la procédure stockée des droits d'un définisseur (valeur par défaut).

Dans SQL Developer, il est relativement facile de vérifier qu'il s'agit bien du problème. Si vous exécutez la commande

SET ROLE none

puis exécutez l'instruction SELECT, je m'attendrais à ce que vous obteniez la même erreur ORA-00942.

En supposant que ce soit le cas, la solution serait généralement de demander aux propriétaires des tables du schéma YYY de vous accorder l'accès aux tables directement plutôt que d'accorder l'accès via un rôle. À défaut, vous pouvez définir votre procédure stockée comme une procédure stockée de droits d'invocateur en ajoutant AUTHID CURRENT_USER à la déclaration. Cela signifierait que l'appelant de la procédure aurait besoin d'avoir accès aux objets sous-jacents, mais cela permettrait à vos procédures d'utiliser les privilèges accordés via un rôle.

Si vous souhaitez créer une procédure stockée de droits d'invocateur, vous devrez également faire référence au nom de la table à l'aide de SQL dynamique afin de reporter la vérification des privilèges à l'exécution. Vous auriez donc quelque chose comme

CREATE OR REPLACE PROCEDURE PRC_SOMESP 
  AUTHID CURRENT_USER
AS 
  l_cnt pls_integer;
BEGIN
  EXECUTE IMMEDIATE 'SELECT COUNT(*) FROM yyy.TableA' INTO l_cnt;
END PRC_SOMESP;

si vous vouliez une procédure stockée de droits d'invocateur qui interrogeait la table TableA dans le schéma XXX.