Accordez toutes les autorisations à un utilisateur sur une base de données

206

Je voudrais donner à un utilisateur toutes les autorisations sur une base de données sans en faire un administrateur. La raison pour laquelle je veux le faire est que pour le moment DEV et PROD sont des bases de données différentes sur le même cluster, donc je ne veux pas qu'un utilisateur puisse changer les objets de production mais il doit pouvoir changer les objets sur DEV.

J'ai essayé:

grant ALL on database MY_DB to group MY_GROUP;

mais cela ne semble donner aucune permission.

J'ai ensuite essayé:

grant all privileges on schema MY_SCHEMA to group MY_GROUP;

et il semble me donner la permission de créer des objets mais pas d'interroger \ supprimer des objets sur ce schéma qui appartiennent à d'autres utilisateurs

Je pourrais continuer en accordant l'autorisation USAGE à l'utilisateur sur MY_SCHEMA, mais il se plaindrait de ne pas avoir d'autorisations sur la table ...

Donc je suppose que ma question est: existe-t-il un moyen facile de donner toutes les autorisations à un utilisateur sur une base de données?

Je travaille sur PostgreSQL 8.1.23.

Diego
la source

Réponses:

271

L'utilisateur a besoin d'accéder à la base de données , évidemment:

GRANT CONNECT ON DATABASE my_db TO my_user;

Et (au moins) le USAGEprivilège sur le schéma :

GRANT USAGE ON SCHEMA public TO my_user;

Ou accordez USAGEsur tous les schémas personnalisés:

DO
$$
BEGIN
   -- RAISE NOTICE '%', (  -- use instead of EXECUTE to see generated commands
   EXECUTE (
   SELECT string_agg(format('GRANT USAGE ON SCHEMA %I TO my_user', nspname), '; ')
   FROM   pg_namespace
   WHERE  nspname <> 'information_schema' -- exclude information schema and ...
   AND    nspname NOT LIKE 'pg\_%'        -- ... system schemas
   );
END
$$;

Ensuite, toutes les autorisations pour toutes les tables (nécessite Postgres 9.0 ou version ultérieure).
Et n'oubliez pas les séquences (le cas échéant):

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

Pour les anciennes versions vous pouvez utiliser l '"Assistant Grant" de pgAdmin III (l'interface graphique par défaut).

Il y a d'autres objets, le manuel pourGRANT a la liste complète à partir de Postgres 12:

privilèges sur un objet de base de données (table, colonne, vue, table étrangère, séquence, base de données, wrapper de données étrangères, serveur étranger, fonction, procédure, langage procédural, schéma ou espace disque logique)

Mais le reste est rarement nécessaire. Plus de détails:

Pensez à passer à une version actuelle .

Erwin Brandstetter
la source
133
GRANT ALL PRIVILEGES ON DATABASE "my_db" to my_user;
Unkas
la source
24
Accorder tous les privilèges ON DATABASEsemble puissant, mais cela ne fait pas grand-chose. Ce n'est qu'un début. Il n'accorde aucun privilège sur les objets contenus.
Erwin Brandstetter
50

Dans PostgreSQL 9.0+, vous procéderiez comme suit:

GRANT ALL PRIVILEGES ON ALL TABLES IN SCHEMA MY_SCHEMA TO MY_GROUP;
GRANT ALL PRIVILEGES ON ALL SEQUENCES IN SCHEMA MY_SCHEMA TO MY_GROUP;

Si vous souhaitez également l'activer pour les relations nouvellement créées, définissez les autorisations par défaut:

ALTER DEFAULT PRIVILEGES IN SCHEMA MY_SCHEMA
  GRANT ALL PRIVILEGES ON TABLES TO MY_GROUP;
ALTER DEFAULT PRIVILEGES IN SCHEMA MY_SCHEMA
  GRANT ALL PRIVILEGES ON SEQUENCES TO MY_GROUP;

Cependant, vu que vous utilisez 8.1, vous devez le coder vous-même:

CREATE FUNCTION grant_all_in_schema (schname name, grant_to name) RETURNS integer AS $$
DECLARE
  rel RECORD;
BEGIN
  FOR rel IN
    SELECT c.relname
    FROM pg_class c
    JOIN pg_namespace s ON c.namespace = s.oid
    WHERE s.nspname = schname
  LOOP
    EXECUTE 'GRANT ALL PRIVILEGES ON ' || quote_ident(schname) || '.' || rel.relname || ' TO ' || quote_ident(grant_to);
  END LOOP;
  RETURN 1;
END; $$ LANGUAGE plpgsql STRICT;
REVOKE ALL ON FUNCTION grant_all_in_schema(name, name) FROM PUBLIC;

Cela définira les privilèges sur toutes les relations: tables, vues, index, séquences, etc. Si vous souhaitez restreindre cela, filtrez pg_class.relkind. Voir les documents pg_class pour plus de détails.

Vous devez exécuter cette fonction en tant que superutilisateur et aussi régulièrement que l'exige votre application. Une option serait de l'empaqueter dans une tâche cron qui s'exécute tous les jours ou toutes les heures.

Patrick
la source
Salut Patrick, "TOUTES LES TABLES" n'est pas disponible sur 8.1 ( postgresql.org/docs/8.1/static/sql-grant.html ) Je sais que je pourrais parcourir les tableaux et donner les autorisations individuellement, mais c'est ce que je suis essayer d'éviter. mais merci pour votre aide
Diego
@Diego: Ajout d'une solution pour 8.1
Patrick
merci patrick, j'ai fini par utiliser quelque chose comme toi mais pas avec "GRANT ALL". Pour une raison quelconque, il ne semble rien faire. Par exemple, j'ai couru: accorder TOUS sur le test de schéma à userA; mais après cela, userA n'a toujours pas accès à la lecture des tables sur le test de schéma
Diego
2
Vous devez ACCORDER L'UTILISATION sur un schéma. Ensuite, sur toutes les relations au sein de ce schéma (tables, vues, séquences, index, etc.), vous devez GRANT SELECT, INSERT, UPDATE, DELETE, TRUNCATE séparément. Les schémas sont des espaces de noms, les relations sont l'endroit où se trouvent vos données.
Patrick
28

J'ai fait ce qui suit pour ajouter un rôle «eSumit» sur la base de données PostgreSQL 9.4.15 et fournir toutes les autorisations à ce rôle:

CREATE ROLE eSumit;

GRANT ALL PRIVILEGES ON ALL TABLES IN SCHEMA public TO eSumit;

GRANT ALL PRIVILEGES ON DATABASE "postgres" to eSumit;

ALTER USER eSumit WITH SUPERUSER;

Également vérifié les entrées pg_table via:

sélectionnez * parmi pg_roles; entrez la description de l'image ici

Instantané des requêtes de base de données: entrez la description de l'image ici

Sumit Arora
la source
J'ai Postgres version 10.3 et cela génère une erreur de syntaxe lorsque j'utilise des guillemets autour du nom de la base de données.
sajid