我有一个由 prod_admin 所有的测试程序:
CREATE OR REPLACE PROCEDURE test()
RETURNS VARIANT
LANGUAGE JAVASCRIPT
EXECUTE AS OWNER
AS
$$
query = "SELECT * FROM DWH_OPS.CHANGE_HISTORY";
stmt = snowflake.createStatement({sqlText: query}).execute();
stmt.next();
return stmt;
$$;
还有一个任务来运行这个程序并由 task_admin 拥有:
CREATE OR REPLACE TASK test_procedure
WAREHOUSE = 'COMPUTE_WH'
TIMESTAMP_INPUT_FORMAT = 'YYYY-MM-DD HH24'
SCHEDULE = '5 MINUTE'
AS
call PROD_DB.DWH_OPS.TEST();
一旦任务运行,我们就会收到以下错误:
<块引用>必须将任务仓库的 USAGE 权限授予所有者角色
两个角色都拥有对同一个仓库的使用权限。我们已经为这两个角色运行了 show grants
,他们确实拥有访问权限。
当使用 CALL test()
运行该过程时,它同时使用两个角色。
答案 0 :(得分:1)
我的任务有两个问题:
时间戳会话格式:
原来我们任务中的这一行:
TIMESTAMP_INPUT_FORMAT = 'YYYY-MM-DD HH24'
正在将会话的时间戳设置为与我们数据中的格式不同的格式。
CREATE OR REPLACE TASK DATA_LOAD_TASK
WAREHOUSE = 'COMPUTE_WH'
// TIMESTAMP_INPUT_FORMAT = 'YYYY-MM-DD HH24'
SCHEDULE = 'USING CRON 00 18 * * * Europe/Zurich'
AS
CALL proc1();
如 Snowflake parameters 文档中所述,此行会将整个会话期间的格式设置为任务中指定的格式。
通过不指定此参数的格式,它将设置为 AUTO
,这将留给 Snowflake 根据字段类型进行必要的时间戳转换。
对程序和任务的所有权和使用权:
为了正确处理调用过程的任务,该过程调用了许多其他过程,我们应该将所有使用过程的使用权授予拥有 task
的角色。即使我们正在调用一个过程。
grant usage on procedure proc1(varchar, varchar, varchar, array) to role prod_taskadmin;
grant usage on procedure proc2(varchar, varchar, varchar, varchar) to role prod_taskadmin;
grant usage on procedure proc3(varchar, varchar, varchar, varchar) to role prod_taskadmin;
并且这些过程应该由对架构中的所有对象具有权限的角色拥有:
grant ownership on procedure proc1(string, string, string, array) to role prod_sysadmin;
grant ownership on procedure proc2(string, string, string, array) to role prod_sysadmin;
grant ownership on procedure proc3(string, string, string, array) to role prod_sysadmin;