我是本科学习的学生,在向用户A授予对数据库Oracle 10g mode = xe中用户B拥有的存储过程的所有权时,我几乎没有遇到任何问题。
请帮我编写sql命令,以便将存储过程xyz的所有权授予另一个用户A.
答案 0 :(得分:26)
我不确定我理解“所有权”的含义。
如果用户B拥有存储过程,则用户B可以授予用户A运行存储过程的权限
GRANT EXECUTE ON b.procedure_name TO a
然后,用户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;
答案 1 :(得分:6)
你不能做我认为你要做的事。
您可以在程序上授予的唯一权限是EXECUTE和DEBUG。
如果要允许用户B在用户A架构中创建过程,则用户B必须具有CREATE ANY PROCEDURE权限。更改任何过程和DROP ANY PROCEDURE是更改或删除用户B的用户A过程所需的其他适用权限。所有权限都是广泛的权限,因为它不会将用户B限制为任何特定模式。如果授予这些权限,用户B应该高度信任。
编辑:
正如Justin所提到的,为B拥有的程序赋予A执行权的方式:
GRANT EXECUTE ON b.procedure_name TO a;
答案 2 :(得分:1)
Oracle中的包和存储过程默认使用包/过程OWNER的权限执行,而不是当前登录的用户。
因此,如果您调用创建用户的程序包,例如程序包所有者,而不是需要create user privilege的调用用户。调用者只需要对包具有执行权限。
如果您希望使用调用用户的权限运行包,那么在创建包时需要指定AUTHID CURRENT_USER
Oracle文档“Invoker Rights vs Definer Rights”包含更多信息http://docs.oracle.com/cd/A97630_01/appdev.920/a96624/08_subs.htm#18575
希望这有帮助。
答案 3 :(得分:1)
在您的DBA帐户中,授予USERB使用授权grant create any procedure to USERB
程序将是
CREATE OR REPLACE PROCEDURE USERB.USERB_PROCEDURE
--Must add the line below
AUTHID CURRENT_USER AS
BEGIN
--DO SOMETHING HERE
END
END
GRANT EXECUTE ON USERB.USERB_PROCEDURE TO USERA
我知道这是一个非常古老的问题,但我希望我可以把它搞砸一下。
答案 4 :(得分:0)
SQL> grant create any procedure to testdb;
当我们想给“testdb”用户提供创建权限时,这是一个命令。