昨天的文章《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篇文章分类和索引》

同名的同义词和视图解惑相关推荐

  1. Oracle 快速入门 同义词序列视图索引

    目录 一.数据库对象 二.同义词synonym 三.序列 四.视图 五.索引 六.综合代码 1.同义词部分: 2.序列: 3.视图和索引 一.数据库对象 1.数据库对象         2.同义词   ...

  2. oracle视图的同义词,oracle 视图、同义词、序列

    /********************************************************** 视图 ************************************* ...

  3. Oracle Class4. 数据库对象(同义词,序列,视图,索引,簇)

    ------------------------2013-5-9------------------------ 索引的建立情况:经常用于查询,排序和分组的列(即经常在where,order或grou ...

  4. oracle 之索引,同义词 ,关键词,视图 ,存储过程,函数,触发器

    --创建索引 关键词 index create[unique] index index_name on table_name(column_name [,column_name-]) [tablesp ...

  5. linuxoracle静默安装应答文件修改_Oracle 19c的examples静默安装

    Oracle 11g的examples示例schema安装,在这篇文章<Oracle 11g的examples静默安装>介绍过了,Oracle 19c的examples示例schema安装 ...

  6. sqlplus登录缓慢的解决

    sqlplus登录Oracle数据库出现缓慢或者错误的原因可能很多,例如曾经碰到的,<登录缓慢的诡异问题>.<sqlplus登录报ORA-06502错误的问题排查和解决>,最近 ...

  7. 公众号1200篇文章分类和索引

    承蒙读者朋友们的关照,截止到今天,杂货铺的文章已经积累到了1200篇,其中有超过2/3的文章都是原创的,即使是转载,我给的底线是一定要加些自己的见解,因为至少得让读者了解到这篇文章的价值,而不仅仅是文 ...

  8. 1元股权转让的一点思考

    这两天在北京球迷圈最热炒的一个话题,就算是中信转让股权的事情,说起这个事情的由来,还要追溯到2020年12月中国足协职业联赛专项治理工作会当中的一个议题,更新了俱乐部名称非企业化变更的通知. 其中规定 ...

  9. Oracle的greatest和least函数

    碰巧看到一篇文章提到了Oracle的greatest函数,相对应的有个least,以为这俩是个新的函数,但是看了下官方文档,其实在11g的<SQL Language Reference>, ...

  10. 9、oracle数据库下的视图和同义词

    ORACLE下的视图和同义词 1.视图 视图就是一个查询的结果,可能包含一张表或者多张表的信息,创建视图其目的在于,便于查看表中的信息.视图只是在逻辑上存在. 1.1创建/修改视图 创建视图一定要有C ...

最新文章

  1. QQ互联OAuth2.0 .NET SDK 发布以及网站QQ登陆示例代码(转)
  2. CCF201312-5 I’m stuck!(100分)
  3. 策划文档html,html代码整理.doc
  4. 真实HDFS集群启动后master的jps没有DataNode
  5. gradient descent,计算图,backpropagation
  6. spring-bean(xml方式管理)
  7. Socks5协议中文文档
  8. Oracle 如何定义自动增量autocreament的主键ID?
  9. Node - 从0基础到实战企业官网
  10. Swing Copters摇摆直升机高分攻略,游戏攻略
  11. 1072: 青蛙爬井
  12. Objective C的关键字oneway
  13. DirectX11 屏幕截图
  14. 2020-12-22 ACM集训一(二维数组与结构体)
  15. CLion配置STM32开发环境(JLink GDB Server)
  16. 阿里云南京云栖大会举行 给制造业升级下猛药
  17. Flutter自定义控件之饼状图、大转盘
  18. 02.07Center Alignment居中对齐
  19. 511遇见易语言乐玩插件FindStr找字和FindStrFast快速找字
  20. 好用又强大的JavaScript 框架介绍

热门文章

  1. android高帧率模式,《和平精英》等五款游戏已经适配小米10系列高帧率模式
  2. 智慧工厂如何实现工业设备的状态采集
  3. 电脑怎么设置微信定位服务器,电脑版微信,一个很简单的客户端,许多功能不支持...
  4. 最常见绩效考核方法有哪些?5种有效方法介绍
  5. python累乘怎么写_怎么编写Python关于累乘的程序?
  6. ubuntu清理cache
  7. matlab双峰滤波,MATLAB中的单峰或双峰分布
  8. CDH安装过程中出现:主机 cdh04 上的内存被调拨过度。总内存分配额是 4.0 艾字节 个字节,但是 RAM 只有 62.8 吉字节 个字节(其中的 12.6 吉字节 个字节是保留给系统使用的)。
  9. 内存模型与C++ 内存序
  10. BAT大牛亲授基于ElasticSearch的搜房网实战(第三章环境搭建)