Accorder l'utilisation / sélectionner à une seule table
Si vous accordez uniquement CONNECT à une base de données, l'utilisateur peut se connecter mais ne dispose d'aucun autre privilège. Vous devez accorder USAGE sur les espaces de noms (schémas) et SELECT sur les tables et les vues individuellement comme suit:
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;
Tables / vues multiples (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 taper une par une:
GRANT SELECT ON ALL TABLES IN SCHEMA public TO xxx;
Cela n'affecte que les tables qui ont déjà été créées. Plus puissamment, vous pouvez automatiquement attribuer des rôles par défaut à de 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'elle puisse également être définie 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 toujours quelques faffings. 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.
Tables / vues multiples (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 nécessaire GRANT SELECT
pour 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 sur GRANT SELECT sur toutes les tables, vues et séquences en public, pour un copier-coller. Naturellement, cela ne sera appliqué qu'aux tables déjà créées.
REVOKE CREATE ON SCHEMA public FROM PUBLIC;
. Sans cela, l'utilisateur "en lecture seule" ne pourrait pas modifier les tables existantes, mais pourrait créer de nouvelles tables dans le schéma et ajouter / supprimer des données de ces tables.psql mydb
sinon la plupart de ces manipulations ne feraient pas. Personnellement, il m'a fallu beaucoup de temps pour le découvrir par moi-même. J'espère que cela aide quelqu'un.Notez que PostgreSQL 9.0 (aujourd'hui en test bêta) aura un moyen simple de le faire :
la source
Référence tirée de ce blog:
Script pour créer un utilisateur en lecture seule:
Attribuez l'autorisation à cet utilisateur en lecture seule:
Attribuer des autorisations pour lire toutes les nouvelles tables créées à l'avenir
la source
ALTER DEFAULT PRIVILEGES IN SCHEMA public GRANT SELECT ON TABLES TO Read_Only_User;
qui permettrait également de lire toutes les tables créées dans la même base de données à l'avenir.INSERT
art.GRANT EXECUTE ON ALL FUNCTIONS IN SCHEMA schema_name TO Read_Only_User;
GRANT ALL ON ALL SEQUENCES IN SCHEMA schema_name TO Read_Only_User
?Voici le meilleur moyen que j'ai trouvé pour ajouter des utilisateurs en lecture seule (en utilisant PostgreSQL 9.0 ou plus récent):
Connectez-vous ensuite à toutes les machines associées (maître + esclave (s) de lecture / redondance d'UC, etc.) et exécutez:
la source
Par défaut, les nouveaux utilisateurs seront autorisés à créer des tables. Si vous prévoyez de créer un utilisateur en lecture seule, ce n'est probablement pas ce que vous voulez.
Pour créer un véritable utilisateur en lecture seule avec PostgreSQL 9.0+, exécutez les étapes suivantes:
Si votre utilisateur en lecture seule n'a pas l'autorisation de lister les tables (c'est-à-dire qu'il
\d
ne renvoie aucun résultat), c'est probablement parce que vous n'avez pas d'USAGE
autorisations pour le schéma.USAGE
est une autorisation qui permet aux utilisateurs d'utiliser réellement les autorisations qui leur ont été attribuées. À quoi ça sert? Je ne suis pas sûr. Pour corriger:la source
J'ai créé un script pratique pour cela; pg_grant_read_to_db.sh . Ce script accorde des privilèges en lecture seule à un rôle spécifié sur toutes les tables, vues et séquences d'un schéma de base de données et les définit par défaut.
la source
J'ai lu toutes les solutions possibles, qui sont très bien, si vous vous souvenez de vous connecter à la base de données avant d'accorder les choses;) Merci quand même à toutes les autres solutions !!!
créer un utilisateur psql:
démarrez psql cli et définissez un mot de passe pour l'utilisateur créé:
se connecter à la base de données cible:
accordez tous les privilèges nécessaires:
modifier les privilèges par défaut pour les cibles db shema public:
la source
Si votre base de données est dans le schéma public, c'est facile (cela suppose que vous avez déjà créé le
readonlyuser
)Si votre base de données utilise
customschema
, exécutez ce qui précède mais ajoutez une autre commande:la source
La manière pas simple de le faire serait d'accorder select sur chaque table de la base de données:
Vous pouvez automatiser cela en générant vos relevés de droits à partir des métadonnées de la base de données.
la source
la source
Tiré d'un lien publié en réponse au lien de despesz .
Postgres 9.x semble avoir la capacité de faire ce qui est demandé. Voir le paragraphe Grant On Database Objects de:
http://www.postgresql.org/docs/current/interactive/sql-grant.html
Où il est indiqué: "Il existe également une option pour accorder des privilèges sur tous les objets du même type dans un ou plusieurs schémas. Cette fonctionnalité n'est actuellement prise en charge que pour les tables, les séquences et les fonctions (mais notez que TOUS LES TABLEAUX sont considérés comme incluant des vues et tables étrangères). "
Cette page traite également de l'utilisation des ROLE et d'un PRIVILEGE appelé "TOUS PRIVILÈGES".
Des informations sur la façon dont les fonctionnalités GRANT se comparent aux normes SQL sont également présentes.
la source