代码之家  ›  专栏  ›  技术社区  ›  alim1990

雪花任务正在运行,调用过程时不影响任何数据

  •  0
  • alim1990  · 技术社区  · 4 年前

    我有一个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();
    

    任务运行后,我们收到以下错误:

    必须将任务仓库的使用权限授予所有者角色

    这两个角色都对同一个仓库拥有使用权限。我们跑了 show grants 对于这两个角色,他们都有访问权限。

    使用以下命令运行程序时 CALL test() ,它同时使用这两个角色。

    0 回复  |  直到 4 年前
        1
  •  3
  •   alim1990    4 年前

    我的任务有两个问题:

    时间戳会话格式:

    事实证明,我们任务中的这一行:

    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;