sql >> Database teknologi >  >> RDS >> PostgreSQL

Giv privilegier til en bestemt database i PostgreSQL

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.



  1. Håndtering af fejlhåndtering, mens du kører sqlplus fra shell-scripts

  2. Oracle Indekser og typer af indekser i Oracle med eksempel

  3. Introduktion til Azure Serverless

  4. Hvornår kører SQLiteOpenHelper onCreate() / onUpgrade()?