Предоставить / отозвать разрешение на выполнение процедуры из пакета - PullRequest
0 голосов
/ 20 июня 2019

У меня есть пара хранимых процедур (скажем, PROC_1 и PROC_2) внутри одного пакета (т.е. PROC_PKG), который находится под одной из схем / пользователя (то есть A).

Мне нужно предоставить разрешение на выполнение другому пользователю (например, B).

Поэтому я уже пробовал использовать следующие команды:

grant execute on PROC_1 TO B;

grant execute on A.PROC_1 TO B;

grant execute on PROC_PKG.PROC_1 TO B;

grant execute on A.PROC_PKG.PROC_1 TO B;

Я уже изучил это и это ответыно они не помогли мне.

PS: Я хочу разрешить пользователю B доступ только к PROC_1, что означает, что пользователь B не сможет получить доступ к PROC_2 из того же пакета.

Ответы [ 3 ]

1 голос
/ 20 июня 2019

Как указал Алекс Пул, один обходной путь с ROLES будет выглядеть так:

CREATE ROLE EXECUTE_PROC_1 NOT IDENTIFIED;

GRANT EXECUTE_PROC_1 TO B;
ALTER USER B DEFAULT ROLE ALL;

CREATE OR REPLACE PACKAGE BODY MY_PACKAGE AS
   PROCEDURE PROC_1 IS
   BEGIN
       IF NOT DBMS_SESSION.IS_ROLE_ENABLED('EXECUTE_PROC_1') THEN
           RAISE_APPLICATION_ERROR(-20001, 'Not permitted');
       END IF;
       -- Do your stuff
   END;
END MY_PACKAGE;
/
1 голос
/ 20 июня 2019

Вы можете создать отдельную процедуру-обертку, которая будет выполнять только A.PROC_PKG.PROC_1, а затем разрешить выполнение этого отдельно для B.

1 голос
/ 20 июня 2019

Мы не можем предоставить привилегию выполнения отдельной хранимой процедуре или функции из пакета. Таким образом, мы можем предоставить привилегию выполнения каждой хранимой процедуре / функции из пакета или ни одной из них из пакета.

Фактически это одно из преимуществ пакета: Выможет предоставлять роли в пакете вместо предоставления ролей для каждого объекта в пакете.

Следующий запрос предоставит привилегию выполнения пользователю B от пользователя A (Это позволитпользователь B для выполнения каждой хранимой процедуры / функции из этого пакета).

GRANT EXECUTE ON PROC_PKG TO B;

...