用户管理

用户管理员可以通过 SQL 或 Web 界面创建和管理 Snowflake 用户:

  • 使用 SQL,管理员可以执行所有与用户相关的任务,包括更改用户的登录凭据和默认值。

  • Snowsight 支持大多数与用户相关的任务。

用户类型

有些用户对象对应的是人类用户,而其他用户对象则对应的是以编程方式与 Snowflake 交互(而无需人类交互)的服务或应用程序。创建用户对象时,您可以指定用户类型以区分人员和服务。这种区别很重要,因为人员需要注册 多重身份验证 (MFA),但服务和应用程序不应注册,因为没有人使用辅助身份验证方法。

用户对象的 TYPE 属性决定了用户类型。此 TYPE 属性的可能值如下:

PERSON:

用户是可以与 Snowflake 交互的人类用户。

NULL:

功能与 PERSON 相同。

SERVICE:

用户是与 Snowflake 交互(而无需人类交互)的服务或应用程序。

为改善非交互式用例的安全态势,将 TYPE 属性设置为 SERVICE 的用户具有以下特性:

  • 他们无法使用密码登录。

  • 他们无法使用 SAML SSO 登录。

  • 他们不能 注册 MFA。

  • 它们不受身份验证策略 MFA 强制执行的约束。

  • 它们不能具有以下属性:

    • FIRST_NAME

    • MIDDLE_NAME

    • LAST_NAME

    • PASSWORD

    • MUST_CHANGE_PASSWORD

    • MINS_TO_BYPASS_MFA

  • 不能使用以下命令:

    • ALTER USER RESET PASSWORD

    • ALTER USER SET DISABLE_MFA = TRUE

SNOWFLAKE_SERVICE:

由 Snowflake 为 Snowpark Container Services 创建的用户。管理员不能创建类型为 SNOWFLAKE_SERVICE 的用户,也不能将现有用户的类型更改为 SNOWFLAKE_SERVICE。有关 SNOWFLAKE_SERVICE 用户的更多信息,请参阅 Snowpark Container Services:SQL 执行。

LEGACY_SERVICE:

TYPE 属性设置为 LEGACY_SERVICE 的用户表示非交互式集成。与 SERVICE 类似,但允许密码和 SAML 身份验证。

备注

LEGACY_SERVICE 类型即将弃用。为服务和应用程序使用 SERVICE 类型。有关弃用 LEGACY_SERVICE 的时间表,请参阅 为单因素密码登录的弃用做好计划。

用户角色

Snowflake 使用角色来控制用户可以访问的对象(虚拟仓库、数据库、表等):

  • Snowflake 提供一组预定义的角色,以及用于定义自定义角色层次结构的框架。

  • 所有 Snowflake 用户都自动分配了预定义的 PUBLIC 角色,该角色支持登录 Snowflake 和访问基本对象。

  • 除了 PUBLIC 角色之外,还可以为每个用户分配其他角色,其中一个角色可指定为 默认角色。用户的默认角色决定了用户发起的 Snowflake 会话中使用的角色;但这只是默认角色。用户可以随时更改会话中的角色。

  • 可以在用户创建之时或之后分配角色。

注意

在决定要分配给用户的其他角色以及指定其默认角色时,请考虑以下预定义的 ACCOUNTADMIN 角色(执行账户级管理任务时所需的角色):

  • Snowflake 建议严格控制 ACCOUNTADMIN 的分配,但建议将其分配给至少两个用户。

  • 不 应该将 ACCOUNTADMIN 指定为用户的默认角色。相反,应指定较低级别的管理角色或自定义角色作为其默认角色。

有关 ACCOUNTADMIN 角色的详细信息和最佳实践,请参阅 访问控制最佳实践。有关角色的更多常规信息,请参阅 访问控制概述。

创建和修改用户所需的权限

管理账户中的用户需要以下角色或权限:

创建用户:

USERADMIN 系统角色可以使用 SQL (CREATE USER) 创建用户。

要为此目的使用自定义角色,请将账户的 CREATE USER 权限授予此角色。

修改用户:

角色只有拥有用户的 OWNERSHIP 权限,才能使用 SQL (ALTER USER) 修改大多数用户属性。

创建用户

本节介绍如何在特定账户中创建用户。

备注

Snowsight,要求您在创建用户时指定密码。CREATE USER 命令和 UserCollection.create Python API 则没有。

备注

如果您想创建可以访问组织内多个账户的用户,请参阅 组织用户。

