雪花用户默认角色不存在

Aar*_*nin 3 snowflake-cloud-data-platform

我希望使用以下脚本为单个用户创建一个具有访问权限的数据库:

USE ROLE ACCOUNTADMIN;
CREATE DATABASE db;
USE DATABASE db;
CREATE WAREHOUSE wh
    WAREHOUSE_SIZE = SMALL
    ;
CREATE ROLE new_role;
GRANT USAGE ON DATABASE db TO ROLE new_role;
GRANT CREATE SCHEMA ON DATABASE db TO ROLE new_role;
GRANT ALL ON SCHEMA db.PUBLIC TO ROLE new_role;
CREATE or replace USER new_user PASSWORD='' DEFAULT_ROLE = 'new_role' DEFAULT_WAREHOUSE='wh';
GRANT ROLE new_role TO USER new_user;
GRANT ALL ON WAREHOUSE wh TO new_role;
Run Code Online (Sandbox Code Playgroud)

尝试使用新创建的用户登录或从其他服务连接时,我看到以下错误:

用户配置的默认角色“new_role”不存在或未经授权。联系您的本地系统管理员,或尝试使用带有连接字符串的 CLI 客户端登录,并选择另一个

将默认角色设置为PUBLIC允许我从 Snowflake Web 门户登录。然后,我可以选择所需的角色并按预期进行导航。第三方连接无法访问任何新创建的对象,大概是因为它没有尝试切换角色。

允许为我的新用户设置默认角色缺少什么?

Han*_*sen 7

您应该删除角色名称周围的引号: DEFAULT_ROLE = new_role

ROLE名称是区分大小写的,而语法就像是列名:
COL_NAMEcol_name"COL_NAME" 是相同的,但 "col_name"不同的是,即。小写。

我建议您不要引用此类标识符,并让系统将任何大小写中的引用隐式转换为大写。这是大多数人所做的。

所有这些设置方法DEFAULT_ROLE都是有效且相等的:

ALTER USER u SET DEFAULT_ROLE = NEW_ROLE;
ALTER USER u SET DEFAULT_ROLE = new_role;
ALTER USER u SET DEFAULT_ROLE = "NEW_ROLE";
ALTER USER u SET DEFAULT_ROLE = 'NEW_ROLE';
Run Code Online (Sandbox Code Playgroud)

但是,以下内容与上述不同,因为ROLE名称区分大小写:

ALTER USER u SET DEFAULT_ROLE = 'new_role';
ALTER USER u SET DEFAULT_ROLE = "new_role";
Run Code Online (Sandbox Code Playgroud)

DEFAULT_ROLE只是一个文本属性,可以设置为任何内容,例如。不存在的角色或未授予用户的角色。两者都会在登录时产生错误。

使用以下命令查看DEFAULT_ROLE有效设置的确切名称:

DESC USER u;
Run Code Online (Sandbox Code Playgroud)

注意:该DEFAULT_ROLE设置不是角色授予!
你也需要使用GRANT ROLE r TO USER u