【发布时间】:2020-05-31 09:59:27
【问题描述】:
我创建了一个存储过程,其行为以所有者身份执行(我需要所有者的权限)。
我正在寻找调用它的用户的原始角色,有什么办法吗?
不幸的是,正如预期的那样,select current_role() 语句返回了所有者的角色......
如果存在解决方法,如果您能向我描述一下,我将不胜感激。
按照 Mike 的建议:这里有我为测试 Harsh 的解决方案所做的代码:
又失败了^^ 这是我的代码。也许你会看到我的错误。
create or replace procedure do_noting_proc()
returns string
language javascript
execute as OWNER
AS
$$
var retour="Resultat";
try{
rs0=snowflake.createStatement({sqlText:"SELECT $QUERY_TAG;"}).execute();
cR=rs0.getColumnValue(1);
return "QRValue= "+callerRole;
}catch(err){
return "do_noting_proc KO: "+ err.message+";";
}
$$;
create or replace procedure test_proc()
returns string
language javascript
execute as CALLER
AS
$$
var rString="Result -->";
try{
rs0=snowflake.createStatement({sqlText:"SELECT CURRENT_ROLE();"}).execute();
rs0.next();
cr="testQT"+rs0.getColumnValue(1);
snowflake.createStatement({sqlText:"alter session set QUERY_TAG="+cr+";"}).execute();
rs=snowflake.createStatement({sqlText:"call PUBLIC.do_noting_proc();"}).execute();
rs.next();
rString+=rs.getColumnValue(1);
}catch(err){
return "test_proc: "+ err.message+";";
}
return "test_proc : "+rString;
$$;
那么call share_view_or_table();
==>test_proc : ** 结果 -->do_noting_proc KO:在所有者权限存储过程中不允许使用会话变量“$QUERY_TAG”;**
(由系统管理员创建并以系统管理员身份执行的过程)
另外,如果我运行“代码” 选择 $QUERY_TAG;
我收到错误:SQL 编译错误:第 1 行错误,位置 7 会话变量“$QUERY_TAG”不存在
而
SHOW PARAMETERs LIKE 'QUERY_TAG' IN SESSION ;
工作正常并打印 TESTQTSYSADMIN
@Harsh 非常感谢您抽出宝贵时间
【问题讨论】:
-
您的意思是来自 SP 内部吗?
-
我错过了您的评论(抱歉,迈克)。是的,就是这样,在存储过程中
标签: stored-procedures snowflake-cloud-data-platform