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

PostgreSQL:Дайте всички разрешения на потребител в база данни на PostgreSQL

Всички команди трябва да се изпълняват, докато са свързани към правилния клъстер на базата данни. Уверете се в това.

Ролите са обекти на клъстер на базата данни . Всички бази данни от един и същ клъстер споделят набора от дефинирани роли. Привилегиите се предоставят/отменят за база данни/схема/таблица и т.н.

Ролята се нуждае от достъп до базата данни , очевидно. Това е предоставено на PUBLIC по подразбиране. Друго:

GRANT CONNECT ON DATABASE my_db TO my_user;

Основни привилегии за Postgres 14 или по-нова версия

Postgres 14 добавя предварително дефинирани роли без влизане pg_read_all_data / pg_write_all_data .
Те имат SELECT / INSERT , UPDATE , DELETE привилегии за всички таблици, изгледи и последователности. Плюс USAGE на схеми. Можем да GRANT членство в тези роли:

GRANT pg_read_all_data TO my_user;
GRANT pg_write_all_data TO my_user;

Това обхваща всички основни DML команди (но не DDL, а не някои специални команди като TRUNCATE или EXECUTE привилегия за функции!). Ръководството:

pg_read_all_data

Прочетете всички данни (таблици, изгледи, последователности), сякаш имате SELECT права върху тези обекти и USAGE права върху всички схеми, дори и без това изрично. Тази роля няма атрибута на ролятаBYPASSRLS комплект. Ако се използва RLS, администраторът може да пожелае да зададе BYPASSRLS за ролите, които тази роля е GRANT изд. до.

pg_write_all_data

Напишете всички данни (таблици, изгледи, последователности), сякаш имате INSERT ,UPDATE и DELETE права върху тези обекти и USAGE права върху всички схеми, дори без да го има изрично. Тази роля няма атрибута на ролята BYPASSRLS комплект. Ако се използва RLS, администраторът може да пожелае да зададе BYPASSRLS за ролите, които тази роля еGRANT изд. до.

Всички привилегии без използване на предварително дефинирани роли (всяка версия на Postgres)

Командите трябва да се изпълняват, докато са свързани с правилната база данни. Уверете се в това.

Ролята се нуждае (поне) от USAGE привилегия върху схемата . Отново, ако това е предоставено на PUBLIC , покрити сте. Друго:

GRANT USAGE ON SCHEMA public TO my_user;

Или предоставете USAGE на всички персонализирани схеми:

DO
$$
BEGIN
   -- RAISE NOTICE '%', (  -- use instead of EXECUTE to see generated commands
   EXECUTE (
   SELECT string_agg(format('GRANT USAGE ON SCHEMA %I TO my_user', nspname), '; ')
   FROM   pg_namespace
   WHERE  nspname <> 'information_schema' -- exclude information schema and ...
   AND    nspname NOT LIKE 'pg\_%'        -- ... system schemas
   );
END
$$;

След това всички разрешения за всички таблици (изисква Postgres 9.0 или по-късно).
И не забравяйте последователностите (ако има):

GRANT ALL PRIVILEGES ON ALL TABLES IN SCHEMA public TO my_user;
GRANT ALL PRIVILEGES ON ALL SEQUENCES IN SCHEMA public TO my_user;

Като алтернатива можете да използвате "Grant Wizard" на pgAdmin 4, за да работите с GUI.

Има някои други обекти, ръководството за GRANT има пълния списък. От Postgres 12:

привилегии върху обект на база данни (таблица, колона, изглед, чужда таблица, последователност, база данни, обвивка на чужди данни, чужд сървър, функция, процедура, процедурен език, схема или пространство за таблици)

Но останалото рядко е необходимо. Повече подробности:

  • Как да управлявам ПРАВИЛЕГИИТЕ ПО ПОДРАЗБИРАНЕ за ПОТРЕБИТЕЛИ на БАЗА ДАННИ спрямо SCHEMA?
  • Дайте привилегии за конкретна база данни в PostgreSQL
  • Как да предоставим всички привилегии за изгледи на произволен потребител

Помислете за надграждане до текуща версия.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Postgres не използва индекс, когато сканирането на индекса е много по-добър вариант

  2. postgres - където в (списък) - колоната не съществува

  3. В psql защо някои команди нямат ефект?

  4. Филтриране на Django JSONField

  5. Да се ​​изчисли максималната сума на анотирано поле върху групирано по заявка в Django ORM?