Table 从包 A 过程调用时,插入在包 B 过程中不起作用

Table insert not working in package B procedure when called from Package A procedure

当从另一个包调用时,我正在尝试插入过程(在用户 U1 的包 A 中定义)中的编辑视图(view1 - 在 table table1 上定义) B(在用户 U2 中定义)。权限不足会出错。

这是在 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) 一切都检查在同一个版本

我希望插入发生在视图 1 中,因为该角色已分配给用户 U2。但它并没有发生,它出错了 "insufficient privileges"。 但是当我明确地向用户 U2 授予插入此 view1 的权限时,它就可以工作了。这是否意味着如果包 A 具有调用者权限,仅通过角色访问是不够的?

"Does this mean that access through roles only is not sufficient if the package A is having invoker rights"

比那更简单。我们不能使用通过角色授予的权限构建 PL/SQL 包、视图或触发器。这正是 Oracle 安全模型的工作方式。构建此类对象所需的所有权限必须直接授予用户。

另一个陷阱是,如果我们使用另一个架构中的对象的权限构建视图(或其他),并且我们想授予其他人对我们视图的访问权限,那么我们收到的权限必须授予 WITH GRANT OPTION。