CURRENT_ROLE () поведение в процедуре против функции - PullRequest
0 голосов
/ 28 мая 2020

Я хотел бы подтвердить свое наблюдение о получении разных результатов от CURRENT_ROLE () при вызове из процедуры по сравнению с UDF ..

Например, из пользовательского интерфейса я создаю процедуру и функцию как 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_pro c () возвращает «role_A», тогда как select tst_exec_owner_fun c () возвращает «role_B». Это ожидаемое поведение (при условии, что role_A и role_B имеют необходимые права USAGE)?

1 Ответ

0 голосов
/ 29 мая 2020

Хранимая процедура может выполняться с привилегиями владельца (хранимая процедура с «правами владельца») или с привилегиями вызывающего объекта (хранимая процедура с «правами вызывающего»). Если вы выполните оператор CREATE PROCEDURE ... EXECUTE AS CALLER, то в будущем процедура будет выполняться как процедура прав вызывающего. Если вы выполните CREATE PROCEDURE ... EXECUTE AS OWNER, то процедура будет выполняться как процедура с правами владельца. По умолчанию (если ни OWNER, ни CALLER не указаны явно во время создания процедуры), процедура запускается как хранимая процедура прав владельца.

Попробуйте включить EXECUTE AS CALLER в свой код.

...