sql >> Databasteknik >  >> RDS >> PostgreSQL

Hur skapar man en skrivskyddad användare i PostgreSQL?

Bevilja användning/välj till en enskild tabell

Om du bara beviljar CONNECT till en databas kan användaren ansluta men har inga andra privilegier. Du måste bevilja USAGE på namnutrymmen (scheman) och SELECT på tabeller och vyer individuellt så här:

GRANT CONNECT ON DATABASE mydb TO xxx;
-- This assumes you're actually connected to mydb..
GRANT USAGE ON SCHEMA public TO xxx;
GRANT SELECT ON mytable TO xxx;

Flera tabeller/vyer (PostgreSQL 9.0+)

I de senaste versionerna av PostgreSQL kan du ge behörigheter för alla tabeller/vyer/etc i schemat med ett enda kommando istället för att behöva skriva dem en efter en:

GRANT SELECT ON ALL TABLES IN SCHEMA public TO xxx;

Detta påverkar bara tabeller som redan har skapats. Mer kraftfullt kan du automatiskt få standardroller tilldelade nya objekt i framtiden:

ALTER DEFAULT PRIVILEGES IN SCHEMA public
   GRANT SELECT ON TABLES TO xxx;

Observera att detta som standard endast kommer att påverka objekt (tabeller) som skapats av användaren som utfärdade detta kommando:även om det också kan ställas in på vilken roll som helst som den utfärdande användaren är medlem i. Däremot hämtar du inte standardprivilegier för alla roller du är medlem i när du skapar nya objekt... så det finns fortfarande en del tjafs. Om du använder tillvägagångssättet att en databas har en ägande roll och schemaändringar utförs som den ägarrollen, bör du tilldela standardbehörigheter till den ägarrollen. IMHO det här är lite förvirrande och du kan behöva experimentera för att komma fram till ett funktionellt arbetsflöde.

Flera tabeller/vyer (PostgreSQL-versioner före 9.0)

För att undvika fel i långa ändringar av flera tabeller, rekommenderas att du använder följande "automatiska" process för att generera den nödvändiga GRANT SELECT till varje tabell/vy:

SELECT 'GRANT SELECT ON ' || relname || ' TO xxx;'
FROM pg_class JOIN pg_namespace ON pg_namespace.oid = pg_class.relnamespace
WHERE nspname = 'public' AND relkind IN ('r', 'v', 'S');

Detta bör mata ut de relevanta GRANT-kommandona till GRANT SELECT på alla tabeller, vyer och sekvenser offentligt, för copy-n-paste kärlek. Naturligtvis kommer detta bara att tillämpas på tabeller som redan har skapats.



  1. Använda Jenkins med Kubernetes AWS, del 2

  2. MySQL hoppa över de 10 första resultaten

  3. java, korrekt användning av statiska variabler för att förhindra dödläge - Synkronisering

  4. Hur man anropar en Oracle PL/SQL-objekt supermetod