[CURRENT_ROLE()在过程与函数中的行为

问题描述 投票:0回答:1

我想验证我从过程与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授予)?

user-defined-functions roles procedure snowflake-cloud-data-platform
1个回答
0
投票

存储过程可以使用所有者的特权(“所有者的权利”存储过程)或调用者的特权(“调用者的权利”存储过程)执行。如果您执行CREATE PROCEDURE ... EXECUTE AS CALLER语句,则将来该过程将作为呼叫者的权利过程执行。如果您执行CREATE PROCEDURE ... EXECUTE AS OWNER,则该过程将作为所有者的权利过程执行。默认情况下(如果在创建过程时未明确指定OWNER和CALLER),则该过程将作为所有者的权限存储过程运行。

尝试在代码中包含EXECUTE AS CALLER。

© www.soinside.com 2019 - 2024. All rights reserved.