PostgreSQL
 sql >> Base de données >  >> RDS >> PostgreSQL

Comment créez-vous un utilisateur en lecture seule dans PostgreSQL ?

Accorder l'utilisation/sélectionner à une seule table

Si vous accordez uniquement CONNECT à une base de données, l'utilisateur peut se connecter mais n'a pas d'autres privilèges. Vous devez accorder USAGE sur les espaces de noms (schémas) et SELECT sur les tables et les vues individuellement comme ceci :

GRANT CONNECT ON DATABASE mydb TO xxx;
-- This assumes you're actually connected to mydb..
GRANT USAGE ON SCHEMA public TO xxx;
GRANT SELECT ON mytable TO xxx;

Plusieurs tables/vues (PostgreSQL 9.0+)

Dans les dernières versions de PostgreSQL, vous pouvez accorder des autorisations sur toutes les tables/vues/etc du schéma à l'aide d'une seule commande plutôt que d'avoir à les saisir une par une :

GRANT SELECT ON ALL TABLES IN SCHEMA public TO xxx;

Cela n'affecte que les tables déjà créées. De manière plus puissante, vous pouvez automatiquement attribuer des rôles par défaut aux nouveaux objets à l'avenir :

ALTER DEFAULT PRIVILEGES IN SCHEMA public
   GRANT SELECT ON TABLES TO xxx;

Notez que par défaut, cela n'affectera que les objets (tables) créés par l'utilisateur qui a émis cette commande :bien qu'il puisse également être défini sur n'importe quel rôle dont l'utilisateur émetteur est membre. Cependant, vous ne récupérez pas les privilèges par défaut pour tous les rôles dont vous êtes membre lors de la création de nouveaux objets... il y a donc encore des problèmes. Si vous adoptez l'approche selon laquelle une base de données a un rôle propriétaire et que les modifications de schéma sont effectuées en tant que rôle propriétaire, vous devez attribuer des privilèges par défaut à ce rôle propriétaire. À mon humble avis, tout cela est un peu déroutant et vous devrez peut-être expérimenter pour trouver un flux de travail fonctionnel.

Plusieurs tables/vues (versions PostgreSQL antérieures à 9.0)

Pour éviter les erreurs dans les modifications longues et multi-tables, il est recommandé d'utiliser le processus "automatique" suivant pour générer le GRANT SELECT requis à chaque table/vue :

SELECT 'GRANT SELECT ON ' || relname || ' TO xxx;'
FROM pg_class JOIN pg_namespace ON pg_namespace.oid = pg_class.relnamespace
WHERE nspname = 'public' AND relkind IN ('r', 'v', 'S');

Cela devrait générer les commandes GRANT pertinentes vers GRANT SELECT sur toutes les tables, vues et séquences en public, pour un copier-coller. Naturellement, cela ne s'appliquera qu'aux tables déjà créées.