Autorisation refusée pour la relation

331

J'ai essayé d'exécuter une simple commande sql:

select * from site_adzone;

et j'ai eu cette erreur

ERROR:  permission denied for relation site_adzone

Quel pourrait être le problème ici?

J'ai également essayé de sélectionner d'autres tables et j'ai eu le même problème. J'ai aussi essayé de faire ça:

GRANT ALL PRIVILEGES ON DATABASE jerry to tom;

mais j'ai reçu cette réponse de la console

WARNING:  no privileges were granted for "jerry"

Avez-vous une idée de ce qui ne va pas?

Boban
la source
Je ne sais pas comment mettre à jour les autorisations pour pouvoir lire / écrire dans DB
Boban
1
Vous devez accorder les privilèges nécessaires: postgresql.org/docs/current/static/ddl-priv.html et postgresql.org/docs/current/static/sql-grant.html
a_horse_with_no_name
2
Bienvenue chez SO! Pour cette question, vous pouvez obtenir plus d'aide sur dba.stackexchange.com, bien que vous puissiez trouver autant de commentaires sournois :)
Jared Beck
10
Pardon. Ceci est la deuxième question postgresql très liée à la programmation que j'ai vue fermée ce soir hors sujet! Le dernier avait 67 000 vues, celui-ci 30 000 vues. Nous devrions avoir une clause de popularité: Toute question non subjective avec> 15 000 vues = sur le sujet.
Theodore R. Smith,
1
Cette question n'est pas hors sujet! Il s'agit cependant d'une duplication de stackoverflow.com/questions/13497352/…
Wheaties

Réponses:

391

GRANT sur la base de données n'est pas ce dont vous avez besoin. Accordez directement sur les tables.

L'octroi de privilèges sur la base de données est principalement utilisé pour accorder ou révoquer des privilèges de connexion. Cela vous permet de spécifier qui peut faire des choses dans la base de données si elles ont suffisamment d'autres autorisations.

Vous voulez plutôt:

 GRANT ALL PRIVILEGES ON TABLE side_adzone TO jerry;

Cela réglera ce problème.

Chris Travers
la source
7
exécutez-le en tant que superutilisateur, comme postgres.
Chris Travers
19
Cela peut-il être raccourci d'une manière ou d'une autre? ACCORDER TOUS LES PRIVILÈGES SUR TOUTES LES TABLES?
Shadur
196
@Shadur ACCORDER TOUS LES PRIVILÈGES SUR TOUTES LES TABLES DE SCHEMA public TO jerry;
Ron E
10
@RonE est-ce limité à la base de données actuelle?
Shadur
7
@zmiftah pour le schéma dont vous avez besoin> ACCORDER TOUS LES PRIVILÈGES SUR LE SCHÉMA nameSchema TO user;
Pierozi
241

Publication de la réponse de Ron E pour les privilèges de subvention sur toutes les tables, car cela pourrait être utile à d'autres.

GRANT ALL PRIVILEGES ON ALL TABLES IN SCHEMA public TO jerry;
affaissement
la source
21
Vous devrez peut-être également exécuter une commande similaire pour ALL SEQUENCESet ALL FUNCTIONS.
Pistos
7
Juste pour ceux qui se demandaient: ALL TABLEScomprend également des vues, donc il n'y a pas de ALL VIEWScommande séparée :-)
André Gasser
74

Connectez-vous d'abord à la bonne base de données , puis exécutez:

GRANT ALL PRIVILEGES ON ALL TABLES IN SCHEMA public TO jerry;
user2757813
la source
4
merci de me connecter à la bonne base de données n'était PAS ce que je faisais plus tôt!
asgs
15
se connecter à la bonne base de données fait une énorme différence :)\connect databasename;
Denis Matafonov
3
CE. J'ai toujours été connecté aux "postgres". Merci!
Andrew
2
Oui, la connexion à la base de données a fait la différence
inostia
44
GRANT ALL PRIVILEGES ON ALL TABLES IN SCHEMA public to jerry;
GRANT ALL PRIVILEGES ON ALL SEQUENCES IN SCHEMA public to jerry;
GRANT ALL PRIVILEGES ON ALL FUNCTIONS IN SCHEMA public to jerry;
Klanjabrik
la source
cette réponse m'a sauvé la journée!
anhtran
19

