FOUT: toestemming geweigerd voor relatietabelnaam op Postgres tijdens het proberen van een SELECT als een alleen-lezen gebruiker

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;

Other episodes