web-dev-qa-db-fra.com

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

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

J'ai essayé:

grant ALL on database MY_DB to group MY_GROUP;

mais cela ne semble donner aucune permission.

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 d'interroger\supprimer des objets sur ce schéma appartenant à d'autres utilisateurs

Je pourrais continuer en donnant la permission USAGE à l'utilisateur sur MY_SCHEMA, mais alors il se plaindrait de ne pas avoir de permission sur la table ...

Je suppose donc que ma question est la suivante: existe-t-il un moyen simple de donner toutes les autorisations à un utilisateur sur une base de données?

Je travaille sur PostgreSQL 8.1.23.

167
Diego

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

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;

Ensuite, toutes les autorisations pour toutes les tables (requiert Postgres 9.0 ou ultérieur):

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

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

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

Pour les anciennes versions , vous pouvez utiliser l’Assistant d’Aide (Grant Wizard) de pgAdmin III (l’interface graphique par défaut).

Plus:

Mais vraiment, vous devriez passer à une version actuelle .

203
Erwin Brandstetter
GRANT ALL PRIVILEGES ON DATABASE "my_db" to my_user;
109
Unkas

Dans PostgreSQL 9.0+, vous feriez ce qui 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 limiter cela, filtrez sur pg_class.relkind. Voir le pg_class docs pour plus de détails.

Vous devez exécuter cette fonction en tant que superutilisateur et aussi régulièrement que votre application le nécessite. Une option serait de regrouper cela dans un travail cron qui s'exécute tous les jours ou toutes les heures.

47
Patrick

J'ai procédé comme suit pour ajouter un rôle 'eSumit' à la base de données PostgreSQL 9.4.15 et pour fournir toutes les autorisations sur 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électionnez * parmi pg_roles; enter image description here

Instantané des requêtes de base de données: enter image description here

20
Sumit Arora