用户管理

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

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

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

  • Classic Console 不支持所有与用户相关的任务,但提供了一个向导,用于创建用户和执行常见的活动,例如重置用户密码。

用户类型

有些用户对象对应的是人类用户,而其他用户对象则对应的是以编程方式与 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 用户的更多信息,请参阅 从容器内部连接到 Snowflake

LEGACY_SERVICE:

TYPE 属性设置为 LEGACY_SERVICE 的用户表示非交互式集成。与 SERVICE 类似,但允许密码和 SAML 身份验证。在未来的版本中,LEGACY_SERVICE 类型将会弃用,届时所有非交互式用例将使用具有安全身份验证方法的 SERVICE 类型。

LEGACY_SERVICE 用户具有以下特征:

  • 他们可以使用密码或 SAML 身份验证登录,与 SERVICE 用户不同。

  • 他们具有 SERVICE 用户的属性,但具有可用的 PASSWORDMUST_CHANGE_PASSWORD 属性。

  • 他们具有 SERVICE 用户的命令限制,但可以使用 ALTER USER RESET PASSWORD 命令。

  • 他们不受身份验证策略多重身份验证 (MFA) 强制执行的影响。此属性允许管理员设置账户级身份验证,该策略需要使用 MFA 进行密码身份验证,而无需设置用户级身份验证策略来防止 LEGACY_SERVICE 用户需要 MFA 进行密码身份验证。

用户角色

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

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

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

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

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

注意

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

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

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

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

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

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

创建用户:

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

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

修改用户:

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

创建用户

本部分介绍如何使用您选择的界面在特定账户中创建用户。

选择界面时,请考虑 Web 界面,无论您使用的是 Classic Console 还是 Snowsight,都要求您在创建用户时指定密码。CREATE USER 命令和 UserCollection.create Python API 则没有。

备注

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

使用 Snowsight

  1. 登录 Snowsight。

  2. 选择 Admin » Users & Roles

  3. 选择 + User

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

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

  6. PasswordConfirm Password 字段中,输入用户的密码。

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

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

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

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

    • 登录后显示 Display Name

    • First NameLast Name 用于填写用户简介。

    • Default RoleDefault WarehouseDefault Namespace

  10. 选择 Create User

使用 Classic Console

  1. 选择 Account Account 选项卡 » Users

  2. 选择 Create

  3. User Name 字段中,输入用户的唯一标识符。

    备注

    用户名是 Snowflake 中用户的唯一标识符。它 不是 用户的登录名(即用户登录 Snowflake 时输入的名称)。如果需要,Snowflake 允许用户拥有不同的用户名和登录名。在下一个屏幕上为用户指定登录名。

  4. PasswordConfirm Password 字段中,输入用户的密码。

  5. 选中 Force Password Change 复选框,以强制用户在下次登录时更改其密码,否则,取消选中该复选框。

  6. 选择 NextAdvanced 屏幕打开。

  7. (可选)输入用户的 Login NameDisplay Name 和个人信息。

    备注

    用户需要登录名才能登录 Snowflake;如果没有显式提供登录名,Snowflake 将使用他们的用户名作为登录名。

  8. 选择 NextPreferences 屏幕打开。

  9. (可选)输入用户的默认值:

    • 虚拟仓库

    • db_namedb_name.schema_name 形式的命名空间

    • 角色

  10. 选择 Finish。Snowflake 显示成功消息。

使用 SQL

使用 CREATE USER 命令创建用户。

重要

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

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

GRANT ROLE myrole TO USER janesmith;
Copy

请注意,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'))
Copy

禁用或启用用户

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

使用 Snowsight

  1. 登录 Snowsight。

  2. 选择 Admin » Users & Roles

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

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

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

使用 Classic Console

  1. 点击 Account Account 选项卡 » Users

  2. 点击用户行,将其选中,然后点击 Disable User 按钮。此时会打开一个确认对话框。

  3. 点击 Yes 以禁用用户。

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

使用 SQL

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

  • 禁用用户:

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

    ALTER USER janesmith SET DISABLED = FALSE;
    
    Copy

使用 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)
    
    Copy
  • 启用用户:

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

解锁用户

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

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

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

ALTER USER janesmith SET MINS_TO_UNLOCK= 0;
Copy

小技巧

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

更改用户的会话参数

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

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

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

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

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

    ALTER USER <name> UNSET <session_param>
    
    Copy

修改其他用户属性

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

例如:

  • 将用户 janesmith 的姓更改为 Jones

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

    2. 选择 Admin » 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');
    
    Copy
    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)
    
    Copy
    Snowsight:

    备注

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

    1. 登录 Snowsight。

    2. 选择 Admin » Users & Roles

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

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

    5. 选择 Save User

查看用户

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

使用 SQL

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

例如:

DESC USER janeksmith;
Copy

使用 Python

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

例如:

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

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

例如:

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

使用 Snowsight

  1. 登录 Snowsight。

  2. 选择 Admin » Users & Roles

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

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

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

删除用户

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

重要

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

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

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

小心

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

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

使用 Snowsight

  1. 登录 Snowsight。

  2. 选择 Admin » Users & Roles

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

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

使用 Classic Console

  1. 选择 Account Account 选项卡 » Users

  2. 点击用户行,将其选中,然后选择 Drop。此时会打开一个确认对话框。

  3. 选择 Yes 以删除用户。

使用 SQL

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

DROP USER janesmith;
Copy

使用 Python

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

root.users["janesmith"].drop()
Copy
语言: 中文