sql >> Database >  >> RDS >> PostgreSQL

Hoe maak je een alleen-lezen gebruiker aan in PostgreSQL?

Gebruik/selecteer toekennen aan een enkele tafel

Als u alleen CONNECT aan een database verleent, kan de gebruiker verbinding maken, maar heeft hij geen andere rechten. U moet USAGE op naamruimten (schema's) en SELECT op tabellen en views afzonderlijk toekennen, zoals:

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;

Meerdere tabellen/weergaven (PostgreSQL 9.0+)

In de nieuwste versies van PostgreSQL kunt u machtigingen verlenen voor alle tabellen/views/etc. in het schema met een enkele opdracht in plaats van ze een voor een te typen:

GRANT SELECT ON ALL TABLES IN SCHEMA public TO xxx;

Dit is alleen van invloed op tabellen die al zijn gemaakt. Sterker nog, u kunt in de toekomst automatisch standaardrollen toewijzen aan nieuwe objecten:

ALTER DEFAULT PRIVILEGES IN SCHEMA public
   GRANT SELECT ON TABLES TO xxx;

Houd er rekening mee dat dit standaard alleen van invloed is op objecten (tabellen) die zijn gemaakt door de gebruiker die deze opdracht heeft gegeven:hoewel het ook kan worden ingesteld op elke rol waarvan de uitgevende gebruiker lid is. Je krijgt echter niet standaard privileges voor alle rollen waarvan je lid bent bij het maken van nieuwe objecten... dus er is nog wat gepruts. Als u de benadering toepast dat een database een eigenaarsrol heeft en schemawijzigingen worden uitgevoerd als die eigenaarsrol, dan moet u standaardprivileges toewijzen aan die eigenaarsrol. IMHO is dit allemaal een beetje verwarrend en moet je misschien experimenteren om een ​​functionele workflow te bedenken.

Meerdere tabellen/weergaven (PostgreSQL-versies vóór 9.0)

Om fouten bij langdurige wijzigingen in meerdere tabellen te voorkomen, wordt aanbevolen om het volgende 'automatische' proces te gebruiken om de vereiste GRANT SELECT te genereren naar elke tafel/weergave:

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');

Dit zou de relevante GRANT-commando's moeten uitvoeren naar GRANT SELECT op alle tabellen, weergaven en reeksen in het openbaar, voor copy-and-paste liefde. Uiteraard wordt dit alleen toegepast op tabellen die al zijn aangemaakt.



  1. Hoe kan ik een native SQL-script in JPA/Hibernate uitvoeren?

  2. Verschil tussen een gebruiker en een schema in Oracle?

  3. Hoe pdo-stuurprogramma in php docker-afbeelding te installeren?

  4. Haal de ID op van een nieuw record dat in een database is ingevoegd uit de geretourneerde Uri