Basisconcept in Postgres
Rollen zijn globale objecten die toegang hebben tot alle databases in een db-cluster - met de vereiste bevoegdheden.
Een cluster bevat veel databases , die veel schema's bevatten . Schema's (zelfs met dezelfde naam) in verschillende DB's zijn niet gerelateerd. Het verlenen van privileges voor een schema is alleen van toepassing op dit specifieke schema in de huidige DB (de huidige DB op het moment van verlening).
Elke database begint met een schema public
standaard. Dat is een conventie en veel instellingen beginnen ermee. Anders dan dat, het schema public
is gewoon een schema zoals elk ander.
Als je van MySQL komt, wil je misschien beginnen met een enkel schema public
, waarbij de schemalaag in feite volledig wordt genegeerd. Ik gebruik regelmatig tientallen schema's per database.
Schema's zijn een beetje (maar niet volledig) zoals mappen in het bestandssysteem.
Als u eenmaal gebruik maakt van meerdere schema's, zorg er dan voor dat u search_path
begrijpt instelling:
- Hoe beïnvloedt het zoekpad de resolutie van de ID en het "huidige schema"
Standaardrechten
Per documentatie op GRANT
:
PostgreSQL kent standaardrechten op sommige typen objecten toe aan
PUBLIC
. Er worden geen privileges verleend aanPUBLIC
standaard op tabellen, kolommen, schema's of tablespaces. Voor andere typen, de standaardprivileges die zijn toegekend aanPUBLIC
zijn als volgt:CONNECT
enCREATE TEMP TABLE
voor databanken;EXECUTE
privilege voor functies; enUSAGE
privilege voor talen.
Al deze standaardinstellingen kunnen worden gewijzigd met ALTER DEFAULT PRIVILEGES
:
- Alles op een specifiek schema in de db toekennen aan een groepsrol in PostgreSQL
Groepsrol
Zoals @Craig opmerkte, is het het beste om GRANT
rechten toe aan een groepsrol en maak vervolgens een specifieke gebruiker lid van die rol (GRANT
de groepsrol naar de gebruikersrol). Op deze manier is het eenvoudiger om bundels privileges uit te delen en in te trekken die nodig zijn voor bepaalde taken.
Een groepsrol is gewoon een andere rol zonder login. Voeg een login toe om deze om te zetten in een gebruikersrol. Meer:
- Waarom heeft PostgreSQL gebruikers en groepen samengevoegd tot rollen?
Vooraf gedefinieerde rollen
Bijwerken: Postgres 14 of later voegt de nieuwe vooraf gedefinieerde rollen toe (formeel "standaardrollen") pg_read_all_data
en pg_write_all_data
om een aantal van de onderstaande te vereenvoudigen. Zie:
- Toegang verlenen tot alle tabellen van een database
Recept
Stel, we hebben een nieuwe database mydb
, een groep mygrp
, en een gebruiker myusr
...
Terwijl verbonden met de database in kwestie als superuser (postgres
bijvoorbeeld):
REVOKE ALL ON DATABASE mydb FROM public; -- shut out the general public
GRANT CONNECT ON DATABASE mydb TO mygrp; -- since we revoked from public
GRANT USAGE ON SCHEMA public TO mygrp;
Om "een gebruiker alle privileges voor alle tafels" toe te wijzen zoals je schreef (ik ben misschien restrictiever):
GRANT ALL ON ALL TABLES IN SCHEMA public TO mygrp;
GRANT ALL ON ALL SEQUENCES IN SCHEMA public TO mygrp; -- don't forget those
Om standaardrechten voor toekomstige objecten in te stellen, voer je uit voor elke rol die objecten in dit schema maakt:
ALTER DEFAULT PRIVILEGES FOR ROLE myusr IN SCHEMA public
GRANT ALL ON TABLES TO mygrp;
ALTER DEFAULT PRIVILEGES FOR ROLE myusr IN SCHEMA public
GRANT ALL ON SEQUENCES TO mygrp;
-- more roles?
Geef de groep nu aan de gebruiker:
GRANT mygrp TO myusr;
Gerelateerd antwoord:
- PostgreSQL - DB-gebruiker mag alleen functies aanroepen
Alternatieve (niet-standaard) instelling
Afkomstig van MySQL, en aangezien u de privileges op databases gescheiden wilt houden, zou u deze niet-standaard instelling db_user_namespace
kunnen waarderen . Per documentatie:
Met deze parameter worden gebruikersnamen per database ingeschakeld. Het is standaard uitgeschakeld.
Lees de handleiding aandachtig door. Ik gebruik deze instelling niet. Het maakt het bovenstaande niet ongeldig.