sql >> Databasteknik >  >> RDS >> PostgreSQL

PostgreSQL:Ge alla behörigheter till en användare på en PostgreSQL-databas

Alla kommandon måste köras medan de är anslutna till rätt databaskluster. Se till det.

Roller är objekt i databasens kluster . Alla databaser i samma kluster delar uppsättningen av definierade roller. Behörigheter beviljas / återkallas per databas / schema / tabell etc.

En roll behöver åtkomst till databasen , självklart. Det är beviljat till PUBLIC som standard. Annars:

GRANT CONNECT ON DATABASE my_db TO my_user;

Grundläggande behörigheter för Postgres 14 eller senare

Postgres 14 lägger till de fördefinierade rollerna som inte är inloggade pg_read_all_data / pg_write_all_data .
De har SELECT / INSERT , UPDATE , DELETE privilegier för alla tabeller, vyer och sekvenser. Plus USAGE på scheman. Vi kan GRANT medlemskap i dessa roller:

GRANT pg_read_all_data TO my_user;
GRANT pg_write_all_data TO my_user;

Detta täcker alla grundläggande DML-kommandon (men inte DDL, och inte vissa specialkommandon som TRUNCATE eller EXECUTE privilegium för funktioner!). Manualen:

pg_read_all_data

Läs all data (tabeller, vyer, sekvenser), som om du hade SELECT rätt på dessa objekt och USAGE rättigheter på alla scheman, även utan att ha det uttryckligen. Den här rollen har inte rollattributetBYPASSRLS uppsättning. Om RLS används kan en administratör vilja ställa in BYPASSRLS på roller där denna roll är GRANT red till.

pg_write_all_data

Skriv alla data (tabeller, vyer, sekvenser), som om du hade INSERT ,UPDATE och DELETE rättigheter för dessa objekt och USAGE rättigheter på alla scheman, även utan att ha det uttryckligen. Den här rollen har inte rollattributet BYPASSRLS uppsättning. Om RLS används kan en administratör vilja ställa in BYPASSRLS på roller som denna roll ärGRANT red till.

Alla privilegier utan att använda fördefinierade roller (alla Postgres-versioner)

Kommandon måste köras när du är ansluten till rätt databas. Se till det.

Rollen behöver (minst) USAGE behörighet på schemat . Återigen, om det är beviljat till PUBLIC , du är täckt. Annars:

GRANT USAGE ON SCHEMA public TO my_user;

Eller bevilja USAGEalla anpassade scheman:

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
$$;

Sedan alla behörigheter för alla tabeller (kräver Postgres 9.0 eller senare).
Och glöm inte sekvenser (om någon):

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

Alternativt kan du använda "Grant Wizard" i pgAdmin 4 för att arbeta med ett GUI.

Det finns några andra objekt, manualen för GRANT har hela listan. Från och med Postgres 12:

privilegier på ett databasobjekt (tabell, kolumn, vy, främmande tabell, sekvens, databas, främmande dataomslag, främmande server, funktion, procedur, procedurspråk, schema eller tabellutrymme)

Men resten behövs sällan. Mer information:

  • Hur hanterar man DEFAULT PRIVILEGES för ANVÄNDARE på en DATABAS kontra SCHEMA?
  • Ge privilegier för en viss databas i PostgreSQL
  • Hur man beviljar alla privilegier för visningar till godtyckliga användare

Överväg att uppgradera till en aktuell version.



  1. Lär dig hur du importerar Excel-data till en MySQL-databas

  2. Omvandling av rad till kolumn i MySQL

  3. Använda uttryck för att filtrera data i databasen

  4. En checklista för efterlevnad av SOx för PostgreSQL