第十六节: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 : 原创博客请在转载时保留原文链接或在文章开头加上本人博客地址,否则保留追究法律责任的权利。
 
原文地址:https://www.cnblogs.com/yaopengfei/p/12730223.html