雪花任务返回必须授予所有者角色的使用错误
Snowflake task is returning a usage error that must be granted to owner role
我有一个属于 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();
任务 运行ning 后,我们收到以下错误:
USAGE privilege on the task's warehouse must be granted to owner role
两个角色都对同一个仓库拥有使用权限。我们已经 运行 show grants
这两个角色,他们确实有访问权限。
当 运行 使用 CALL test()
连接过程时,它使用两个角色都有效。
我的任务有 2 个问题:
时间戳会话格式:
原来我们任务中的这一行:
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;
我有一个属于 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();
任务 运行ning 后,我们收到以下错误:
USAGE privilege on the task's warehouse must be granted to owner role
两个角色都对同一个仓库拥有使用权限。我们已经 运行 show grants
这两个角色,他们确实有访问权限。
当 运行 使用 CALL test()
连接过程时,它使用两个角色都有效。
我的任务有 2 个问题:
时间戳会话格式:
原来我们任务中的这一行:
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;