Grundkoncept i Postgres
Roller är globala objekt som kan komma åt alla databaser i ett db-kluster - givet de nödvändiga privilegierna.
Ett kluster innehåller många databaser , som innehåller många scheman . Scheman (även med samma namn) i olika DB:er är inte relaterade. Att bevilja privilegier för ett schema gäller endast detta specifika schema i den aktuella DB (den nuvarande DB vid tidpunkten för beviljandet).
Varje databas börjar med ett schema public
som standard. Det är en konvention, och många inställningar börjar med det. Annat än det, schemat public
är bara ett schema som alla andra.
När du kommer från MySQL kanske du vill börja med ett enda schema public
, i praktiken ignorerar schemalagret helt. Jag använder dussintals scheman per databas regelbundet.
Schema är lite (men inte helt) som kataloger i filsystemet.
När du använder flera scheman, se till att förstå search_path
inställning:
- Hur påverkar sökvägen identifierarens upplösning och det "aktuella schemat"
Standardbehörigheter
Per dokumentation på GRANT
:
PostgreSQL ger standardbehörigheter för vissa typer av objekt till
PUBLIC
. Inga privilegier ges tillPUBLIC
som standard på tabeller, kolumner, scheman eller tabellutrymmen. För andra typer, standardprivilegierna som ges tillPUBLIC
är följande:CONNECT
ochCREATE TEMP TABLE
för databaser;EXECUTE
privilegium för funktioner; ochUSAGE
behörighet för språk.
Alla dessa standardinställningar kan ändras med ALTER DEFAULT PRIVILEGES
:
- Ge alla på ett specifikt schema i db till en grupproll i PostgreSQL
Grupproll
Som @Craig kommenterade, är det bäst att GRANT
privilegier till en grupproll och gör sedan en specifik användare till den rollen (GRANT
grupprollen till användarrollen). På så sätt är det enklare att dela ut och återkalla buntar av privilegier som behövs för vissa uppgifter.
En grupproll är bara en annan roll utan inloggning. Lägg till en inloggning för att omvandla den till en användarroll. Mer:
- Varför slog PostgreSQL samman användare och grupper till roller?
Fördefinierade roller
Uppdatering: Postgres 14 eller senare lägger till de nya fördefinierade rollerna (formellt "standardroller") pg_read_all_data
och pg_write_all_data
för att förenkla något av nedanstående. Se:
- Ge åtkomst till alla tabeller i en databas
Recept
Säg att vi har en ny databas mydb
, en grupp mygrp
, och en användare myusr
...
Medan du är ansluten till databasen i fråga som superanvändare (postgres
till exempel):
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;
Att tilldela "en användare alla privilegier till alla tabeller" som du skrev (jag kanske är mer 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
För att ställa in standardbehörigheter för framtida objekt, kör för alla roller som skapar objekt i detta schema:
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?
Ge nu gruppen till användaren:
GRANT mygrp TO myusr;
Relaterat svar:
- PostgreSQL - DB-användare ska endast tillåtas att anropa funktioner
Alternativ (icke-standard) inställning
Kommer från MySQL, och eftersom du vill behålla privilegier på databaser åtskilda, kanske du gillar denna icke-standardinställning db_user_namespace
. Per dokumentation:
Den här parametern aktiverar användarnamn per databas. Den är avstängd som standard.
Läs manualen noggrant. Jag använder inte den här inställningen. Det ogiltigförklarar inte ovanstående.