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

PostgreSQL 8.4 предоставя DML привилегии за всички таблици на роля

Също така бих искал тази субсидия да продължи и за създаване на нова таблица в бъдеще.[...] Прегледах документацията и изглежда не мога да намеря подходящо решение.

Защото преди 9.0 няма. Всичко, което можете да получите, е да зададете разрешенията за съществуващи маси. Трябва да направите едно GRANT за всяка таблица, защото преди 9.0 нямаше "насипен" режим. Вижте SQL grammer за 8.4 и 9.0:

GRANT { { SELECT | INSERT | UPDATE | DELETE | TRUNCATE | REFERENCES | TRIGGER }
    [,...] | ALL [ PRIVILEGES ] }
    ON [ TABLE ] tablename [, ...]
    TO { [ GROUP ] rolename | PUBLIC } [, ...] [ WITH GRANT OPTION ]

и 9.0 тук:

GRANT { { SELECT | INSERT | UPDATE | DELETE | TRUNCATE | REFERENCES | TRIGGER }
    [,...] | ALL [ PRIVILEGES ] }
    ON { [ TABLE ] table_name [, ...]
         | ALL TABLES IN SCHEMA schema_name [, ...] }
    TO { [ GROUP ] role_name | PUBLIC } [, ...] [ WITH GRANT OPTION ]

Новият ALL TABLES IN SCHEMA част е тази, която ви липсва.

Също така:Задаването на разрешения на ниво база данни, както във вашия въпрос, няма да ви помогне:Вие ще зададете "само" разрешенията на базата данни, но не и за всякакви "съдържащи се" неща като таблици. Съответният раздел:

GRANT { { CREATE | CONNECT | TEMPORARY | TEMP } [,...] | ALL [ PRIVILEGES ] }
    ON DATABASE dbname [, ...]
    TO { [ GROUP ] rolename | PUBLIC } [, ...] [ WITH GRANT OPTION ]

Което означава, че можете да зададете само CREATE , CONNECT и TEMP разрешения за самата база данни, но без SELECT , INSERT и др.

Дотук за лошите неща. Какво можете да направите са следните неща:

  • Намалете броя на управлението на разрешенията, като предоставите права не на потребители, а на роли. След това добавете роли към отделни потребители. Когато се създаде нова таблица, трябва да коригирате само една или две роли, но не и стотици потребители.

  • Потърсете системните каталози и създайте подходящ GRANT команди. Запазете ги във файл и изпълнете този файл. Това би трябвало да ви осигури по-лесно стартиране.

Такава заявка може да изглежда така:

select 'GRANT ALL ON ' || table_schema || '.' || table_name ||' to my_group;' 
from information_schema.tables 
where 
    table_type = 'BASE TABLE' and 
    table_schema not in ('pg_catalog', 'information_schema');


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. няма запис pg_hba.conf за хост

  2. Разделете върнатия от функцията запис на множество колони

  3. Извадете часовете от функцията now().

  4. Променете типа на колоната и задайте не нула

  5. Как да възстановите непоследователен PostgreSQL Slave