J'utilise SQL Developer et j'ai établi une connexion à ma base de données avec l'utilisateur système, après avoir créé un utilisateur et établi une autre connexion avec cet utilisateur avec tous les privilèges nécessaires.
Mais quand j'essaie de continuer après, j'obtiens l'erreur SQL
La table ou la vue ORA-00942 n'existe pas.
INSERT INTO customer (c_id,name,surname) VALUES ('1','Micheal','Jackson')
Parce que ce message est le premier trouvé sur stackoverflow lors de la recherche de "ORA-00942: la table ou la vue n'existe pas, insérez", je souhaite mentionner une autre cause possible de cette erreur (au moins dans Oracle 12c): une table utilise une séquence définir une valeur par défaut et que l'utilisateur qui exécute la requête d'insertion ne dispose pas du privilège de sélection sur la séquence. C'était mon problème et il m'a fallu beaucoup de temps pour le résoudre.
Pour reproduire le problème, exécutez le code SQL suivant en tant que user1
:
create sequence seq_customer_id;
create table customer (
c_id number(10) default seq_customer_id.nextval primary key,
name varchar(100) not null,
surname varchar(100) not null
);
grant select, insert, update, delete on customer to user2;
Ensuite, exécutez cette instruction insert comme user2
:
insert into user1.customer (name,surname) values ('michael','jackson');
Le résultat sera "ORA-00942: la table ou la vue n'existe pas" même si user2
dispose des privilèges d’insertion et de sélection sur user1.customer
table et préfixe correctement la table avec le nom du propriétaire du schéma. Pour éviter le problème, vous devez accorder le privilège select sur la séquence:
grant select on seq_customer_id to user2;
soit l'utilisateur n'a pas les privilèges nécessaires pour voir la table, la table n'existe pas ou vous exécutez la requête dans le mauvais schéma
la table existe-t-elle?
select owner,
object_name
from dba_objects
where object_name = any ('CUSTOMER','customer');
quels privilèges avez-vous accordés?
grant select, insert on customer to user;
exécutez-vous la requête contre le propriétaire depuis la première requête?
Vous ne pouvez pas accéder directement à la table avec le nom 'client'. Soit il doit s'agir de 'utilisateur1.customer', soit créer un synonyme 'client' pour l'utilisateur2 pointant sur 'utilisateur1.customer'. J'espère que cela t'aides..
Voici une réponse: http://www.dba-Oracle.com/concepts/synonyms.htm
Un synonyme Oracle vous permet essentiellement de créer un pointeur sur un objet existant ailleurs. Vous avez besoin de synonymes Oracle, car lorsque vous êtes connecté à Oracle, il recherche tous les objets que vous interrogez dans votre schéma (compte). S'ils ne sont pas là, cela vous donnera une erreur en vous disant qu'ils n'existent pas.
Les tables sensibles à la casse (noms de table créés avec des guillemets) peuvent également générer cette même erreur. Voir cette réponse pour plus d'informations.
Enveloppez simplement la table entre guillemets:
INSERT INTO "customer" (c_id,name,surname) VALUES ('1','Micheal','Jackson')