SELECT 'drop ' || DECODE (s.owner, 'PUBLIC', 'PUBLIC SYNONYM ', 'SYNONYM ' || s.owner || '.') || s.synonym_name || ';' FROM dba_synonyms s WHERE table_owner NOT IN ('SYSTEM', 'SYS') AND db_link IS NULL AND NOT EXISTS (SELECT 1 FROM dba_objects o WHERE s.table_owner = o.owner AND s.table_name = o.object_name)
SET LONG 20000 set LONGCHUNKSIZE 20000 set PAGESIZE 0 set LINESIZE 1000 set FEEDBACK OFF set VERIFY OFF select 'alter public synonym '||object_name||' compile;' from all_objects where status='INVALID' and object_type='SYNONYM';
A public synonym gets invalidated when the underlying object changes
SQL> select owner, object_type, status from dba_objects where object_name = 'CI_VALIDATE_SYSTEM_MAPPING'; Object Owner Type Status -------- ------------ ---------- PUBLIC SYNONYM INVALID CI PROCEDURE VALID SQL> alter public synonym CI_VALIDATE_SYSTEM_MAPPING compile; Synonym altered. SQL> select owner, object_type, status from dba_objects where object_name = 'CI_VALIDATE_SYSTEM_MAPPING'; Object Owner Type Status -------- ------------ ---------- PUBLIC SYNONYM VALID CI PROCEDURE VALID
select t1.owner owner, t1.synonym_name synonym_name from dba_synonyms t1 where t1.synonym_name in (select SYNONYM_NAME from dba_synonyms where owner in ('ILM_GPP_APP','PUBLIC') and table_owner in ('ILM_GPP') group by SYNONYM_NAME having count(*) > 1) -- and t1.owner = 'PUBLIC' order by 2,1; set term off spool drop_dup_pub_syn select 'drop public synonym '||t1.synonym_name||';'||chr(10) from dba_synonyms t1 where t1.synonym_name in (select SYNONYM_NAME from dba_synonyms where owner in ('ILM_GPP_APP','PUBLIC') and table_owner in ('ILM_GPP') group by SYNONYM_NAME having count(*) > 1) and t1.owner = 'PUBLIC' order by t1.synonym_name; spool off spool restore_drop_dup_pub_syn.lst select 'create public synonym '||t1.synonym_name||' for ilm_gpp.'||table_name||';'||chr(10) from dba_synonyms t1 where t1.synonym_name in (select SYNONYM_NAME from dba_synonyms where owner in ('ILM_GPP_APP','PUBLIC') and table_owner in ('ILM_GPP') group by SYNONYM_NAME having count(*) > 1) and t1.owner = 'PUBLIC' order by t1.synonym_name; spool off set term on
This happens when you have a "dangling" synonym, because it points to itself.
For example:
SQL> create table blah ( a number ); Table created. SQL> create public synonym blah for blah; Synonym created. SQL> drop table blah; Table dropped. SQL> select * from blah; select * from blah * ERROR at line 1: ORA-01775: looping chain of synonyms