SET ROLE 时,角色似乎会在单次查询中更改,但在下一次查询时又恢复原状。如果权限需要跨查询和会话持续生效,请设置用户专属 SQL 控制台角色。
症状
- 运行
SET ROLE sql_console_developer后,后续查询仍使用sql_console_read_only。 currentRoles、enabledRoles和defaultRoles的结果因查询而异。- 同时运行
SET ROLE和另一条查询时,无法始终保留所选角色。 SHOW GRANTS列出了预期角色,但其权限未生效。
为什么会出现这种情况
SET ROLE 会更改当前会话中启用的角色,但不会将该会话状态保留到后续的 SQL 控制台请求中。因此,后续查询可能不会使用先前请求启用的角色运行。
因此,请勿将 SET ROLE 用作 SQL 控制台中的持久性访问控制机制。
SQL 控制台用户角色的工作原理
配置持久权限
sql_console_admin 角色的 SQL 控制台用户,或拥有 ACCESS MANAGEMENT 特权的其他用户。
1
创建自定义角色
以下示例创建自定义
sql_console_developer 角色,并授予其对 my_database 的权限:sql_console_developer 是示例角色,并非 ClickHouse Cloud 内置角色。您也可以使用现有的自定义角色,只要该角色具备用户所需的权限即可。2
创建用户专属 SQL 控制台角色
创建一个名称中包含用户完整电子邮件地址的角色:由于角色名称中包含特殊字符,必须使用反引号。
3
授予自定义角色
将所需角色授予用户专属 SQL 控制台角色:如有需要,可以授予多个角色:
4
启动新的 SQL 控制台会话
请用户退出 SQL 控制台后重新登录,或刷新浏览器选项卡。在新会话中,ClickHouse Cloud 会将 结果中应包含通过
sql-console-role:user@example.com 应用于 sql-console:user@example.com;无需执行 SET ROLE 语句。验证已启用角色:sql-console-role:user@example.com 授予的权限。避免修改托管角色
sql_console_admin 或 sql_console_read_only 来授予自定义权限。这些内置角色由 ClickHouse Cloud 管理。若要为单个用户设置权限,请使用 sql-console-role:<email>。
有关角色管理的一般示例,请参阅常见访问管理查询。