Est-il vrai qu'il est IMPOSSIBLE de créer un utilisateur de sauvegarde en lecture seule dans PostgreSQL?
J'ai été informé sur un canal IRC que vous ne pouvez tout simplement pas avoir un utilisateur de sauvegarde uniquement sans privilèges de propriété. Je trouve cela très étrange, donc je veux m'assurer que je ne manque pas quelque chose.
Voici ce que j'ai essayé mais cela ne me donne pas les résultats que je recherche. Quand je fais pg_dump
sur une table donnée je reçois Permission denied for relation...
:
GRANT SELECT ON ALL TABLES IN SCHEMA public TO backup;
ALTER DEFAULT PRIVILEGES IN SCHEMA public GRANT SELECT ON TABLES TO backup;
GRANT SELECT, USAGE ON ALL SEQUENCES IN SCHEMA public TO backup;
ALTER DEFAULT PRIVILEGES IN SCHEMA public GRANT SELECT, USAGE ON SEQUENCES TO backup;
Toute aide serait grandement appréciée!
Non, c'est facile (maintenant de toute façon).
Accorder l'autorisation de connexion sur un nouvel utilisateur
GRANT CONNECT ON DATABASE mydb TO myReadolyUser;
Accordez les autorisations sur tous les objets de base de données en cours. Ceci est spécifique au schéma et vous devrez exécuter une copie pour chaque schéma que vous souhaitez que votre utilisateur utilise,
GRANT SELECT ON ALL TABLES IN SCHEMA mySchema TO myReadonlyUser;
De les docs , ALL TABLES
comprend tout ce que vous souhaitez.
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 des tables étrangères.
Alors ALTER DEFAULT PRIVLEGES
pour accorder futureSELECT
privilèges pour les objets non encore créés.
ALTER DEFAULT PRIVILEGES IN SCHEMA mySchema
GRANT SELECT ON TABLES TO myReadonlyUser;
Le moyen simple et agréable est de créer un superutilisateur avec une autorisation en lecture seule.
psql
en tant que postgres ou autre superutilisateur.Créez le nouveau rôle de superutilisateur et définissez-le en lecture seule:
CREATE USER backadm SUPERUSER password '<PASS>';
ALTER USER backadm set default_transaction_read_only = on;
<PASS>
par le mot de passe choisi.backadm
par le nom d'utilisateur choisi. (J'ai mis backadm
pour Backup Administrator
).Vous pouvez maintenant utiliser ce rôle pour sauvegarder.
Notez que le blog référencé dans le réponse donnée par @Gyre ne fonctionnera pas pour créer un utilisateur en lecture seule "application" (c'est-à-dire pour créer un rôle en lecture seule pour une application web pour se connecter à la base de données) , et pourrait ouvrir une grave vulnérabilité de sécurité, car elle est facilement contournable, comme expliqué dans cette réponse de liste postgresql . Pour référence, par le client remplaçant les paramètres de session:
SET SESSION CHARACTERISTICS AS TRANSACTION READ WRITE
Reportez-vous Présentation "Gestion des droits dans postgresql" liée dans le wiki postgres pour une méthode plus détaillée, similaire à celle publiée dans la question.
Après avoir testé la sauvegarde de la solution d'Evan Caroll, je suis tombé sur cette erreur:
ERREUR: autorisation refusée pour la relation 'table'
il manque une autre autorisation:
GRANT SELECT ON ALL SEQUENCES IN SCHEMA mySchema TO myReadonlyUser
L'ajout de cette autorisation m'a permis de sauvegarder avec mon utilisateur en lecture seule.
J'ai fait des recherches appropriées et il semble y avoir une solution à cela. Je suis tombé sur ce article de blog qui explique parfaitement ce qui doit être fait. J'espère que cela aide les gens qui recherchent la même réponse que moi. Évidemment - la restauration des sauvegardes effectuées de cette façon est une question différente.