Също така бих искал тази субсидия да продължи и за създаване на нова таблица в бъдеще.[...] Прегледах документацията и изглежда не мога да намеря подходящо решение.
Защото преди 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');