web-dev-qa-db-fra.com

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

Je suis nouveau sur Postgres et j'essaie de migrer nos bases de données MySQL. Dans MySQL, je peux accorder des privilèges SELECT, UPDATE, INSERT et DELETE sur un utilisateur à faible privilège et permettre à ces subventions de s'appliquer à toutes les tables d'un base de données spécifiée. Je dois manquer quelque chose dans Postgres car il semble que je doive accorder ces privilèges pour chaque table une par une. Avec de nombreuses bases de données et des centaines de tables par base de données, cela semble être une tâche intimidante juste pour démarrer. De plus, une fois qu'une base de données est opérationnelle, l'ajout de tables se produit assez fréquemment pour que je ne veuille pas avoir à accorder des autorisations à chaque fois, sauf si cela est absolument nécessaire.

Comment est-ce mieux accompli?

158
PlaidFan

Tout d'abord, vous devez pouvoir vous connecter à la base de données afin d'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 REVOKE est nécessaire car

Le mot clé PUBLIC indique que les privilèges doivent être accordés à tous les rôles, y compris ceux qui pourraient être créés ultérieurement. PUBLIC peut être considéré comme un groupe implicitement défini qui inclut toujours tous les rôles. Tout rôle particulier aura la somme des privilèges qui lui sont directement accordé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 restreindre 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;

Ceux-ci supposent que vous n'aurez qu'un seul schéma (qui est nommé "public" par défaut).

Comme l'a souligné Jack Douglas, 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;

Ici, some_role est un rôle qui crée les tables, tandis que user_name est celui qui obtient les privilèges. En définissant cela, vous devez être connecté en tant que some_role ou un membre de celui-ci.

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

180
dezso

en supposant que vous voulez leur donner tous les privilèges - faites ceci:

grant all privileges on database dbname to dbuser;

dbname est le nom de votre base de données et dbuser est le nom de l'utilisateur.

54
alxkls

L'octroi de tous les privilèges à toutes les tables de la base de données est réalisé 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>;
22
Nomadme

Il se peut que je fasse quelque chose de mal ici car je suis très nouveau sur PostgreSQL. Mais cela n'a résolu que la première partie du problème pour moi - la définition des privilèges sur toutes les tables existantes.

Pour que les autorisations soient correctement définies pour mon utilisateur sur les nouvelles tables créées, je dois définir des 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;
18
Will
--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;
3
Jorge Valenzuela