Oracle对象——视图之简单视图与视图约束
文章目录
- 什么是视图
- 为什么会使用视图
- 视图语法
- 案例
- 简单视图的创建
- 更改数据基表,视图数据会变化么?
- 更改视图数据,基表数据会变更么?
- 带检查约束的视图
- 结论
- 创建只读视图(MySQL不支持)
- 总结
什么是视图
视图
是一种数据对象
,是从一个或者多个数据表或视图中导出的虚拟表
。
视图中的数据,并不是真正的存储在视图中
。视图的表结构与数据是对数据表查询的结果
。
说到底,视图就是对SQL语句的一种封装
。
为什么会使用视图
使用视图,会具有以下几种优点:
1、简化数据操作。
在平时开发中,可能存在关联多张表
的查询,每次都需要写sql,过于繁琐。
此时就可以将SQL语句,放入视图中,每次进来直接查询视图就能获取对应的数据信息。2、可以过滤敏感类数据,只展示需要的数据。
业务表中存在很多的敏感数据信息,并不想直接暴露给开发者所见,此时就能创建视图,根据编写SQL语句,将想要显示的数据放置于虚拟表中。3、可以对视图设置
只读
等权限。
视图提供了一个简单而有效的安全机制,可以定制不同用户对数据的访问权限。4、提供向后兼容性
使用户能够在表的架构更改时,为表创建向后兼容接口。
视图语法
创建视图的语法如下:
CREATE [OR REPLACE] [FORCE|NOFORCE] VIEW view[(alias[, alias]...)]AS subquery
[WITH CHECK OPTION [CONSTRAINT constraint]]
[WITH READ ONLY [CONSTRAINT constraint]];
选项解释:
命令名 | 命令含义 |
---|---|
CREATE | 创建视图 |
OR REPLACE | 修改视图,若创建的视图已存在,则自动创建新的视图,否则会创建视图报错。 |
force |
不管基表 是否存在,都会创建视图。建视图时,不会监测其中的SQL语句,以及from后的表是否存在。
|
subquery | 视图数据内容的sql语句,即被包装的sql |
WITH CHECK OPTION | 插入或修改的数据行必须满足视图定义的某些约束。 |
WITH READ ONLY |
将视图设置为只读 ,无法进行DML(增删改)操作。
|
删除指定的视图:
drop view view_name
案例
简单视图的创建
视图中的SQL只是单表查询,并且没有聚合函数。
如下,有这么一张基表
。(数据库中存在的表)
此时,将这个表中的所有数据,放入视图中,视图语句如下:
create or REPLACE VIEW view_test
as
select * from user
从视图中查询数据结果:
select * from view_test
更改数据基表,视图数据会变化么?
执行更改语句,再次查看视图数据:
update user set user_age = 22 where id = 1
SELECT * from user
再次查询视图,看数据是否变更:
select * from view_test
【结论:】更改基表的数据后,视图中的数据会发生变化!!
更改视图数据,基表数据会变更么?
在视图中进行 update 操作,再次查看基表,查看数据是否变更:
update view_test set user_age = 18 where id = 1
查看基表:
【结论:】视图中执行update操作语句后,基表中的数据也会同步变更!!
视图,只是数据库中的一个SQL语句,并不是一张真实的表!!
带检查约束的视图
WITH CHECK OPTION
【疑问:】
什么叫检查约束?
比如在视图中的SQL,由于视图数据是根据
某些条件 如 age = xxx
进行了筛选。
在上面的结论中,也说到了在对视图进行update操作时,也会刷新 原表 中的数据记录
。
此时,将要将视图中某条记录的age
值,修改成其他值
,如果加了WITH CHECK OPTION
,则不会执行成功。
控制数据的某些值,只能是指定的值。必须符合视图中sql语句的条件,才能update执行成功。
约束还有一个是WITH READ ONLY
。
将视图设置为
只读模式
,也就是只允许select,不能进行update、delete等。
创建一个带检查约束的视图,SQL如下所示:
create or replace view vw_test2 as
select * from user WHERE user_age = '18'
with CHECK OPTION
注意where 后的条件,等会会验证!
创建视图后,查询数据信息,如下所示:
对视图中的数据进行修改,先修改user_name
属性值。
update vw_test2 set user_name = 'Jone1' where id = 1
再修改其user_age
属性值,SQL如下所示:
update vw_test2 set user_age = '22' where id = 1
执行后,则出现了如下的现象:
检查约束修改失败!!
也就是说:
无法修改创建视图时,where条件语句后的设定值。
如果在创建视图时,where条件后跟的是数据的范围呢?
创建一个视图,视图中的数据根据
user_age > 18
进行筛选。
create or replace view vw_test3 as
select * from user WHERE user_age > '18'
with CHECK OPTION
执行后,进行查询,如下:
select * from vw_test3;
修改id = 2
的数据信息,将年龄修改为 20
。
update vw_test3 set user_age = '20' where id = 2
执行后,现象如下:
诶,执行成功了!
是不是说,检查约束无效了呢?!
那么就再验证一个修改语句,将user_age
修改为10
,如果说约束失效,那么就一定可以修改成功!
update vw_test3 set user_age = '10' where id = 2
发现:
修改失败了!
结论
增加视图的检查约束WITH CHECK OPTION
后,如果对数据进行修改操作,那么修改
视图
where条件后的字段值
,不允许超出其范围
!
创建只读视图(MySQL不支持)
WITH READ ONLY
使用Oracle
创建一个新的视图,必须保证是只读
模式。
create or replace view vw_test4_readonly as
select * from user WHERE user_age > '18'
with read only
【扩展】如果是 必须创建mysql的只读视图
,可以另辟蹊径:
间接方式创建只读视图:
创建对所有表具有SELECT权限的用户和CREATE VIEW权限,然后使用此用户创建视图并在CREATE VIEW语句中指定SQL
资料参考
创建好只读视图
后,尝试进行修改操作:
update vw_test4_readonly set user_age = '10' where id = 2
当执行后,则会出现下列的报错信息:
总结
只读视图
,只允许进行select
操作。
Oracle对象——视图之简单视图与视图约束相关推荐
- Oracle数据库:创建和删除视图view,简单和复杂视图,内建视图,topN分析,oracle分页查询
Oracle数据库:创建和删除视图view,简单和复杂视图,内建视图,topN分析,oracle分页查询 2022找工作是学历.能力和运气的超强结合体,遇到寒冬,大厂不招人,可能很多算法学生都得去找开 ...
- Oracle物化视图的简单使用
最近有个项目因为有比较多的查询汇总,之前用的是oralce的临时表,但临时表的特性导致无法完成业务需求,所以使用了物化视图. 先看简单创建语句: //创建物化视图 create materialize ...
- ORACLE对象-高级(视图、序列、索引)
ORACLE对象-高级 一.视图 (一)什么是视图 视图和表的区别: 视图是实体表的映射,视图和实体表区别就是于视图中没有真实的数据存在. 视图中存储的是SQL语句 什么时候使用视图: 1.为了安全, ...
- Oracle 视图(1)建立视图
一. 视图是基于表的表或者视图的逻辑表,与储存数据的表一样都是Oracle的方案对象. 视图通常用于下面: 1.通过提供用户所需要的的基表中的数据,可以简化用户对数据的理解,隐藏表结构的复杂性,而且可 ...
- oracle常用角色权限,Oracle角色、权限的一些常用视图 - 一夜寒江
Oracle角色.权限的一些常用视图 ORACLE中数据字典视图分为3大类 , 用前缀区别,分别为:USER,ALL 和 DBA,许多数据字典视图包含相似的信息. USER_*: 有关用户所拥有的对象 ...
- oracle v$ 表,【学习笔记】Oralce视图 查找分析V$PARAMETER视图的基表
天萃荷净 分享一篇关于查找分析V$PARAMETER视图的基表的案例方法 1.使用trace查找show parameter执行语句 alter session set events '10046 t ...
- Oracle 如何根据物化视图日志快速刷新物化视图 (不积跬步,无以至千里)
Oracle物化视图的快速刷新机制是通过物化视图日志完成的.Oracle如何通过一个物化视图日志就可以支持多个物化视图的快速刷新呢,本文简单的描述一下刷新的原理. 首先,看一下物化视图的结构: SQL ...
- Oracle的告警日志之v$diag_alert_ext视图
Oracle的告警日志之v$diag_alert_ext视图 Oracle的告警日志之v$diag_alert_ext视图 最近由于自己写的一个job老是报错,找不出来原因,数据库linux的term ...
- Oracle提高(访问其他用户和视图、同义词、序列、索引学习)
当想保存或者读取SQL语句时可以用一下命令 --使用spool命令,保存SQL语句到硬盘文件e:/oracle1.sql,并创建SQL文件 spool e:/oracle1.sql;--使用spool ...
最新文章
- 找到一款牛B的vim插件
- 9.1 正则介绍_grep(上);9.2 grep(中);9.3 grep(下)
- 报名 | 腾讯组织的区块链技术沙龙,本周六在深圳!
- pythoncharm下载cpython失败_pycharm虚拟环境下安装mysqlclient失败
- Jupyter配置步骤
- C++ 设置线程名字
- 仲裁文件夹服务器,仲裁服务器是什么
- nginx的反向代理、负载均衡、页面缓存、URL重写及读写分离
- 移远EC600低功耗唤醒锁wakelock的使用,QuecPython功耗分析
- 怎么把office卸载干净?
- 2016 CCF-CSP 计算机职业资格认证考试 解题报告
- JAVAWEB-NOTE04
- Google提供Fastboot和ADB单独下载服务(转载)
- 获取基因的所有转录本(不同亚型)的外显子区域
- TesterHome android app 编写历程(二)
- Direct2D (9) : 显示图像
- dwc3_gadget_get_link_state
- SpringBoot 亚马逊Simple邮件发送
- MATLAB基础应用精讲-【基础知识篇】MATLAB中的标点符号
- SAP MM ME56不能为审批后的PR分配货源? 2
热门文章
- 吉林大学微型计算机试卷,吉林大学全真预测试卷及答案
- Windows值得推荐的桌面管理软件
- stack、queue和priority_queue
- Ubuntu无法上网问题解决
- Linux中使用交叉编译、二进制分析工具链
- 每日学习一个设计模式--观察者模式(发布-订阅模式)
- 中国液冷数据中心市场发展研究
- java如何实现获取客户端公网IP地址?若不会,我手把手教你|非常详细,建议收藏
- About Garbage Collector and finilize()
- No7. net-snmp 一些命令行应用程序: