Autorisation refusée pour la relation <table>

12

J'ai exécuté le SQL suivant dans psql:

CREATE USER bspu LOGIN;

CREATE DATABASE bsp OWNER bspu;

GRANT ALL PRIVILEGES ON DATABASE bsp TO bspu;

\c bsp

CREATE TABLE users (
  id SERIAL PRIMARY KEY,
  client_id VARCHAR(20) NOT NULL,
  api_key VARCHAR(100) NOT NULL,
  api_secret VARCHAR(100) NOT NULL,
  auth_token VARCHAR(128) NOT NULL
);

Lorsque je me connecte en tant que bspuet essaie d'interroger la userstable, j'obtiens l'erreur:

permission denied for relation users

J'ai essayé de courir:

ALTER DEFAULT PRIVILEGES GRANT ALL ON TABLES TO bspu;

Mais ça n'aide pas. Qu'est-ce que je fais mal? Pourquoi le propriétaire de la base de données N'A PAS les autorisations pour interroger sa propre base de données?

EDIT: J'ai mis bspuà niveau vers superutilisateur pour l'instant, donc je peux continuer à travailler. Toute autre orientation appréciée.

si __name__ est Aucun
la source
Que montre la sortie de \dt "users"?
bma
@bma, seul mon compte principal est répertorié.
si __name__ est None
Vous avez exécuté les commandes initiales en tant qu'utilisateur? De quoi tirez-vous SELECT session_user, current_useren haut de votre script? Et quelle est votre version Postgres?
Erwin Brandstetter
Si ce sont les commandes exactes que vous avez exécutées, alors vous êtes toujours connecté avec votre 'acc principal'. Cela dépend donc de vos privilèges . Sinon, voir l'excellente réponse d'Erwin. (Permettez-moi d'admettre que je trouve stupide que ce message d'erreur ne dise pas quel rôle n'a pas d'autorisation. Par exemple, lorsque l'on exécute une chaîne de fonctions avec SECURITY DEFINER, il est assez rapide de confondre qui est qui.)
dezso

Réponses:

22

DEFAULT PRIVILEGESne modifiez pas les autorisations pour les objets existants . Ce sont les privilèges par défaut pour les objets nouvellement créés et uniquement pour le rôle particulier auquel ils appartiennent. Si vous ne définissez pas le rôle lors de l'exécution ALTER DEFAULT PRIVILEGES, il correspond par défaut au rôle actuel (lors de l'exécution de l' ALTER DEFAULT PRIVILEGESinstruction.

De plus, puisque vous utilisez une serialcolonne, qui crée un SEQUENCE, vous souhaiterez également définir des privilèges par défaut pour les séquences.

Exécutez ceci sur l'utilisateur avec lequel vous créez des objets, avant d'exécuter la CREATEcommande:

ALTER DEFAULT PRIVILEGES [ FOR ROLE my_create_role] GRANT ALL ON TABLES TO bspu;
ALTER DEFAULT PRIVILEGES [ FOR ROLE my_create_role] GRANT ALL ON SEQUENCES TO bspu;

Si vous devez utiliser pgAdmin, un mot d'avertissement. Il y a un bogue dans la version actuelle 1.20 (ou plus ancienne) dans l'affichage du script SQL inversé pour DEFAULT PRIVILEGES. L'affichage ignore l'utilisateur propriétaire et est donc incorrect dans certaines situations. J'ai signalé le bug, l'affaire est en suspens .

Pour les objets existants , vous pouvez également être intéressé par cette forme "batch" de la GRANTcommande :

GRANT ALL PRIVILEGES ON ALL TABLES IN SCHEMA public TO bspu;
GRANT ALL PRIVILEGES ON ALL SEQUENCES IN SCHEMA public TO bspu;

Plus sur cette question connexe sur SO:

Erwin Brandstetter
la source
1
Le bogue mentionné persiste toujours dans pgAdmin4, voir redmine.postgresql.org/issues/4685 , qui a été signalé comme un doublon de redmine.postgresql.org/issues/4256
dpprdan
-1
This is working for me after some research. psql (9.6.12)

-- login to postgres database server as postgres user.
ssh <user>>@hostname.<domain>>.com
sudo su postgres
id
psql
postgres=# create user sentry_read with login password 'sentry_read';
postgres=# du+
postgres=# \l+
-- **very important: make sure we should connect required database before we grant to user.**
postgres=# \c sentry
postgres=# \dt
sentry=# \dp SENTRY_VERSION
sentry=# select * from "SENTRY_VERSION";
sentry=# GRANT SELECT ON ALL TABLES IN SCHEMA public TO sentry_read;
postgres=# \q

[user@hostname ~]$ psql -U sentry_read -d sentry -h hostname.<domain>>.com -W
sentry=> select * from "SENTRY_VERSION";
Srinu Mareti
la source