对象、同义词和公有同义词顺序选取
笔者开发的项目中,广泛使用公有同义词技术。通过公有同义词,消除不同数据源对象之间访问的差异,做到数据逻辑和物理上的分布。
突然想到一个问题:在一个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/
对象、同义词和公有同义词顺序选取相关推荐
- Oracle 原理: 公有同义词 和 私有同义词
同义词是现有对象的一个别名,和 C++ 里面的typedef关键字很像.同义词都能简化SQL语句,隐藏对象的名称和所有者,也可以提供对对象的公共访问. 在Oracle中,同义词分为公有同义词和私有同义 ...
- oracle 查询公有同义词,Oracle序列(sequence),OracleRUNNUM和Oracle同义词(synonyms)
一团网资讯 一团资讯 > oracle > Oracle序列(sequence),OracleRUNNUM和Oracle同义词(synonyms)... Oracle序列(sequence ...
- mysql实现oracle的同义词_Oracle的同义词(synonyms)详解
知识扩展:数据库对象 表.视图.序列.过程.函数.程序包,甚至其它同义词都可以创建同义词. 1.同义词:私有同义词.公有同义词. 私有同义词只能被当前模式的用户访问.私有同义词名称不可与当前模式的对象 ...
- oracle公共同义词查找,[Oracle]同义词(synonym)
(一)同义词的概念 同义词是数据库中表.视图.索引或其他模式对象的别名,与视图相似,同义词不占用实际的存储空间,在数据字典中只存同义词的定义. 在开发数据库时,应尽量避免直接引用表.视图或其他数据库对 ...
- oracle 同义词名称,ORACLE同义词总结
同义词概念 Oracle的同义词(synonyms)从字面上理解就是别名的意思,和视图的功能类似,就是一种映射关系.它可以节省大量的数据库空间,对不同用户的操作同一张表没有多少差别;它扩展了数据库的使 ...
- oracle只读权限 同义词,权限的同义词,欣赏和权限的近义词是什么
欣赏和权限的近义词是什么 欣赏的近义词--玩赏.观赏.赏识.鉴赏 权限的近义词--范围,.权势.权位.权责 如何给同义词授权 如果在bai用户agmtadmin下创建了du一个表TC_EP_SPLIT ...
- oracle中private同义词和public同义词
项目中遇到,遂从网上搜索了下,觉得如下解释较为通俗易懂: 假设oracle有以下两个用户: admin , visitor 我们在admin下建立了 testtable 这个表,并且对visitor用 ...
- 有 n 个学生站成一排,每个学生有一个能力值,牛牛想从这 n 个学生中按照顺序选取 k 名学生,要求相邻两个学生的位置编号的差不超过 d,使得这 k 个学生的能力值的乘积最大,你能返回最大的乘积吗?
题目描述 有 n 个学生站成一排,每个学生有一个能力值,牛牛想从这 n 个学生中按照顺序选取 k 名学生,要求相邻两个学生的位置编号的差不超过 d,使得这 k 个学生的能力值的乘积最大,你能返回最大的 ...
- 为什么 JS 对象内部属性遍历的顺序乱了
问题重现 需求是要获取一个车型列表,并且输出到页面上按年份排序,故而接口提供的对象简化如下 let obj = { '2018': {modelCode: "204313",mod ...
最新文章
- 儿童python编程入门-天津少儿编程Python入门
- 互联网分布式架构--演进过程
- iis应用程序池不能启动
- 佳能hdr_相机缺货潮将至?索尼、佳能、尼康都可能受波及?
- mysql数据库的系统操作基本操作
- oracle 事务测试
- python中面向对象空间时间_python基础学习Day15 面向对象、类名称空间、对象名称空间 (2)...
- java gc 可达性_JAVA--GC 垃圾回收机制----可达性分析算法
- android studio导入android studio工程
- iTextSharp 显示中文字体
- <EDEM 基础案例 01>SAG Mill
- 【Python爬虫实战】 图片爬虫-淘宝图片爬虫--千图网图片爬虫
- ASCLL UTF-8 GBK URL编码
- 【SEU程序设计课笔记】 Mooc - Chapter 6 - (EX) - 泰勒展开求sin(x)/计算PI的近似值
- python中的sep函数_Python中sep是函数吗?该怎么使用?_后端开发
- 【电子学会】2021年12月图形化四级 -- 棕熊大战
- XCOM V2.6串口助手
- onkeyup 事件
- ★为什么不要和“穷人”做朋友?
- 美可汗学院因用户基数过小决定移除其在Windows上的软件
热门文章
- list对象中 根据某个属性 查询最大最小对象
- 扶持中小企业就是扶持社会
- 【eMMC】简介与协议浅析
- C语言中的‘\0’、0、‘0’和NULL辨析
- 护卫神php套件 xp,护卫神PHP套件FastCGI版PHP v5.4
- php sql datediff,PHP_模拟SQLSERVER的两个函数:dateadd(),datediff(),?php//文件名:date.inc.php3//在 - phpStudy...
- java读取钱龙股票软件下载的日线数据核心代码
- 交叉熵、相对熵(KL散度)、JS散度和Wasserstein距离(推土机距离)
- java-net-php-python-springboot药膳食疗系统计算机毕业设计程序
- 仿QQ个人信息详情界面中背景图的下拉扩展放大功能