0

不幸的是,我不能提供任何代码,但我会尽力解释,并会在必要时提供额外的信息。

在这个场景中有 3 种不同的模式在起作用:X_SCHM、APPS 和 HR

APPS 有一个名为 X_PKG 的包来运行资源的某些功能,并且 X_PKG 还调用 HR 模式拥有的包 HR_EMPLOYEE_API 中的过程。APPS 将 X_PKG 的执行权限授予 X_SCHM,X_SCHM 可以成功调用 X_PKG 内部的过程。

但是,我想尽可能远离 APPS 并进入 X_SCHM,因此 X_PKG 的包体被复制到 X_SCHM 中的新 X2_PKG。X2_PKG 仍然需要调用 HR_EMPLOYEE_API 中的过程,因此授予 X_SCHM 以执行该包。

现在,当 X_SCHM 尝试调用与 APPS 拥有的 X_PKG 相同的所有帐户的 X2_PKG 时,它成功进入 HR 拥有的 HR_EMPLOYEE_API,然后开始在其中运行“表或视图不存在”错误,APPS 或X_SCHM 运行 APPS 拥有的 X_PKG 不会遇到。

我不确定这是否是需要额外拨款的问题。我认为由于 X_SCHM 对 HR_EMPLOYEE_API 具有执行权限,因此它从 HR_EMPLOYEE_API 调用的程序将能够访问 HR 拥有的表,除非我缺少关于需要自己授予的权限的包的信息,这些包需要与拥有它们的模式分开。

请让我知道我可以在哪里更清楚或提供更多信息以解决此问题。

4

1 回答 1

2

包 HR_EMPLOYEE_API 定义为 AUTHID CURRENT_USER。这意味着包内的所有代码都以调用它的用户身份执行。所以基本上你有3个选择:

1) 您按照@Sudipta Mondal 的建议将包留在 APPS 用户中。听起来是最安全的选择。

2) 如果 X2_PKG 被定义为 AUTHID DEFINER,您可以尝试将所有直接权限从 APPS 复制到 X_SCHM 并希望最好。但这真的不是那么好,因为我很确定APPS有很多权利。幸运的是,您不必为通过角色获得的权限而烦恼,因为它们不适用于包。尝试类似的东西

select 'GRANT '||PRIVILEGE||' ON '||OWNER||'.'||TABLE_NAME||' TO X_SCHM;' FROM DBA_TAB_PRIVS WHERE GRANTEE = 'APPS';

3) 尝试通过反复试验或从 DBA_DEPENDENCIES 中获取它们(如果它们被引用)来确定要添加哪些权限:

select REFERENCED_OWNER, REFERENCED_TYPE, REFERENCED_NAME from dba_dependencies where NAME = 'HR_EMPLOYEE_API';

我个人同意 Sudipta Mondal,如果不是强制性的,您可能应该重新考虑移动它。

于 2017-07-27T00:31:28.310 回答