Snowflake JavaScript存储过程执行多条SQL语句报错求助
问题原因&解决方案
报错根因
- 第一个报错是因为你将
USE ROLE OPS和GRANT两条SQL拼接在同一个sqlText里传入createStatement,Snowflake JS存储过程的单次API调用只支持执行单条SQL语句,不支持多条语句拼接执行。 - 第二个报错是因为Snowflake JavaScript存储过程的官方API本身就没有
executemany()方法,调用不存在的方法自然会抛出is not a function的错误。
修复要点
- 把拼接的多条SQL拆分为单独的语句分别执行,
USE ROLE OPS不需要放到循环中重复执行,在循环开始前执行一次即可。 - 删除你原有代码中循环内的
return InsertSelect逻辑,原有代码第一次循环执行到return就会直接终止存储过程,后续的schema权限授予逻辑根本不会执行。 - 所有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
相关产品推荐
相关产品推荐

