【问题标题】:Granting Rights on Stored Procedure to another user of Oracle将存储过程的权限授予 Oracle 的另一个用户
【发布时间】:2011-05-17 08:39:15
【问题描述】:

我是一名本科生,在数据库 Oracle 10g 模式 =xe 中向用户 A 授予用户 B 拥有的存储过程的所有权时,我遇到了一些问题。

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

【问题讨论】:

    标签: oracle stored-procedures grant owner rights-management


    【解决方案1】:

    在您的 DBA 帐户上,授予 USERB 使用 grant 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

    我知道这是一个非常古老的问题,但我希望我能稍微解决一下。

    【讨论】:

      【解决方案2】:
      SQL> grant create any procedure to testdb;
      

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

      【讨论】:

        【解决方案3】:

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

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

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

        Oracle 文档“调用者权限与定义者权限”有更多信息http://docs.oracle.com/cd/A97630_01/appdev.920/a96624/08_subs.htm#18575

        希望这会有所帮助。

        【讨论】:

          【解决方案4】:

          你不能做我认为你要求做的事情。

          您可以授予对过程的唯一权限是 EXECUTE 和 DEBUG。

          如果要允许用户 B 在用户 A 模式中创建过程,则用户 B 必须具有 CREATE ANY PROCEDURE 权限。 ALTER ANY PROCEDURE 和 DROP ANY PROCEDURE 是更改或删除用户 B 的用户 A 过程所需的其他适用特权。所有这些都是广泛的特权,因为它不将用户 B 限制为任何特定模式。如果授予这些权限,用户 B 应该受到高度信任。

          编辑:

          正如贾斯汀所说,为 B 拥有的程序赋予 A 执行权的方式:

          GRANT EXECUTE ON b.procedure_name TO a;
          

          【讨论】:

          • +1 一种比 CREATE ANY PROCEDURE 不那么激烈的方法,但也存在陷阱,即为使用用户 B 的应用程序提供用户 A 的密码,允许他们以该用户身份登录。听起来您想授予架构级别的权限,但这些权限在 Oracle 中不可用。
          • 好的先生,请告诉我如何授予用户A执行权限以运行用户B的存储过程。
          【解决方案5】:

          我不确定我理解您所说的“所有权”是什么意思。

          如果用户 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;
          

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2023-04-07
            • 1970-01-01
            • 2013-09-07
            • 2015-06-25
            • 1970-01-01
            相关资源
            最近更新 更多