Alle kommandoer skal udføres, mens de er forbundet til den rigtige databaseklynge. Sørg for det.
Roller er objekter i databasens klynge . Alle databaser i den samme klynge deler sættet af definerede roller. Privilegier tildeles / tilbagekaldes pr. database / skema / tabel osv.
En rolle skal have adgang til databasen , naturligvis. Det er givet til PUBLIC
som standard. Ellers:
GRANT CONNECT ON DATABASE my_db TO my_user;
Grundlæggende privilegier for Postgres 14 eller nyere
Postgres 14 tilføjer de foruddefinerede, ikke-login-roller pg_read_all_data
/ pg_write_all_data
.
De har SELECT
/ INSERT
, UPDATE
, DELETE
privilegier for alle tabeller, visninger og sekvenser. Plus USAGE
på skemaer. Vi kan GRANT
medlemskab i disse roller:
GRANT pg_read_all_data TO my_user;
GRANT pg_write_all_data TO my_user;
Dette dækker alle grundlæggende DML-kommandoer (men ikke DDL, og ikke nogle specielle kommandoer såsom TRUNCATE
eller EXECUTE
privilegium til funktioner!). Manualen:
pg_read_all_data
Læs alle data (tabeller, visninger, sekvenser), som om du havde SELECT
ret til disse objekter og USAGE
rettigheder på alle skemaer, selv uden at have det eksplicit. Denne rolle har ikke rolleattributtenBYPASSRLS
sæt. Hvis RLS bliver brugt, kan en administrator ønsker at indstille BYPASSRLS
på roller, hvor denne rolle er GRANT
red til.
pg_write_all_data
Skriv alle data (tabeller, visninger, sekvenser), som om du havde INSERT
,UPDATE
og DELETE
rettigheder til disse objekter og USAGE
rettigheder på alle skemaer, selv uden at have det eksplicit. Denne rolle har ikke rolleattributten BYPASSRLS
sæt. Hvis RLS bruges, vil en administrator muligvis indstille BYPASSRLS
på roller, hvor denne rolle erGRANT
red til.
Alle privilegier uden brug af foruddefinerede roller (enhver Postgres-version)
Kommandoer skal udføres, mens du er forbundet til den rigtige database. Sørg for det.
Rollen kræver (mindst) USAGE
privilegium på skemaet . Igen, hvis det er givet til PUBLIC
, du er dækket. Ellers:
GRANT USAGE ON SCHEMA public TO my_user;
Eller giv USAGE
på alle tilpassede skemaer:
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
$$;
Derefter alle tilladelser til alle tabeller (kræver Postgres 9.0 eller senere).
Og glem ikke sekvenser (hvis nogen):
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 bruge "Grant Wizard" i pgAdmin 4 til at arbejde med en GUI.
Der er nogle andre objekter, manualen til GRANT
har den komplette liste. Fra Postgres 12:
privilegier på et databaseobjekt (tabel, kolonne, visning, fremmed tabel, sekvens, database, fremmed-data wrapper, fremmed server, funktion, procedure, proceduresprog, skema eller tablespace)
Men resten er sjældent nødvendigt. Flere detaljer:
- Hvordan administrerer man STANDARDPRIVILEGIER for BRUGERE på en DATABASE vs. SCHEMA?
- Tildel privilegier til en bestemt database i PostgreSQL
- Sådan giver du alle privilegier på visninger til vilkårlige brugere
Overvej at opgradere til en aktuel version.