我想从一个过程中向用户授予一个角色 . 例如,我以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 回答
默认情况下,Oracle中的过程是使用定义者权限创建的 . 我没有't remember off hand all the details, but in the definer'权限模式,该过程以过程所有者的权限运行,过程所有者可能与执行过程的用户不同,甚至不一定与创建/编译过程的用户相同 . 另外,我认为它忽略了程序所有者的角色 . 它只能访问直接授予过程所有者的权限 .
在您的情况下,我认为您想使用调用者的权利编译该过程 . 在此模式下,该过程使用执行用户的权限,我相信也会考虑角色 .
要使用此模式,您只需要将
authid current_user
添加到过程的声明中:有关可以执行过程的2种模式的更好和更完整的说明,请查看此处:Managing Security for Definer's Rights and Invoker's Rights .
EDIT
我还将添加以下文章的链接,我发现它更容易阅读:Invoker Rights Part 1 .