De alleen-lezen gebruiker kan verbinding maken, de tabellen zien, maar wanneer hij een eenvoudige selectie probeert uit te voeren, krijgt hij:
ERROR: permission denied for relation mytable
SQL state: 42501
Dit gebeurt op PostgreSQL 9.1
Wat heb ik verkeerd gedaan?
Antwoord 1, autoriteit 100%
Hier is de complete oplossing voor PostgreSQL 9+, onlangs bijgewerkt.
CREATE USER readonly WITH ENCRYPTED PASSWORD 'readonly';
GRANT USAGE ON SCHEMA public to readonly;
ALTER DEFAULT PRIVILEGES IN SCHEMA public GRANT SELECT ON TABLES TO readonly;
-- repeat code below for each database:
GRANT CONNECT ON DATABASE foo to readonly;
\c foo
ALTER DEFAULT PRIVILEGES IN SCHEMA public GRANT SELECT ON TABLES TO readonly; --- this grants privileges on new tables generated in new database "foo"
GRANT USAGE ON SCHEMA public to readonly;
GRANT SELECT ON ALL SEQUENCES IN SCHEMA public TO readonly;
GRANT SELECT ON ALL TABLES IN SCHEMA public TO readonly;
Met dank aan https://jamie.curle.io /creëren-een-alleen-lezen-gebruiker-in-postgres/voor verschillende belangrijke aspecten
Als iemand kortere code vindt, en liefst een die dit voor alle bestaande databases kan uitvoeren, extra complimenten.
Antwoord 2, autoriteit 8%
Probeer toe te voegen
GRANT USAGE ON SCHEMA public to readonly;
U wist waarschijnlijk niet dat u over de vereiste machtigingen voor een schema moet beschikken om objecten in het schema te kunnen gebruiken.
Antwoord 3
Dit werkte voor mij:
Controleer de huidige rol waarbij u bent aangemeld met behulp van:
SELECT CURRENT_USER, SESSION_USER;
Opmerking: het moet overeenkomen met de eigenaar van het schema.
Schema | Naam | Typ | Eigenaar
——–+——–+——-+———-
Als de eigenaar anders is, geef dan alle toekenningen aan de huidige gebruikersrol vanuit de beheerdersrol door:
GRANT ‘ROLE_OWNER’ aan ‘CURRENT ROLENAME’;
Probeer vervolgens de query uit te voeren, het zal de uitvoer geven omdat het nu toegang heeft tot alle relaties.
Antwoord 4
zorg ervoor dat uw gebruiker kenmerken heeft voor zijn rol. bijvoorbeeld:
postgres=# \du
List of roles
Role name | Attributes | Member of
-----------+------------------------------------------------+-----------
flux | | {}
postgres | Superuser, Create role, Create DB, Replication | {}
na het uitvoeren van de volgende opdracht:
postgres=# ALTER ROLE flux WITH Superuser;
ALTER ROLE
postgres=# \du
List of roles
Role name | Attributes | Member of
-----------+------------------------------------------------+-----------
flux | Superuser | {}
postgres | Superuser, Create role, Create DB, Replication | {}
het heeft het probleem verholpen.
bekijk hier de tutorial voor rollen en zo: https://www.digitalocean.com/community/tutorials/how-to-use-roles-and-manage-grant-permissions-in-postgresql-on -a-vps–2
Antwoord 5
U moet de volgende query uitvoeren:
GRANT ALL ON TABLE mytable TO myuser;
Of als uw fout in een weergave zit, heeft de tabel misschien geen toestemming, dus u moet de volgende query uitvoeren:
GRANT ALL ON TABLE tbm_grupo TO myuser;