Snowflake自定义角色权限问询:批量及未来数据库权限授予
Snowflake 批量授权现有及未来数据库权限方案
一、批量授权现有所有数据库
Snowflake没有直接的grant ... on account databases命令,但可以通过动态SQL批量生成授权语句解决逐个授权的麻烦:
- 先列出所有数据库(可排除系统库):
SHOW DATABASES WHERE NAME NOT IN ('SNOWFLAKE', 'INFORMATION_SCHEMA');
- 基于查询结果生成批量授权语句,比如给
DBCREATOR授权CREATE TABLE:
SELECT 'GRANT CREATE TABLE ON DATABASE ' || "\"" || NAME || "\"" || ' TO ROLE DBCREATOR;' AS grant_stmt FROM TABLE(RESULT_SCAN(LAST_QUERY_ID()));
- 执行生成的所有GRANT语句,完成现有数据库的批量授权。
二、自动授权未来新增数据库
Snowflake支持未来对象授权,可以给账户级的未来数据库设置默认权限,新增数据库会自动继承:
给DBCREATOR授权未来数据库的CREATE TABLE权限:
GRANT CREATE TABLE ON FUTURE DATABASES IN ACCOUNT TO ROLE DBCREATOR;
给DBEDITOR授权未来数据库的编辑权限(仅数据操作,无删除库权限):
不要直接授予ALL(包含DROP DATABASE等高风险权限),按需指定具体权限:
-- 未来数据库的基础访问权限 GRANT USAGE ON FUTURE DATABASES IN ACCOUNT TO ROLE DBEDITOR; -- 未来数据库下所有Schema的访问权限 GRANT USAGE ON FUTURE SCHEMAS IN ACCOUNT TO ROLE DBEDITOR; -- 未来表的读写权限 GRANT SELECT, INSERT, UPDATE, DELETE ON FUTURE TABLES IN ACCOUNT TO ROLE DBEDITOR; -- 如需允许创建表,可添加以下语句(按需调整) -- GRANT CREATE TABLE ON FUTURE SCHEMAS IN ACCOUNT TO ROLE DBEDITOR;
三、补全DBEDITOR对现有数据库的权限
同样用动态SQL批量处理现有数据库及下属对象:
- 生成数据库
USAGE授权语句:
SELECT 'GRANT USAGE ON DATABASE ' || "\"" || NAME || "\"" || ' TO ROLE DBEDITOR;' AS grant_stmt FROM TABLE(RESULT_SCAN(LAST_QUERY_ID())); -- 基于之前SHOW DATABASES的结果
- 生成现有Schema的
USAGE授权:
SHOW SCHEMAS IN ACCOUNT; SELECT 'GRANT USAGE ON SCHEMA ' || "\"" || DATABASE_NAME || "\"" || '.' || "\"" || NAME || "\"" || ' TO ROLE DBEDITOR;' AS grant_stmt FROM TABLE(RESULT_SCAN(LAST_QUERY_ID()));
- 生成现有表的读写授权:
SHOW TABLES IN ACCOUNT; SELECT 'GRANT SELECT, INSERT, UPDATE, DELETE ON TABLE ' || "\"" || DATABASE_NAME || "\"" || '.' || "\"" || SCHEMA_NAME || "\"" || '.' || "\"" || NAME || "\"" || ' TO ROLE DBEDITOR;' AS grant_stmt FROM TABLE(RESULT_SCAN(LAST_QUERY_ID()));
执行以上生成的语句,即可让DBEDITOR拥有现有所有数据库的编辑权限。
关键注意事项
- 未来对象授权仅对授权完成后新建的对象生效,之前的对象必须单独批量授权。
- 始终按需指定具体权限,避免授予
ALL以降低误操作风险。 - 系统数据库如不需要授权,可在
SHOW语句中通过WHERE条件排除。
内容的提问来源于stack exchange,提问作者Alejandro Garcia Navarro
相关产品推荐
相关产品推荐

