PostgreSQL
 sql >> база данни >  >> RDS >> PostgreSQL

Как да създадете потребител само за четене в PostgreSQL?

Предоставяне на използване/избор на една таблица

Ако предоставите само CONNECT към база данни, потребителят може да се свърже, но няма други привилегии. Трябва да предоставите USAGE на пространства от имена (схеми) и SELECT на таблици и изгледи поотделно, както следва:

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;

Множество таблици/изгледи (PostgreSQL 9.0+)

В най-новите версии на PostgreSQL можете да предоставите разрешения за всички таблици/изгледи/и т.н. в схемата, като използвате една команда, вместо да се налага да ги въвеждате една по една:

GRANT SELECT ON ALL TABLES IN SCHEMA public TO xxx;

Това засяга само таблици, които вече са създадени. По-мощно, можете автоматично да имате роли по подразбиране, присвоени на нови обекти в бъдеще:

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

Имайте предвид, че по подразбиране това ще засегне само обекти (таблици), създадени от потребителя, който е издал тази команда:въпреки че може да бъде зададена и за всяка роля, на която членува издаващият потребител. Въпреки това, вие не получавате привилегии по подразбиране за всички роли, на които сте член, когато създавате нови обекти... така че все още има някои бъркотии. Ако приемете подхода, че базата данни има роля на собственик и промените в схемата се извършват като тази роля на собственик, тогава трябва да присвоите привилегии по подразбиране на тази роля на собственик. ИМХО всичко това е малко объркващо и може да се наложи да експериментирате, за да излезете с функционален работен процес.

Множество таблици/изгледи (версии на PostgreSQL преди 9.0)

За да избегнете грешки при продължителни промени в няколко таблици, се препоръчва да използвате следния „автоматичен“ процес за генериране на необходимия GRANT SELECT към всяка таблица/изглед:

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

Това трябва да изведе съответните команди GRANT за GRANT SELECT на всички таблици, изгледи и последователности публично, за любов за копиране и поставяне. Естествено, това ще се прилага само към таблици, които вече са създадени.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. PostgreSQL как да свържете стойността на интервала '2 дни'

  2. Как да напиша ограничение относно максимален брой редове в postgresql?

  3. Как да инсталирам libpq-fe.h?

  4. PostgreSQL Избиране на най-новия запис за даден идентификатор

  5. Заявка за последните N свързани реда на ред