权限常见问题
即使已将所需的角色分配给用户,为什么仍然报告错误消息“no permission”?
如果角色未激活,则可能会发生此错误。您可以运行 select current_role();
来查询当前会话中为用户激活的角色。如果所需的角色未激活,请运行 SET ROLE 来激活此角色,并使用此角色执行操作。
如果您希望在登录时自动激活角色,则 user_admin
角色可以运行 SET DEFAULT ROLE 或 ALTER USER DEFAULT ROLE 来为每个用户设置默认角色。设置默认角色后,用户登录时将自动激活。
如果您希望在登录时自动激活所有用户的所有已分配角色,您可以运行以下命令。此操作需要 System 级别的 OPERATE 权限。
SET GLOBAL activate_all_roles_on_login = TRUE;
但是,我们建议您遵循“最小权限”原则,通过设置具有有限权限的默认角色来防止潜在风险。例如
- 普通用户可以将只具有 SELECT 权限的
read_only
角色设置为默认角色,同时避免将具有 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>;
上述语句等效于 v3.0 之前的版本中使用的 GRANT select_priv ON db.* TO <user_identity>;
。