Invalid Synonyms in 10g

September 19th, 2007 | Categories: Boring | Tags:

10g以前,同义词在dba_objects中的状态始终是VALID(Synonyms never become invalid),不管其所引用的对象是否存在。可以使用这个脚本查找无效的同义词,转贴如下

rem
rem  Exludes SYS and SYSTEM users
rem
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)
/

在10g中,当同义词所引用的对象不存在时,同义词在dba_objects的状态将变为INVALID,测试如下

首先看9i的测试

SQL> create table binzhang_tab as select * from dba_objects;
Table created.
 
SQL> create public synonym binzhang_syn for binzhang_tab;
Synonym created.
 
SQL> SELECT *
        
FROM DBA_DEPENDENCIES
        
WHERE name like 'BINZHANG%' or
              
REFERENCED_NAME like 'BINZHANG%';
 
no rows selected
 
SQL> select status from dba_objects where object_name='BINZHANG_SYN';
STATUS
-----
--
VALID

 
SQL> drop table BINZHANG_TAB;
Table dropped.
 
SQL> select status from dba_objects where object_name='BINZHANG_SYN';
STATUS
-----
--
VALID

从9i的测试中看到,同义词和表之间没有依赖关系(DEPENDENCIES).

而在10g中,则不同。同义词HARD REFERENCE表。对表作DDL操作,将会Invalid同义词。

SQL> SELECT *
        
FROM DBA_DEPENDENCIES
        
WHERE name like 'BINZHANG%' or
              
REFERENCED_NAME like 'BINZHANG%';
              
 
OWNER     NAME            TYPE       REFERENCE REFERENCED_NAME REFERENCED REFER DEPEN
-------
-- --------------- ---------- --------- --------------- ---------- ----- -----
PUBLIC    BINZHANG_SYN    SYNONYM    ORACLE    BINZHANG_TAB    TABLE            HARD
 
 
SQL> select status from dba_objects where object_name='BINZHANG_SYN';
STATUS
-----
--
VALID

 
SQL> alter table binzhang_tab add a number;
Table altered.
 
SQLselect status from dba_objects where object_name='BINZHANG_SYN';
STATUS
-----
--
INVALID

 
SQL> select count(*) from BINZHANG_SYN;
 
COUNT(*)
--------
--
     29012

 
SQL>   select status from dba_objects where object_name='BINZHANG_SYN';
STATUS
-----
--
VALID

 
SQL> drop table binzhang_tab;
Table dropped.
 
SQLselect status from dba_objects where object_name='BINZHANG_SYN';
STATUS
-----
--
INVALID

当在事务频繁的对象上作某些DDL操作的时候,这因为同义词增加的dependency就会增加改动后编译的风险(library cache pin&lock,dead lock等).

Del.icio.us Google书签 Digg Live Bookmark Technorati Furl Yahoo书签 Facebook 百度搜藏 新浪 ViVi 365Key 网摘 天极网摘 和讯网摘 博拉网 POCO 网摘 饭否 QQ 书签 Digbuzz 我挖网 Mister Wong
No comments yet.