Доступные версии документации

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

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

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

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

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

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

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

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

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

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

Пример

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

username SYSTEM/MANAGER;

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 '12345';
grant execute as owner on CurUser to TESTER;

4. Выполнение процедуры от имени пользователя, которому дано это право. В данном случае процедура запускается на выполнение текущим пользователем TESTER (номинальный исполнитель), а реально выполнятся с правами пользователя SYSTEM (фактический исполнитель)

username TESTER/12345;
execute SYSTEM.CurUser() as owner;
Результат: Номинальный: TESTER. Фактический: SYSTEM

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

Заметили ошибку?
Выделите текст и нажмите Ctrl + Enter