雪花任务返回必须授予所有者角色的使用错误

时间:2021-05-18 13:24:28

标签: scheduled-tasks snowflake-cloud-data-platform data-warehouse

我有一个由 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() 运行该过程时,它同时使用两个角色。

1 个答案:

答案 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;