将存储过程的权限授予Oracle的另一个用户

12

我是一名本科生,我在Oracle 10g模式= xe的数据库中遇到了一个小问题,即如何将所有权权限授予用户A,以便让其使用由用户B拥有的存储过程。

请帮助我编写SQL命令,将存储过程xyz的所有权权限授予另一个用户A。

5个回答

39

我不确定你所说的“所有权权限”是什么意思。

如果用户B拥有一个存储过程,那么用户B可以授权给用户A运行该存储过程的权限。

GRANT EXECUTE ON b.procedure_name TO a

User A将使用完全限定的名称来调用该过程,即:

BEGIN
  b.procedure_name( <<list of parameters>> );
END;

或者,用户 A 可以创建一个同义词来避免使用完全限定的过程名称。

CREATE SYNONYM procedure_name FOR b.procedure_name;

BEGIN
  procedure_name( <<list of parameters>> );
END;

8
您想做的事情我认为是不可能的。
过程中唯一能授予权限的是EXECUTE和DEBUG。
如果您想让用户B在用户A模式下创建一个过程,则用户B必须拥有CREATE ANY PROCEDURE特权。ALTER ANY PROCEDURE和DROP ANY PROCEDURE是改变或删除用户A过程的其他适用权限。这些都是广泛的权限,因为它不限制用户B到任何特定模式。如果授予这些权限,用户B应该是非常值得信赖的人。
编辑:
正如Justin所提到的,给A执行B拥有的过程的方法:
GRANT EXECUTE ON b.procedure_name TO a;

1
一个比CREATE ANY PROCEDURE更温和的方法,但也有缺陷,是给使用用户B的应用程序提供用户A的密码,允许他们以该用户身份登录。听起来你想授予模式级别的权限,但这在Oracle中不可用。 - Leigh Riffel
好的,先生,请告诉我如何授予用户A执行用户B存储过程的权限。 - Basmah

1

在您的DBA账户上,使用授权grant create any procedure to USERB,给予USERB创建存储过程的权限。

存储过程如下:

CREATE OR REPLACE PROCEDURE USERB.USERB_PROCEDURE
--Must add the line below
AUTHID CURRENT_USER AS
  BEGIN
  --DO SOMETHING HERE
  END
END

授予USERA对USERB.USERB_PROCEDURE的执行权限

我知道这是一个非常老的问题,但我希望我能做出一点贡献。


1

在Oracle中,包和存储过程默认使用包/过程所有者的权限来执行,而不是当前登录用户的权限。

因此,如果您调用一个创建用户的包,例如,需要有创建用户特权的是包所有者,而不是调用用户。调用者只需要对包具有执行权限即可。

如果您希望该包应在调用用户的权限下运行,则在创建包时需要指定AUTHID CURRENT_USER。

Oracle文档“Invoker Rights vs Definer Rights”提供了更多信息http://docs.oracle.com/cd/A97630_01/appdev.920/a96624/08_subs.htm#18575

希望这可以帮助到您。


0
SQL> grant create any procedure to testdb;

这是一个命令,当我们想要给“testdb”用户创建特权时使用。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接