La première et importante étape consiste à se connecter à votre base de données:

psql -d yourDBName

2 étapes, accorder des privilèges

GRANT ALL PRIVILEGES ON ALL TABLES IN SCHEMA public TO userName;
zond
la source
18

Pour accorder des autorisations à toutes les tables existantes du schéma, utilisez:

GRANT ALL PRIVILEGES ON ALL TABLES IN SCHEMA <schema> TO <role>

Pour spécifier les autorisations par défaut qui seront appliquées aux futures tables, utilisez:

ALTER DEFAULT PRIVILEGES IN SCHEMA <schema> 
  GRANT <privileges> ON TABLES TO <role>;

par exemple

ALTER DEFAULT PRIVILEGES IN SCHEMA public 
  GRANT SELECT, INSERT, UPDATE, DELETE ON TABLES TO admin;

Si vous utilisez des colonnes SERIALou BIGSERIALalors vous voudrez probablement faire de même pour SEQUENCES, sinon votre INSERTéchouera ( Postgres 10IDENTITY ne souffre pas de ce problème et est recommandé par rapport aux SERIALtypes), c'est-à-dire

ALTER DEFAULT PRIVILEGES IN SCHEMA <schema> GRANT ALL ON SEQUENCES TO <role>;

Voir aussi ma réponse aux autorisations PostgreSQL pour Web App pour plus de détails et un script réutilisable.

Réf:

SUBVENTION

ALTER DEFAULT PRIVILEGES

isapir
la source
9

Cela se produit fréquemment lorsque vous créez une table en tant que postgres utilisateur, puis essayez d'y accéder en tant qu'utilisateur ordinaire. Dans ce cas, il est préférable de se connecter en tant qu'utilisateur postgres et de changer la propriété de la table avec la commande:

alter table <TABLE> owner to <USER>;
Bruce
la source
5

Assurez-vous de vous connecter à psql en tant que propriétaire des tables. pour savoir à qui appartiennent les tables utilisées\dt

psql -h CONNECTION_STRING DBNAME -U OWNER_OF_THE_TABLES

alors vous pouvez exécuter les SUBVENTIONS

Brian McCall
la source
0

Comme vous recherchez des autorisations de sélection, je vous suggère d'accorder uniquement des privilèges de sélection plutôt que tous. Vous pouvez le faire en:

GRANT SELECT ON <table> TO <role>;
Sergi Ramón
la source
0

Vous devriez:

  1. se connecter à la base de données via DBeaver avec l'utilisateur postgres
  2. sur l'onglet gauche ouvrez votre base de données
  3. ouvrir l'onglet / la liste déroulante des rôles
  4. sélectionnez votre utilisateur
  5. sur l'onglet de droite, appuyez sur «onglet Autorisations»
  6. appuyez sur votre onglet de schéma
  7. onglet / liste déroulante des tables de presse
  8. sélectionner toutes les tables
  9. cochez toutes les autorisations requises (ou appuyez sur Tout accorder)
  10. appuyez sur Enregistrer
happydmitry
la source
-3

J'ai été confronté à ce problème une fois. changez simplement l'utilisateur de base de données en superutilisateur et votre problème est résolu.

ALTER USER myuser AVEC SUPERUSER;

Adebayo Ogunmoriyele
la source
En faisant cela, vous accordez plus de primes que vous n'en avez besoin. Le superutilisateur leur donnera l'autorisation d'effectuer d'autres opérations que vous ne voudrez peut-être pas que cet utilisateur effectue, telles que la création d'autres utilisateurs, de bases de données, etc.
Santi