Accorder des privilèges pour un particulier de base de données PostgreSQL
Je me déplace à partir de MySQL à PostgreSQL et ont frappé un mur avec des privilèges d'utilisateur. Je suis habitué à l'affectation d'un utilisateur tous les privilèges de toutes les tables d'une base de données avec la commande suivante:
# MySQL
grant all privileges on mydatabase.* to 'myuser'@'localhost' identified by 'mypassword';
Il me semble que le PostgreSQL 9.x solution consiste à affecter des privilèges à un "schéma", mais l'effort exigé de moi de comprendre exactement ce que SQL à la question s'avère excessif. Je sais que quelques heures de recherche donnera une réponse, mais je pense que tout le monde se déplaçant à partir de MySQL à PostgreSQL pourrait bénéficier d'au moins une page sur le web qui fournit une manière simple et complète de la recette. C'est la seule commande que j'ai jamais nécessaire de problème pour les utilisateurs. Je préfère ne pas avoir à émettre une commande pour chaque nouveau tableau.
Je ne sais pas ce que les scénarios doivent être traitées différemment dans PostgreSQL, donc je vais la liste de certains des scénarios que j'ai généralement eu à gérer dans le passé. Supposons que nous ne signifie modifier les privilèges d'une base de données unique qui a déjà été créé.
(1a) Pas toutes les tables ont été créées, ou (1b) les tableaux ont déjà été créés.
(2a), L'utilisateur n'a pas encore été créé, ou (2b) l'utilisateur a déjà été créé.
(3a) les Privilèges n'ont pas encore été affectés à l'utilisateur, ou (3b) les privilèges ont été précédemment attribué à l'utilisateur.
(4a) L'utilisateur a seulement besoin d'insérer, mettre à jour, de sélectionner et de supprimer des lignes, ou (4b) l'utilisateur doit également être en mesure de créer et de supprimer des tables.
J'ai vu des réponses qui accorder tous les privilèges de toutes les bases de données, mais ce n'est pas ce que je veux ici. S'il vous plaît, je suis à la recherche d'une recette simple, bien que je ne me dérangerait pas une explication.
Je ne veux pas d'accorder des droits à tous les utilisateurs et toutes les bases de données, comme cela semble être le conventionnel raccourci, parce que l'approche des compromis de toutes les bases de données lorsqu'un utilisateur est compromis. Je l'hôte de plusieurs bases de données clients et d'attribuer à chaque client une connexion différente.
Il semble que j'ai aussi besoin de la USAGE
privilège d'obtenir l'augmentation des valeurs d'un serial
colonne, mais je dois accorder sur une sorte de séquence. Mon problème a plus de complexe.
La page suivante s'affiche pour accorder à un utilisateur des droits nécessaires pour toutes les tables de toutes les bases de données, alors que je veux seulement accorder des droits à une base de données unique. dba.stackexchange.com/questions/36870/...
OriginalL'auteur Joe Lapp | 2014-07-23
Vous devez vous connecter pour publier un commentaire.
Concept de base dans Postgres
Rôles sont des objets globaux qui peuvent accéder à toutes les bases de données dans une base de données de cluster donné les privilèges requis.
Un cluster détient de nombreux bases de données, qui détiennent de nombreux schémas. Les schémas (même avec le même nom) dans différents DBs ne sont pas liés. L'octroi de privilèges pour un schéma s'applique uniquement à ce schéma dans le courant DB (DB au moment de l'octroi).
Chaque base de données commence avec un schéma
public
par défaut. C'est une convention, et de nombreux paramètres de départ. Autre que cela, le schémapublic
est juste un schéma comme les autres.Venant de MySQL, vous voudrez peut-être commencer avec un seul et unique schéma
public
, effectivement ignorant le schéma de la couche complètement. Je suis à l'aide de dizaines de schéma de données par base de données régulièrement.Les schémas sont un peu (mais pas complètement) à l'instar de répertoires du système de fichiers.
Une fois que vous faites usage de plusieurs schémas, assurez-vous de comprendre
search_path
réglage:Droits par défaut
Selon la documentation sur
BOURSE
:L'ensemble de ces valeurs par défaut peuvent être modifiés qu'avec l'
MODIFIER des droits par DÉFAUT
:Rôle du groupe
Comme @Craig a commenté, il est préférable de
GRANT
des privilèges à un groupe de rôles, puis faites un utilisateur membre d'un rôle (GRANT
le rôle du groupe du rôle de l'utilisateur). de cette manière, il est plus simple de traiter et de révoquer les faisceaux de privilèges nécessaires pour certaines tâches.Un rôle du groupe est juste un autre rôle sans connexion. Ajouter une connexion d'accès à la transformer en un rôle d'utilisateur. Plus:
Recette
Dire, nous avons une nouvelle base de données
mydb
, un groupemygrp
, et un utilisateurmyusr
...Pendant la connexion à la base de données en question en tant que superutilisateur (
postgres
par exemple):À attribuer
a user all privileges to all tables
comme vous avez écrit (j'ai peut-être plus restrictif):Pour définir les droits par défaut pour les objets futurs, courir pour chaque rôle qui crée des objets dans ce schéma:
Maintenant, accordez au groupe de l'utilisateur:
Liées réponse:
De remplacement (non-standard)
Venant de MySQL, et puisque vous voulez garder des privilèges sur les bases de données séparées, vous pourriez aimer cette non-standard réglage
db_user_namespace
. Par la documentation:Lire attentivement le manuel. Je n'utilise pas ce paramètre. Il ne vide pas la-dessus.
GRANT
ing à des utilisateurs individuels. Au lieu de créer des rôles (groupes) et leur accorder des droits à des tables. Ajouter des utilisateurs à des rôles lorsque vous créez des utilisateurs. Cela vous permettra d'économiser beaucoup de la gestion de la douleur en bas de la piste.Exactement. Ici est lié réponse avec la démo de code: stackoverflow.com/questions/15867175/...
C'est génial. Je vous remercie. Je suis en train de le digérer. Mon scénario privilégié est d'avoir un seul admin utilisateur qui peut accéder à quoi que ce soit, donc, personnellement, je n'avez qu'à vous souvenir d'un seul mot de passe pour tous travaux d'administration. Est votre recette ci-dessus compatible avec qui? J'ai créé mon admin utilisateur par l'intermédiaire de "createuser -U postgres -d-e -F-l-P -r -s-admin".
votre révision proche de la clarification j'ai une autre question. Pourquoi êtes-vous en mentionnant "myusr" dans votre "ALTER par DÉFAUT PRIVILÈGES" des requêtes? Il me semble que "la SUBVENTION mygrp À myusr" devrait être suffisant pour l'octroi d'myusr les privilèges de mygrp.
Tant qu'il y a un seul utilisateur, vous n'avez pas besoin
ALTER DEFAULT PRIVILEGES
à tous. S'il y a plusieurs, et chacun peut créer des objets et vous souhaitez que les autres utilisateurs de partager les droits pour les nouveaux objets, d'accorder des privilèges à le rôle du groupe automatiquement.OriginalL'auteur Erwin Brandstetter
Ce que vous appelez une base de données dans MySQL ressemble plus à un PostgreSQL schéma de la base de données PostgreSQL.
Se connecter à la base de données "test" en tant que super-utilisateur. Ici c'est
Modifier les droits par défaut pour l'utilisateur existant "testeur".
Évolution des droits par défaut n'a pas d'effet sur les tables existantes. C'est par la conception. Pour les tables existantes, utilisation standard ACCORDER et RÉVOQUER la syntaxe.
Vous ne pouvez pas attribuer les privilèges d'un utilisateur qui n'existe pas.
OriginalL'auteur Mike Sherrill 'Cat Recall'
OK. Lorsque vous affectez des tables pour le bon rôle, les privilèges accordés seront rôle spécifique et non pas à tous les utilisateurs! Ensuite, vous pouvez décider à qui donner
roles
.role
pour chaque base de données. Un rôle peut contenir de nombreux utilisateurs.client-username
pour le bon rôle.your-username
pour chaque rôle, si nécessaire.OK. Vous pouvez créer des tableaux plus tard.
Lorsque vous êtes prêt, affecter les tables pour le client approprié
role
.OK. Créer des noms d'utilisateur lorsque vous êtes prêt. Si votre client a besoin de plus qu'un nom d'utilisateur il suffit de créer un deuxième
client-username
.OK. Lorsque vous êtes prêt à accorder des privilèges, créer l'utilisateur et lui donner le bon rôle pour lui.
L'utilisation de la SUBVENTION DE commande pour attribuer des rôles aux utilisateurs.
OK. Vous exécutez ces commandes pour ajouter des autorisations à vos utilisateurs.
OriginalL'auteur Red
Vous pouvez oublier le schéma si vous utilisez uniquement le PUBLIC.
Alors vous faites quelque chose comme ceci: (voir la doc ici)
Je parlais de schéma de public, pas de rôle public.
Je suis désolé, je suppose que je ne comprends pas votre réponse. Peut-être que vous pourriez me donner un exemple qui permet à un utilisateur spécifique select/insert/update/delete sur toutes les tables -- ceux existant et n'est pas encore créé -- d'une base de données spécifique? Merci!
OriginalL'auteur Str.