用户管理¶
用户管理员可以通过 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
用户的属性,但具有可用的PASSWORD
和MUST_CHANGE_PASSWORD
属性。他们具有
SERVICE
用户的命令限制,但可以使用 ALTER USER RESET PASSWORD 命令。他们不受身份验证策略多重身份验证 (MFA) 强制执行的影响。此属性允许管理员设置账户级身份验证,该策略需要使用 MFA 进行密码身份验证,而无需设置用户级身份验证策略来防止
LEGACY_SERVICE
用户需要 MFA 进行密码身份验证。
用户角色¶
Snowflake 使用角色来控制用户可以访问的对象(虚拟仓库、数据库、表等):
Snowflake 提供一组预定义的角色,以及用于定义自定义角色层次结构的框架。
所有 Snowflake 用户都自动分配了预定义的 PUBLIC 角色,该角色支持登录 Snowflake 和访问基本对象。
除了 PUBLIC 角色之外,还可以为每个用户分配其他角色,其中一个角色可指定为 默认角色。用户的默认角色决定了用户发起的 Snowflake 会话中使用的角色;但这只是默认角色。用户可以随时更改会话中的角色。
可以在用户创建之时或之后分配角色。
创建和修改用户所需的权限¶
管理账户中的用户需要以下角色或权限:
- 创建用户:
USERADMIN 系统角色可以使用 SQL (CREATE USER) 创建用户。
要为此目的使用自定义角色,请将账户的 CREATE USER 权限授予此角色。
- 修改用户:
角色只有拥有用户的 OWNERSHIP 权限,才能使用 SQL (ALTER USER) 修改大多数用户属性。
创建用户¶
本部分介绍如何使用您选择的界面在特定账户中创建用户。
选择界面时,请考虑 Web 界面,无论您使用的是 Classic Console 还是 Snowsight,都要求您在创建用户时指定密码。CREATE USER 命令和 UserCollection.create Python API 则没有。
备注
如果您想创建可以访问组织内多个账户的用户,请参阅 组织用户。
使用 Snowsight¶
登录 Snowsight。
选择 Admin » Users & Roles。
选择 + User。
在 User Name 字段中,输入用户的唯一标识符。除非您指定登录名,否则用户将使用此标识符登录 Snowflake。
(可选)在 Email 字段中指定用户的电子邮件地址。
在 Password 和 Confirm Password 字段中,输入用户的密码。
(可选)添加注释,解释创建用户的原因。
选中 Force user to change password on first time login 复选框,以强制用户在登录时更改其密码。
(可选)选择 Advanced User Options 以指定有关用户的其他详细信息:
登录 Snowflake 时要使用的是 Login Name,而不是 User Name。
登录后显示 Display Name。
First Name 和 Last Name 用于填写用户简介。
Default Role、Default Warehouse 和 Default Namespace。
选择 Create User。
使用 Classic Console¶
选择 Create。
在 User Name 字段中,输入用户的唯一标识符。
备注
用户名是 Snowflake 中用户的唯一标识符。它 不是 用户的登录名(即用户登录 Snowflake 时输入的名称)。如果需要,Snowflake 允许用户拥有不同的用户名和登录名。在下一个屏幕上为用户指定登录名。
在 Password 和 Confirm Password 字段中,输入用户的密码。
选中 Force Password Change 复选框,以强制用户在下次登录时更改其密码,否则,取消选中该复选框。
选择 Next。Advanced 屏幕打开。
(可选)输入用户的 Login Name、Display Name 和个人信息。
备注
用户需要登录名才能登录 Snowflake;如果没有显式提供登录名,Snowflake 将使用他们的用户名作为登录名。
选择 Next。Preferences 屏幕打开。
(可选)输入用户的默认值:
虚拟仓库
db_name
或db_name.schema_name
形式的命名空间角色
选择 Finish。Snowflake 显示成功消息。
使用 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¶
要启用用户,请执行相同的步骤,但选择 Enable User。
使用 Classic Console¶
要启用用户,请执行相同的步骤,但选择 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;
user_parameters = root.users["janesmith"].fetch()
user_parameters.mins_to_unlock = 0
root.users["janesmith"].create_or_alter(user_parameters)
小技巧
如果一个角色具有所有 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:
设置或更改用户
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 的用户设置默认辅助角色。
查看用户¶
您可以通过以下界面查看用户信息。
使用 SQL¶
使用 DESCRIBE USER 或 SHOW USERS 命令可查看有关一个或多个用户的信息。
例如:
DESC USER janeksmith;
使用 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¶
删除用户¶
删除用户也会从 Snowflake 中删除用户凭据。
重要
删除用户时,该用户拥有的文件夹、工作表和仪表板将无法访问,除非启用了共享,否则 不会 转移给其他用户。
具有 查看、查看 + 运行和编辑权限 的共享收件人将保留其分配的权限,并且仍然可以访问共享文件夹、工作表和仪表板。但是,只有具有编辑权限的用户才能修改或删除共享文件夹、工作表和仪表板。如果您在删除所有者之前没有将编辑权限授予至少另一个用户,则无法删除该所有者的文件夹、工作表和仪表板。
如果已删除用户的工作表未启用共享,管理员最多可以 恢复该用户拥有的 500 个工作表。
小心
Classic Console 中的所有工作表都将被永久删除,如果以前未与其他用户共享,仪表板将无法访问。
系统不会删除用户创建的对象(如表或视图),因为在创建对象时,这些对象属于用户的活跃角色。在 角色层次结构 中分配了相同角色或更高角色的其他用户可以管理对象或将所有权转让给其他角色。
使用 Snowsight¶
使用 Classic Console¶
使用 SQL¶
使用 DROP USER 命令可删除用户。
DROP USER janesmith;
使用 Python¶
使用 UserResource.drop Python API 删除用户。
root.users["janesmith"].drop()