sql >> Databasteknik >  >> RDS >> PostgreSQL

Ge privilegier för en viss databas i PostgreSQL

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 tillPUBLIC . Inga privilegier ges till PUBLIC som standard på tabeller, kolumner, scheman eller tabellutrymmen. För andra typer, standardprivilegierna som ges till PUBLIC är följande:CONNECT och CREATE TEMP TABLE för databaser; EXECUTE privilegium för funktioner; och USAGE 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.



  1. Hur man använder DISTINCT i SQL

  2. Hur man ändrar datum- och tidsformat i MySQL

  3. varchar2(n BYTE|CHAR) standard -> CHAR eller BYTE

  4. Hur kan jag radera med INNER JOIN med SQL Server?