Nous utilisons Oracle 11G, la structure de la DB va comme ceci:
Nous avons des utilisateurs CST
et FAS
.
[.____] CST
contient une table ST_CAT2
, un synonyme public ST_CAT
a été créé pour la table CST.ST_CAT2
comme un utilisateur SYS
.
[.____] ST_ROLE
est un rôle qui a donné SELECT UPDATE DELETE ALTER
privilèges sur ST_CAT2
. ST_ROLE
est accordé à FAS
.
Maintenant, tout en créant une vue comme FAS
,
CREATE OR REPLACE VIEW "FAS"."EXTERNAL_SR" ("PROD_ID", "PRODUCT") AS
SELECT
prod_id,
product
FROM
st_cat;
nous éprouvons l'erreur
ORA-00942: table or view does not exist
quelle pourrait-être la cause?
Dans la Référence sur la langue SQL Vous trouverez sous prérequesites (souligné par moi):
Le propriétaire du schéma contenant la vue doit avoir les privilèges nécessaires à sélectionner (lecture ou sélection de privilège), insérer, mettre à jour ou supprimer des lignes de toutes les tables ou vues sur lesquelles la vue est basée. Le propriétaire doit être accordé à ces privilèges directement plutôt que par un rôle.
Vous devez donc accorder aux privilèges directement à l'utilisateur qui crée la vue.
Il en va de même pour les procédures PL/SQL et est déjà discutée dans ce post .
Il existe deux façons d'accorder directement un privilège sélectionné:
grant select on A_TABLE to A_USER;
grant select any table to A_USER;
Ce dernier n'est pas recommandé, accordé à ces privilèges système aux utilisateurs non DBA est considéré comme un risque de sécurité .
De tels privilèges existent pour beaucoup de procédures et d'actions, par ex. Insérez n'importe quelle table, exécutez une procédure, ...