You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Snowflake JavaScript存储过程执行多条SQL语句报错求助

问题原因&解决方案

报错根因

  • 第一个报错是因为你将USE ROLE OPS和GRANT两条SQL拼接在同一个sqlText里传入createStatement,Snowflake JS存储过程的单次API调用只支持执行单条SQL语句,不支持多条语句拼接执行。
  • 第二个报错是因为Snowflake JavaScript存储过程的官方API本身就没有executemany()方法,调用不存在的方法自然会抛出is not a function的错误。

修复要点

  1. 把拼接的多条SQL拆分为单独的语句分别执行,USE ROLE OPS不需要放到循环中重复执行,在循环开始前执行一次即可。
  2. 删除你原有代码中循环内的return InsertSelect逻辑,原有代码第一次循环执行到return就会直接终止存储过程,后续的schema权限授予逻辑根本不会执行。
  3. 所有SQL都单独调用createStatement + execute执行即可。

修正后完整代码

CREATE OR REPLACE PROCEDURE GrantSchemaTablePermissions ()
RETURNS VARCHAR
LANGUAGE JAVASCRIPT
AS
$$
    // 先单独切换角色,只执行一次
    var useRoleStmt = snowflake.createStatement({sqlText: "USE ROLE OPS;"});
    useRoleStmt.execute();

    // 查询所有符合条件的schema
    var table_control = "SELECT DISTINCT TABLE_SCHEMA FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_SCHEMA LIKE 'ABCD%'";
    var sql_statement = snowflake.createStatement({sqlText: table_control});
    var resultSet = sql_statement.execute();
    var processedSchemas = [];

    while (resultSet.next()) {
        var schemaName = resultSet.getColumnValue(1);              
        var grantSql = "GRANT OWNERSHIP ON ALL TABLES IN SCHEMA ABCD." + schemaName + " TO ROLE LOADER;";
        var grantStmt = snowflake.createStatement({sqlText: grantSql});
        grantStmt.execute();
        processedSchemas.push(schemaName);
    }

    return "权限授予完成,已处理schema列表:" + processedSchemas.join(", ");
$$;

CALL GrantSchemaTablePermissions();

额外注意事项

如果需要授予未来新建的表对应权限,可以在循环中补充执行GRANT OWNERSHIP ON FUTURE TABLES IN SCHEMA ABCD.xxx TO ROLE LOADER;的逻辑。

内容的提问来源于stack exchange,提问作者user1810575

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.05 22:39:03