Определение имени фактического исполнителя процедуры

Синтаксис
 
effective_username()
Описание

Получение имени пользователя, с правами которого выполняется процедура.

В СУБД ЛИНТЕР с хранимыми процедурами связаны два понятия:

  1. номинальный исполнитель процедуры;

  2. фактический исполнитель процедуры.

Номинальный исполнитель – это текущий пользователь открытого соединения, который вызвал на исполнение процедуру. Этим пользователем может быть как владелец процедуры, так и любой пользователь, которому владелец процедуры предоставил право её выполнять.

Фактический исполнитель – пользователь БД, которому владелец процедуры предоставил право выполнять процедуру от своего имени. Т.е. в данном случае вызов процедуры с опцией as owner осуществляет текущий (номинальный) пользователь, а реально выполняет её другой пользователь. Функция effective_username() предоставляет имя того пользователя, с чьими правами будет реально выполняться процедура.

Возвращаемое значение

Имя пользователя (char(66)), с правами которого выполняется процедура.

Пример
1) Создание процедуры CurUser, владельцем которой является пользователь SYSTEM.
username SYSTEM/MANAGER8

create or replace procedure CurUser() result varchar(128)
code
  return "Номинальный: " + trim(USERNAME()) + ". " + "Фактический: " + trim(EFFECTIVE_USERNAME());
end;
2) Выполнение процедуры.
execute CurUser()
Результат: Номинальный: SYSTEM. Фактический: SYSTEM
3) Создание пользователя TESTER и предоставление ему владельцем процедуры CurUser прав на выполнение
этой процедуры от имени владельца.
create or replace user TESTER identified by '12345678';
grant execute as owner on CurUser to TESTER;
4) Выполнение процедуры от имени пользователя, которому дано это право.
В данном случае процедура запускается на выполнение текущим пользователем TESTER (номинальный исполнитель), а реально выполнятся с правами пользователя SYSTEM (фактический исполнитель)
username TESTER/12345678
execute SYSTEM.CurUser() as owner;
Результат: Номинальный: TESTER. Фактический: SYSTEM

Примечание. В случае если в процедуре используются таблицы БД, владельцами которых являются номинальный и фактический исполнители процедуры, то в имени таблицы должен указываться их владелец с помощью функции username() или effetive_username(), например,
 "trim(username())".auto или "trim(effective _username())".auto.