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

Hvordan opretter du en skrivebeskyttet bruger i PostgreSQL?

Tildel brug/vælg til en enkelt tabel

Hvis du kun giver CONNECT til en database, kan brugeren oprette forbindelse, men har ingen andre privilegier. Du skal give USAGE på navnerum (skemaer) og SELECT på tabeller og visninger individuelt som sådan:

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;

Flere tabeller/visninger (PostgreSQL 9.0+)

I de seneste versioner af PostgreSQL kan du give tilladelser til alle tabeller/visninger/osv i skemaet ved at bruge en enkelt kommando i stedet for at skulle skrive dem én efter én:

GRANT SELECT ON ALL TABLES IN SCHEMA public TO xxx;

Dette påvirker kun tabeller, der allerede er oprettet. Mere kraftfuldt kan du automatisk få tildelt standardroller til nye objekter i fremtiden:

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

Bemærk, at dette som standard kun vil påvirke objekter (tabeller), der er oprettet af den bruger, der har udstedt denne kommando:selvom det også kan indstilles på enhver rolle, som den udstedende bruger er medlem af. Du opfanger dog ikke standardprivilegier for alle roller, du er medlem af, når du opretter nye objekter... så der er stadig en del pjat. Hvis du anvender den tilgang, at en database har en ejerrolle, og skemaændringer udføres som den ejerrolle, så skal du tildele standardprivilegier til den ejerrolle. IMHO det hele er en smule forvirrende, og du skal muligvis eksperimentere for at komme med en funktionel arbejdsgang.

Flere tabeller/visninger (PostgreSQL-versioner før 9.0)

For at undgå fejl i langvarige, multi-table ændringer, anbefales det at bruge følgende 'automatiske' proces til at generere den nødvendige GRANT SELECT til hver tabel/visning:

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');

Dette skulle udsende de relevante GRANT-kommandoer til GRANT SELECT på alle tabeller, visninger og sekvenser i offentligheden, for at copy-n-paste elsker. Dette vil naturligvis kun blive anvendt på tabeller, der allerede er oprettet.



  1. Spørg om udtalelser:Én sekvens for alle tabeller

  2. Failover &Failback på Amazon RDS

  3. Forståelse af SQL Server Always Encrypted

  4. LISTAGG i Oracle for at returnere forskellige værdier