Grundlæggende koncept i Postgres
Roller er globale objekter, der kan få adgang til alle databaser i en db-klynge - givet de nødvendige privilegier.
En klynge har mange databaser , som indeholder mange skemaer . Skemaer (selv med samme navn) i forskellige DB'er er ikke relaterede. Tildeling af privilegier til et skema gælder kun for dette særlige skema i den aktuelle DB (den aktuelle DB på tildelingstidspunktet).
Hver database starter med et skema public
som standard. Det er en konvention, og mange indstillinger starter med det. Bortset fra det er skemaet public
er bare et skema som alle andre.
Når du kommer fra MySQL, vil du måske starte med et enkelt skema public
, der effektivt ignorerer skemalaget fuldstændigt. Jeg bruger dusinvis af skemaer pr. database regelmæssigt.
Skemaer er lidt (men ikke fuldstændigt) ligesom mapper i filsystemet.
Når du har brugt flere skemaer, skal du sørge for at forstå search_path
indstilling:
- Hvordan påvirker søgestien identifikationsopløsning og det "aktuelle skema"
Standardrettigheder
Pr. dokumentation på GRANT
:
PostgreSQL giver standardprivilegier på nogle typer objekter tilPUBLIC
. Ingen privilegier er givet til PUBLIC
som standard på tabeller, kolonner, skemaer eller tablespaces. For andre typer er standardrettighederne givet til PUBLIC
er som følger:CONNECT
og CREATE TEMP TABLE
til databaser; EXECUTE
privilegium til funktioner; og USAGE
privilegium til sprog.
Alle disse standardindstillinger kan ændres med ALTER DEFAULT PRIVILEGES
:
- Tildel alle på et specifikt skema i db'en til en grupperolle i PostgreSQL
Grupperolle
Som @Craig kommenterede, er det bedst at GRANT
privilegier til en grupperolle og derefter gøre en bestemt bruger til medlem af denne rolle (GRANT
grupperollen til brugerrollen). På denne måde er det nemmere at håndtere og tilbagekalde bundter af privilegier, der er nødvendige for visse opgaver.
En grupperolle er blot endnu en rolle uden login. Tilføj et login for at omdanne det til en brugerrolle. Mere:
- Hvorfor fusionerede PostgreSQL brugere og grupper til roller?
Foruddefinerede roller
Opdatering: Postgres 14 eller nyere tilføjer de nye foruddefinerede roller (formelt "standardroller") pg_read_all_data
og pg_write_all_data
for at forenkle nogle af nedenstående. Se:
- Giv adgang til alle tabeller i en database
Opskrift
Lad os sige, vi har en ny database mydb
, en gruppe mygrp
, og en bruger myusr
...
Mens du er forbundet til den pågældende database som superbruger (postgres
for eksempel):
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;
At tildele "en bruger alle privilegier til alle tabeller" som du skrev (jeg er måske mere restriktiv):
GRANT ALL ON ALL TABLES IN SCHEMA public TO mygrp;
GRANT ALL ON ALL SEQUENCES IN SCHEMA public TO mygrp; -- don't forget those
For at indstille standardrettigheder for fremtidige objekter skal du køre for hver rolle der opretter objekter i dette skema:
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?
Giv nu gruppen til brugeren:
GRANT mygrp TO myusr;
Relateret svar:
- PostgreSQL - DB-bruger bør kun have tilladelse til at kalde funktioner
Alternativ (ikke-standard) indstilling
Kommer fra MySQL, og da du vil holde privilegier på databaser adskilt, kan du måske lide denne ikke-standardindstilling db_user_namespace
. Per dokumentation:
Denne parameter aktiverer brugernavne pr. database. Den er som standard slået fra.
Læs manualen omhyggeligt. Jeg bruger ikke denne indstilling. Det annullerer ikke ovenstående.