首页 文章

在Oracle中,从过程内向用户授予角色

提问于
浏览
0

我想从一个过程中向用户授予一个角色 . 例如,我以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的过程,因此对过程的执行权限应该不是问题 .

1 回答

  • 2

    默认情况下,Oracle中的过程是使用定义者权限创建的 . 我没有't remember off hand all the details, but in the definer'权限模式,该过程以过程所有者的权限运行,过程所有者可能与执行过程的用户不同,甚至不一定与创建/编译过程的用户相同 . 另外,我认为它忽略了程序所有者的角色 . 它只能访问直接授予过程所有者的权限 .

    在您的情况下,我认为您想使用调用者的权利编译该过程 . 在此模式下,该过程使用执行用户的权限,我相信也会考虑角色 .

    要使用此模式,您只需要将 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 .

    EDIT

    我还将添加以下文章的链接,我发现它更容易阅读:Invoker Rights Part 1 .

相关问题