授予/撤消程序包对过程的执行权限

时间:2019-06-20 12:37:13

标签: oracle stored-procedures plsql plsql-package

我在一个计划/用户(即{{1})下的一个程序包(即PROC_1)中有几个存储过程(假设PROC_2PROC_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;

我已经调查了thisthis的答案,但它们并没有帮助我。


PS:我想允许用户grant execute on A.PROC_PKG.PROC_1 TO B;仅访问B,这意味着用户PROC_1不能从同一软件包访问B

3 个答案:

答案 0 :(得分:1)

我们不能授予软件包中单个存储过程或函数的执行特权。 因此,我们可以授予程序包中每个存储过程/函数的执行特权,或者不授予程序包中的任何存储过程/函数。

实际上,这是Package的优势之一: You can grant roles on the package, instead of granting roles on each object in the package.

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

GRANT EXECUTE ON PROC_PKG TO B;

答案 1 :(得分: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;
/

答案 2 :(得分:1)

您可以创建一个单独的“包装程序”过程,该过程仅执行A.PROC_PKG.PROC_1,然后将其分别授予B执行。