【问题标题】:Is there a way in which I can grant only read access of a procedure in snowflake?有没有一种方法可以让我只授予雪花程序的读取权限?
【发布时间】:2022-08-15 23:07:42
【问题描述】:
我在雪花中创建了一个程序
我想将雪花中该存储过程的读取权限授予其他用户/角色。
GRANT USAGE ON PROCEDURE
get_column_scale(float)
TO ROLE other_role_name_here;
我相信上面的命令也会提供我不想要的写访问权限。有没有一种方法可以授予只读访问权限
-
使用将授予执行权限。 Refer 用于存储过程的允许权限。
标签:
snowflake-cloud-data-platform
snowflake-schema
【解决方案1】:
分配给过程的唯一权限是usage,因此如果您希望角色能够读取过程的定义但不能运行它,那么您可以使用定义为以所有者权限执行的存储过程:
create or replace procedure read_procedure(PROCEDURE_PATH string)
returns string
language javascript
execute as owner
as
$$
let rs = snowflake.execute({sqlText: `select get_ddl('procedure', ?) as DDL`, binds:[PROCEDURE_PATH]});
rs.next();
return rs.getColumnValue('DDL');
$$;
create or replace procedure FOO(S string)
returns string
language javascript
as
$$
return S;
$$;
grant usage on procedure READ_PROCEDURE(string) to role MY_ROLE;
call read_procedure('FOO(string)');
在此设置中,确保 MY_ROLE 在过程 read_procedure(string) 上使用,但在过程 foo(string) 上没有使用。这样,该角色将能够查看foo(string) 的定义,而无需执行它(使用)所需的特权。
请注意,由于read_procedure(string) 过程以所有者权限运行,因此调用它的任何人都可以读取所有者角色可以读取的任何过程。
编辑:您还可以在 INFORMATION_SCHEMA.PROCEDURES 视图中分部分阅读 SP。您可以在该视图上授予 select 权限,而无需在过程上授予 USAGE 权限。