2023年11月27日发(作者:)

我在此通过一个具体的实验来给大家展示一种常见的导致“ORA-00980”错误发生的情况,然

后给出一些其他可能导致这个错误发生的原因,最后给出一个可以自动化获得删除所有无效

同名的SQL脚本。

一、先来模拟一下这个“ORA-00980: synonym translation is no longer valid”错误。

1.secooler用户中创建一张表t

secooler@ora10g> create table t (x number);

Table created.

secooler@ora10g> insert into t values (1);

1 row created.

secooler@ora10g> commit;

Commit complete.

2.切换到sec用户,创建同名syn_t引用secooler用户下的t

secooler@ora10g> conn sec/sec

Connected.

sec@ora10g> create synonym syn_t for secooler.t;

Synonym created.

sec@ora10g> select * from syn_t;

X

----------

1

3.回到secooler用户中将表t删除掉

sec@ora10g> conn secooler/secooler

Connected.

secooler@ora10g> drop table t purge;

Table dropped.

4.此时,我们再次使用同名syn_t查看表t时就会见到这个“ORA-00980”错误了

secooler@ora10g> conn sec/sec

Connected.

sec@ora10g> select * From syn_t;

select * From syn_t

*

ERROR at line 1:

ORA-00980: synonym translation is no longer valid

二、导致“ORA-00980”错误的原因小结

1.删除了数据库对象,但是忘记删除同名;

2.删除一个用户,但是忘记删除与此用户中相关的同名;

3.创建同名时,同名对应的数据库对象已经被删除掉了(这种情况很有意思)

针对第三点,进一步演示一下,前面我们已经删除了secooler用户下t表的情况。此时我们

尝试使用secooler用户下被删除的t表再创建两个同名,有意思的是虽然表已经不存在了,

但同名还是可以创建成功的。需要清醒的认识到此时被创建出来的同名是无效的,从后面的

脚本执行结果中可以更清晰的得出这个结论。

sec@ora10g> create synonym syn_public_t for secooler.t;

Synonym created.

sec@ora10g> create synonym syn_tt for secooler.t;

Synonym created.

三、隆重推出自动化生成删除无效同名的脚本

1.脚本如下

select 'drop '

11 from dba_objects o

12 where _owner =

13 and _name = _name)

14 /

Dropping invalid synonyms:

------------------------------------------------------------------------

drop synonym _TT;

drop synonym _PUBLIC_T;

drop synonym _T;

3.使用脚本生成的SQL脚本即可轻松完成无效同名的清理任务。

sys@ora10g> drop synonym _TT;