使用 Snowsight

  1. 登录 Snowsight。

  2. 在导航菜单中,选择 Governance & security » Users & roles。

  3. 选择 + User。

  4. 在 User Name 字段中,输入用户的唯一标识符。除非您指定登录名,否则用户将使用此标识符登录 Snowflake。

  5. (可选)在 Email 字段中指定用户的电子邮件地址。

  6. 在 Password 和 Confirm Password 字段中,输入用户的密码。

  7. (可选)添加注释,解释创建用户的原因。

  8. 选中 Force user to change password on first time login 复选框,以强制用户在登录时更改其密码。

  9. (可选)选择 Advanced User Options 以指定有关用户的其他详细信息:

    • 登录 Snowflake 时要使用的是 Login Name,而不是 User Name。

    • 登录后显示 Display Name。

    • First Name 和 Last Name 用于填写用户简介。

    • Default Role、Default Warehouse 和 Default Namespace。

  10. 选择 Create User。

使用 SQL

使用 CREATE USER 命令创建用户。

重要

在创建用户时,如果为用户分配了默认角色,则必须将此角色显式授予用户。例如:

CREATE USER janesmith PASSWORD = 'abc123' DEFAULT_ROLE = myrole MUST_CHANGE_PASSWORD = TRUE;

GRANT ROLE myrole TO USER janesmith;

请注意,GRANT ROLE 命令允许为单个用户分配多个角色。Web 界面目前不支持相同的功能。

使用 Python

使用 UserCollection.create Python API 创建用户。

重要

在创建用户时,如果为用户分配了默认角色,则必须将此角色显式授予用户。例如:

from snowflake.core.user import Securable, User

my_user = User(
  name="janesmith",
  password="abc123",
  default_role="myrole",
  must_change_password=True)
root.users.create(my_user)

root.users['janesmith'].grant_role(role_type="ROLE", role=Securable(name='myrole'))

禁用或启用用户

禁用用户将阻止用户登录 Snowflake。您可以通过以下界面禁用用户。

使用 Snowsight

  1. 登录 Snowsight。

  2. 在导航菜单中,选择 Governance & security » Users & roles。

  3. 找到要禁用的用户,然后选择 更多选项 » Disable User。

  4. 在打开的确认对话框中,选择 Disable。

要启用用户,请执行相同的步骤,但选择 Enable User。

使用 SQL

使用 ALTER USER 命令禁用或启用用户。例如:

  • 禁用用户:

    ALTER USER janesmith SET DISABLED = TRUE;
    
  • 启用用户:

    ALTER USER janesmith SET DISABLED = FALSE;
    

使用 Python

使用 UserResource.create_or_alter Python API 禁用或启用用户。例如:

  • 禁用用户:

    user_parameters = root.users["janesmith"].fetch()
    user_parameters.disabled = True
    root.users["janesmith"].create_or_alter(user_parameters)
    
  • 启用用户:

    user_parameters = root.users["janesmith"].fetch()
    user_parameters.disabled = False
    root.users["janesmith"].create_or_alter(user_parameters)
    

解锁用户

如果用户在连续五次尝试后登录失败,则系统会在一段时间(目前为 15 分钟)内为用户锁定其账户。这段时间过去后,系统将自动解除锁定,用户可以尝试再次登录。

要在时间结束前解锁用户,可以使用 ALTER USER 命令或 UserResource.create_or_alter Python API 重置计时器。

以下示例将计时器重置为 0,这将立即解锁用户 janesmith:

ALTER USER janesmith SET MINS_TO_UNLOCK = 0;

小技巧

如果一个角色具有所有 Snowflake 用户的 OWNERSHIP 权限,建议将该角色授予多个用户。这样,如果锁定了该角色的某个成员,另一个成员可以解锁该用户。

更改用户的会话参数

  • 要显示用户的会话参数,请使用以下 SQL 语法:

    SHOW PARAMETERS [ LIKE '<pattern>' ] FOR USER <name>
    
  • 要更改用户的会话参数,请使用以下语法:

    ALTER USER <name> SET <session_param> = <value>
    

    例如,允许用户无限期地保持连接到 Snowflake 而不会超时:

    ALTER USER janesmith SET CLIENT_SESSION_KEEP_ALIVE = TRUE;
    
  • 要将用户的会话参数重置为默认值,请使用以下语法:

    ALTER USER <name> UNSET <session_param>
    

修改其他用户属性

