Postgresql: що РОБОТИ ВСІ ПРИВИЛЕГИ НА БАНКУ?


60

Я намагаюся надати всі привілеї у всіх таблицях даної бази даних новому користувачеві postgres (а не власнику). Здається, GRANT ALL PRIVILEGES ON DATABASE my_db TO new_user;це не робить. Після успішного виконання вказаної команди (як користувач postgres) я отримую наступне як new_user:

$ psql -d my_db
my_db => SELECT * FROM a_table_in_my_db;
ERROR:  permission denied for relation a_table_in_my_db

Два питання:

1) Що робить команда, наведена вище, якщо не надає всіх дозволів на всі таблиці в my_db?

2) Який правильний спосіб надати користувачеві всі дозволи на всі таблиці? (включаючи всі таблиці, створені в майбутньому)

Відповіді:


80

Відповіді на ваші запитання надходять із онлайн-документів PostgreSQL 8.4 .

  1. GRANT ALL PRIVILEGES ON DATABASEгранти CREATE, CONNECTі TEMPORARYпривілей на бази даних до ролі (користувачі правильно називається ролями ). Жоден із цих привілеїв фактично не дозволяє виконувати роль читання даних із таблиці; SELECTдля цього потрібна пільга на столі.

  2. Я не впевнений, що існує "належний" спосіб надання всім привілеям на всіх таблицях ролі. Найкращий спосіб забезпечити певну роль усіма привілеями на столі - це переконатися, що роль належить таблиці. За замовчуванням кожен новостворений об’єкт належить ролі, яка його створила, тому, якщо ви хочете, щоб у ролі були всі привілеї на столі, використовуйте цю роль для її створення.

    PostgreSQL 9.0 представляє наступний синтаксис, який є майже тим, що вам потрібно:

    GRANT ALL PRIVILEGES ON ALL TABLES IN SCHEMA public TO new_user;

    Руба полягає в тому, що якщо ви створюєте таблиці в схемах поза стандартною схемою "public", це GRANTне стосується їх. Якщо ви використовуєте непублічні схеми, вам доведеться GRANTпривілеювати ці схеми окремо.


1
може база даних має кількох власників? якщо так, то як додати іншого власника?
рз.

ні, я не думаю, що в базі даних може бути більше одного власника, ви можете дати їм усі записи власника
hellomynameisjoel

15
не забувайте, що ви повинні робити те ж саме в послідовностях: GRANT ALL PRIVILEGES ON ALL SEQUENCES IN SCHEMA public TO your_user;або ви не можете вставити записи.

Навіть якщо це не працює, спробуйте це: = НАДАЙТЕ ВСІ ПРИВІЛЕГИ НА ВСІ ТАБЛИЦІ В СХЕМІ public to your_user;
Каустуб,

10

Можливе налаштування декількох логінів, які виступають власником бази даних:

  • Створіть роль "nologin", щоб виступати як власник: create role dbowner nologin
  • Змініть власника вашої бази даних на це: alter database mydb owner dbowner
  • Надайте всі свої реєстрації на цю нову роль: grant dbowner to user1, user2

Тепер, якщо або user1, або user2 увійти, вони мають усі дозволи на "mydb" без додаткових дозволів.

Однак я б розглядав це рішення уважно. Привабливим є те, щоб ваш веб-додаток використовував одну з цих реєстрацій, щоб уникнути болю при створенні додаткових грантів кожного разу, коли схема оновлюється, але ви видаляєте дуже корисну форму захисту таким чином. Використовуйте наведене вище рішення, якщо ви дійсно хочете декількох "адміністраторів", але дотримуйтесь шаблону "надайте всі привілеї для всіх таблиць на схемі ..." вище для входу в систему для вашого додатка "звичайного використання".


1
Кріс Когдон, лише невелике виправлення: змінити власника бази даних mydb на dbowner
user876743
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.