第十六节:SQLServer视图的概述、基本操作、EFCore中映射和使用
一. 视图概述
1. 什么是视图
视图是一个虚拟表,是从一个或多个表中到处,行为与表相似,同样可以Select、Insert、Update、对视图的最终操作都会转换成对数据表的操作,可以保障数据系统的安全性。
2. 视图的分类
(1). 标准视图
标准视图组合了一个或多个表结构中数据,视图的基本功能都可以使用,侧重点是简化数据查询、查询指定数据。
(2). 索引视图
被具体化的视图,为视图创建索引,对视图创建一个唯一的聚集索引。索引视图可以显著提高某些类型查询的性能,索引视图尤其适于聚合许多行的查询,但它们不太适于经常更新的基本数据集。
(3). 分区视图
多台服务器之间表的水平组合,用于分布式场景。
3. 视图的优点
(1). 简化用户的操作,所见即所要,不必再指定一些特殊查询条件。
(2). 从安全角度来考虑,视图只是一些SQL语句的集合。可以防止用户接触数据表,从而不知表结构;用户只能修改或者查看他所用到的数据,其它数据 和 表是不可以访问,视图和表的设置权限是互不影响的。
(3). 屏蔽真实表结构带来的变化。
4. 视图与表的区别
(1). 视图是已经编译好的SQL语句,是基于SQL语句的结果集的可视化表,而表不是。
(2). 除了索引视图外,其它视图是没有实际的物理记录,而基本表有,即表是占物理空间的,视图不占,只是逻辑概念的存在。
(PS:表是实表,视图是虚拟表)
(3). 视图的创建和删除只影响视图,不影响其对应的表结构。
二. 基本操作
1. 创建普通视图
if (exists (select * from sys.objects where name='UserInfor_View')) drop view UserInfor_View go create view UserInfor_View as select id,userAge from UserInfor where userAge >=20; --执行视图 select * from UserInfor_View;
运行结果:
2. 创建加密视图
if(exists (select * from sys.objects where name='UserInfor_View_encryption')) drop view UserInfor_View_encryption go create view UserInfor_View_encryption with encryption --加密 as select id,userName from UserInfor -- 执行加密视图 select * from UserInfor_View_encryption -- 查看加密视图的结构 select * from INFORMATION_SCHEMA.VIEWS where TABLE_NAME like 'UserInfor_View_encryption'
运行结果:
3. 查看视图信息
-- 使用sp_help存储过程查看视图的定义信息 exec sp_help 'UserInfor_View'; -- 使用sp_helptext系统存储过程使用来显示规则,默认值,未加密的存储过程,用户定义函数,触发器或视图的文本 exec sp_helptext 'UserInfor_View';
运行结果:
4. 通过视图修改数据
(1). 增加数据
--4.1 增加数据 insert into UserInfor_View values('004',26); --查看主表 和 视图 select * from UserInfor; select * from UserInfor_View;
运行结果:
(2). 修改数据
--4.2 修改数据 update UserInfor_View set userAge=100 where id = '004'; --查看主表 和 视图 select * from UserInfor; select * from UserInfor_View;
运行结果
(3). 删除数据
--4.3 删除数据 delete from UserInfor_View where userAge=100 --查看主表 和 视图 select * from UserInfor; select * from UserInfor_View;
运行结果:
5. 修改视图
--5.修改视图 alter view UserInfor_View as select id,userAge from UserInfor where userAge >=10; --执行视图 select * from UserInfor_View;
运行结果:
6. 删除视图
drop view UserInfor_View,UserInfor_View_encryption;
7. 一个应用,比如把用户和用户详情表关联起来做一个视图,用于查询
if (exists (select * from sys.objects where name='AllUserInfor')) drop view AllUserInfor go create view AllUserInfor as select t1.id, t1.userAge, t2.userSchool,t2.userAddress from UserInfor as t1 inner join UserDetails as t2 on t1.id = t2.userId --执行视图 select * from AllUserInfor where userAge >10;
运行结果:
三. EFCore中映射和使用
1. 从EF Core3.0 开始,已经可以直接通过指令来映射视图了。
https://docs.microsoft.com/zh-cn/ef/core/what-is-new/ef-core-3.0/?view=aspnetcore-1.1
【Scaffold-DbContext "Server=xxxx;Database=SQLTestDB;User ID=sqltestdbuser;Password=xxxx;" Microsoft.EntityFrameworkCore.SqlServer -OutputDir Models -UseDatabaseNames -DataAnnotations 】
2. 本质会生成对应的视图类
如:UserInfor_View.cs 和 UserInfor_View_encryption.cs ,并加载在EF的上下文中,如:public virtual DbSet<UserInfor_View> UserInfor_View { get; set; }
然后,通过 entity.ToView("UserInfor_View"); 加载视图。
代码调用:和表调用一样
using (SQLTestDBContext context=new SQLTestDBContext()) { var data = context.Set<UserInfor_View>().ToList(); }
!
- 作 者 : Yaopengfei(姚鹏飞)
- 博客地址 : http://www.cnblogs.com/yaopengfei/
- 声 明1 : 如有错误,欢迎讨论,请勿谩骂^_^。
- 声 明2 : 原创博客请在转载时保留原文链接或在文章开头加上本人博客地址,否则保留追究法律责任的权利。