我想验证我从过程与UDF调用时从CURRENT_ROLE()得到不同结果的观察。
例如,在用户界面中,我创建以下过程,并充当role_A:
create or replace procedure tst_exec_owner_proc()
returns VARCHAR
language javascript
as
$$
// Set the second session variable
var stmt = snowflake.createStatement(
{sqlText: "select CURRENT_ROLE();"}
);
var rs = stmt.execute();
rs.next();
return rs.getColumnValue(1);
$$
;
create or replace function tst_exec_owner_func()
returns VARCHAR
as
$$
select current_role()
$$;
现在,调用过程,函数返回“ role_A”;但是一旦我切换到role_B,则调用tst_exec_owner_proc()会返回“ role_A”,而选择tst_exec_owner_func()会返回“ role_B”。这是预期的行为吗(假设role_A和role_B具有必要的USAGE授予)?
存储过程可以使用所有者的特权(“所有者的权利”存储过程)或调用者的特权(“调用者的权利”存储过程)执行。如果您执行CREATE PROCEDURE ... EXECUTE AS CALLER语句,则将来该过程将作为呼叫者的权利过程执行。如果您执行CREATE PROCEDURE ... EXECUTE AS OWNER,则该过程将作为所有者的权利过程执行。默认情况下(如果在创建过程时未明确指定OWNER和CALLER),则该过程将作为所有者的权限存储过程运行。
尝试在代码中包含EXECUTE AS CALLER。