Skip to content
ClickHouse Docs
ClickHouse DocsClickHouse Docs

为何 `SET ROLE` 不会在 ClickHouse Cloud SQL 控制台中持久生效

当您在 ClickHouse Cloud SQL 控制台中运行 SET ROLE 时,角色似乎会在单次查询中更改,但在下一次查询时又恢复原状。如果权限需要跨查询和会话持续生效,请设置用户专属 SQL 控制台角色。

症状

您可能会遇到以下一种或多种情况:

  • 运行 SET ROLE sql_console_developer 后,后续查询仍使用 sql_console_read_only
  • currentRolesenabledRolesdefaultRoles 的结果因查询而异。
  • 同时运行 SET ROLE 和另一条查询时,无法始终保留所选角色。
  • SHOW GRANTS 列出了预期角色,但其权限未生效。

您可以通过以下方式查看当前用户和角色:

SELECT
    currentUser(),
    currentRoles(),
    enabledRoles(),
    defaultRoles();

为什么会出现这种情况

SQL 控制台通过无状态 HTTP 连接向多副本 ClickHouse Cloud 服务发送查询。连续执行的查询不一定会使用同一连接或副本。

SET ROLE 会更改当前会话中启用的角色,但不会将该会话状态保留到后续的 SQL 控制台请求中。因此,后续查询可能不会使用先前请求启用的角色运行。

因此,请勿将 SET ROLE 用作 SQL 控制台中的持久性访问控制机制。

SQL 控制台用户角色的工作原理

当用户打开 SQL 控制台时,ClickHouse Cloud 会按以下命名规则创建一个数据库用户:

sql-console:user@example.com

ClickHouse Cloud 还会检查名称符合以下约定的数据库角色:

sql-console-role:user@example.com

当该角色存在时,ClickHouse Cloud 会将其分配给相应的 SQL 控制台用户。这是向单个 SQL 控制台用户授予持久性自定义权限的受支持方式。

实体 用途 持久性
sql-console:<email> 用户打开 SQL 控制台时预配的数据库用户 是,由 ClickHouse Cloud 管理
sql_console_adminsql_console_read_only 内置 SQL 控制台角色 是,由 ClickHouse Cloud 管理
sql-console-role:<email> 管理员创建的用户专属自定义角色 是,用户登录时应用

配置持久权限

请使用在该服务上具有管理特权的用户运行以下语句,例如具有 sql_console_admin 角色的 SQL 控制台用户,或拥有 ACCESS MANAGEMENT 特权的其他用户。

创建自定义角色

以下示例创建自定义 sql_console_developer 角色,并授予其对 my_database 的权限:

CREATE ROLE IF NOT EXISTS sql_console_developer;

GRANT SELECT, INSERT, CREATE TABLE
ON my_database.*
TO sql_console_developer;

sql_console_developer 是示例角色,并非 ClickHouse Cloud 内置角色。您也可以使用现有的自定义角色,只要该角色具备用户所需的权限即可。

创建用户专属 SQL 控制台角色

创建一个名称中包含用户完整电子邮件地址的角色:

CREATE ROLE IF NOT EXISTS `sql-console-role:user@example.com`;

由于角色名称中包含特殊字符,必须使用反引号。

授予自定义角色

将所需角色授予用户专属 SQL 控制台角色:

GRANT sql_console_developer
TO `sql-console-role:user@example.com`;

如有需要,可以授予多个角色:

GRANT sql_console_developer, sql_console_read_only
TO `sql-console-role:user@example.com`;

启动新的 SQL 控制台会话

请用户退出 SQL 控制台后重新登录,或刷新浏览器选项卡。在新会话中,ClickHouse Cloud 会将 sql-console-role:user@example.com 应用于 sql-console:user@example.com;无需执行 SET ROLE 语句。

验证已启用角色:

SELECT
    currentUser(),
    currentRoles(),
    enabledRoles(),
    defaultRoles();

结果中应包含通过 sql-console-role:user@example.com 授予的权限。

避免修改托管角色

请勿修改 sql_console_adminsql_console_read_only 来授予自定义权限。这些内置角色由 ClickHouse Cloud 管理。若要为单个用户设置权限,请使用 sql-console-role:<email>

有关角色管理的一般示例,请参阅常见访问管理查询

Navigation