笔者开发的项目中,广泛使用公有同义词技术。通过公有同义词,消除不同数据源对象之间访问的差异,做到数据逻辑和物理上的分布。

突然想到一个问题:在一个schema下,如果存在自身对象、私有同义词和公有同义词相同,那么在访问的时候,Oracle会如何选择呢?

一个简单的实验,可以告诉我们答案。

构建实验环境

思路是在一个用户下建立三个数据表test、test1、test2。为test1创建私有同义词private synonym,名称为test。为test2创建公有同义词public synonym,名称为test。

SQL> conn scott/tiger@orcl;

Connected to Oracle Database 10g Enterprise Edition Release 10.2.0.1.0

Connected as scott

//test建立

SQL> create table test

2  ( dest varchar2(20));

Table created

SQL> insert into test values ('I''m test table !');

1 row inserted

SQL> commit;

Commit complete

//test2建立

SQL> create table test2 (dest varchar2(20));

Table created

SQL> insert into test2 values ('I''m test2 table !');

1 row inserted

SQL> commit;

Commit complete

//test3建立

SQL> create table test3 (dest varchar2(20));

Table created

SQL> insert into test3 values ('I''m test3 table !');

1 row inserted

SQL> commit;

Commit complete

建立私有和公有同义词。

SQL> create synonym test for scott.test2;

create synonym test for scott.test2

ORA-00955: 名称已由现有对象使用 //报错,作为scott用户私有对象,看来不允许是同名出现!!!

//公有同义词就可以了!

SQL> create public synonym test for scott.test2;

Synonym created

从这里,我们已经可以获得一个知识。Oracle是不允许一个owner下面存在相同名称数据表,但是公共同义词同名是允许的。那么,在自身对象和公共同义词上,Oracle如何选取呢?

优先级选择实验A

//发出查询语句

SQL> select * from test;

DEST

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

I'm test table !         //访问的是scott自身下面的数据表test

SQL> select * from public.test;  //公共同义词基本不能访问到。

select * from public.test

ORA-00903: 表名无效

//如果切换了用户,我们实验一下。

SQL> conn sys/Conan2002@orcl as sysdba;

Connected to Oracle Database 10g Enterprise Edition Release 10.2.0.1.0

Connected as SYS

SQL> select * from test;  //公共同义词起效果。

DEST

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

I'm test2 table !

结论:在schema里,当面临着自身私有对象和公共同义词对象的时候,Oracle会优先选择私有对象作为目标。

如果我们删除了私有对象呢?继续实验。

SQL> drop table test;

Table dropped  //删除了对象!

SQL> select * from test;

DEST

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

I'm test2 table !   //删除了对象,公共同义词起效果了。

结论:当存在同名对象的时候,只有在私有对象被去除之后,才可能有访问到公共同义词的机会。

继续思考,那么私有同义词和公共同义词之间同名发生时,Oracle做什么样的选择呢?

优先级选择实验B

数据表test已经被删除,设置test3表为scott用户的私有同义词。

SQL> create synonym test for scott.test3; //创建私有同义词

Synonym created

//优先选择私有同义词对象。

SQL> select * from test;

DEST

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

I'm test3 table !

结论显而易见:在有私有同义词和公有同义词的相同的情况下,Oracle优先选择私有同义词对象。当然,如果删除了私有同义词,公有同义词也就开始起效果了。

SQL> drop synonym test;

Synonym dropped

SQL> select * from test;

DEST

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

I'm test2 table !

一个简单的问题,告诉我们Oracle一个选择的原则:在选择对象的时候,范围是从小而大,可能范围越小,Oracle认为Schema的可控能力就越强吧。

来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/17203031/viewspace-687732/,如需转载,请注明出处,否则将追究法律责任。

转载于:http://blog.itpub.net/17203031/viewspace-687732/

