разные пользователи и доступ
, не могу разобраться с ролями
![]() |
Наши проекты:
Журнал · Discuz!ML · Wiki · DRKB · Помощь проекту |
|
| ПРАВИЛА | FAQ | Помощь | Поиск | Участники | Календарь | Избранное | RSS |
| [216.73.216.14] |
|
|
информация о разделе
![]() | Данный раздел предназначается исключительно для обсуждения вопросов использования языка запросов SQL. Обсуждение общих вопросов, связанных с тематикой баз данных - обсуждаем в разделе "Базы данных: общие вопросы". Убедительная просьба - соблюдать "Правила форума" и не пренебрегать "Правильным оформлением своих тем". Прежде, чем создавать тему, имеет смысл заглянуть в раздел "Базы данных: FAQ", возможно там уже есть ответ. |
разные пользователи и доступ
, не могу разобраться с ролями
|
|
|
|
|
Здравствуйте, Господа!
Сразу предупрежу: в PostgreSQL я пока еще совсем новичок. Опишу проблему на примере, думаю так станет понятнее. ![]() ![]() #psql postgres=# CREATE USER user1 WITH password 'password'; postgres=# CREATE DATABASE db1; postgres=# GRANT ALL PRIVILEGES ON DATABASE db1 TO user1; postgres=# CREATE USER user2 WITH password 'password'; postgres=# GRANT ALL PRIVILEGES ON DATABASE db1 TO user2; postgres=# \q #psql -U user1 db1 db1=# CREATE SEQUENCE user_ids; db1=# CREATE TABLE users (id INTEGER PRIMARY KEY DEFAULT NEXTVAL('user_ids'), login CHAR(64), password CHAR(64)); db1=# INSERT INTO users (login, password) VALUES ("u1", "p1"); db1=# \q #psql -U user2 db1 db1=# INSERT INTO users (login, password) VALUES ("u2", "p2"); ОШИБКА: нет доступа к отношению users Вот тут я в растерянности. Оба пользователя ALL PRIVILEGES для db1, но второй, т.е. не создатель таблицы, добавлять записи не может. Как это побороть? |
|
Сообщ.
#2
,
|
|
|
|
Опция ALL PRIVILEGES для DATABASE подразумевает CREATE, CONNECT и кажется TEMP привилегии для базы данных.
Так вот CREATE позволяет создавать ТОЛЬКО схемы в рамках базы данных. А для схемы вы не предоставили прав, соответственно получили ошибку доступа. |
|
Сообщ.
#3
,
|
|
|
|
Цитата grgdvo @ Опция ALL PRIVILEGES для DATABASE подразумевает CREATE, CONNECT и кажется TEMP привилегии для базы данных. Так вот CREATE позволяет создавать ТОЛЬКО схемы в рамках базы данных. А для схемы вы не предоставили прав, соответственно получили ошибку доступа. Простите бестолкового, а как для схем предоставить привилегии? Если, возможно, напишите запрос на основе моего примера. Спасибо! |
|
Сообщ.
#4
,
|
|
|
|
Цитата HighMan @ Простите бестолкового, а как для схем предоставить привилегии? В конце я неправ, забываешь как оно работает, когда не пользуешься. Для схемы (как объекта) тоже будет недостаточно прав ![]() Нужны команды конкретно на таблицу или ALL TABLES IN SCHEMA. И права нужно раздавать после создания таблицы, либо умудриться использовать ALTER DEFAULT PRIVILEGES. Для вашего примера скорее всего правильный порядок будет такой ![]() ![]() ~ # psql -U postgres postgres=# CREATE USER user1 WITH password 'password'; postgres=# CREATE USER user2 WITH password 'password'; postgres=# CREATE DATABASE db1; postgres=# \q db1 создается со схемой public по умолчанию, в которой пользователи уже могут создавать таблицы (и т.д.), поэтому user1 и user2 смогут создать свои объекты базы ![]() ![]() ~ # psql -U user1 db1 db1=# CREATE SEQUENCE user_ids; db1=# CREATE TABLE users (id INTEGER PRIMARY KEY DEFAULT NEXTVAL('user_ids'), login CHAR(64), password CHAR(64)); db1=# INSERT INTO users (login, password) VALUES ('u1', 'p1'); db1=# \q теперь к user_ids и users доступ имеет только user1, ибо он владелец этих объектов. Назначаем права user2 ![]() ![]() ~ # psql -U postgres db1 db1=# GRANT ALL PRIVILEGES ON ALL SEQUENCES IN SCHEMA public TO user2; db1=# GRANT ALL PRIVILEGES ON ALL TABLES IN SCHEMA public TO user2; Теперь user2 имеет все привилегии на таблицы и последовательнсти, которые УЖЕ БЫЛИ СОЗДАНЫ на данный момент в схеме. ![]() ![]() ~ # psql -U user2 db1 db1=# INSERT INTO users (login, password) VALUES ('u2', 'p2'); |
|
Сообщ.
#5
,
|
|
|
|
Цитата grgdvo @ Цитата HighMan @ Простите бестолкового, а как для схем предоставить привилегии? В конце я неправ, забываешь как оно работает, когда не пользуешься. Для схемы (как объекта) тоже будет недостаточно прав ![]() Нужны команды конкретно на таблицу или ALL TABLES IN SCHEMA. И права нужно раздавать после создания таблицы, либо умудриться использовать ALTER DEFAULT PRIVILEGES. Для вашего примера скорее всего правильный порядок будет такой ![]() ![]() ~ # psql -U postgres postgres=# CREATE USER user1 WITH password 'password'; postgres=# CREATE USER user2 WITH password 'password'; postgres=# CREATE DATABASE db1; postgres=# \q db1 создается со схемой public по умолчанию, в которой пользователи уже могут создавать таблицы (и т.д.), поэтому user1 и user2 смогут создать свои объекты базы ![]() ![]() ~ # psql -U user1 db1 db1=# CREATE SEQUENCE user_ids; db1=# CREATE TABLE users (id INTEGER PRIMARY KEY DEFAULT NEXTVAL('user_ids'), login CHAR(64), password CHAR(64)); db1=# INSERT INTO users (login, password) VALUES ('u1', 'p1'); db1=# \q теперь к user_ids и users доступ имеет только user1, ибо он владелец этих объектов. Назначаем права user2 ![]() ![]() ~ # psql -U postgres db1 db1=# GRANT ALL PRIVILEGES ON ALL SEQUENCES IN SCHEMA public TO user2; db1=# GRANT ALL PRIVILEGES ON ALL TABLES IN SCHEMA public TO user2; Теперь user2 имеет все привилегии на таблицы и последовательнсти, которые УЖЕ БЫЛИ СОЗДАНЫ на данный момент в схеме. ![]() ![]() ~ # psql -U user2 db1 db1=# INSERT INTO users (login, password) VALUES ('u2', 'p2'); Спасибо большое! Постараюсь завтра проверить! |