如何调用属于另一个用户的包

How to call a package which is belongs to a another user

我在架构中有一个包'PKG_PARTITION_MAINTENANCE:'SAB_OWN' 我向如下用户授予了执行权限:

GRANT EXECUTE ON  PKG_PARTITION_MAINTENANCE TO SAB_READ_USER;

但是当用户尝试调用包时出现如下错误:

EXECUTE PKG_PARTITION_MAINTENANCE.ADD_TABLE_PARTITIONS('tbl_name');

错误:

[Error] Execution (3: 7): ORA-06550: line 1, column 7:
PLS-00201: identifier 'PKG_PARTITION_MAINTENANCE.ADD_TABLE_PARTITIONS' must be declared
ORA-06550: line 1, column 7:
PL/SQL: Statement ignored

我遗漏了什么,为什么用户 SAB_READ_USER 无法执行它?此包 运行 在 SAB_OWN 架构中很好。

如果对象不在您登录的模式中,您必须告诉 Oracle 该对象属于哪个模式:

EXECUTE SAB_OWN.PKG_PARTITION_MAINTENANCE.ADD_TABLE_PARTITIONS('tbl_name');

您也可以创建同义词:

create synonym PKG_PARTITION_MAINTENANCE for SAB_OWN.PKG_PARTITION_MAINTENANCE;

它就像一个指针,告诉 Oracle 去哪里寻找被调用的对象。

或者,您可以更改您的会话,使您 "looking" 所在的架构与您登录的架构不同:

alter session set current_schema = SAB_OWN;

最后两个选项应该允许您 运行 包而无需明确说明架构名称,但就个人而言,我不会推荐它们 - 我会明确说明架构名称,除非有这是行不通的好理由!