sql >> Database >  >> RDS >> PostgreSQL

Verleen privileges voor een bepaalde database in PostgreSQL

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 aanPUBLIC . Er worden geen privileges verleend aan PUBLIC standaard op tabellen, kolommen, schema's of tablespaces. Voor andere typen, de standaardprivileges die zijn toegekend aan PUBLIC zijn als volgt:CONNECT en CREATE TEMP TABLE voor databanken; EXECUTE privilege voor functies; en USAGE 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.



  1. Snel script dat alle eigenschappen van SERVERPROPERTY() retourneert in SQL Server 2017/2019

  2. Hoe een kolom in SQL Server te verwijderen met T-SQL

  3. Nieuwe functie voor BYOC – Clusters onderbreken en hervatten

  4. Inleiding tot SQL Server 2017