Accorder l'accès à toutes les tables à un utilisateur

151

Je suis nouveau dans Postgres et j'essaie de migrer nos bases de données MySQL. En MySQL je peux accorder SELECT, UPDATE, INSERTet les DELETEprivilèges sur un faible utilisateur privilégié et permettre aux subventions d'appliquer à toutes les tables dans une base de données spécifiée. Il me manque quelque chose dans Postgres car il semble que je dois accorder ces privilèges à chaque table, une à la fois. Avec de nombreuses bases de données et des centaines de tables par base de données, cela semble être une tâche ardue de décoller. De plus, une fois qu'une base de données est en opération, l'ajout de tables est assez fréquent pour que je ne veuille plus avoir à accorder des autorisations à moins que cela ne soit absolument nécessaire.

Comment cela est-il mieux accompli?

PlaidFan
la source

Réponses:

175

Tout d'abord, vous devez pouvoir vous connecter à la base de données pour pouvoir exécuter des requêtes. Ceci peut être réalisé en

REVOKE CONNECT ON DATABASE your_database FROM PUBLIC;

GRANT CONNECT
ON DATABASE database_name 
TO user_name;

Le REVOKEest nécessaire car

Le mot clé PUBLIC indique que les privilèges doivent être accordés à tous les rôles, y compris ceux pouvant être créés ultérieurement. PUBLIC peut être considéré comme un groupe défini implicitement, qui inclut toujours tous les rôles. Tout rôle particulier aura la somme des privilèges qui lui sont directement attribués, des privilèges accordés à tout rôle dont il est actuellement membre et des privilèges accordés à PUBLIC.

Si vous voulez vraiment limiter votre utilisateur aux instructions DML, vous avez un peu plus à faire:

REVOKE ALL
ON ALL TABLES IN SCHEMA public 
FROM PUBLIC;

GRANT SELECT, INSERT, UPDATE, DELETE
ON ALL TABLES IN SCHEMA public 
TO user_name;

Celles-ci supposent que vous n'ayez qu'un seul schéma (nommé "public" par défaut).

Comme Jack Douglas l'a souligné, ce qui précède ne donne que les privilèges pour les tables déjà existantes . Pour obtenir la même chose pour les futures tables, vous devez définir les privilèges par défaut :

ALTER DEFAULT PRIVILEGES 
    FOR ROLE some_role   -- Alternatively "FOR USER"
    IN SCHEMA public
    GRANT SELECT, INSERT, UPDATE, DELETE ON TABLES TO user_name;

Voici some_roleun rôle qui crée les tables, alors que user_namec'est celui qui obtient les privilèges. Pour le définir, vous devez être connecté en tant some_roleque membre.

Et, enfin, vous devez faire la même chose pour les séquences (merci à PlaidFan de l'avoir signalé) - ici, c'est le USAGEprivilège dont vous avez besoin.

dezso
la source
1
Merci, FOR some_rolec’était l’élément clé qui me manquait pour que cela fonctionne pour mes tables créées plus tard. Mais je n'avais pas besoin d'être connecté en tant que tel some_role, cela fonctionnait également si j'exécutais la requête en tant postgresqu'utilisateur admin par défaut .
JustAMartin
54

en supposant que vous souhaitiez leur accorder tous les privilèges, procédez comme suit:

grant all privileges on database dbname to dbuser;

dbnameest le nom de votre base de données et dbuserest le nom de l'utilisateur.

Alxkls
la source
44
Cela ajoutera les privilèges suivants sur la base de données : CREATE, CONNECT, TEMPORARY. Aucun privilège sur les tables.
dezso
13
Une commande similaire pour toutes les tables serait,GRANT ALL PRIVILEGES ON ALL TABLES IN SCHEMA public TO dbuser;
Dolan Antenucci
5
J'ai trouvé cela utile aussi:GRANT ALL PRIVILEGES ON ALL SEQUENCES IN SCHEMA public TO dbuser;
Paolo
18

L’octroi de tous les privilèges à toutes les tables de la base de données est obtenu avec

GRANT ALL PRIVILEGES ON ALL TABLES IN SCHEMA <schema_name> TO <username>;
GRANT ALL PRIVILEGES ON ALL SEQUENCES IN SCHEMA <schema_name> TO <username>;
Nomadme
la source
15

Peut-être que je faisais quelque chose de mal ici car je suis très nouveau dans PostgreSQL. Mais cela ne résout que la première partie du problème: définir les privilèges sur toutes les tables existantes.

Pour que les autorisations soient correctement définies pour mon utilisateur sur les nouvelles tables, celles-ci sont créées. Je dois définir les autorisations par défaut pour l'utilisateur:

ALTER DEFAULT PRIVILEGES IN SCHEMA public
  GRANT SELECT, INSERT, UPDATE, DELETE ON tables TO user_name;

ALTER DEFAULT PRIVILEGES IN SCHEMA public
  GRANT SELECT, USAGE ON sequences TO user_name;
Volonté
la source
2
--Create User

CREATE USER my_user_test WITH LOGIN NOSUPERUSER NOCREATEDB  NOCREATEROLE    INHERIT NOREPLICATION   CONNECTION LIMIT -1 PASSWORD 'xxxxxxx';

-- Grant connect to my data base

GRANT CONNECT ON DATABASE my_db_test TO my_user_test;

-- Grant usage the schema

GRANT USAGE ON SCHEMA my_sch_test TO my_user_test ;

-- Grant all table for SELECT, INSERT, UPDATE, DELETE

GRANT SELECT, INSERT, UPDATE, DELETE ON ALL TABLES IN SCHEMA my_sch_test TO my_user_test;
Jorge Valenzuela
la source