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 bspu
et que j'essaie d'interroger la table users
, 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 à jour bspu
vers superutilisateur pour l'instant, donc je peux continuer à travailler. Toute autre orientation appréciée.
DEFAULT PRIVILEGES
do pas modifiez 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 de ALTER DEFAULT PRIVILEGES
, il prend par défaut le rôle actuel (lors de l'exécution du ALTER DEFAULT PRIVILEGES
déclaration.
De plus, puisque vous utilisez une colonne serial
, qui crée un SEQUENCE
, vous souhaiterez définir les privilèges par défaut pour les séquences comme bien.
Exécutez ceci sur l'utilisateur avec lequel vous créez des objets, avant vous exécutez la commande CREATE
:
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 de prudence. Il y a un bogue dans la version actuelle 1.20 (ou plus ancienne) dans l'affichage du script SQL de reverse engineering 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 commande GRANT
:
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: