
此文主要向大家讲述的是SQL Server视图的实际操作功能,在前一段时间作项目中,我们曾遇到使用视图的问题,以前的工作中很少遇到视图,认为直接用表就ok了,何须视图呢?下面我来讲述一下它的功用:
以往当我们查询数据时,一定要很认真的地从设计select语句开始,将需要查询的每个字段写在sql语句里,
前段时间作项目中,遇到使用SQL Server视图的问题,以前的工作中很少遇到视图,认为直接用表就ok了,何须视图呢?下面我来讲述一下它的功用:以往当我们查询数据时,一定要很认真的地从设计select语句开始,将需要查询的每个字段写在sql语句里,每次你要以同样的条件来查询数据时,那么每次都要重复输入相同的查询语句,效率很低。
若将这个经常要重复使用的查询语句创建成视图,就不用那么麻烦了!直接用select * from 视图名 就行了,其实将查询语句创建成视图,不仅仅是简化查询的动作;更重要的是,视图具备数据表的特性,还可以衍生出更多的应用。
所谓视图(View)其实是执行查询语句后得到的结果,但这个查询结果可以仿真成数据表来使用,所以有人也称它为“虚拟数据表”,视图在操作上和数据表没有什么区别,但两者的差异是其本质是不同的:
数据表是实际存储记录的地方,然而视图并不保存任何记录,它存储的实际上是查询语句,其所呈现出来的记录实际来自于数据表,可以为多张数据表,大家由此可以预见到视图应用的弹性!我们可以依据各种查询需要创建不同SQL Server视图,但不会因此而增加数据库的数据量。
下面总结视图的几大优点:1.增强可读性 2.数据安全及保密:针对不同用户,可以创建不同视图,限制其所能浏览和编辑的数据内容。3.降低查询复杂度 4.方便维护。
总之,善于运用视图可以让数据库的设计、管理及使用都更加有效率、更加方便。
视图可以被看成是虚拟表或存储查询。可通过视图访问的数据不作为独特的对象存储在数据库内。数据库内存储的是 SELECT 语句。SELECT 语句的结果集构成视图所返回的虚拟表。用户可以用引用表时所使用的方法,在 Transact-SQL 语句中通过引用视图名称来使用虚拟表。使用视图可以实现下列任一或所有功能:
ps:leeenx的见解是,因为视图存储的是语句,所以在使用SQL Server视图时,运行的速度跟使用数据表是一样的(严格上说应该会慢一些,因为要先执行sql语句再生成表)
将用户限定在表中的特定行上。
例如,只允许雇员看见工作跟踪表内记录其工作的行。

将用户限定在特定列上。
例如,对于那些不负责处理工资单的雇员,只允许他们看见雇员表中的姓名列、办公室列、工作电话列和部门列,而不能看见任何包含工资信息或个人信息的列。
将多个表中的列联接起来,使它们看起来象一个表。
聚合信息而非提供详细信息。
例如,显示一个列的和,或列的***值和最小值。
通过定义 SELECT 语句以检索将在视图中显示的数据来创建视图。SELECT 语句引用的数据表称为视图的基表。在下例中,pubs 数据库中的 titleview 是一个视图,该视图选择三个基表中的数据来显示包含常用数据的虚拟表:
之后,可以用引用表时所使用的方法在语句中引用 titleview。
一个视图可以引用另一个视图。例如,titleview 显示的信息对管理人员很有用,但公司通常只在季度或年度财务报表中才公布本年度截止到现在的财政数字。可以建立一个视图,在其中包含除 au_ord 和 ytd_sales 外的所有 titleview 列。使用这个新SQL Server视图,客户可以获得已上市的书籍列表而不会看到财务信息:
视图可用于在多个数据库或 Microsoft® SQL Server™ 2000 实例间对数据进行分区。分区视图可用于在整个 服务器 组内分布数据库处理。服务器组具有与服务器聚集相同的性能优点,并可用于支持***的 Web 站点或公司数据中心的处理需求。原始表被细分为多个成员表,每个成员表包含原始表的行子集。
每个成员表可放置在不同服务器的数据库中。每个服务器也可得到分区视图。分区视图使用 Transact-SQL UNION 运算符,将在所有成员表上选择的结果合并为单个结果集,该结果集的行为与整个原始表的复本完全一样。例如在三个服务器间进行表分区。在***个服务器上定义如下的分区视图:
在其它两个服务器上定义类似的分区视图。利用这三个视图,三个服务器上任何引用 PartitionedView 的 Transact-SQL 语句都将看到与原始表中相同的行为。似乎每个服务器上都存在原始表的复本一样,而实际上每个表只有一个成员表和分区视图。有关更多信息,请参见视图使用方案。
只要所做的修改只影响视图所引用的其中一个基表,就可以更新所有 SQL Server 版本内的视图(可以对其执行 UPDATE、DELETE 或 INSERT 语句)。
SQL Server 2000 支持可引用视图的更复杂的 INSERT、UPDATE 和 DELETE 语句。可在视图上定义 INSTEAD OF 触发器,指定必须对基表执行的个别更新以支持 INSERT、UPDATE 或 DELETE 语句。另外,分区视图还支持 INSERT、UDPATE 和 DELETE 语句修改视图所引用的多个成员表。
索引视图是 SQL Server 2000 具有的功能,可显著提高复杂SQL Server视图类型的性能,这些视图类型通常在数据仓库或其它决策支持系统中出现。
视图的结果集通常不保存在数据库中,因此视图也称为虚拟表。视图的结果集动态包含在语句逻辑中并在运行时动态生成。有关更多信息,请参见视图解析。
复杂的查询(如决策支持系统中的查询)可引用基表中的大量行,并将大量信息聚积在相对较简洁的聚合中,如总和或平均值。SQL Server 2000 支持在执行此类复杂查询的视图上创建聚集索引。当执行 CREATE INDEX 语句时,视图 SELECT 的结果集将***存储在数据库中。SQL 语句此后若引用该视图,响应时间将会显著缩短。对基本数据的修改将自动反映在视图中。
SQL Server 2000 CREATE VIEW 语句支持 SCHEMABINDING 选项,以防止视图所引用的表在SQL Server视图未被调整的情况下发生改变。必须为任何创建索引的视图指定 SCHEMABINDING。
【编辑推荐】

sql server2000中的“视图”和“存储过程”有什么不同
1.视图是虚拟表,例如有一个工资表,查询工资时总是两个表一起查询,那么就可以建一个员工工资视图里面来自员工表的员工编号和姓名又有来自工资表的员工工资。 2.存储过程是一组为了完成特定功能的sql 语句集,经编译后存储在数据库中。 类型于函数,但函数有返回值。 3.存储过程没办法编辑?你是指它里面的数据不能改变吗?兄弟,它本来里面就没有数据,只是给你调用的时候才用相应的根据参数返回不同的东西而已。 4.视图不能写修改语句(包括插入)。 5.另外,建议您在练习时可以用视图,但开发项目时最好不用,因为其性能不佳。 谢谢。
对已登录用户帐户进一步授权访问所设计的数据库中的某些表的SQL语句怎么写?急~~
用grant语句如果是sql server的话 你可以在联机丛书中查询grant 里面有很详细的解答下例显示权限的优先顺序。 首先,给 public 角色授予 SELECT 权限。 然后,将特定的权限授予用户 Mary、John 和 Tom。 于是这些用户就有了对 authors 表的所有权限。 USE pubsGOGRANT SELECTON authorsTO publicGO GRANT INSERT, UPDATE, DELETEON authorsTO Mary, John, TomGOGRANT在安全系统中创建项目,使当前数据库中的用户得以处理当前数据库中的数据或执行特定的 Transact-SQL 语句。 语法语句权限:GRANT { ALL | statement [ ,...n ] } TO security_account [ ,...n ]对象权限:GRANT{ ALL [ PRIVILEGES ] | permission [ ,...n ] }{ [ ( column [ ,...n ] ) ] ON { table | view }| ON { table | view } [ ( column [ ,...n ] ) ]| ON { stored_procedure | extended_procedure }| ON { user_DeFined_function }} TO security_account [ ,...n ] [ WITH GRANT OPTION ] [ AS { group | role } ]参数ALL表示授予所有可用的权限。 对于语句权限,只有 sysadmin 角色成员可以使用 ALL。 对于对象权限,sysadmin 和 db_owner 角色成员和数据库对象所有者都可以使用 ALL。 statement是被授予权限的语句。 语句列表可以包括: CREATE DATABASECREATE DEFAULTCREATE FUNCTIONCREATE PROCEDURECREATE RULECREATE TABLECREATE VIEWBACKUP DATABASEBACKUP LOG n一个占位符,表示此项可在逗号分隔的列表中重复。 TO指定安全帐户列表。 security_account是权限将应用的安全帐户。 安全帐户可以是: Microsoft® SQL Server™ 用户。 SQL Server 角色。 Microsoft Windows NT® 用户。 Windows NT 组。 当权限被授予一个 SQL Server 用户或 Windows NT 用户帐户,指定的 security_account 是权限能影响到的唯一帐户。 若权限被授予 SQL Server 角色或 Windows NT 组,权限可影响到当前数据库中该组或该角色成员的所有用户。 若组或角色和它们的成员之间存在权限冲突,最严格的权限 (DENY) 优先起作用。 security_account 必须在当前数据库中存在;不可将权限授予其它数据库中的用户、角色或组,除非已为该用户在当前数据库中创建或给予了访问权限。 两个特殊的安全帐户可用于 GRANT 语句。 授予 public 角色的权限可应用于数据库中的所有用户。 授予 guest 用户的权限可为所有在数据库中没有用户帐户的用户使用。 当授予某个 Windows NT 本地组或全局组权限时,请指定在其上定义该组的域名或计算机名,然后依次输入反斜线和组名。 但是,若要授予访问 Windows NT 内置本地组的权限,请指定 BUILTIN 而不是域名或计算机名。 PRIVILEGES是可以包含在符合 SQL-92 标准的语句中的可选关键字。 permission是当前授予的对象权限。 当在表、表值函数或视图上授予对象权限时,权限列表可以包括这些权限中的一个或多个:SELECT、INSERT、DELETE、REFENENCES 或 UPDATE。 列列表可以与 SELECT 和 UPDATE 权限一起提供。 如果列列表未与 SELECT 和 UPDATE 权限一起提供,那么该权限应用于表、视图或表值函数中的所有列。 在存储过程上授予的对象权限只可以包括 EXECUTE。 在标量值函数上授予的对象权限可以包括 EXECUTE 和 REFERENCES。 为在 SELECT 语句中访问某个列,该列上需要有 SELECT 权限。 为使用 UPDATE 语句更新某个列,该列上需要有 UPDATE 权限。 为创建引用某个表的 FOREIGN KEY 约束,该表上需要有 REFERENCES 权限。 为使用引用某个对象的 WITH SCHEMABINDING 子句创建 FUNCTION 或 VIEW,该对象上需要有 REFERENCES 权限。 column是当前数据库中授予权限的列名。 table是当前数据库中授予权限的表名。 view是当前数据库中被授予权限的视图名。 stored_procedure是当前数据库中授予权限的存储过程名。 extended_procedure是当前数据库中授予权限的扩展存储过程名。 user_defined_function是当前数据库中授予权限的用户定义函数名。 WITH GRANT OPTION表示给予了 security_account 将指定的对象权限授予其它安全帐户的能力。 WITH GRANT OPTION 子句仅对对象权限有效。 AS {group | role}指当前数据库中有执行 GRANT 语句权力的安全帐户的可选名。 当对象上的权限被授予一个组或角色时使用 AS,对象权限需要进一步授予不是组或角色的成员的用户。 因为只有用户(而不是组或角色)可执行 GRANT 语句,组或角色的特定成员授予组或角色权力之下的对象的权限。 详细的可以参见sql server的连接丛书!
SQLServer中的页如何影响数据库性能
否则的话,很多数据库的优化工作无法展开。 对于对于数据库管理员来说,虽然学习数据库的内存存储结构比较单调,但是却是我们必须攻下的一个堡垒。 在SQLServer数据库中,数据页是其存储的最基本单位。 系统无论是在保存数据还是在读取数据的时候,都是以页为单位来进行操作的。 一、数据页的基本组成。 如上图所示,是SQLServer数据库中页的主要组成部分。 从这个图中可以看出,一个数据页基本上包括三部分内容,分别为标头、数据行和行偏移量。 其中数据行存储的是数据本身,其他的标头与偏移量都是一些辅助的内容。 对于这个数据页来说,笔者认为数据库管理员必须要了解如下的内容。 一是要了解数据页的大小。 在SQLServer数据库中数据页的大小基本上是固定的,即每个数据页的大小都为8KB,8192个字节。 其中每页开头都有一个标头,其占据了96个字节,用于存储有关页的信息。 如这个页被分配到页码、页的类型、页的可用空间以及拥有这个页的对象的分配单元ID等等信息。 不过值得庆幸的是,这些内容数据库都会自动管理与更新,不需要数据库管理员担心。 数据库管理员只需要知道的是,这个数据页中最多可以用来保存数据的空间。 每个页的大小是8192个字节,扣除掉一些必要的开销(如标头信息或者偏移量所占用的空间),一般其可以用来实际存储数据的空间只有8000字节左右。 牢记这个数字,对于后续数据库性能的优化具有很大的作用。 详细的内容笔者在后续行溢出的部分会进行说明。 二是需要注意行的放置顺序。 在每个数据页上,数据行紧接着标头按顺序放置。 在页的末尾有一张行偏移表。 对于页中的每一行,每个行偏移表都包含有一个条目。 即如果业中的数据行达到100条的话,则在这个行偏移表中就对英100个条目。 每个条目记录中记录对应行的第一个字节与页首的距离。 如第二个跳就记录着第二个数据行的行首字母到数据页页首的位置。 由于每个数据行的大小都是不同的,为此这个行偏移表中记录的内容也是没有规律的。 这里需要注意的是,行偏移表中的条目顺序与页中行的顺序是相反的。 这主要是为了更方便数据库定位数据行。 二、大数据类型与行。 根据SQLServer数据库定义的规则,行是不能够跨页的。 如上图所示,如果一个字段的数据值非常大,其超过8000字节。 此时一个页已经不能够容纳这个数据。 此时数据库会如何处理呢?虽然说在SQLServer数据库中,行是不能够跨页的。 但是可以将行分成两部分,分别存储在不同的行中。 所以说,对于大数据类型来说,是不受到这个页大小(或者说行大小)的限制的。 根据上面的分析可以看出,一个数据页其最大可以用的存储空间在8KB。 如果扣掉一些必要的开销,其只有8000字节左右。 当某条记录的所有列(包括固定长度的列与可变长度的列其大小超过这个限制的时候,数据库就会将其进行分行处理,分别存储在两个不同的页中。 当某张表格中列的总大小超过限制的8KB(实际上还还不到一点)字节时,数据库系统会从最大长度的列开始动态的将一个或多个可变长度列移动到另外一个页中。 简单的说,就是将某个列超过的部分单独存放在另一个页中。 并且同时还会存储一些指针之类的信息,以便在不同页的记录中建立关联。 这种现象在SQLServer数据库中给其取了一个名字,叫做行溢出。 三、行溢出对于数据库性能的不利影响。 掌握了上面关于数据页的基本工作原理后,数据库管理员需要重点理解行溢出对于数据库性能的不利影响。 即需要了解,当所有列(包括固定长度的列与可变长度的列)的累积长度超过一个数据页(或者一个数据行)的最大承受限度时,会将列的内容分行来进行存放。 数据库如此处理,对数据库的性能会有不利的影响吗?如果有的话,该如何避免? 一般来说,每行的记录超过页的最大容量时,肯定会对数据库的性能造成不利的影响。 这是毋庸置疑的。 因为当超过这个容量时,数据库系统就需要对这个数据行进行分页处理。 而分页处理需要数据库额外的开销。 如在分页保存时,需要给数据库添加额外的指针;在查询数据的时候,由于分页情况的存在,为了读取一条完整的记录,数据库系统可能不得不读取多页的内容;当进行更新操作,将某个字段的内容变短,导致整行的内容在页的最大范围之内,则相关的记录会被保存在同一个行中。 这些操作都需要数据库额外的开销。 当在同一个时间处理这些作业多了,那么积累起来,对数据库性能的影响就会很显著。
发表评论