Определение имени фактического исполнителя процедуры
Синтаксис
effective_username()
Описание
Получение имени пользователя, с правами которого выполняется процедура.
В СУБД ЛИНТЕР с хранимыми процедурами связаны два понятия:
-
номинальный исполнитель процедуры;
-
фактический исполнитель процедуры.
Номинальный исполнитель – это текущий пользователь открытого соединения, который вызвал на исполнение процедуру. Этим пользователем может быть как владелец процедуры, так и любой пользователь, которому владелец процедуры предоставил право её выполнять.
Фактический исполнитель – пользователь БД, которому владелец процедуры предоставил право выполнять процедуру от своего имени. Т.е. в данном случае вызов процедуры с опцией 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.