0

我在一个包(即)中有几个存储过程(比方说PROC_1和) ,它位于模式/用户之一(即)下。PROC_2PROC_PKGA

我需要向另一个用户(即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从同一个包访问。

4

3 回答 3

2

我们不能从包中授予单个存储过程或函数的执行权限。因此,我们要么可以将执行权限授予包中的每个存储过程/函数,要么不授予包中的每个存储过程/函数。

事实上,这是包的优点之一: 您可以在包上授予角色,而不是在包中的每个对象上授予角色。

B以下查询将从用户授予用户执行权限A(这将允许用户B执行该包中的每个存储过程/函数)。

GRANT EXECUTE ON PROC_PKG TO B;

于 2019-06-20T13:06:59.063 回答
1

正如 Alex Poole 所指出的,使用 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;
/
于 2019-06-20T13:29:22.283 回答
1

您可以创建一个单独的“包装器”过程,它只执行 A.PROC_PKG.PROC_1,然后将其单独授予 B 执行。

于 2019-06-20T15:37:58.777 回答