Oracle 普通视图 (Oracle Standard Views)

news2024/12/26 22:49:57

     视图(views)是一种基于表的"逻辑抽象"对象,由于它是从表衍生出来的,因此和表有许多相同点,我们可以和对待表一样对其进行查询/更新操作。但视图本身并不存储数据,也不分配存储空间。

    本文只讨论普通的视图(Standard Views)。Oracle的视图类型还有对象视图(Object Views)物化视图(Materiallized Views)和分析视图(Analytic Views)等。

目录

一、视图的作用

二、视图创建语法

三、基础视图

3.1 基础视图创建

3.2 自定义视图列名

3.3 强行建立视图

3.4 通过视图更新基表数据

3.5 通过with check option限制数据插入

3.6 通过with read only选项限制视图只读

四、连接视图

4.1 连接视图的更新规则

4.1.1 键值保留表(key-preserved table)

4.1.2 通过视图判断连接视图中可更新的列

4.2 with check option的影响


一、视图的作用

视图本质是存储的在数据字典中的"查询",其底层有一系列“基表”(Base Tables)或其他视图。因此视图是基表的逻辑抽象,其最基本的作用就是隐藏底层的复杂的数据结构。

Oracle本身就提供了很多数据字典和性能视图(v$视图),通过这些视图我们可以很方便的查询某一类信息,而根本不需要知道底层真实的数据结构。

视图的主要功能有:

  • 简化逻辑,通过视图对数据进行归纳后,可以隐藏底层数据的复杂性
  • 访问控制,通过视图可以限制用户仅访问表的一部分
  • 数据抽象,用户可以对视图的列重名或增加自己的逻辑,而不影响基表
  • 应用隔离,当应用通过视图访问数据时,我们对基表增加列等维护操作时,不会影响应用程序

二、视图创建语法

视图是通过 create view 语句创建的,基础语法为(方括号代表可以忽略的选项,斜线代表选择):

create [or repalce] [force/noforce] view [schema.]view_name [(column_alias ….)]
as
query_definition
[with read only/check option]

主要选项解释:

  • or replace: 当视图已存在时,使用此选项可以重建,通常在修改视图定义时使用。
  • force: 强行建立视图定义,即使视图的基表不存在或者没有权限,默认是noforce。
  • schema: 可以在别人的schema中定义视图,但必须有create any view权限,省略时视图创建在自己的schema。
  • column_alias: 建立视图时,可以重命名列。
  • with read only: 视图不可更新。
  • with check option: 无法通过视图更新或插入视图看不到的数据。

注:上面仅包含了最常用的视图创建选项,更完整的视图定义语法请参阅官方文档。

三、基础视图

通过示例可以更好的理解视图各选项的含义,下面以Oracle自带的sample_schema中的hr.employees作为基表演示视图的创建。

3.1 基础视图创建

创建一个基础视图(仅包含一张基表),仅包含employee_id, first_name, last_name, salary列

create view v_emp as
select employee_id, first_name, last_name, salary from employees;

desc v_emp;

3.2 自定义视图列名

更新刚才的视图,列名重命名为a,b,c,d:

create or replace view v_emp(a, b, c, d) as
select employee_id, first_name, last_name, salary from employees;

desc v_emp;

3.3 强行建立视图

通过force选项创建一个基表不存在的视图:

create force view v_not_exist as select * from employeesssssss;

这里我们基于一个不存在的表强行建立了一个视图,因此有一个警告。在视图基表存在之前,该视图无法使用。

3.4 通过视图更新基表数据

更新v_emp视图,限制仅显示employee_id>=200的数据

create or replace view v_emp as
select employee_id, first_name, last_name, salary from employees where employee_id>=200;

select * from v_emp;

通过视图将employee_id为206的数据更新为99999:

update v_emp set salary=99999 where employee_id=206;

select * from v_emp;

通过视图对基表的更新会受到基表的约束(例如视图看不到的列如果有非空约束,那么会阻止通过视图插入数据),同时如果用户对基表没有DML权限,那么也无法通过视图更新基表。

3.5 通过with check option限制数据插入

通过v_emp视图虽然只能看到employee_id>=200的数据,我们却可以通过它插入employee_id<200的数据,但是视图自己是无法看到该数据的:

insert into v_emp values(20,'Vincent','Chen',12345);    -- 通过视图插入employee_id=20的数据

