Перейти к основному содержимому

Часто задаваемые вопросы о привилегиях

Почему сообщение об ошибке "нет разрешения" все еще появляется даже после того, как пользователю была назначена необходимая роль?

Эта ошибка может возникнуть, если роль не активирована. Вы можете выполнить select current_role(); для запроса ролей, которые были активированы для пользователя в текущей сессии. Если необходимая роль не активирована, выполните SET ROLE для активации этой роли и выполнения операций с использованием этой роли.

Если вы хотите, чтобы роли автоматически активировались при входе в систему, роль user_admin может выполнить SET DEFAULT ROLE или ALTER USER DEFAULT ROLE для установки роли по умолчанию для каждого пользователя. После установки роли по умолчанию она будет автоматически активироваться при входе пользователя в систему.

Если вы хотите, чтобы все назначенные роли всех пользователей автоматически активировались при входе в систему, вы можете выполнить следующую команду. Эта операция требует разрешения OPERATE на уровне системы.

SET GLOBAL activate_all_roles_on_login = TRUE;

Однако мы рекомендуем следовать принципу "минимальных привилегий", устанавливая роли по умолчанию с ограниченными привилегиями для предотвращения потенциальных рисков. Например:

  • Обычные пользователи могут установить роль read_only, которая имеет только привилегию SELECT, в качестве роли по умолчанию, избегая установки ролей с привилегиями типа ALTER, DROP и INSERT в качестве ролей по умолчанию.
  • Администраторы могут установить роль db_admin в качестве роли по умолчанию, избегая установки роли node_admin, которая имеет привилегию добавления и удаления узлов, в качестве роли по умолчанию.

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

Вы можете выполнить GRANT для назначения необходимых привилегий или ролей пользователям.

Я предоставил пользователю привилегию на все таблицы в базе данных (GRANT ALL ON ALL TABLES IN DATABASE <db_name> TO USER <user_identity>;), но пользователь все еще не может создавать таблицы в базе данных. Почему?

Создание таблиц в базе данных требует привилегии CREATE TABLE на уровне базы данных. Вам необходимо предоставить эту привилегию пользователю.

GRANT CREATE TABLE ON DATABASE <db_name> TO USER <user_identity>;;

Я предоставил пользователю все привилегии на базу данных, используя GRANT ALL ON DATABASE <db_name> TO USER <user_identity>;, но ничего не возвращается, когда пользователь выполняет SHOW TABLES; в этой базе данных. Почему?

SHOW TABLES; возвращает только таблицы, на которые у пользователя есть какая-либо привилегия. Если у пользователя нет привилегии на таблицу, эта таблица не будет возвращена. Вы можете предоставить любую привилегию на все таблицы в этой базе данных (например, используя SELECT) пользователю:

GRANT SELECT ON ALL TABLES IN DATABASE <db_name> TO USER <user_identity>;

Приведенное выше утверждение эквивалентно GRANT select_priv ON db.* TO <user_identity>;, используемому в версиях ранее v3.0.