我想从过程中向用户授予角色。例如,我以jsmith身份登录,从SQL窗口我可以去:
.read()
它成功运行。
但是如果我创建这样的程序:
EXECUTE IMMEDIATE 'grant some_role to rjones';
当我运行该程序时,我收到以下错误:
ORA-01932:未授予角色'some_role'
的ADMIN选项
似乎我需要向我的程序授予与用户jsmith相同的角色授予能力,但我不知道该怎么做。另外,我创建了jsmith的过程,因此对过程的执行权限应该不是问题。
答案 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。