同名的同义词和视图解惑
昨天的文章《v$和v_$的一些玄机》,有朋友提出了一些异议,如下相同名称的两个对象v$bisal,Oracle是怎么辨认的?或者说我们的访问请求,Oracle是怎么知道调用的是谁?这里确实存在一些模糊的地方,梳理一下。
文章提到了,
"(1) 假设x$bisal是从dba_tables复制过来的,
create table x$bisal as select * from dba_tables;
(2) 创建视图v$bisal,他的基表是x$bisal,
create view v$bisal as select * from x$bisal;
(3) 创建视图v_$bisal,他是基于v$bisal视图创建的,
create view v_$bisal as select * from v$bisal;
(4) 创建公共同义词v$bisal,他表示的是v_$bisal视图,
create public synonym v$bisal for v_$bisal;"
准确地说,以上操作的目的,通过v_$视图将v$视图和普通用户隔离,这种机制适合系统动态性能视图的场景,不是普通用户自定义的视图场景,为什么这么说?
针对系统动态性能视图,数据库启动时,Oracle动态创建了x$表,在此基础之上,创建gv$和v$视图,Oracle创建了gv_$和v_$视图,然后创建了gv$和v$的公共同义词,而真正的v$视图访问的限制是通过软件机制实现的,不是数据库权限控制的。因此,用户访问的v$对象,不是视图,而是指向v_$视图的同义词,而v_$视图才是基于真正的v$视图(基于x$创建的)创建的。这才能达到通过v_$视图将v$视图和普通用户隔离。
P.S.
gv$是Global v$,除了一些例外,每个v$视图都有个对应的gv$视图,他是为了满足RAC环境的需要,gv$返回所有实例的信息,每个v$视图是基于gv$视图,只是增加了inst_id列作为where条件,限定在当前实例的信息,例如v$session基于gv$session,增加了where inst_id=userenv('Instance'),
gv$session定义(未显示完整),
针对普通用户自定义的视图,我们稍微改造下最开始的SQL,
1. x$bisal表包含id和a字段。
1. v$bisal视图是基于x$bisal表,包含id和a字段。
2. v_$bisal视图是基于v$bisal视图,但是只含max(id)字段。
3. v$bisal的公共同义词是基于v_$bisal视图,只含max(id)字段。
SQL> create table x$bisal (id number, a varchar2(1));
Table created.SQL> create view v$bisal as select * from x$bisal;
View created.SQL> create view v_$bisal as select max(id) x from v$bisal;
View created.SQL> create public synonym v$bisal for v_$bisal;
Synonym created.SQL> select object_name, object_type from dba_objects where object_name in ('V$BISAL','X$BISAL','V_$BISAL');
OBJECT_NAME OBJECT_TYPE
--------------- -------------------
V$BISAL SYNONYM
V$BISAL VIEW
V_$BISAL VIEW
X$BISAL TABLE
v$bisal这个名称,既是视图的名称,又是公共同义词的名称。问题来了,执行检索v$bisal,访问的是视图还是公共同义词?
公共同义词v$bisal指向的是含一个字段的视图v_$bisal,视图v$bisal是含两个字段的。我们执行的“desc v$bisal”,返回两个字段,所以可确认他访问的是视图v$bisal,说明在进行数据访问的时候,先访问的是视图,其优先级要高于公共同义词,
SQL> desc v$bisalName Null? Type------------- -------- ----------------------------ID NUMBERA VARCHAR2(1)
如下是我们创建的顺序,
x$bisal(表) -> v$bisal(视图) -> v_$bisal(视图) -> v$bisal(同义词)
但实际执行v$bisal得到的是v$bisal(视图),不是v$bisal(同义词),因此,针对普通用户自定义的视图,不能通过v_$视图将v$视图和普通用户隔离。
P.S.
eygle的书中介绍了Oracle对于对象名的解析顺序,
(1) Oracle首先查看在发出命令的用户模式中是否存在表或视图。
(2) 如果表或视图不存在,Oracle会看私有同义词是否存在。
(3) 如果私有同义词存在,将使用这个同义词所引用的对象。
(4) 如果私有同义词不存在,看同名的公共同义词是否存在。
(5) 如果公共同义词存在,将使用这个同义词所引用的对象。
(6) 如果公共同义词不存在,返回信息"ORA-00942 table or view does not exit"。
朋友提出第二个问题,为什么能创建出两个相同名称的对象v$bisal?
我们知道,同义词分为public和private,public同义词属于PUBLIC组,每个用户都可以访问,private同义词属于对象所有者,只有其显式授权后其他用户才可访问。
在创建同义词v$bisal时指定了public关键字,视图v$bisal是当前用户,因此这两个对象其实还是属于不同空间的,不存在同名问题,
SQL> create view v$bisal as select * from x$bisal;
View created.SQL> create public synonym v$bisal for v_$bisal;
Synonym created.
再测试几个例子,不能创建两个同名的公共同义词,
SQL> create public synonym a for dba_tables;
Synonym created.SQL> create public synonym a for dba_tables;
create public synonym a for dba_tables*
ERROR at line 1:
ORA-00955: name is already used by an existing object
不能创建两个同名的私有同义词,
SQL> create synonym a for dba_tables;
Synonym created.SQL> create synonym a for user_tables;
create synonym a for user_tables*
ERROR at line 1:
ORA-00955: name is already used by an existing object
但是可创建同名的公共同义词和私有同义词,
SQL> create public synonym a for dba_tables;
Synonym created.SQL> create synonym a for dba_tables;
Synonym created.SQL> select object_name, object_type from dba_objects where object_name in ('A');
OBJECT_NAME OBJECT_TYPE
--------------- -----------------------
A SYNONYM
A SYNONYM
但是当前用户下,不能再创建同名对象,无论是视图、序列、还是表,
SQL> create table a(id number);
create table a(id number)*
ERROR at line 1:
ORA-00955: name is already used by an existing objectSQL> create sequence a;
create sequence a*
ERROR at line 1:
ORA-00955: name is already used by an existing objectSQL> create view a as select * from user_tables;
create view a as select * from user_tables*
ERROR at line 1:
ORA-00955: name is already used by an existing object
近期的热文:
《公众号700篇文章分类和索引》
同名的同义词和视图解惑相关推荐
- Oracle 快速入门 同义词序列视图索引
目录 一.数据库对象 二.同义词synonym 三.序列 四.视图 五.索引 六.综合代码 1.同义词部分: 2.序列: 3.视图和索引 一.数据库对象 1.数据库对象 2.同义词 ...
- oracle视图的同义词,oracle 视图、同义词、序列
/********************************************************** 视图 ************************************* ...
- Oracle Class4. 数据库对象(同义词,序列,视图,索引,簇)
------------------------2013-5-9------------------------ 索引的建立情况:经常用于查询,排序和分组的列(即经常在where,order或grou ...
- oracle 之索引,同义词 ,关键词,视图 ,存储过程,函数,触发器
--创建索引 关键词 index create[unique] index index_name on table_name(column_name [,column_name-]) [tablesp ...
- linuxoracle静默安装应答文件修改_Oracle 19c的examples静默安装
Oracle 11g的examples示例schema安装,在这篇文章<Oracle 11g的examples静默安装>介绍过了,Oracle 19c的examples示例schema安装 ...
- sqlplus登录缓慢的解决
sqlplus登录Oracle数据库出现缓慢或者错误的原因可能很多,例如曾经碰到的,<登录缓慢的诡异问题>.<sqlplus登录报ORA-06502错误的问题排查和解决>,最近 ...
- 公众号1200篇文章分类和索引
承蒙读者朋友们的关照,截止到今天,杂货铺的文章已经积累到了1200篇,其中有超过2/3的文章都是原创的,即使是转载,我给的底线是一定要加些自己的见解,因为至少得让读者了解到这篇文章的价值,而不仅仅是文 ...
- 1元股权转让的一点思考
这两天在北京球迷圈最热炒的一个话题,就算是中信转让股权的事情,说起这个事情的由来,还要追溯到2020年12月中国足协职业联赛专项治理工作会当中的一个议题,更新了俱乐部名称非企业化变更的通知. 其中规定 ...
- Oracle的greatest和least函数
碰巧看到一篇文章提到了Oracle的greatest函数,相对应的有个least,以为这俩是个新的函数,但是看了下官方文档,其实在11g的<SQL Language Reference>, ...
- 9、oracle数据库下的视图和同义词
ORACLE下的视图和同义词 1.视图 视图就是一个查询的结果,可能包含一张表或者多张表的信息,创建视图其目的在于,便于查看表中的信息.视图只是在逻辑上存在. 1.1创建/修改视图 创建视图一定要有C ...
最新文章
- QQ互联OAuth2.0 .NET SDK 发布以及网站QQ登陆示例代码(转)
- CCF201312-5 I’m stuck!(100分)
- 策划文档html,html代码整理.doc
- 真实HDFS集群启动后master的jps没有DataNode
- gradient descent,计算图,backpropagation
- spring-bean(xml方式管理)
- Socks5协议中文文档
- Oracle 如何定义自动增量autocreament的主键ID?
- Node - 从0基础到实战企业官网
- Swing Copters摇摆直升机高分攻略,游戏攻略
- 1072: 青蛙爬井
- Objective C的关键字oneway
- DirectX11 屏幕截图
- 2020-12-22 ACM集训一(二维数组与结构体)
- CLion配置STM32开发环境(JLink GDB Server)
- 阿里云南京云栖大会举行 给制造业升级下猛药
- Flutter自定义控件之饼状图、大转盘
- 02.07Center Alignment居中对齐
- 511遇见易语言乐玩插件FindStr找字和FindStrFast快速找字
- 好用又强大的JavaScript 框架介绍
热门文章
- android高帧率模式,《和平精英》等五款游戏已经适配小米10系列高帧率模式
- 智慧工厂如何实现工业设备的状态采集
- 电脑怎么设置微信定位服务器,电脑版微信,一个很简单的客户端,许多功能不支持...
- 最常见绩效考核方法有哪些?5种有效方法介绍
- python累乘怎么写_怎么编写Python关于累乘的程序?
- ubuntu清理cache
- matlab双峰滤波,MATLAB中的单峰或双峰分布
- CDH安装过程中出现:主机 cdh04 上的内存被调拨过度。总内存分配额是 4.0 艾字节 个字节,但是 RAM 只有 62.8 吉字节 个字节(其中的 12.6 吉字节 个字节是保留给系统使用的)。
- 内存模型与C++ 内存序
- BAT大牛亲授基于ElasticSearch的搜房网实战(第三章环境搭建)