【问题标题】:In Oracle grant role to a user from within a procedure在 Oracle 中,从过程中向用户授予角色
【发布时间】:2016-06-13 21:47:13
【问题描述】:

我想在过程中向用户授予角色。例如,我以 jsmith 身份登录,我可以从一个 SQL 窗口访问:

EXECUTE IMMEDIATE 'grant some_role to rjones';

它运行成功。

但如果我创建这样的程序:

CREATE OR REPLACE PROCEDURE MY_ROLE_GRANTING_PROCEDURE

IS

BEGIN

EXECUTE IMMEDIATE 'grant some_role to rjones';

END;

当我运行该程序时,我收到以下错误:

ORA-01932:没有为角色“some_role”授予 ADMIN 选项

似乎我需要为我的程序授予与用户 jsmith 相同的角色授予能力,但我不知道该怎么做。另外,我以 jsmith 的身份创建了该过程,因此该过程的执行权限应该不是问题。

【问题讨论】:

    标签: oracle stored-procedures


    【解决方案1】:

    默认情况下,Oracle 中的过程是使用定义者的权限创建的。我不记得所有细节,但是在定义者权限模式下,过程以过程所有者的权限运行,可能不是执行该过程的同一用户,甚至不一定与执行该过程的用户相同创建/编译程序。另外,我认为它忽略了程序所有者的角色。它只能访问直接授予过程所有者的权限。

    在您的情况下,我认为您想使用 invoker' 权限 编译该过程。在这种模式下,程序使用了执行用户的权限,我相信角色也是考虑在内的。

    要使用这种模式,只需要在过程的声明中添加authid current_user即可:

    CREATE OR REPLACE PROCEDURE MY_ROLE_GRANTING_PROCEDURE authid current_user
    
    IS
    
    BEGIN
    
    EXECUTE IMMEDIATE 'grant some_role to rjones';
    
    END;
    

    要更好、更完整地解释您可以执行过程的 2 种模式,请查看此处:Managing Security for Definer's Rights and Invoker's Rights

    编辑

    我还将添加指向以下文章的链接,我觉得它更易于阅读:Invoker Rights Part 1

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-11-19
      • 2014-12-09
      • 2020-11-30
      • 2020-04-27
      • 2016-11-19
      • 2017-06-14
      • 2019-04-13
      • 1970-01-01
      相关资源
      最近更新 更多