Snowflake:如何在执行中的存储过程内部获取其所属模式?
获取Snowflake存储过程自身所属模式(EXECUTE AS CALLER模式下)
在Snowflake中,确实可以在EXECUTE AS CALLER的存储过程内部获取其自身所属的模式,完全不需要切换到EXECUTE AS OWNER。这里有个直接可行的解决方案:
- 使用Snowflake内置的
SYSTEM$CURRENT_PROCEDURE_NAME()函数获取存储过程的完全限定名称(格式为数据库名.模式名.存储过程名) - 通过字符串拆分函数提取其中的模式部分
示例实现
以下是完整的存储过程代码,演示如何获取自身所属模式:
CREATE OR REPLACE PROCEDURE UTIL.P_TEST() RETURNS VARCHAR LANGUAGE SQL EXECUTE AS CALLER AS $$ DECLARE -- 获取存储过程的完全限定名称 full_proc_name VARCHAR := SYSTEM$CURRENT_PROCEDURE_NAME(); -- 拆分字符串提取模式名:拆分点为'.',取第2个部分 proc_schema VARCHAR := SPLIT_PART(full_proc_name, '.', 2); BEGIN RETURN CONCAT('当前存储过程所属模式: ', proc_schema); END; $$;
测试验证
当你在NOT_UTIL模式下调用这个存储过程时:
USE NOT_UTIL; CALL UTIL.P_TEST();
返回结果会是:当前存储过程所属模式: UTIL,完全符合你的需求。
原理说明
SYSTEM$CURRENT_PROCEDURE_NAME()函数会返回当前正在执行的存储过程的完整三部分名称(即使跨数据库调用也能正确返回),不受调用者会话上下文的影响SPLIT_PART()函数按照.分隔符拆分字符串,第二部分就是存储过程所属的模式名;如果是跨数据库场景,第一部分是数据库名,第二部分依然是模式名,逻辑同样适用
这个方法完全适配EXECUTE AS CALLER的场景,不需要修改执行权限就能拿到存储过程自身的所属模式。
内容的提问来源于stack exchange,提问作者jduckwo
相关产品推荐
相关产品推荐