select employee_id, salary from employees where employee_id=20;  -- 查询基表,数据插入成功

select * from v_emp;  -- 而视图自己是看不到数据的

更新视图,新增with check option选项,限制其无法插入视图看不到的数据(报错:违反视图定义中的where子句):

create or replace view v_emp as
select employee_id, first_name, last_name, salary from employees where employee_id>=200 with check option;

insert into v_emp values(21,'Vincent','Chen',12345);   -- 通过视图插入employee_id=21的数据

3.6 通过with read only选项限制视图只读

如果视图创建时增加的with read only选项,那么禁止通过视图插入或更新数据(报错:只读视图无法更新):

create or replace view v_emp as
select employee_id, first_name, last_name, salary from employees where employee_id>=200 with read only;

update v_emp set salary=99999 where employee_id=206;

四、连接视图

如果视图的查询定义中包含多张表连接,那么就是连接视图(Join Views)。下面建立基于hr.departments和hr.employees的连接视图,两个基表的表结构如下,两张表可以通过department_id进行连接:

4.1 连接视图创建

create view v_dept_emp as
select d.department_id, d.department_name, e.employee_id, e.first_name, e.salary
from departments d, employees e
where d.department_id = e.department_id
and d.department_id = 20;

4.1 可更新连接视图(updatable join views)

如果连接视图没有通过 with read only 选项约束,那么就是可更新连接视图(updatable join views)。虽然可以更新,但对其更新受到一定的规则约束。

通用约束:对于可更新视图的更新,每次最多涉及一张基表。即通过连接视图更新时,每次只能更新来自同一张基表中的列,不能涉及多张基表。

