同义词:
就是别名的意思。与视图类似,是一种映射关系。
是表、索引、视图的对象的别名。
创建:
create public synonym table_name for user.table_name;
好处:节省数据空间,不同用户操作同一种表无差别。能够在不同的数据用户之间实现无缝交互。
简化对象访问 和 提高对象访问安全性。在开发中对统一数据库,多用户操作。如果没有同义词,个人用户要操作其他表时 需要 用户名.Object,来访问。
用同义词就不需要 加用户了。简化sql语句。
为分布式数据库,的远程对象,提供位置,透明性。
分为共用同义词和私有同义词。
若创建的是公有同义词,则其定义存储在dba_synonyms中,查询时需要具有相关权限。
同义词循环链报错:
因为存在同义词,但同义词没有相应的对象(对应的表,等对象 被删了)。
删除数据库对象,但是忘记删除同义词。
删除一个用户,但忘记删除此用户中相关的同名。
创建同名时,同名对应的数据库对象已经被删掉了。
网上有很多解决方法。
1.一般同义词是和表名或者视图名一样的。这样方便使用。
select * from dba_synonyms where table_owner='TEST' and synonym_name<>table_name;
这里table_owner是你的用户 synonym_name是同义词名称 table_name 是表名。先看一下是否有不一样的。
2.select * from dba_synonyms
and
synonym_name in
(select a.synonym_name from dba_synonyms a where a.table_owner='HD40'
minus
select object_name from user_objects)
dba_synonyms是存储 同义词和表名等对象的关联表。
这条语句 查出,存在同义词,但是table_name对应的表或者对象已经被删了。
你会发现查询这些同义词都报同义词循环链错误。
一般就是这个原因。
网上说的查询结果,然后删除,其实就是删除这些数据。
或者你再创建出表等对象。