我试图从另一个包B(在用户U2中定义)调用过程(用户U1的包A中定义)的过程中插入版本化视图(view1-在表table1上定义)。权限不足,就会出错。
这是在Oracle 12c环境中。 table1和view1由用户U1拥有。通过用户U1拥有的程序包A中的过程将一个插入到view1中。程序包B(在U2中)调用此过程进行插入。 1)在U2中为U1.view1创建了一个同义词(在all_synonyms中选中) 2)有一个角色(R1),它具有对view1的插入特权(在ROLE_TAB_PRIVS中选中) 3)角色R1已分配给用户U2(已在DBA_ROLE_PRIVS中选中) 4)角色R1是默认角色 5)包B是定义者权限,包A是调用者权限 5)所有内容均在同一版本中检查
我希望将角色分配给用户U2,从而将插入插入到view1中。但是它不会发生,它会因“权限不足”而出错。 但是,当我明确向用户U2授予此view1中的插入内容时,它就可以工作。这是否意味着仅在程序包A具有调用者权限的情况下,仅通过角色进行访问是不够的?
答案 0 :(得分:2)
“这是否意味着仅在程序包A具有调用者权限的情况下,通过角色的访问是不够的”
比那简单。我们不能使用通过角色授予的特权来构建PL / SQL包,视图或触发器。这就是Oracle安全模型的工作方式。构建此类对象所需的所有特权必须直接授予用户。
另一个陷阱是,如果我们使用另一个架构中的对象的特权来构建视图(或其他方式),并且希望将视图的访问权限授予其他人,则必须使用GRANT OPTION授予我们收到的特权。