您可以使用 ALTER USER 命令或 UserResource.create_or_alter Python API 修改所有其他用户属性。您可以使用 Snowsight 修改许多相同的用户属性。

例如:

  • 将用户 janesmith 的姓更改为 Jones:

    SQL:
    ALTER USER janesmith SET LAST_NAME = 'Jones';
    
    Python:
    user_parameters = root.users["janesmith"].fetch()
    user_parameters.last_name = "Jones"
    root.users["janesmith"].create_or_alter(user_parameters)
    
    Snowsight:
    1. 登录 Snowsight。

    2. 在导航菜单中,选择 Governance & security » Users & roles。

    3. 找到要编辑的用户,然后选择 更多选项 » Edit。

    4. 对于 Last Name 字段,请输入 Jones。

    5. 选择 Save User。

  • 设置或更改用户 janesmith 的默认仓库、命名空间、主要角色和辅助角色:

    SQL:
    ALTER USER janesmith SET DEFAULT_WAREHOUSE = mywarehouse DEFAULT_NAMESPACE = mydatabase.myschema DEFAULT_ROLE = myrole DEFAULT_SECONDARY_ROLES = ('ALL');
    
    Python:
    user_parameters = root.users["janesmith"].fetch()
    user_parameters.default_warehouse = "mywarehouse"
    user_parameters.default_namespace = "mydatabase.myschema"
    user_parameters.default_role = "myrole"
    user_parameters.default_secondary_roles = "ALL"
    root.users["janesmith"].create_or_alter(user_parameters)
    
    Snowsight:

    备注

    不能为使用 Snowsight 的用户设置默认辅助角色。

    1. 登录 Snowsight。

    2. 在导航菜单中,选择 Governance & security » Users & roles。

    3. 找到要编辑的用户,然后选择 更多选项 » Edit。

    4. 打开 Advanced User Options 并在相关字段中输入值。

    5. 选择 Save User。

查看用户

您可以通过以下界面查看用户信息。

使用 SQL

使用 DESCRIBE USER 或 SHOW USERS 命令可查看有关一个或多个用户的信息。

例如:

DESC USER janesmith;

使用 Python

使用 UserResource.fetch Python API 获取用户信息。

例如:

my_user = root.users["janesmith"].fetch()
print(my_user.to_dict())

使用 UserCollection.iter Python API 列出账户中的用户。

例如:

users = root.users.iter(like="jane%")
for user in users:
  print(user.name)

使用 Snowsight

  1. 登录 Snowsight。

  2. 在导航菜单中,选择 Governance & security » Users & roles。

  3. 找到要查看更多详细信息的用户。

    您可以查看显示名称、状态、上次登录时间、所有者角色以及用户是否设置了多因素身份验证 (MFA)。如果用户有注释,可以将鼠标悬停在 注释图标 上。

  4. (可选)选择用户以查看更多详细信息,例如其默认设置、授予用户权限的角色以及授予用户的角色。

删除用户

删除用户也会从 Snowflake 中删除用户凭据。

重要

删除用户时,该用户拥有的文件夹、工作表和仪表板将无法访问,除非启用了共享,否则 不会 转移给其他用户。

具有 查看、查看 + 运行和编辑权限 的共享收件人将保留其分配的权限,并且仍然可以访问共享文件夹、工作表和仪表板。但是,只有具有编辑权限的用户才能修改或删除共享文件夹、工作表和仪表板。如果您在删除所有者之前没有将编辑权限授予至少另一个用户,则无法删除该所有者的文件夹、工作表和仪表板。

如果已删除用户的工作表未启用共享,管理员最多可以 恢复该用户拥有的 500 个工作表。

小心

Classic Console 中的所有工作表都将被永久删除,如果以前未与其他用户共享,仪表板将无法访问。

系统不会删除用户创建的对象(如表或视图),因为在创建对象时,这些对象属于用户的活跃角色。在 角色层次结构 中分配了相同角色或更高角色的其他用户可以管理对象或将所有权转让给其他角色。

使用 Snowsight

  1. 登录 Snowsight。

  2. 在导航菜单中,选择 Governance & security » Users & roles。

  3. 找到要禁用的用户,然后选择 更多选项 » Drop。

  4. 在打开的确认对话框中,选择 Drop User。

使用 SQL

使用 DROP USER 命令可删除用户。

DROP USER janesmith;

使用 Python

使用 UserResource.drop Python API 删除用户。

root.users["janesmith"].drop()