Страница 1 из 1

Создание read-only пользователя для большого кол-ва таблиц

Добавлено: 23 май 2010, 21:07
Максим Дубинин
Мне надо дать доступ пользователю 'guest' сразу ко многим таблицам в некой базе.

На stackoverflow дают такой пример:

Код: Выделить всё

SELECT 'GRANT SELECT ON ' || relname || ' TO xxx;'
FROM pg_class JOIN pg_namespace ON pg_namespace.oid = pg_class.relnamespace
WHERE nspname = 'public' AND relkind IN ('r', 'v')
Вместо xxx я подставляю guest, это понятно. А что с остальным делать - не очень. Что такое relname? Надо ли его на что-то менять? Расшифруйте, будьте любезны.

Re: Создание read-only пользователя для большого кол-ва таблиц

Добавлено: 23 май 2010, 21:18
Denis Rykov
relname - поле служебной таблицы pg_class. Ничего менять не надо.
Приведенный скрипт сгенерирует список SQL команд, которые потом нужно будет выполнить.

Re: Создание read-only пользователя для большого кол-ва таблиц

Добавлено: 23 май 2010, 22:01
Максим Дубинин
Спасибо, так и есть, ниже строчки с которыми запускается и работает как надо. Выражение это хитрое сохранено в grant-select.sql. Средняя часть нужна чтобы убрать служебные строки и оставить только GRANT'ы.

Код: Выделить всё

psql -U pgsql -d mydatabase -f grant-select.sql | tail +3 | sed 'N;$!P;$!D;$d' > res2.sql
psql -U pgsql -d mydatabase -f res2.sql

Re: Создание read-only пользователя для большого кол-ва таблиц

Добавлено: 23 май 2010, 22:21
Denis Rykov
Чтобы не городить такие конструкции, попробуй запустить psql с ключом -t.

Re: Создание read-only пользователя для большого кол-ва таблиц

Добавлено: 23 май 2010, 22:29
Максим Дубинин
ну вот, а я чуть head не сломал об tail ;) так конечно проще:

Код: Выделить всё

psql -t -U pgsql -d mydatabase -f grant-select.sql > res.sql
psql -U pgsql -d mydatabase -f res.sql