4.1.1 键值保留表(key-preserved table

除了每次只能影响一张基表的约束,可更新视图也并不是所有的列都可以更新。

这里我们先要了解一个概念:保留键值表(Key-preserved table),如果某张基表的键连接后,其键值也可以作为最终连接结果的键,那么它就是键值保留表。

定义比较晦涩,我们通过上面视图定义来解释。在视图的两张基表employees(雇员 别名e)和departments(部门 别名d)中,两张表的主键分别是employee_id和department_id,我们的连接条件是 d.department_id=e.department_id,这里employees去连接departments表的主键(d.department_id),那么employees就是键值保留表。在最终的结果中,employees表连接其他表的主键或唯一键,会保证自己的每行在连接结果中最多出现一次,而departments表是通过主键(或唯一键)进行连接的。

键值保留表会去连接别人的主键(或唯一键),由于连接的是别人的主键/唯一键,所以连接后,自己的行在最终结果中不会重复,因此可以保持唯一(键值保留)。从视图查询结果上我们也可以看到:employees表去连接departments表的主键/唯一键,那么最终结果一定不会导致employees表的记录重复,那么employees的记录可以在最终视图中保持唯一。而departments表的记录可以看到在最终结果中出现了重复(这里就算结果不重复,departments表也不是键值保留表,因为它无法保证不重复)。

select * from v_dept_emp;

理解了键值保留表(key-preserved table),可更新视图的另一个约束就是:可以更新的列要来自键值保留表。

上面示例中,departments表不是键值保留表,我们去更新来自departments表的列时就会报错:不能更改来自非键值保留表的列(ORA-01779)

update v_dept_emp set department_name='abc' where department_id=20;

而employees是键值保留表,来自它的列可以更新成功(这里我们只是把更新的列从department_name换成了first_name,where条件保持相同):

update v_dept_emp set first_name='abc' where department_id=20;

4.1.2 通过视图判断连接视图中可更新的列

如果通过键值保留表的概念判断连接视图中哪些列可以更新比较困难,那么Oracle也提供了更简便的方式,直接通过视图dba/all/user_updatable_columns查询连接视图中的可更新列:

select table_name, column_name, updatable from user_updatable_columns where table_name='V_DEPT_EMP';

通过updatable列我们也可以看到来自employees表(key-preserved table)的三列是可以更新的。

4.2 with check option的影响

如果连接视图在定义时增加了with check option,那么所有连接条件中的列都不可以更新(即使其来自键值保留表)

我们将上面v_dept_emp视图中的department_id列来源从departments表修改为employees表(d.department_id => e.department_id),由于employees是键值保留表,因此从视图user_updatable_columns我们可以看到department_id是可以更新的。

create or replace view v_dept_emp as
select e.department_id, d.department_name, e.employee_id, e.first_name, e.salary
from departments d, employees e
where d.department_id = e.department_id
and d.department_id = 20;

select table_name, column_name, updatable from user_updatable_columns where table_name='V_DEPT_EMP';

我们将视图查询保持不变,仅增加一个with check option选项,department_id依然来自键值保留表employees,我们再次查询视图,发现department_id变为不可更新(因为它是连接条件 d.department_id = e.department_id 中的列)。

create or replace view v_dept_emp as
select e.department_id, d.department_name, e.employee_id, e.first_name, e.salary
from departments d, employees e
where d.department_id = e.department_id
and d.department_id = 20
with check option;

select table_name, column_name, updatable from user_updatable_columns where table_name='V_DEPT_EMP';

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/777394.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Linux下搭建pyqt5开发环境—基于Pycharm

防踩坑Tips&#xff1a; 1、不能学windows那样直接用pip安装PyQt5Designer和pyqt5-tools。这两个模块最根本的是用的windows的程序&#xff0c;linux上是运行不了的&#xff0c;特别是PyQt5Designer&#xff0c;会提示安装失败。 2、推荐在python环境安装同系统版本一致的pyq…

2023.7.16 第五十九次周报

目录 前言 文献阅读:跨多个时空尺度进行预测的时空 LSTM 模型 背景 本文思路 本文解决的问题 方法论 SPATIAL 自动机器学习模型 数据处理 模型性能 代码 用Python编写的LSTM多变量预测模型 总结 前言 This week, I studied an article that uses LSTM to solve p…

数据分析系统中的六边形战士——奥威BI系统

数据分析软件可以对收集的数据进行分析和报告&#xff0c;帮助企业获得更深入的数据洞察力&#xff0c;从而推动企业数字化运营决策&#xff0c;提高决策效率与质量。进入大数据时代&#xff0c;企业对数据分析软件的要求也在水涨船高&#xff0c;传统的数据分析软件显然已不能…

数据结构 单向链表(不循环)的基础知识和基础操作

头定义&#xff1a; typedef int datatype; typedef struct Node {//数据域存储数据datatype data;//指针域存储下一个地址struct Node *next; }*Linkelist; 创建节点 Linkelist create_node()//创建新节点 {Linkelist node(Linkelist)malloc(sizeof(struct Node));if(nodeN…

Elasticsearch 源码探究 001——故障探测和恢复机制

1、Elasticsearch 故障探测及熔断背景 探究Elasticsearch7.10.2 节点之间的故障探测以及熔断故障是怎么做的&#xff0c;思考生产上的最佳实践。 服务端故障场景&#xff1a; 单个master挂掉 除了断点断网&#xff0c;状态同步异常&#xff0c;主master也会认为自己已经失败&am…

ASPICE V模型之软件需求

ASPICE V模型之软件需求 了解ASPICE认识软件需求软件需求分解软件需求工作流程 了解ASPICE ASPICE全称是“Automotive Software Process Improvement and Capacity Determination”汽车软件过程改进及能力评定&#xff0c;是汽车行业用于评价软件开发团队的研发能力水平的模型框…

全球生成式AI大竞赛,Llama 2大模型现已可在亚马逊云科技上使用

一直以来Llama可以说是AI社区内最强大的开源大模型。但因为开源协议问题&#xff0c;一直不可免费商用。7月19日&#xff0c;Meta发布了大家期待已久的免费可商用版本Llama 2。一夜之间&#xff0c;大模型格局再次发生巨变。 作为Meta宣布的首批合作伙伴之一&#xff0c;现亚…

Ubuntu 安装Postgresql与PostGIS

1.前言 最近在做GIS分析&#xff0c;采集设备的经纬度点判断是否进出围栏以及是否产生道路偏移报警&#xff0c;在之前的文章有介绍过Windows下使用C#来实现&#xff0c;参考文章&#xff1a;利用PostgresqlPostgis进行空间地理信息分析&#xff08;道路偏移&#xff0c;进出电…

sql注入---报错注入

updatexml&#xff08;&#xff09;&#xff1a;对XML文档数据进行查询和修改 extractvalue&#xff08;&#xff09;&#xff1a;对XML文档数据进行查询 floor&#xff08;&#xff09;&#xff1a;取整的函数 前提是未关闭数据库报错函数&#xff0c;对于一些SQL语句的错误…

Java反射、动态代理

文章目录 反射什么是动态代理&#xff1f;程序为什么需要代理?代理长什么样? 反射 java反射机制原理&#xff1a;我们写的源代码是.java文件&#xff0c;通过javac编译后成为.class文件&#xff0c;即字节码文件&#xff0c;程序执行时&#xff0c;JVM会类加载字节码文件到内…

浅谈单片机

目录 1.什么是单片机 2.单片机的作用&#xff1f; 3.单片机的种类 4.如何学好单片机 5. 单片机的就业前景 1.什么是单片机 单片机&#xff08;Microcontroller Unit&#xff0c;简称MCU&#xff09;是一种集成了微处理器核心、存储器、输入输出端口和各种外围功能模块于一体…

Rspack 学习了解

一、简介 Rspack GitHub 仓库、Rspack Quick start。 Rspack 是由字节 ByteDance Web Infra 团队基于 Rust 语言开发的 Web 高性能构建工具。 Rust 是种高效、可靠的通用高级语言。其高效不仅限于开发效率&#xff0c;执行效率也是令人称赞的&#xff0c;属于少有兼顾开发效率…

vulnhub打靶--buli_b0x

目录 vulnhub--buli_b0x1.下载靶机2.导入靶机&#xff0c;开启靶机&#xff0c;nmap扫描3.探测目录&#xff0c;发现敏感目录4.通过test.php下载源码5.代码审计6.提权7.总结 vulnhub–buli_b0x 1.下载靶机 Billu_b0x.zip 2.导入靶机&#xff0c;开启靶机&#xff0c;nmap扫描…

分布式 RPC 框架HSF

分布式 RPC 框架HSF 概述HSF架构调用方式优势应用场景 概述 HSF (High-speed Service Framework)&#xff0c;高速服务框架&#xff0c;是在阿里巴巴内部广泛使用的分布式 RPC 服务框架。HSF 作为阿里巴巴的基础中间件&#xff0c;联通不同的业务系统&#xff0c;解耦系统间的…

WebSocket笔记

1. websocket介绍 WebSocket 是基于 TCP 的一种新的网络协议。它实现了浏览器与服务器全双工通信——浏览器和服务器只需要完成一次握手&#xff0c;两者之间就可以创建持久性的连接&#xff0c; 并进行双向数据传输。 HTTP协议和WebSocket协议对比&#xff1a; HTTP是短连接W…

iOS--动静态库

文章目录 认识动静态库静态库动态库静态的打包静态库的使用动态库的打包动态库的使用 动静态库的本质就是可执行程序的"半成品"。 需要完成一个可执行程序需要经历以下四个步骤: 预处理:完成头文件的展开&#xff0c;去掉注释&#xff0c;宏替换&#xff0c;条件编译…

微信小程序学习笔记(五)——优化

下拉刷新后主动关闭 Page({onPullDownRefresh: function() {// ...wx.stopPullDownRefresh()} })在发起请求时设置 loading&#xff0c;请求结束后关闭 Page({onLoad: function(options) {wx.showLoading({title: 数据加载中...}) // 展示 loadingwx.request({// ...complete: …

leetcode每日一练-第206题-反转链表

一、思路 迭代 二、解题方法 以输入为 1 -> 2 -> 3 -> 4 -> 5 的链表为例 三、code class Solution { public:ListNode* reverseList(ListNode* head) {ListNode* prevnullptr;//反转后的链表ListNode* currhead;//当前更新的原有链表while(curr)//原有链表无值…

【大模型】更强的 LLaMA2 来了,开源可商用、与 ChatGPT 齐平

【大模型】可商用且更强的 LLaMA2 来了 LLaMA2 简介论文GitHubhuggingface模型列表训练数据训练信息模型信息 许可证参考 LLaMA2 简介 2023年7月19日&#xff1a;Meta 发布开源可商用模型 Llama 2。 Llama 2是一个预训练和微调的生成文本模型的集合&#xff0c;其规模从70亿到…

中间件安全-CVE漏洞复现-Weblogic+JBoss+GlassFish

服务攻防测试流程&#xff1a; 使用vulfocus靶场&#xff1a; 案例演示&#xff1a;中间件-Weblogic-工具梭哈 探针默认端口&#xff1a;7001&#xff0c;Weblogic是Oracle公司推出的J2EE应用服务器 使用vulfocus靶场复现漏洞 漏洞&#xff1a;weblogic-cve_2020_14883 启动环…