sql >> Database >  >> RDS >> PostgreSQL

PostgreSQL:geef alle machtigingen aan een gebruiker op een PostgreSQL-database

Alle opdrachten moeten worden uitgevoerd terwijl ze zijn verbonden met het juiste databasecluster. Zorg ervoor.

Rollen zijn objecten van de database cluster . Alle databases van hetzelfde cluster delen de set gedefinieerde rollen. Privileges worden toegekend / ingetrokken per database / schema / tabel enz.

Een rol heeft toegang nodig tot de database , blijkbaar. Dat wordt verleend aan PUBLIC standaard. Anders:

GRANT CONNECT ON DATABASE my_db TO my_user;

Basisrechten voor Postgres 14 of hoger

Postgres 14 voegt de vooraf gedefinieerde, niet-aanmeldingsrollen toe pg_read_all_data / pg_write_all_data .
Ze hebben SELECT / INSERT , UPDATE , DELETE privileges voor allen tabellen, weergaven en reeksen. Plus USAGE op schema's. We kunnen GRANT lidmaatschap in deze rollen:

GRANT pg_read_all_data TO my_user;
GRANT pg_write_all_data TO my_user;

Dit omvat alle basis DML-commando's (maar niet DDL, en niet enkele speciale commando's zoals TRUNCATE of de EXECUTE privilege voor functies!). De handleiding:

pg_read_all_data

Lees alle gegevens (tabellen, weergaven, reeksen), alsof u SELECT . hebt rechten op die objecten, en USAGE rechten op alle schema's, zelfs zonder dit expliciet te hebben. Deze rol heeft niet het rolkenmerkBYPASSRLS set. Als RLS wordt gebruikt, kan een beheerder BYPASSRLS . willen instellen op rollen waarvan deze rol GRANT . is ed naar.

pg_write_all_data

Schrijf alle gegevens (tabellen, weergaven, reeksen), alsof u INSERT . hebt ,UPDATE , en DELETE rechten op die objecten, en USAGE rechten op alle schema's, zelfs zonder dit expliciet te hebben. Deze rol heeft niet het rolkenmerk BYPASSRLS set. Als RLS wordt gebruikt, kan een beheerder BYPASSRLS willen instellen op rollen die deze rol isGRANT ed naar.

Alle privileges zonder vooraf gedefinieerde rollen te gebruiken (elke Postgres-versie)

Opdrachten moeten worden uitgevoerd terwijl ze met de juiste database zijn verbonden. Zorg ervoor.

De rol heeft (minimaal) de USAGE . nodig privilege op het schema . Nogmaals, als dat wordt toegekend aan PUBLIC , je bent gedekt. Anders:

GRANT USAGE ON SCHEMA public TO my_user;

Of geef USAGE op alle aangepaste schema's:

DO
$$
BEGIN
   -- RAISE NOTICE '%', (  -- use instead of EXECUTE to see generated commands
   EXECUTE (
   SELECT string_agg(format('GRANT USAGE ON SCHEMA %I TO my_user', nspname), '; ')
   FROM   pg_namespace
   WHERE  nspname <> 'information_schema' -- exclude information schema and ...
   AND    nspname NOT LIKE 'pg\_%'        -- ... system schemas
   );
END
$$;

Dan alle rechten voor alle tabellen (vereist Postgres 9.0 of later).
En vergeet reeksen . niet (indien aanwezig):

GRANT ALL PRIVILEGES ON ALL TABLES IN SCHEMA public TO my_user;
GRANT ALL PRIVILEGES ON ALL SEQUENCES IN SCHEMA public TO my_user;

Als alternatief kunt u de "Grant Wizard" van pgAdmin 4 gebruiken om met een GUI te werken.

Er zijn nog enkele andere objecten, de handleiding voor GRANT heeft de volledige lijst. Vanaf Postgres 12:

privileges op een database-object (tabel, kolom, weergave, vreemde tabel, reeks, database, vreemde-gegevenswrapper, vreemde server, functie, procedure, proceduretaal, schema of tabelruimte)

Maar de rest is zelden nodig. Meer details:

  • Hoe STANDAARDPRIVILEGES voor GEBRUIKERS beheren op een DATABASE versus SCHEMA?
  • Bevoegdheden verlenen voor een bepaalde database in PostgreSQL
  • Hoe alle rechten op weergaven toe te kennen aan een willekeurige gebruiker

Overweeg om te upgraden naar een huidige versie.



  1. Hoeveel database-indexen is te veel?

  2. Proberen eigendom van niet-object in te krijgen

  3. Like In MySQL gebruiken voor zoekbewerkingen met Pattern

  4. Hoe pg_dump versie mismatch fouten op te lossen?