我在一个计划/用户(即{{1})下的一个程序包(即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;
仅访问B
,这意味着用户PROC_1
不能从同一软件包访问B
。
答案 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执行。