我在一个远程的Oracle数据库上有一个同义词,我可以通过数据库链接在SQL中访问它,例如:
insert into my_table select * from my_synonym@my_database_link;
如果我将上述语句放入PLSQL块中,它不会编译,并出现错误消息“ORA-00980:同义词翻译不再有效”。标准解释是同义词指向的表已被删除等,但这并不是问题的原因,因为该语句在SQL中可以工作。
我在一个远程的Oracle数据库上有一个同义词,我可以通过数据库链接在SQL中访问它,例如:
insert into my_table select * from my_synonym@my_database_link;
如果我将上述语句放入PLSQL块中,它不会编译,并出现错误消息“ORA-00980:同义词翻译不再有效”。标准解释是同义词指向的表已被删除等,但这并不是问题的原因,因为该语句在SQL中可以工作。
如果在SQL中可以正常工作但在PL/SQL中无法正常工作,则大多数情况下这是一个权限问题。
任何用户通过角色获得的权限在进入PL/SQL块时都不会生效。因此,底层表上的SELECT
权限很可能是通过角色授予的,因此在PL/SQL块中不是“活动的”。
通常的解决方法是直接将权限授予给用户,而不是通过角色授予。
https://support.oracle.com/rs?type=doc&id=453754.1
解决方法是使用Oracle视图。
CREATE VIEW v_my_synomym as (select * from my_synonym@my_database_link);
然后在您的包或过程中引用该视图,例如:
insert into my_table select * from v_my_synonym;
当表/视图/过程的所有者与 SYNONYM 中提到的所有者不匹配时,我发现了这个问题。
例如:如果 TABLE_BRACH 表的所有者是 ownerA,而在 Synonym 中提到的表所有者是其他人(不是 ownerA)。
解决方案: 1. 删除 SYNONYM 2. 使用正确的所有者名称创建相同名称的 SYNONYM。
CREATE PUBLIC SYNONYM BRANCH FOR ownerA.TABLE_BRACH ;
需要检查远程数据库授权中与 "my_synonym" 相关的权限,必须对连接字符串中使用的用户几乎具有 "select" 权限,还要检查此同义词指向的对象(可能是有人删除了表)。