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

时间:2016-06-13 21:47:13

标签: oracle stored-procedures

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

.read()

它成功运行。

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

EXECUTE IMMEDIATE 'grant some_role to rjones';

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

  

ORA-01932:未授予角色'some_role'

的ADMIN选项

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

1 个答案:

答案 0 :(得分:2)

默认情况下,Oracle中的过程是使用 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

修改

我还会添加以下文章的链接,我觉得这个文章更容易理解:Invoker Rights Part 1