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.