На главную Наши проекты:
Журнал   ·   Discuz!ML   ·   Wiki   ·   DRKB   ·   Помощь проекту
ПРАВИЛА FAQ Помощь Участники Календарь Избранное RSS
msm.ru
! информация о разделе
user posted imageДанный раздел предназначается исключительно для обсуждения вопросов использования языка запросов SQL. Обсуждение общих вопросов, связанных с тематикой баз данных - обсуждаем в разделе "Базы данных: общие вопросы". Убедительная просьба - соблюдать "Правила форума" и не пренебрегать "Правильным оформлением своих тем". Прежде, чем создавать тему, имеет смысл заглянуть в раздел "Базы данных: FAQ", возможно там уже есть ответ.

Модераторы: Akina
  
> разные пользователи и доступ , не могу разобраться с ролями
    Здравствуйте, Господа!
    Сразу предупрежу: в PostgreSQL я пока еще совсем новичок.
    Опишу проблему на примере, думаю так станет понятнее.
    ExpandedWrap disabled
      #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, но второй, т.е. не создатель таблицы, добавлять записи не может.
    Как это побороть?
      Опция ALL PRIVILEGES для DATABASE подразумевает CREATE, CONNECT и кажется TEMP привилегии для базы данных.
      Так вот CREATE позволяет создавать ТОЛЬКО схемы в рамках базы данных.
      А для схемы вы не предоставили прав, соответственно получили ошибку доступа.
        Цитата grgdvo @
        Опция ALL PRIVILEGES для DATABASE подразумевает CREATE, CONNECT и кажется TEMP привилегии для базы данных.
        Так вот CREATE позволяет создавать ТОЛЬКО схемы в рамках базы данных.
        А для схемы вы не предоставили прав, соответственно получили ошибку доступа.


        Простите бестолкового, а как для схем предоставить привилегии?
        Если, возможно, напишите запрос на основе моего примера.
        Спасибо!
        Сообщение отредактировано: HighMan -
          Цитата HighMan @
          Простите бестолкового, а как для схем предоставить привилегии?

          В конце я неправ, забываешь как оно работает, когда не пользуешься.
          Для схемы (как объекта) тоже будет недостаточно прав :(

          Нужны команды конкретно на таблицу или ALL TABLES IN SCHEMA.
          И права нужно раздавать после создания таблицы, либо умудриться использовать ALTER DEFAULT PRIVILEGES.

          Для вашего примера скорее всего правильный порядок будет такой

          ExpandedWrap disabled
            ~ # 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 смогут создать свои объекты базы

          ExpandedWrap disabled
            ~ # 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

          ExpandedWrap disabled
            ~ # 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 имеет все привилегии на таблицы и последовательнсти, которые УЖЕ БЫЛИ СОЗДАНЫ на данный момент в схеме.

          ExpandedWrap disabled
            ~ # psql -U user2 db1
            db1=# INSERT INTO users (login, password) VALUES ('u2', 'p2');
          Сообщение отредактировано: grgdvo -
            Цитата grgdvo @
            Цитата HighMan @
            Простите бестолкового, а как для схем предоставить привилегии?

            В конце я неправ, забываешь как оно работает, когда не пользуешься.
            Для схемы (как объекта) тоже будет недостаточно прав :(

            Нужны команды конкретно на таблицу или ALL TABLES IN SCHEMA.
            И права нужно раздавать после создания таблицы, либо умудриться использовать ALTER DEFAULT PRIVILEGES.

            Для вашего примера скорее всего правильный порядок будет такой

            ExpandedWrap disabled
              ~ # 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 смогут создать свои объекты базы

            ExpandedWrap disabled
              ~ # 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

            ExpandedWrap disabled
              ~ # 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 имеет все привилегии на таблицы и последовательнсти, которые УЖЕ БЫЛИ СОЗДАНЫ на данный момент в схеме.

            ExpandedWrap disabled
              ~ # psql -U user2 db1
              db1=# INSERT INTO users (login, password) VALUES ('u2', 'p2');

            Спасибо большое!
            Постараюсь завтра проверить!
            1 пользователей читают эту тему (1 гостей и 0 скрытых пользователей)
            0 пользователей:


            Рейтинг@Mail.ru
            [ Script execution time: 0,0606 ]   [ 14 queries used ]   [ Generated: 27.03.26, 08:58 GMT ]