PostgreSQL 8.4 предоставляет роли права доступа DML для всех таблиц

Как я могу предоставить DML (SELECT,INSERT,UPDATE,DELETE) для всех таблиц в схеме в PostgreSQL 8.4? Я также хотел бы, чтобы этот грант сохранялся для создания новой таблицы в будущем.

Я видел решения для 9.0, но я застрял с 8.4, поскольку он поставляется с Debian stable.

Я пробовал следующее в качестве базовой линии, но это не работает, в результате чего неизбежный "доступ к отношению X запрещен":

GRANT ALL PRIVILEGES ON DATABASE testdb TO testuser;

Я драгировал через документация, и я не могу найти подходящее решение.

5 ответов


Я также хотел бы, чтобы этот грант сохранялся для создания новой таблицы в будущем. [...] Я просмотрел документацию, и я не могу найти подходящее решение.

потому что до 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 разрешения на саму базу данных, но нет!--9-->, INSERT etc.


пока для плохих вещей. Что ты!--17-->можно сделать следующие вещи:

  • уменьшите количество управления разрешениями, предоставив права не пользователям, а ролям. Затем добавьте роли отдельным пользователям. При создании новой таблицы вам нужно настроить только одну или две роли, но не сотни пользователей.

  • запросить системные каталоги и создать соответствующий 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');

гранты в PostgreSQL не являются рекурсивными; a GRANT на базе набора прав для объекта базы данных, но не влияет на содержащиеся схемы или их таблиц, представлений, функций и т. д.

о предоставлении ALL PRIVELEGES на базе Гранты CREATE, CONNECT и TEMPORARY прав.

посмотреть \h GRANT в psql, или документация GRANT в 8.4, чтобы увидеть, что ALL PRIVILEGES средство DATABASE:

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

есть функции plpgsql и доступны различные сторонние скрипты, которые используют pg_catalog или information_schema динамически строить GRANTs и рекурсивно установить права. Найдите "рекурсивный грант postgresql".

это не поможет вам установить права доступа по умолчанию для новая таблицы. PostgreSQL doe есть ИЗМЕНИТЬ ПРИВИЛЕГИИ ПО УМОЛЧАНИЮ чтобы вы могли установить права таблицы по умолчанию для новых таблиц, но это поддерживается только в Pg 9.1 и новее. Явное GRANTs необходимы для каждой таблицы в более старом версий, или когда разрешения должны быть установлены после создания таблицы.

новые версии, как вы отметили, имеют возможности для нескольких грантов через GRANT ... ALL TABLES, но ваш вопрос специфичен для 8.4.


Я считаю, что вы не можете этого сделать. Но вы можете использовать информационную схему для создания грантов, поэтому вам не нужно вручную делать это для 10 000 таблиц. См. ссылку ниже для относительного примера и сайта, связанного с easy very good for info.

http://www.postgresonline.com/journal/archives/30-DML-to-generate-DDL-and-DCL-Making-structural-and-Permission-changes-to-multiple-tables.html


Если у вас есть другой пользователь с правами DML, он работает в postgresql 8.x / 9.x:

grant <userWithDMLPrivileges> to testuser;

надеюсь, что это помогает.


добавить все привилегии на все таблицы:

GRANT ALL PRIVILEGES ON ALL TABLES IN SCHEMA public TO [username];