Oracle 如何调用属于另一个用户的包
我有一个包'PKG_PARTITION_MAINTENANCE in Schema:'SAB_OWN' 我向如下用户授予了执行权限:Oracle 如何调用属于另一个用户的包,oracle,oracle11g,database-administration,database-partitioning,Oracle,Oracle11g,Database Administration,Database Partitioning,我有一个包'PKG_PARTITION_MAINTENANCE in Schema:'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):
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_用户无法执行它?此包在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在哪里查找被调用的对象
或者,您可以更改会话,以便“查看”的模式与您登录的模式不同:
alter session set current_schema = SAB_OWN;
最后两个选项应该允许您在不显式声明模式名称的情况下运行包,尽管就我个人而言,我不建议使用它们-我会显式声明模式名称,除非有很好的理由说明它不起作用