Donner toutes les permissions à un utilisateur sur un DB

je voudrais donner à un utilisateur toutes les permissions sur une base de données sans en faire un administrateur. La raison pour laquelle je veux faire cela est qu'à l'heure actuelle DEV et PROD sont différents DBs sur le même cluster donc je ne veux pas qu'un utilisateur soit en mesure de changer des objets de production, mais il doit être en mesure de changer des objets sur DEV.

j'ai essayé:

grant ALL on database MY_DB to group MY_GROUP;

mais il ne semble pas donner d'autorisation.

puis j'ai 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 à la requête supprimer des objets sur ce schéma qui appartiennent à d'autres utilisateurs

je pourrais continuer en donnant la permission d'utilisation à L'utilisateur sur MY_SCHEMA mais ensuite il se plaindrait de ne pas avoir les permissions sur la table ...

donc je suppose que ma question Est: y a-t-il un moyen facile de donner toutes les permissions à un utilisateur sur un DB?

je travaille sur PostgreSQL 8.1.23.

93
demandé sur Erwin Brandstetter 2014-03-18 19:16:35

4 réponses

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 privilège USAGE sur le schéma :

GRANT USAGE ON SCHEMA public TO my_user;

puis, toutes les permissions pour tous tables (nécessite Postgres 9.0 ou plus tard):

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

et n'oubliez pas séquences (le cas échéant)):

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

Pour anciennes versions , vous pouvez utiliser la "Subvention" Assistant de pgAdmin III (le GUI par défaut).

plus:

mais vraiment, vous devriez mettre à jour à une version actuelle .

104
répondu Erwin Brandstetter 2018-09-12 20:42:08
GRANT ALL PRIVILEGES ON DATABASE "my_db" to my_user;
78
répondu Unkas 2017-01-09 20:46:20

Dans PostgreSQL 9.0+ vous procédez de la manière suivante:

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 voulez l'activer pour les relations nouvellement créées aussi, alors définissez les permissions 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 voulez restreindre cela, filtrez sur pg_class.relkind . Voir la pg_class docs pour plus de détails.

vous devez exécuter cette fonction en tant que super-utilisateur et aussi régulier que votre application nécessite. Une option serait de l'empaqueter dans une tâche cron qui s'exécute tous les jours ou toutes les heures.

39
répondu Patrick 2014-03-19 01:52:58

j'ai fait ce qui suit pour ajouter un rôle 'eSumit' sur la base de données PostgreSQL 9.4.15 et fournir toute permission à 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;

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

sélectionner * à partir de pg_roles; enter image description here

requêtes de la base de données snapshot : enter image description here

10
répondu Sumit Arora 2018-03-19 12:04:13