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 ochUSAGE
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 inBYPASSRLS
på roller där denna roll ärGRANT
red till.
pg_write_all_data
Skriv alla data (tabeller, vyer, sekvenser), som om du hade
INSERT
,UPDATE
ochDELETE
rättigheter för dessa objekt ochUSAGE
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 inBYPASSRLS
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 USAGE
på alla 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.