对象、同义词和公有同义词顺序选取相关推荐

  1. Oracle 原理: 公有同义词 和 私有同义词

    同义词是现有对象的一个别名,和 C++ 里面的typedef关键字很像.同义词都能简化SQL语句,隐藏对象的名称和所有者,也可以提供对对象的公共访问. 在Oracle中,同义词分为公有同义词和私有同义 ...

  2. oracle 查询公有同义词,Oracle序列(sequence),OracleRUNNUM和Oracle同义词(synonyms)

    一团网资讯 一团资讯 > oracle > Oracle序列(sequence),OracleRUNNUM和Oracle同义词(synonyms)... Oracle序列(sequence ...

  3. mysql实现oracle的同义词_Oracle的同义词(synonyms)详解

    知识扩展:数据库对象 表.视图.序列.过程.函数.程序包,甚至其它同义词都可以创建同义词. 1.同义词:私有同义词.公有同义词. 私有同义词只能被当前模式的用户访问.私有同义词名称不可与当前模式的对象 ...

  4. oracle公共同义词查找,[Oracle]同义词(synonym)

    (一)同义词的概念 同义词是数据库中表.视图.索引或其他模式对象的别名,与视图相似,同义词不占用实际的存储空间,在数据字典中只存同义词的定义. 在开发数据库时,应尽量避免直接引用表.视图或其他数据库对 ...

  5. oracle 同义词名称,ORACLE同义词总结

    同义词概念 Oracle的同义词(synonyms)从字面上理解就是别名的意思,和视图的功能类似,就是一种映射关系.它可以节省大量的数据库空间,对不同用户的操作同一张表没有多少差别;它扩展了数据库的使 ...

  6. oracle只读权限 同义词,权限的同义词,欣赏和权限的近义词是什么

    欣赏和权限的近义词是什么 欣赏的近义词--玩赏.观赏.赏识.鉴赏 权限的近义词--范围,.权势.权位.权责 如何给同义词授权 如果在bai用户agmtadmin下创建了du一个表TC_EP_SPLIT ...

  7. oracle中private同义词和public同义词

    项目中遇到,遂从网上搜索了下,觉得如下解释较为通俗易懂: 假设oracle有以下两个用户: admin , visitor 我们在admin下建立了 testtable 这个表,并且对visitor用 ...

  8. 有 n 个学生站成一排,每个学生有一个能力值,牛牛想从这 n 个学生中按照顺序选取 k 名学生,要求相邻两个学生的位置编号的差不超过 d,使得这 k 个学生的能力值的乘积最大,你能返回最大的乘积吗?

    题目描述 有 n 个学生站成一排,每个学生有一个能力值,牛牛想从这 n 个学生中按照顺序选取 k 名学生,要求相邻两个学生的位置编号的差不超过 d,使得这 k 个学生的能力值的乘积最大,你能返回最大的 ...

  9. 为什么 JS 对象内部属性遍历的顺序乱了

    问题重现 需求是要获取一个车型列表,并且输出到页面上按年份排序,故而接口提供的对象简化如下 let obj = { '2018': {modelCode: "204313",mod ...

最新文章

  1. 儿童python编程入门-天津少儿编程Python入门
  2. 互联网分布式架构--演进过程
  3. iis应用程序池不能启动
  4. 佳能hdr_相机缺货潮将至?索尼、佳能、尼康都可能受波及?
  5. mysql数据库的系统操作基本操作
  6. oracle 事务测试
  7. python中面向对象空间时间_python基础学习Day15 面向对象、类名称空间、对象名称空间 (2)...
  8. java gc 可达性_JAVA--GC 垃圾回收机制----可达性分析算法
  9. android studio导入android studio工程
  10. iTextSharp 显示中文字体
  11. <EDEM 基础案例 01>SAG Mill
  12. 【Python爬虫实战】 图片爬虫-淘宝图片爬虫--千图网图片爬虫
  13. ASCLL UTF-8 GBK URL编码
  14. 【SEU程序设计课笔记】 Mooc - Chapter 6 - (EX) - 泰勒展开求sin(x)/计算PI的近似值
  15. python中的sep函数_Python中sep是函数吗?该怎么使用?_后端开发
  16. 【电子学会】2021年12月图形化四级 -- 棕熊大战
  17. XCOM V2.6串口助手
  18. onkeyup 事件
  19. ★为什么不要和“穷人”做朋友?
  20. 美可汗学院因用户基数过小决定移除其在Windows上的软件

热门文章

  1. list对象中 根据某个属性 查询最大最小对象
  2. 扶持中小企业就是扶持社会
  3. 【eMMC】简介与协议浅析
  4. C语言中的‘\0’、0、‘0’和NULL辨析
  5. 护卫神php套件 xp,护卫神PHP套件FastCGI版PHP v5.4
  6. php sql datediff,PHP_模拟SQLSERVER的两个函数:dateadd(),datediff(),?php//文件名:date.inc.php3//在 - phpStudy...
  7. java读取钱龙股票软件下载的日线数据核心代码
  8. 交叉熵、相对熵(KL散度)、JS散度和Wasserstein距离(推土机距离)
  9. java-net-php-python-springboot药膳食疗系统计算机毕业设计程序
  10. 仿QQ个人信息详情界面中背景图的下拉扩展放大功能