Есть ли у кого-нибудь сейчас простой и относительно быстрый способ достичь следующего:
У меня есть СУБД PostgreSQL 8.2.9 с несколькими (10 или около того) разными базами данных, которые все служат для соответствующих веб-приложений. Эти базы данных разделены на разные схемы, которые, конечно же, разделены на разные таблицы.
Я использовал суперпользователя postgres для подключения к базам данных в своих веб-приложениях. Теперь я хочу переосмыслить свою концепцию безопасности и, следовательно, создать менее привилегированного пользователя, который может выполнять только следующие действия: INSERT, DELETE, UPDATE и SELECT для всех таблиц всех баз данных. Не имеет значения, может ли этот пользователь получить доступ ко всем базам данных, я не хочу создавать отдельных пользователей для всех веб-приложений.
В любом случае должен быть способ предоставить эти привилегии пользователю после его создания, что-то вроде
GRANT SELECT, INSERT, UPDATE, DELETE ON . TO new_user;
Я знаю только, как предоставить эти привилегии отдельным таблицам, но это была бы одиссея с более чем 10000 таблицами, распределенными по 10 базам данных. Я кое-что читал о чтении метатаблицы pg_tables, чтобы получить список всех таблиц, но это почему-то не сработало в моей версии. Может быть, вы также могли бы ответить, существует ли на самом деле база данных PostgreSQL, которая стоит выше всех баз данных и включает в себя метаинформацию обо всех базах данных ?! Я только заметил, что в каждой базе данных есть схема под названием information_schema, в которой хранится информация о текущей базе данных ?!
Большое спасибо.
Массовый GRANT / REVOKE доступен только в PostgreSQL 9.0+.
Вместо этого вы можете создать функции pg_grant () и pg_revoke (), найденные в http://blog.bhushangahire.net/2009/06/17/grant-privileges-to-all-tables-in-a-database-for-postgresql/
Параметры обеих функций:
Вам нужно будет запустить команду для каждой базы данных и каждой схемы. Синтаксис выглядит так:
SELECT pg_grant('web_user','SELECT,INSERT,UPDATE,DELETE','%','public');
Если хотите, вы можете изменить эту строку в определении функции:
nspname = $4 AND
к этому:
nspname like $4 AND
чтобы иметь возможность указать схему как подстановочный знак, но я ее не тестировал.