ddlDegree设置什么属性怎么oracle ddl触发器

没有更多推荐了,
不良信息举报
举报内容:
SQLSTATE 消息
举报原因:
原文地址:
原因补充:
最多只允许输入30个字
加入CSDN,享受更精准的内容推荐,与500万程序员共同成长!没有更多推荐了,
不良信息举报
举报内容:
SQLSTATE各种状态码
举报原因:
原文地址:
原因补充:
最多只允许输入30个字
加入CSDN,享受更精准的内容推荐,与500万程序员共同成长!没有更多推荐了,
不良信息举报
举报内容:
DB2的SQLSTATE值
举报原因:
原文地址:
原因补充:
最多只允许输入30个字
加入CSDN,享受更精准的内容推荐,与500万程序员共同成长!&&&&&&&&&&&&&&&&&&
posts - 425,comments - 6,trackbacks - 0
SQL Server数据库基础
当创建了数据库之后,下一步就需要设计数据库对象。SQL Server能够创建多种数据库对象,如表、索引、视图、存储过程、游标、触发器等。本章将对其基础知识、相关的操作进行详细介绍。
本章主要内容:
l&存储过程
本节我们介绍数据表的基础知识,以及一些基本的操作:创建、修改、删除操作。需要提醒的是,创建数据表是创建数据库的一项基本操作。在实际的项目开发过程中,在创建数据表的时候,需要注意使用五种范式对表的数据列进行划分,得到表的逻辑结构,然后通过SQL Server提供的工具加以实现其物理结构。
1.1 &表基础
,,例如,下面是SQL Server提供的默认数据库Pubs中的sales表结构如图1所示。
图1&&&sales&表
该表包含行和列信息,其中行表示数据,列表示数据域(stor_id、ord_num、ord_date、qty、payterns、title_id)。
当设计完成数据表之后,可以采用多种方式创建数据表,如在SQL Server Management Studio中使用图形界面创建数据库表,或者执行Transact-SQL语句创建数据库表。
表的每一列都有一组属性,如名称、数据类型、为空性和数据长度等。列的所有属性构成列的定义。可以使用数据库关系图在数据库表中直接指定列的属性。在数据库中创建表之前列应具备三个属性:列名、数据类型和数据长度。
1.2 &企业信息平台的
在了解了SQL Server数据表概念和列属性之后,下面就可以创建数据表。SQL Server提供了多种方式创建数据表。如在SQL Server Management Studio中采用图形向导创建数据表,也可以使用Transact-SQL语句创建数据表,下面分别加以介绍。
(1)使用SQL Server Management Studio创建数据库表
使用SQL Server Management Studio创建数据库表的步骤如下:
打开SQL Server Management Studio,如图2所示。
图2 &SQL Server Management Studio
选择需要创建表的数据库,展开文件夹,选择&表&,单击鼠标右键,选择&新建表&,如图3所示。
图3 &选择&新建表&菜单项
输入列的名称、数据类型、长度、是否允许为空等属性,如图4所示。
图4 定义数据表
当定义完成之后,单击工具栏上的按钮,保存该表,SQL Server Management Studio将弹出对话框,要求输入表名,如图5所示。
图5 &定义表名的对话框
当定义了表名之后,单击&OK&按钮,保存该表,数据表创建完成。
(2)使用Transact-SQL创建数据库表
在SQL Server Management Studio提供的查询分析器中,可以定义Transact-SQL的CREATE TABLE语句创建数据表。其语法格式如下:
CREATE TABLE
[ database_name . [ schema_name ] . | schema_name . ] table_name
( { &column_definition& | &computed_column_definition& }
[ &table_constraint& ] [ ,...n ] )
[ ON { partition_scheme_name ( partition_column_name ) | filegroup
| " DEFAULT " } ]
[ { TEXTIMAGE_ON { filegroup | " DEFAULT " } ]
& column_definition & ::=
column_name &data_type&
[ NULL | NOT NULL ]
[ COLLATE collation_name ]
[ CONSTRAINT constraint_name ] DEFAULT constant_expression ]
| [ IDENTITY [ ( seed ,increment ) ] [ NOT FOR REPLICATION ]
[ ROWGUIDCOL ] [ &column_constraint& [ ...n ] ]
&data type& ::=
[ type_schema_name . ] type_name
[ ( precision [ , scale ] | MAX | xml_schema_collection ) ]
sql_server_native_type | type_name
&column_constraint& ::=
[ CONSTRAINT constraint_name ]
{ PRIMARY KEY | UNIQUE }
[ CLUSTERED | NONCLUSTERED ]
WITH FILLFACTOR = fillfactor
| WITH ( & index_option &[, ...n ] )
[ ON { partition_scheme_name ( partition_column_name )
| filegroup | " DEFAULT " } ]
| [ FOREIGN KEY ]
REFERENCES [ schema_name . ] referenced_table_name [ ( ref_column ) ]
[ ON DELETE { NO ACTION | CASCADE | SET NULL | SET DEFAULT } ]
[ ON UPDATE { NO ACTION | CASCADE | SET NULL | SET DEFAULT } ]
[ NOT FOR REPLICATION ]
| CHECK [ NOT FOR REPLICATION ] ( logical_expression )
&computed_column_definition& ::=
column_name AS computed_column_expression
[ PERSISTED [ NOT NULL] ]
[ CONSTRAINT constraint_name ]
{ PRIMARY KEY | UNIQUE }
[ CLUSTERED | NONCLUSTERED ]
WITH FILLFACTOR = fillfactor
| WITH ( &index_option& [, ...n ] )
| [ FOREIGN KEY ]
REFERENCES ref_table [ ( ref_column ) ]
[ ON DELETE { NO ACTION | CASCADE } ]
[ ON UPDATE { NO ACTION } ]
[ NOT FOR REPLICATION ]
| CHECK ( logical_expression )
[ ON { partition_scheme_name ( partition_column_name )
| filegroup | " DEFAULT " } ]
& table_constraint & ::=
[ CONSTRAINT constraint_name ]
{ PRIMARY KEY | UNIQUE }
[ CLUSTERED | NONCLUSTERED ]
(column [ ASC | DESC ] [ ,...n ] )
WITH FILLFACTOR = fillfactor
|WITH ( &index_option& [, ...n ] )
[ ON { partition_scheme_name (partition_column_name)
| filegroup | " DEFAULT " } ]
| FOREIGN KEY
( column [ ,...n ] )
REFERENCES ref_table [ ( ref_column [ ,...n ] ) ]
[ ON DELETE { NO ACTION | CASCADE | SET NULL | SET DEFAULT } ]
[ ON UPDATE { NO ACTION | CASCADE | SET NULL | SET DEFAULT } ]
[ NOT FOR REPLICATION ]
| CHECK [ NOT FOR REPLICATION ] ( logical_expression )
&index_option& ::=
PAD_INDEX = { ON | OFF }
| FILLFACTOR = fillfactor
| IGNORE_DUP_KEY
= { ON | OFF }
| STATISTICS_NORECOMPUTE = { ON | OFF }
| ALLOW_ROW_LOCKS= { ON | OF}
| ALLOW_PAGE_LOCKS={ ON | OF}
其中,各个参数的具体说明如下:
l&,是新表所属于的模式名。
l&,定义SQL Server物理存储计算值到表中,当计算列依赖的任何其他列值发生改变的时候,更新值。
l&,定义表所在的分区模式或者文件组。如果选择,表是一个分区表。如果定义为,表存储在文件组中。文件组必须位于数据库中。
l&,定义列的数据类型,以及所属于的模式,数据类型可以是:类型、用户自定义类型。
l&,定义数据类型的精度。
l&,定义数据类型的刻度。
l&,只能用于和数据类型,存储字节的字符串或者二进制数据,或者的Unicode数据。
l&,只应用于XML数据类型,将XML模式同类型关联起来。在将一个XML列输入到模式中时,首先必须使用CREATE XML SCHEMA COLLECTION语句在数据库中创建模式。
l&,表示FOREIGN KEY约束引用的表名及其所属于的模式名。
l&,表示定义文件组的分区模式名。
l&,定义用于对一个表的数据进行分区的列名。
l&,定义SQL Server如何使用索引页存储索引数据。用户自定义的填充因子值的范围为1到100。如果没有定义该值,默认为0。
l&,定义一个或者多个索引选项,对于选项的说明,请参考CREATE INDEX语句的语法。
l&,当设置为ON的时候,FILLFACTOR定义的空闲空间的百分比应用于索引的中间层页。当定义为OFF或者没有指定的时候,中间层页填充几乎整个空间,只保留存储最大索引一行数据的空间。默认值为OFF。
l&,定义指示SQL Server在创建和修改索引的时候,如何创建索引页的页层。取值范围为1到100,默认值为0。
l&,定义在对唯一集群索引执行多行INSERT事务的时候,出现重复键值的错误响应。当设置为ON时,如果行破坏了唯一索引,将显示一个警告消息,插入行失败。当设置为OFF的时候,如果行破坏唯一索引,将提供一个错误消息,整个INSERT语句回滚。当处理UPDATE语句的时候,没有影响,默认值为OFF。
l&,当设置为ON的时候,过期索引统计信息不会自动被重新计算。当设置为OFF的时候,自动更新统计信息,默认值为OFF。
l&,当设置为ON的时候,当访问索引的时候,支持行锁。数据库引擎确定何时使用行锁。如果设置为OFF,不使用行锁,默认值为ON。
l&,当设置为ON的时候,当访问索引的时候,支持页锁。数据库引擎确定何时使用页锁。当设置为OFF的时候,不使用页锁。默认值为ON。
假设要求在企业信息平台数据库EAMS中创建数据表,如表1所示,表示个人的通信录信息,包括通信录ID、类别、人员ID、通信录人员姓名、性别、人员编码、Email地址、办公室电话、办公室传真、移动电话、地址等信息。
表1 &clCommunicationsList表结构
通信录类别名称
通信录人员名
人员Email地址
办公室电话
办公室传真
创建表的Transact-SQL语句如下:
USE [EAMS]
SET ANSI_NULLS ON
SET ANSI_PADDING OFF
CREATE TABLE [dbo].[clCommunicationsList](
[CommunicationID] [int] IDENTITY(127,1) NOT NULL,
[CategoryName] [varchar](50) COLLATE Chinese_PRC_CI_AS NOT NULL,
[EmpID] [int] NOT NULL,
[COMName] [varchar](50) COLLATE Chinese_PRC_CI_AS NOT NULL,
[EmpCode] [varchar](20) COLLATE Chinese_PRC_CI_AS NULL,
[Sex] [bit] NOT NULL,
[Email] [varchar](50) COLLATE Chinese_PRC_CI_AS NULL,
[OfficeTel] [varchar](50) COLLATE Chinese_PRC_CI_AS NULL,
[OfficeFax] [varchar](20) COLLATE Chinese_PRC_CI_AS NULL,
[Mobile] [varchar](20) COLLATE Chinese_PRC_CI_AS NULL,
[Position] [varchar](50) COLLATE Chinese_PRC_CI_AS NULL,
[Province] [varchar](32) COLLATE Chinese_PRC_CI_AS NULL,
[City] [varchar](32) COLLATE Chinese_PRC_CI_AS NULL,
[District] [varchar](32) COLLATE Chinese_PRC_CI_AS NULL,
[Street] [varchar](32) COLLATE Chinese_PRC_CI_AS NULL,
[PostCode] [varchar](20) COLLATE Chinese_PRC_CI_AS NULL,
[Tel1] [varchar](20) COLLATE Chinese_PRC_CI_AS NULL,
[Tel2] [varchar](20) COLLATE Chinese_PRC_CI_AS NULL,
[note] [varchar](1000) COLLATE Chinese_PRC_CI_AS NULL CONSTRAINT [DF_clCommunicationsList_DelFlag]
DEFAULT (0)
CONSTRAINT [PK_clCommunicationsList] PRIMARY KEY CLUSTERED
[CommunicationID] ASC,
[CategoryName] ASC,
[EmpID] ASC
) ON [PRIMARY]
) ON [PRIMARY]
SET ANSI_PADDING ON
SET ANSI_NULLS OFF
类似可以创建企业信息平台的企业表结构。
&企业信息平台的
当创建了表之后,根据特定情况,可能需要对所创建好的表进行修改操作,如修改列名、数据类型、类型长度、默认值等属性。修改表的列定义相对较为简单。可以在SQL Server Management Studio中采用图形方式,也可以采用Transact-SQL语句完成。例如,修改企业信息平台数据库表mrBaseInf,将办公室电话号码OfficeTel长度从50修改为20。
采用图形方式修改表的步骤如下:
打开SQL Server Management Studio,在&对象资源管理器&视图中,展开EAMS数据库,如图6所示。
图6 &选择EAMS数据库
选中&mrBaseInf&表,单击鼠标右键,选择&修改表&菜单项,如图7所示。
图7 &修改表
打开表的定义视图,如图8所示。
图8 &mrBaseInf表结构
选择&OfficeTel&列,在列属性视图中,将长度从50修改为20,如图9所示。
图9 &修改列定义
如果还需要修改其它列定义,可以参考类似操作,单击工具栏上的按钮,保存修改即可。
&企业信息平台的
当某些表不再需要的时候,可以删除数据库中的某些表。删除数据表的操作可以在SQL Server Management Studio中,或者采用Transact-SQL语句完成。
(1)使用SQL Server Management Studio删除表
使用SQL Server Management Studio删除表的步骤如下:
在SQL Server Management Studio中的&对象资源管理器&视图中,选中需要删除的表,单击鼠标右键,如图10所示。
图10 删除表
选择&删除&菜单项,弹出&删除对象&对话框,单击&确定&按钮,删除表,如图11所示。
图11 &确定删除表
(2)使用Transact-SQL语句删除表
使用Transact-SQL语句删除表的语句是DELETE TABLE,语法如下:
参数说明如下:
l&,表示表所在的数据库名。
l&,表示表属于的模式名。
l&,需要删除的表名。
l&,表示在任何数据库中删除多个表。如果删除的表引用了另一个表的主键,则另一个表也被删除。
假定需要删除所创建的企业信息平台数据表mrBaseInf。可以采用Transact-SQL语句删除数据表,其语句如下:
USE&[EAMS]
DROP&TABLE&[dbo].[&mrBaseInf]
USE&[master]
索引机制是提升数据库性能的重要机制。SQL Server提供了对索引的良好支持,提供了多种类型的索引机制,方便开发人员在适当的时候创建特定的索引。
2.1 &索引基础
SQL Server
通过定义索引,可以提高查询速率,节省响应时间。
图 12 &索引结构
使用两种基本类型的索引:聚集索引和非聚集索引。这两类索引都可以对多个列进行索引,在这种情况下也可以称它们为组合索引。依据查询使用索引的方式,还可以将其称为覆盖索引()。在SQL Server中,还支持唯一索引、索引视图、全文索引和XML索引。
(1)非聚集索引
如图13所示,
典型的桌面数据库使用的是非聚集索引。在这类索引中,索引键值是有序的,而每个索引节点所指向的数据行是无序的。一个表最多可以拥有255个非聚集索引。
图 13 &非聚集索引结构
(2)聚集索引
如图14所示,
系统数据库表
图14 &聚集索引结构
对于聚集索引,人们往往有一些错误的认识。其中,最常见的错误有:
l&聚集索引会降低insert操作的速度,因为必须要向后移动一半的数据来为新插入的行腾出空间。这种认识是错误的,因为可以利用填充因子控制填充的百分比,从而在索引页上为新插入的数据保留空间。如果索引页填满了,将会进行页拆分,在这种情况下只有第一个页才会受到影响。
l&在使用标识列的主键上创建聚集索引是一种好的设计方法,它可以使对表的操作达到最快速度。这种认识是错误的,它浪费了创建其它更有效的聚集索引的机会。并且,使用这种方法会把每个新插入的记录行都存储到表尾部的同一个的数据页中,这将导致数据库的热点和锁争用。笔者曾经见过采用这种方法设计的数据库,对于每一个新订单,客户服务人员都不得不等待数分钟来加以确认。
l&聚集索引是具有魔力的。如果哪个查询的速度不够快,那么就在该列上创建聚集索引,对于表的操作速度一定会得到提高。这种认识也是错误的,聚集索引只是比非聚集索引稍稍快了那么一点点。因为在每个表上只能创建一个聚集索引,所以它也是一种宝贵的性能资源,只有在那些经常作为条件查询一组记录行的列上才应该建立聚集索引。
(3)唯一索引
唯一索引可以确保索引列不包含重复的值。在多列唯一索引的情况下,该索引可以确保索引列中每个值组合都是唯一的。例如,如果在 last_name、first_name 和 middle_initial 列的组合上创建了唯一索引 full_name,则该表中任何两个人都不可以具有相同的全名。
聚集索引和非聚集索引都可以是唯一的。因此,只要列中的数据是唯一的,就可以在同一个表上创建一个唯一的聚集索引和多个唯一的非聚集索引。
只有当唯一性是数据本身的特征时,指定唯一索引才有意义。如果必须实施唯一性以确保数据的完整性,则应在列上创建 UNIQUE 或 PRIMARY KEY 约束,而不要创建唯一索引。例如,如果打算经常查询雇员表(主键为 emp_id)中的社会安全号码 (ssn) 列,并希望确保社会安全号码的唯一性,则在 ssn 列上创建 UNIQUE 约束。如果用户为一个以上的雇员输入了同一个社会安全号码,则会显示错误。
(4)索引视图
复杂报表的场景经常会在数据仓储应用程序中遇到,它在查询过程中会对数据库服务器产生大量请求。当这些查询访问视图时,因为数据库将建立视图结果集所需的逻辑合并到从基本表数据建立完整查询结果集所需的逻辑中,所以性能将会下降。这一操作的开销可能会比较大,尤其当视图涉及到复杂的大量行处理--如大量数据聚合或多表联结时。因为结果集并不永久存放在数据库(标准视图)中,以后对该视图的访问可能导致在每次执行查询时建立结果集的代价。
SQL Server允许为视图创建独特的聚集索引,从而让访问此类视图的查询的性能得到极大地改善。在创建了这样一个索引后,视图将被执行,结果集将被存放在数据库中,存放的方式与带有聚集索引的表的存放方式相同。这就在数据库中有效地实现了查询结果。对于那些在FROM子句中不直接指定视图名的查询,SQL Server查询优化器将使用视图索引。现有查询将受益于从索引视图检索数据而无需重新编写程序原码的高效率。对于某些特定类型的视图,甚至可以获得指数级的性能改善。
如果在视图上创建索引,那么视图中的数据会被立即存储在数据库中,对索引视图进行修改,那么这些修改会立即反映到基础表中。同理,对基础表所进行的数据修改也会反映到索引视图那里。索引的惟一性大大提高了SQL Server 查找那些被修改的数据行。
维护索引视图比维护基础表的索引更为复杂。所以,如果认为值得以因数据修改而增加系统负担为代价来提高数据检索的速度,那么应该在视图上创建索引。
设计索引视图时,请考虑以下准则:
l&设计的索引视图必须能用于多个查询或多个计算。 例如,包含某列的 SUM 和某列的 COUNT_BIG 的索引视图可用于包含函数 SUM、COUNT、COUNT_BIG 或 AVG 的查询。由于只需检索视图中的少数几行,而不是基表中的所有行,且执行 AVG 函数要求的部分计算已经完成,所以查询将比较快。
l&使索引保持紧凑。 通过使用最少的列数和尽可能少的字节数,优化器在查找行数据时可获得最高的效率。相反,如果定义了大的群集索引关键字,则为视图定义的任何辅助性非群集索引都将明显增大,这是因为非群集索引项除包含索引定义的列之外,还将包含群集关键字。
l&考虑生成的索引视图的大小。 在单纯的聚合情况下,如果索引视图的大小类似于原表的大小,使用索引视图可能无法明显提高任何性能。
l&设计多个较小的索引视图来加快部分进程的速度。 有时可能无法设计出能满足整个查询需要的索引视图。此时即可考虑创建这样一些索引视图,每个索引视图执行一部分查询。
在为视图创建索引前,视图本身必须满足以下条件:
l&视图以及视图中引用的所有表都必须在同一数据库中,并具有同一个所有者。
l&索引视图无需包含要供优化器使用的查询中引用的所有表。
l&必须先为视图创建唯一群集索引,然后才可以创建其它索引。
l&创建基表、视图和索引以及修改基表和视图中的数据时,必须正确设置某些 SET 选项(在本文档的后文中讨论)。另外,如果这些 SET 选项正确,查询优化器将不考虑索引视图。
l&视图必须使用架构绑定创建,视图中引用的任何用户定义的函数必须使用 SCHEMABINDING 选项创建。
l&另外,还要求有一定的磁盘空间来存放由索引视图定义的数据。
在视图上创建了索引之后,如果打算修改视图数据,则应该保证修改时的选项设置与创建索引时的选项设置一样,否则SQL Server 将产生错误信息,并回滚所做的INSERT、UPDATE 和DELETE 操作。
并非所有查询都会从索引视图中获益。与普通索引类似,如果未使用索引视图,就没有好处可言。在此情况下,不但不能提高性能,还会加大磁盘空间的占用、增加维护和优化的成本。但是,如果使用了索引视图,它们可以(成数量级地)明显地提高数据访问的性能。这是因为查询优化器使用存储在索引视图中的预先计算的结果,从而大大降低了执行查询的成本。
查询优化器只在查询的成本比较大时才考虑使用索引视图。这样可以避免在查询优化成本超出因使用索引视图而节省的成本时,试图使用各种索引视图。当查询成本低于 1 时,几乎不使用索引视图。
使用索引视图可以受益的应用包括:
l&决定支持工作量
l&数据集市
l&联机分析处理 (OLAP) 库和源
l&数据挖掘工作量
从查询的类型和模式的角度来看,受益的应用可被归纳为包含以下内容的应用:
l&大表的联接和聚合
l&查询的重复模式
l&重复聚合相同或重叠的列集
l&针对相同关键字重复联接相同的表
l&上述的组合
相反,包含许多写入的联机事务处理 (OLTP) 系统或更新频繁的数据库,可能会因为要同时更新视图和根本基表而使维护成本增加,所以不能利用索引视图。
SQL Server 自动维护索引视图,这与维护任何其它索引的情况类似。对于普通索引而言,每个索引都直接连接到单个表。通过对基础表执行每个 INSERT、UPDATE 或 DELETE 操作,索引相应地进行了更新,以便使存储在该索引中的值始终与表一致。
索引视图的维护与此类似。不过,如果视图引用了多个表,则对这些表中的任何一个进行更新都需要更新索引视图。与普通索引不同的是,对任何一个参与的表执行一次行插入操作都可能导致在索引视图中进行多次行插入操作。更新和删除操作的情况也是如此。因此,较之于维护表的索引,维护索引视图的代价更为高昂。
在 SQL Server 中,某些视图可以更新。如果某个视图可以更新,则使用 INSERT、UPDATE 和 DELETE 语句可通过该视图直接修改根本基表。为某个视图创建索引并不会妨碍该视图的更新。
l&标量聚合,包括 SUM 和不带 GROUP BY 的 COUNT_BIG。
l&标量表达式和用户定义的功能 (UDFs)。例如,给定一个表 T(a int, b int, c int) 和一个标量 UDF dbo.MyUDF(@x int),T 上定义的索引视图可包含一个计算列(比如:a+b 或 dbo.MyUDF(a))。
l&不精确的永久性列。不精确的列是一种浮型或实型的列,或者是一种派生自浮型或实型列的计算列。在 SQL Server 2000 中,如果不属于索引键的一部分,不精确的列就可用于索引视图的选择列表。不精确的列不能用于视图定义中的其他地方(比如:WHERE 或 FROM 子句)。如果不精确的列永久保存在基表中,那么 SQL Server 允许其加入键或视图定义。永久性列包含常规列和标记为 PERSISTED 的计算列。
l&不精确的非永久性列无法加入索引或索引视图的根本原因是:必须使数据库脱离原计算机,然后再附加到另一台计算机。完成转移之后,保存在索引或索引视图中的所有计算列值在新硬件上的派生方式必须与旧硬件完全相同,精确到每个位。否则,这些索引视图在新硬件上会遭到逻辑破坏。由于这种破坏,在新硬件上,针对索引视图的查询会根据计划是否使用了索引视图或基表来派生视图数据,返回不同的应答。此外,无法在新计算机上正常维护索引视图。可惜,不同计算机上的浮点硬件(即便采用相同制造商的相同处理器体系结构)在处理器的版本上并不总是完全相同。对于某些浮点值 a 和 b,固件升级可能导致新硬件上的 (a*b) 不同于旧硬件上的 (a*b)。例如,结果可能非常相近,但仍存在细微差别。在进行索引之前一直保留不精确的计算值可解决这种分离/附加的不一致性问题,因为在进行索引和索引视图的数据库更新和维护期间,在相同的计算机上评估了所有表达式。
l&通用语言运行时 (CLR) 类型。SQL Server 的一个主要的新功能是支持基于 CLR 的用户定义的类型 (UDT) 和 UDF。假如列或表达式具有确定性或是永久且精确的,或者二者兼具,那么就可在 CLR UDT 列或从这些列派生而来的表达式上定义索引视图。不能在索引视图上使用 CLR 用户定义的聚合。
优化器匹配查询和索引视图(使之可在查询计划中使用)的功能经扩展包含:
l&新的表达式类型,位于查询或视图的 SELECT 列表或条件中,涉及:标量表达式(比如 (a+b)/2)、标量聚合、标量 UDF。
l&间隔归入。优化器可检测索引视图定义中的间隔条件是否覆盖或&归入&查询中的间隔条件。例如,优化器可确定&a&10 and a&20&覆盖&a&12 and a&18&。
l&&表达式等价。某些表达式虽然在语法上有所不同,但最终的结果却相同,那么可以将其视为等价。例如,&a=b and c&&10&与&10&&c and b=a&等价。
(4)全文索引
全文索引可以对存储在SQL Server数据库中的文本数据执行快速检索功能。同LIKE谓词不同,全文索引只对字符模式进行操作,对字和语句执行搜索功能。全文索引对于查询非结构化数据非常有效。一般情况下,可以对char、varchar和nvarchar数据类型的列创建全文索引,同时,还可以对二进制格式的列创建索引,如image和varbinary数据类型列。对于这些二进制数据,无法使用LIKE谓词。
为了对表创建全文索引,表必须包含单个、唯一、非空列。当执行全文检索的时候,SQL Server搜索引擎返回匹配搜索条件的行的键值。一般情况,使用sql server中的全文索引,经过大体4个步骤:
l&安装全文索引服务;
l&为数据表建立全文索引目录;
l&使全文索引与数据表内容同步;
l&使用全文索引进行查询。
(5)XML索引
Microsoft SQL Server 以 XML 数据类型的形式添加了内置的 XML 支持。XML 数据可以存储在 XML 数据类型列内部。另外,通过将一个 XML 方案集合与此 XML 数据类型列关联,还可以对其进行进一步的限制。存储在 XML 数据类型列中的 XML 值可以借助 XQuery 和 XML 数据修改语言 (DML) 进行处理。可以在 XML 数据上建立索引,以增强查询性能。此外,FOR XML 和 OPENXML 也已得到增强,能够支持新的 XML 数据类型。
SQL Server 中引入的存储和处理 XML 数据的新功能与 SQL Server 早期版本中提供的 XML 功能结合在一起,为开发人员提供了多种在 XML 应用程序中存储和处理 XML 数据的方法。由于使用 SQL Server 提供的方法,有多种方法可以生成 XML 应用程序,因此,了解各种不同技术的方案,以及如何在各种技术之间进行权衡和配合对于作出正确的选择是至关重要的。本文提供了如何选择适当的方法,使用 SQL Server 开发 XML 应用程序的指南。
针对XML数据类型,SQL Server提供了XML索引类型。XML索引是在xml数据类型列上创建的索引,同其他索引类似,XML索引可以提高查询性能。
2.2 &创建索引
确定了索引设计后,便可以在数据库的表上创建索引。创建索引时须考虑的其它事项包括:
l&只有表的所有者可以在同一个表中创建索引。
l&每个表中只能创建一个聚集索引。
l&每个表可以创建的非聚集索引最多为 249 个(包括 PRIMARY KEY 或 UNIQUE 约束创建的任何索引)。
l&包含索引的所有长度固定列的最大大小为 900 字节。例如,不可以在定义为 char(300)、char(300) 和 char (301) 的三个列上创建单个索引,因为总宽度超过了 900 字节。
l&包含同一索引的列的最大数目为 16。
在使用 CREATE INDEX 语句创建索引时,必须指定索引、表以及索引所应用的列的名称。作为 PRIMARY KEY 或 UNIQUE 约束的一部分或使用 SQL Server 企业管理器创建的新索引,会根据数据库表的名称,自动获得系统定义的名称。如果在一个表上创建多个索引,这些索引的名称被追加 _1、_2 等。必要时可对索引重新命名。
当需要创建索引的时候,可以采用多种方式,可以在SQL Server Management Sudio中采用图形工具创建索引,也可以执行Transact-SQL语句创建索引,下面我们分别进行介绍。
(1)使用SQL Server Management Sudio图形工具创建索引
使用SQL Server Management Sudio图形工具创建索引的步骤如下:
打开SQL Server Management Studio,在&对象资源管理器&视图中双击需要创建索引的数据库,展开需要创建索引的表,选择&索引&节点,单击鼠标右键,如图15所示。
图 15 &&新建索引
选择&新建索引&菜单项,打开&新建索引&对话框的&常规&视图,如图16所示。
图 16 &&常规&视图
在该对话框中,定义:
l&索引的名称;
l&索引的类型;
l&索引列。
当添加索引列的时候,单击&添加&按钮,将打开创建索引的表,如图17所示,用户可以指定索引列。
图 17 &定义索引列
在&选项&对话框中,定义索引的相关选项,如图18所示。
图 18 &定义索引选项
选项说明:
l&&删除现有索引&,&删除现有索引&只有当对话框处于重新创建状态才变为有效,在这种情况下,&重新生成索引&不可用。
l&&重新生成索引&,重新创建索引。当对话框打开的时候,选项默认没有选中。
l&&忽略重复的值&,
l&&自动重新计算统计信息&,
l&&在访问索引时使用行锁&,支持行层锁。默认情况下,SQL Server在页层、行层或者表层锁机制之间进行选择。当清除该选项,索引不使用行层锁机制。默认情况下,选中该选项。
l&&在访问索引时使用页锁&,支持也层锁机制。默认情况下,SQL Server在页层、行层或者表层锁机制之间进行选择。当清除该选项,索引不使用页层锁机制。默认情况下,选中该选项。
l&&将中间排序结果存储在中&,将用于创建索引的中间排序结果存储在tempdb数据库中。默认情况下,没有选中该选项,该选项只有在对话框处于重新创建状态或者重新生成状态的时候才可用。
l&&设置填充因子&, 。
l&&填充索引&,
l&&运行在创建索引时在线处理DML语句&:允许用户并发在索引操作过程中,访问底层表、聚集索引数据和任何相关非聚集索引。该选项默认情况下没有被选中,只有在对话框处于重新创建状态才可用。
l&&设置最大并行度&,限制在并行计划执行过程中使用的处理器数量,默认值为0,使用实际可用的CPU,取值为1表示压缩并行计划生成;设置大于1的数字,表示在单个查询过程中使用的处理器的最大数量。
l&&使用索引&,将索引可用。
在&包含性列&对话框中,定义索引中包含的其他列,如图19所示。当选择聚集索引和XML索引时,无法添加列,当选择非聚集索引类型的时候,可以添加索引列。
图 19 &定义索引所包含的其他列
在&存储&对话框中,定义索引的存储选项,包括定义文件组、分区模式等参数,如图20所示。
图 20 &定义索引的存储选项
当完成定义之后,单击&确定&按钮,完成对索引的定义,SQL Server数据库引擎将创建索引。
(2)使用Transact-SQL语句创建索引
SQL Server提供了CREATE INDEX Transact-SQL语法,用于创建索引,其语法格式如下:
创建关系索引的语法:
CREATE [ UNIQUE ] [ CLUSTERED | NONCLUSTERED ] INDEX index_name
ON &object& ( column [ ASC | DESC ] [ ,...n ] )
[ INCLUDE ( column_name [ ,...n ] ) ]
[ WITH ( &relational_index_option& [ ,...n ] ) ]
[ ON { partition_scheme_name ( column_name )
| filegroup_name
&object& ::=
[ database_name. [ schema_name ] . | schema_name. ]
table_or_view_name
&relational_index_option& ::=
= { ON | OFF }
| FILLFACTOR = fillfactor
| SORT_IN_TEMPDB = { ON | OFF }
| IGNORE_DUP_KEY = { ON | OFF }
| STATISTICS_NORECOMPUTE = { ON | OFF }
| DROP_EXISTING = { ON | OFF }
| ONLINE = { ON | OFF }
| ALLOW_ROW_LOCKS = { ON | OFF }
| ALLOW_PAGE_LOCKS = { ON | OFF }
| MAXDOP = number_of_processors
创建XML索引的语法:
CREATE [ PRIMARY ] XML INDEX index_name
ON &object& ( xml_column_name )
[ USING XML INDEX xml_index_name
[ FOR { VALUE | PATH } ]
[ WITH ( &xml_index_option& [ ,...n ] ) ]
&object& ::=
[ database_name. [ schema_name ] . | schema_name. ]
table_name
&xml_index_option& ::=
= { ON | OFF }
| FILLFACTOR = fillfactor
| SORT_IN_TEMPDB = { ON | OFF }
| STATISTICS_NORECOMPUTE = { ON | OFF }
| DROP_EXISTING = { ON | OFF }
| ALLOW_ROW_LOCKS = { ON | OFF }
| ALLOW_PAGE_LOCKS = { ON | OFF }
| MAXDOP = number_of_processors
向后兼容的关系索引创建语法:
CREATE [ UNIQUE ] [ CLUSTERED | NONCLUSTERED ] INDEX index_name
ON &object& ( column_name [ ASC | DESC ] [ ,...n ] )
[ WITH &backward_compatible_index_option& [ ,...n ] ]
[ ON { filegroup_name | default } ]
&object& ::=
[ database_name. [ owner_name ] . | owner_name. ]
table_or_view_name
&backward_compatible_index_option& ::=
| FILLFACTOR = fillfactor
| SORT_IN_TEMPDB
| IGNORE_DUP_KEY
| STATISTICS_NORECOMPUTE
| DROP_EXISTING
参数说明:
l&,索引所在的数据库名。
l&,索引所在的模式名。
l&,或者视图
l&,表示索引创建所在的XML列。在单个XML索引定义中,只能定义在一个XML列上。但是,可以在单个XML列上创建多个辅助XML索引。主XML索引不能在计算XML列上创建。
l&,定义在创建副本XML索引中使用的主XML索引。
l&,FOR VALUE用于在主XML索引的列上创建副本索引。FOR PATH用于在主XML索引的列上创建副本索引。
l&,定义添加到非聚集索引页级的非键列。
l&,定义分区模式。分区模式用于定义分区索引映射的文件组。
表2 &填充索引页说明
表 3 &IGNORE_DUP_KEY使用情况
l&,当设置为ON的时候,长项表锁不允许对底层表进行查询或者更新操作。当设置为OFF的时候,应用表锁机制。默认值为OFF。
l&,当设置为ON,当访问索引时,支持行级锁。当设置为OFF时,不使用行级锁。默认为ON。
l&,当设置为ON,当访问索引时,支持页级锁。当设置为OFF时,不使用页级锁。默认为ON。
l&,覆盖&&配置选项的值。使用&&限制在并行计划执行过程中使用的处理器数量,默认值为0,使用实际可用的CPU,取值为1表示压缩并行计划生成;设置大于1的数字,表示在单个查询过程中使用的处理器的最大数量。
例如,下面给出创建索引的SQL语句。
USE&[EAMS]
CREATE&NONCLUSTERED&INDEX&[ix_name] ON&[dbo].[mrBaseInf]
[EmpName] ASC
)WITH&(PAD_INDEX &=&OFF,&SORT_IN_TEMPDB =&OFF,&DROP_EXISTING =&OFF,&IGNORE_DUP_KEY =&OFF,&ONLINE =&OFF)&ON&[PRIMARY]
2.3 &查看和修改索引
当在数据库上创建了索引之后,可以在SQL Server Management Sudio中查看和修改索引,为此,可以采用SQL Server Management Studio的图形工具或者使用Transact-SQL语句修改索引。
(1)使用SQL Server Management Studio图形工具查看和修改索引
使用SQL Server Management Studio图形工具查看和修改索引步骤如下:
打开SQL Server Management Studio,在&对象资源管理器&视图中展开&Database&节点,然后选择某个数据库,如选择数据库&EAMS&,双击&表&节点,展开表,选择&索引&节点,如图21所示。
图 21 &选择&Index&节点
展开&索引&节点,可以看到在表上所创建的索引,如图22所示。
图 22 &展开&索引&
选择某个索引,单击鼠标右键选择&属性&菜单项,打开&索引属性&对话框,用户可以查看和修改索引选项,如图23所示。
图 23 &查看和修改索引
当修改完成之后,单击&确定&按钮,保存索引修改。
(2)使用Transact-SQL语句查看和修改索引
当需要修改索引的选项时,可以使用ALTER INDEX语句完成,其语法格式如下:
ALTER INDEX { index_name | ALL }
ON &object&
[ [ WITH ( &rebuild_index_option& [ ,...n ] ) ]
| [ PARTITION = partition_number
[ WITH ( &single_partition_rebuild_index_option&
[ ,...n ] )
| REORGANIZE
[ PARTITION = partition_number ]
[ WITH ( LOB_COMPACTION = { ON | OFF } ) ]
| SET ( &set_index_option& [ ,...n ] )
&object& ::=
[ database_name. [ schema_name ] . | schema_name. ]
table_or_view_name
&rebuild_index_option & ::=
= { ON | OFF }
| FILLFACTOR = fillfactor
| SORT_IN_TEMPDB = { ON | OFF }
| IGNORE_DUP_KEY = { ON | OFF }
| STATISTICS_NORECOMPUTE = { ON | OFF }
| ONLINE = { ON | OFF }
| ALLOW_ROW_LOCKS = { ON | OFF }
| ALLOW_PAGE_LOCKS = { ON | OFF }
| MAXDOP = number_of_processors
&single_partition_rebuild_index_option& ::=
SORT_IN_TEMPDB = { ON | OFF }
| MAXDOP = number_of_processors
&set_index_option&::=
ALLOW_ROW_LOCKS= { ON | OFF }
| ALLOW_PAGE_LOCKS = { ON | OFF }
| IGNORE_DUP_KEY = { ON | OFF }
| STATISTICS_NORECOMPUTE = { ON | OFF }
参数说明请参考Create Idex语句语法的参数说明。
如果需要修改索引的名称,可以使用sp_rename存储过程完成,其语法格式如下:
l&,表示对象名;
l&,表示新的名称。
l&,在此为&INDEX&。
返回0,表示成功,返回非零表示失败。
当需要查看索引时,SQL Server提供了几个视图和函数,用于显示索引元数据信息。例如,可以显示特定表上的索引类型、索引选项和索引整个空间使用情况。
用于返回索引元数据的视图包括:
l&,包括索引类型、文件组或者分区模式ID、索引当前选项的设置。
l&,包括列ID、在索引中的位置、类型和排序规则;
l&,同索引相关的统计信息;
l&,同统计相关的列ID;
l&,XML索引类型、路径表达式、辅助类型和描述信息。
同时,SQL Sever还提供了几个函数,用于返回元数据:
l&,显示索引规模和分段统计信息;
l&,显示当前索引和表I/O统计信息;
l&,显示在索引中索引列的位置和列排序规则;
l&,显示索引类型、当前设置;
l&,显示索引的键列名。
2.4 &删除索引
使用索引可以提高数据库查询的性能,但索引同样需要数据库的开销。当某些索引不需要的时候,需要删除这些索引。删除索引可以直接在SQL Server Management Studio中采用图形方式完成,也可以通过执行Transact-SQL语句完成。
(1)使用SQL Server Management Studio图形工具删除索引
使用SQL Server Management Studio图形工具删除索引的步骤如下:
打开SQL Server Management Studio,在&对象资源管理器&视图中展开&数据库&节点,然后选择某个数据库,如选择 &EAMS&,双击&表&节点,展开表,选择&索引&节点,如图24所示。
图 24 &选择&索引&节点
展开&索引&节点,可以看到在表上所创建的索引,如图25所示。
图 25 &展开&索引&
选择某个需要删除的索引,单击鼠标右键,选择&删除&菜单项,打开&删除对象&对话框,如图26所示。
图 26 &&删除对象&对话框
当确定删除时,单击&确定&按钮,完成删除操作。
(2)使用Transact-SQL语句删除索引
当需要使用Transact-SQL语句删除索引时,采用DROP INDEX语句,其语法格式如下:
DROP INDEX
{ &drop_relational_or_xml_index& [ ,...n ]
| &drop_backward_compatible_index& [ ,...n ]
&drop_relational_or_xml_index& ::=
index_name ON &object&
[ WITH ( &drop_clustered_index_option& [ ,...n ] ) ]
&drop_backward_compatible_index& ::=
[ owner_name. ] table_or_view_name.index_name
&object& ::=
[ database_name. [ schema_name ] . | schema_name. ]
table_or_view_name
&drop_clustered_index_option& ::=
MAXDOP = number_of_processors
| ONLINE = { ON | OFF }
| MOVE TO { partition_scheme_name ( column_name )
| filegroup_name
l&,表示需要删除的索引名;
l&,表示索引所在的数据库名称;
l&,表示索引所在的模式名;
l&,表示索引所在的表或者视图的名称;
l&,控制聚集索引选项,这个选项不能同其他索引类型一起使用。
l&,重写&&选项。
l&,当设置为ON的时候,长项表锁不允许对底层表进行查询或者更新操作。当设置为OFF的时候,应用表锁机制。默认值为OFF。
l&,定义聚集索引页级的数据行移动的位置。
l&,定义存储结果表的分区模式。
l&,定义存储结果表的文件组。
l&,定义存储结果表的默认位置。
当某个索引不能明显改进查询效率时候,需要将索引删除,以节省资源,因为索引是需要耗费代价的。下面我们以删除2.3一节所创建的索引&ix_name&为例,使用Drop Index命令删除索引,其Transact-SQL语句如下:
ix_namemrBaseInf
视图是关系数据库的一个重要概念,它为数据呈现提供了更多的表现形式,并提供了数据的访问控制能力,让用户只看到他们权限限制范围内的数据,保护企业的敏感数据。本节将结合企业信息平台数据库的实例,介绍视图的基本概念,以及如何使用多种方式创建、修改、删除视图。
3.1 &视图基础
视图(也称虚表)是用户查看数据表中数据的一种方式,用户可以通过它来浏览表中感兴趣的部分或全部数据。而数据库的物理存储位置仍然在表中,这些表称为视图的基表。视图可以从一个或多个基表中派生,也可以从其他视图中派生。需要注意,图27显示了在两个表上所创建的一个视图。
图 27 &视图示例
使用视图,最大的优势如下:
l&限定特定的数据,
l&简化数据操作,视图可以简化用户操作数据的方式。可将经常使用的联接、投影、联合查询和选择查询定义为视图,这样,用户每次对特定的数据执行进一步操作时,不必指定所有条件和限定。例如,一个用于报表目的,并执行子查询、外联接及聚合以从一组表中检索数据的复合查询,就可以创建为一个视图。视图简化了对数据的访问,因为每次生成报表时无须写或提交基础查询,而是查询视图。
l&,例如,希望将进销存数据库中的销售数据导出到Excel中执行分析操作,可以为销售表创建一个视图,然后从视图中使用数据导出服务,将数据复制到Excel表中。
l&,北京上海北京北京视图
到目前为止,视图所存在的最大问题是性能问题。那些不愿意使用视图的开发人员正确的指出了问题的所在:视图不是预编译的,所以它们会对性能产生较大的影响。当在SQL select语句中引用视图时,SQL Server需要通过以下这些步骤来解析视图:
l&将调用视图的SQL select语句和它引用的视图所包含的select语句合并为单个的查询。
l&必须对这个新的查询进行解析。如果在表名中没有指定所有者名字,就必须正确地做出应该引用哪个表的决定。例如,如果在数据库中存在着两个表,和,那么,在的查询中引用表的就应当是,而在其它人的查询中引用的表就应当是。
l&必须进行安全性的处理和检查。如果从视图到基础表的所有权链是一致的,那么不管对视图有权限的用户是否对相应基础表拥有权限,他或她都可以通过视图来引用基础表(假定这个视图的所有者拥有对基础表的相应权限)。尽管如此,如果所有权链是断开的,或者在要通过视图对基础表进行更新的情况下,用户就必须拥有对所有权链中每个对象的权限才能够进行操作。所以检查安全性的工作会对性能产生较大的影响。
l&如果以前已经执行过具有同样类型的参数的查询,并且在现在处理的查询中包含了所有者名字,就可以利用SQL Server的自动参数化功能(),重用以前存储的查询执行计划。如果没有为查询或者视图所包含的表指定所有者名字,或者是第一次执行合并后的查询,查询优化器就必须求出一个查询执行计划。
l&执行合并后的查询。
所以,视图究竟会对性能产生多大的影响呢?根据经验,写的好的存储过程比写的好的视图大约要快10%-20%。当然,编写存储过程需要使用很多的参数。
3.2 &创建视图
开发视图具有两个方面的目标:第一个目标是让用户更容易的获取数据;第二个目标是保护数据的安全,防止用户进行非法的存取。通过创建为用户提供正确数据的视图,可以防止用户对于数据的错误查询和错误理解。
在创建视图前请考虑如下原则:
l&只能在当前数据库中创建视图。但是,如果使用分布式查询定义视图,则新视图所引用的表和视图可以存在于其它数据库中,甚至其它服务器上。
l&视图名称必须遵循标识符的规则,且对每个用户必须为唯一。此外,该名称不得与该用户拥有的任何表的名称相同。
l&可以在其它视图和引用视图的过程之上建立视图。Microsoft SQL Server 允许嵌套多达 32 级视图。
l&不能将规则或 DEFAULT 定义与视图相关联。
l&不能将 AFTER 触发器与视图相关联,只有 INSTEAD OF 触发器可以与之相关联。
l&定义视图的查询不可以包含 ORDER BY、COMPUTE 或 COMPUTE BY 子句或 INTO 关键字。
l&不能在视图上定义全文索引定义。
l&不能创建临时视图,也不能在临时表上创建视图。
l&不能除去参与到用 SCHEMABINDING 子句创建的视图中的表或视图,除非该视图已被除去或更改而不再具有架构绑定。另外,如果参与具有架构绑定的视图的表执行 ALTER TABLE 语句影响视图定义,则这些语句将失败。
l&不能对视图执行全文查询,但是如果查询所引用的表被配置为支持全文索引,就可以在视图定义中包含全文查询。
同时,尽量将视图用于即席查询,而不要将它们作为应用程序的核心。基于这个思想,下面给出了为即席查询创建视图时需要采用的一些原则:
l&使用视图来简化复杂的连接,从而将用户难以理解的数据模式中用来连接数据的键隐藏起来。设计良好的视图应当使用户方便地获取到他们感兴趣的数据。
l&如果不使用视图来预先实现一些复杂的连接,即席查询就会造成潜在的数据完整性问题。即使用户知道什么是连接,他们也很少能够搞清楚什么时候应当使用内连接,什么时候应使用外连接,而错误的连接就会导致错误的结果。
l&将复杂的聚合查询存储为视图。因为在聚合查询中,所有的列都必须出现在聚合函数或者group by子句中,许多复杂的聚合查询往往会包含子查询以便返回那些非聚合的列。如果你能够为即席查询用户预先构造好这些复杂的查询,他们一定会对你感激不尽。
l&使用别名将那些含义不清的列名改为可以理解的列名。就像SQL select语句可以使用列别名或者命名的范围变量(表别名)来改变表或者列的名字一样,在视图中也可以使用这些特性来为用户产生更具可读性的结果集。
l&只把用户感兴趣的列包含在视图中。如果把用户不感兴趣的列排除在视图之外,视图就会变得更易于查询。包含在视图中的列称为投影列,这意味着它们只会从整个基础表中投影出选定的数据。
l&通用的、动态的视图会具有较长的生命周期,也更为实用。单一用途的视图将会很快变得过时,并把数据库弄得乱七八糟。创建视图时,应当假定用户将会把它与where子句一道使用以返回一个数据的子集。如果用户不指定where条件,视图就应当返回全部的行。
因为视图只是存储的SQL select,所以创建视图要从编写select语句开始。可以从任意的工具将SQL select语句-只要它是一个合法的SQL select语句(视图对于SQL select语句只有很少的限制)剪贴到视图中去。
在SQL Server中创建视图可以采用图形化方式,也可以在查询分析器中执行Transact-SQL语句。
使用图形化方式创建视图
SQL Server Management Studio提供了创建视图的图形工具,可以以图形化的方式完成对视图的创建操作,具体步骤如下:
打开SQL Server Management Studio,如图28所示。
图 28 &SQL Server Management Studio
在&对象资源管理器&视图中,展开&数据库&文件夹,选择需要创建视图的数据库,展开数据库节点,选择&视图&节点,单击鼠标右键,选择&新建视图&,如图29所示。
图 29 &选择&新建视图&菜单项
打开添加&表&对话框,如图30所示。
图30 &添加表
单击&添加&按钮,执行视图定义,用户可以添加列名,定义视图的语句,例如,图31显示了一个视图定义的示例。
图 31 &创建视图的图形界面
单击工具栏上的保存按钮,命名所创建的视图,如图32所示,SQL Server数据库引擎将创建该视图。
图32 &命名视图
使用Transact-SQL语句创建视图
同样,可以使用Transact-SQL语句创建视图,其语法格式如下:
l&,表示视图所属于的模式名。
l&,定义临时命名结果集或者视图,也称为公共表表达式,在SELECT语句的范围内定义。结果集是从执行简单查询得到的。
l&,;;;不能。
例如,下面的SQL语句用于创建视图v_mrBaseInf。
USE&[EAMS]
SET&ANSI_NULLS&ON
SET&QUOTED_IDENTIFIER&ON
CREATE&VIEW&[dbo].[v_mrBaseInf]
SELECT&&&&&EmpID,&EmpName,&DepID,&LoginID,&Sex
FROM&&&&&&&&&dbo.mrBaseInf
3.3 &使用视图修改数据
建立视图不但可以用于查询数据库中的数据,也可以通过视图修改视图基表的数据,其行为类似于修改表中数据。为此,可以使用UPDATE、INSERT和DELETE语句修改数据,或者使用bcp工具和BULK INSERT语句。但是,在更新视图的时候,有一些限制:
l&任何修改(包括UPDATE、INSERT、DELETE语句)只能引用来自一个基表的列。
l&视图中被修改的列必须直接引用表列的数据,不能从其他方式派生而来,如通过函数,或者通过使用集合操作符(和)计算得到。
l&被修改的列不能受、或者子句的影响。
如果视图是可更新的,就可以使用INSERT向视图基表插入数据,使用UPDATE修改视图基表的数据,使用DELETE语句删除视图基表的数据。下面我们分别给出INSERT、UPDATE和DELETE语句的语法和一些示例。
(1)INSERT语句
INSERT语句的语法如下:
l&,定义临时命名结果集,也称为公共表表达式,定义在INSERT语句的范围内,结果集是执行SELECT语句得到的。
l&,定义将要删除的随机行的数量或者百分比,要么是数量,要么是百分比。
l&,是表或者视图所在的服务器名。
l&,数据库的名称。
l&,视图或者表所在的模式名。
l&&&,1)2)3)4)
l&,返回插入的行作为INSERT操作的一部分。OUTPUT子句在任何DML语句模板视图或者远程表中不支持。
下面提供了一个示例,定义了一个视图,然后使用视图将数据插入到视图的基表中。
(2)UPDATE语句
UPDATE语句的语法如下:
l&,定义临时命名结果集,也称为公共表表达式,定义在INSERT语句的范围内,结果集是执行SELECT语句得到的。
l&,定义将要删除的随机行的数量或者百分比,要么是数量,要么是百分比。
l&,是表或者视图所在的服务器名。
l&,数据库的名称。
l&,视图或者表所在的模式名。
l&,是用户自定义类型的公共属性或者公共数据成员。
l&&&,是带一个或者多个参数的的非静态公共方法。
l&,定义需要修改的的值。
l&&,是用于存储表达式返回值的变量。
l&,返回更新的数据或者表达式。
(3)DELETE语句
DELETE语句的语法如下:
l&,定义临时命名结果集,也称为公共表表达式,定义在INSERT语句的范围内,结果集是执行SELECT语句得到的。
l&,定义将要删除的随机行的数量或者百分比,要么是数量,要么是百分比。
l&,是一个可选的关键字,用于在DELETE关键字和或者之间。
l&,是表或者视图所在的服务器名。
l&,数据库的名称。
l&,视图或者表所在的模式名。
l&,返回删除的行或者表达式。
l&,定义引用一个全局游标。
3.4 &修改视图
视图创建完成之后,可以支持应用程序的开发。但是,应用往往是经常发生变化的,因此也要求视图也发生变化,才能适合特定需求。SQL Server提供了修改视图的功能,完成对视图的修改操作。
通常情况下,完成对视图的修改可以采用两种方式:第一种是删除原有的视图,然后重新创建所需要的视图,另一种方式是使用ALTER VIEW语句。其语法格式如下:
l&,视图所在的数据库。
l&,视图所属于的模式名。
3.5 &删除视图
当视图创建完成之后,可能因为应用程序不再需要,需要删除该视图。在删除视图的时候,底层数据表是不受影响的。
删除视图可以直接在SQL Server Management Studio中采用图形方式删除,也可以使用Transact-SQL语句DROP VIEW完成。
使用SQL Server Management Studio删除视图的步骤如下:
打开SQL Server Management Studio,在&对象资源管理器&视图中展开视图所在的数据库,双击&视图&节点,选择需要删除的视图,单击鼠标右键,选择&删除&菜单项,如图33所示。
图 33 &删除视图
打开&删除对象&对话框,当确定删除该视图的时候,单击&确定&按钮,数据库引擎将删除所选择的视图,如图34所示。
图 34 &&Delete Object&对话框
同样,可以使用Transact-SQL语句删除视图,其语法格式如下:
l&,视图所在的数据库的名称。
l&,视图所属于的模式名。
l&,需要删除的视图名。
例如,下面的脚本用于删除视图v_mrBaseInf。
USE&[EAMS]
DROP&VIEW&[dbo].[v_mrBaseInf]
4 &存储过程
4.1 &存储过程基础
4.2 &创建存储过程
在SQL Server Management Studio中新建一个查询窗口,输入以下SQL语句,单击执行按钮同样可以创建该存储过程。
数据库EAMS可编程性存储过程单击鼠标右键,选择&新建存储过程&,35
图 35 &选择&新建存储过程&菜单项
打开&新建存储过程&对话框,定义存储过程的名称&&,定义查询脚本,如下所示。
USE&[EAMS]
SET&ANSI_NULLS&ON
SET&QUOTED_IDENTIFIER&ON
CREATE&PROCEDURE&[dbo].[GetLogInfo]
SELECT&LogInfo.*
FROM&LogInfo &order&by&Logintime desc
单击保存按钮,SQL Server数据库引擎将创建该存储过程。
4.3 &执行存储过程
当创建了存储过程之后,可以使用EXEC语句执行该存储过程,具体语法如下:
将得到如图36所示的结果:
图 36 &执行结果
4.4 &查看存储过程
4.5 &修改存储过程
例如,将存储过程重命名为sp_,其Transact-SQL语句如下:
&EXEC&sp_rename&'GetLogInfo','sp_GetLogInfo'
4.6 &删除存储过程
当需要删除某个存储过程的时候,直接在SQL Server Management Studio中,通过图形工具删除,下面以删除EAMS数据库存储过程为例,其步骤如下:
数据库删除EAMS可编程性存储过程选择存储过程&&,单击鼠标右键,选择&删除&菜单项,37
图 37 &选择&Delete&菜单项
打开&删除对象&对话框,如图38所示,当确定删除时,单击&确定&按钮即可。
图 38 &&删除对象&对话框
同样,可以执行Transact-SQL语句完成存储过程的删除操作,针对这个示例,其语句如下。
USE&[EAMS]
DROP&PROCEDURE&[dbo].[GetLogInfo]
USE&[master]
游标是数据库应用程序开发的一个基本技术,在许多企业应用开发中得到广泛应用,本节我们将结合企业信息平台介绍SQL Server游标的概念、类型,以及创建和使用游标的相关过程和语法规范。
5.1 &游标基础
游标是从数据表中提取出来的数据,以临时表的形式存放在内存中,在游标中有一个数据指针,在初始状态下指向的是首记录,利用fetch语句可以移动该指针,从而对游标中的数据进行各种操作,然后将操作结果写回数据表中。
l&允许定位在结果集的特定行。
l&从结果集的当前位置检索一行或多行。
l&支持对结果集中当前位置的行进行数据修改。
l&为由其他用户对显示在结果集中的数据库数据所做的更改提供不同级别的可见性支持。
l&提供脚本、存储过程和触发器中使用的访问结果集中的数据的 Transact-SQL 语句。
Microsoft SQL Server支持的因此,在使用的时候,需要加以注意。
5.2 &创建游标
用户在创建和使用时,需游标
通常,用户使用DECLARE语句声明一个游标,声明一个游标主要包括以下内容:
l&游标名字
l&数据来源(表和列)
l&选取条件
l&属性(仅读或可修改)
在SQL Server中,DECLARE CURSOR语句同时支持SQL-92和Transact-SQL两种标准。
(1)SQL-92语法
其中SQL-92语法的参数如下:
l&,防止游标被更新。
下面我们显示游标的使用方法,读者需要注意DECLARE、OPEN、FETCH、CLOSE和语句的使用,分别表示游标使用的整个过程。
USE [EAMS]
/*声明并打开一个全局游标,在批处理以外该游标依然可见*/
declare emp_cur cursor global scroll for
SELECT * FROM mrBaseInfo
pen emp_cur
/*用游标变量引用已声明的游标*/
declare @cur_tal cursor
set @cur_tal = emp_cur
/*现在释放对游标的引用*/
deallocate @cur_tal
/*游标emp_cur 依旧存在*/
&next from emp_cur
/*再引用游标*/
declare @cur_ta2 cursor
set !cur_ta2 = emp_cur
/*释放emp_cur游标*/
deallocate emp_cur
/*由于游标被@cur_ta2引用,所以依旧存在*/
&next from @cur_ta2
/*当最有一个游标变量超出游标作用域时,游标将被释放*/
declare @cur_ta cursor
set @cur_ta = cursor local scroll for
select * from mrBaseInf
/*由于没有其他变量对其进行引用,所以游标被释放*/
deallocate @cur_ta
5.3 &使用游标
下面我们介绍如何使用所创建的游标,这是用户使用游标的基础,其步骤包括:
l&打开所创建的游标
l&获取数据
l&关闭游标
l&释放游标
(1)打开游标
使用OPEN语句
其语法如下:
(2)获取数据
使用其语法规范如下:
l&,返回紧跟当前行之后的结果行,并且当前行递增为结果行。如果 FETCH NEXT 为对游标的第一次提取操作,则返回结果集中的第一行。NEXT 为默认的游标提取选项。
l&,返回紧临当前行前面的结果行,并且当前行递减为结果行。如果 FETCH PRIOR 为对游标的第一次提取操作,则没有行返回并且游标置于第一行之前。
l&,返回游标中的第一行并将其作为当前行。
l&,返回游标中的最后一行并将其作为当前行。
l&,如果 n 或 @nvar 为正数,返回从游标头开始的第 n 行并将返回的行变成新的当前行。如果 n 或 @nvar 为负数,返回游标尾之前的第 n 行并将返回的行变成新的当前行。如果 n 或 @nvar 为 0,则没有行返回。n 必须为整型常量且 @nvar 必须为 smallint、tinyint 或 int。
l&,如果 n 或 @nvar 为正数,返回当前行之后的第 n 行并将返回的行变成新的当前行。如果 n 或 @nvar 为负数,返回当前行之前的第 n 行并将返回的行变成新的当前行。如果 n 或 @nvar 为 0,返回当前行。如果对游标的第一次提取操作时将 FETCH RELATIVE 的 n 或 @nvar 指定为负数或 0,则没有行返回。n 必须为整型常量且 @nvar 必须为 smallint、tinyint 或 int。
l&,指定 cursor_name 指的是全局游标。
l&,要从中进行提取的开放游标的名称。如果同时有以 cursor_name 作为名称的全局和局部游标存在,若指定为 GLOBAL 则 cursor_name 对应于全局游标,未指定 GLOBAL 则对应于局部游标。
l&,游标变量名,引用要进行提取操作的打开的游标。
l&,允许将提取操作的列数据放到局部变量中。列表中的各个变量从左到右与游标结果集中的相应列相关联。各变量的数据类型必须与相应的结果列的数据类型匹配或是结果列数据类型所支持的隐性转换。变量的数目必须与游标选择列表中的列的数目一致。
(3)关闭游标
使用CLOSE语句
其语法如下:
(4)释放游标
的语法规范如下:
l&,是已声明游标的名称。当全局和局部游标都以 cursor_name 作为它们的名称存在时,如果指定 GLOBAL,则 cursor_name 引用全局游标,如果未指定 GLOBAL,则 cursor_name 引用局部游标。
l&,是 cursor 变量的名称。@cursor_variable_name 必须为 cursor 类型。
本示例通过游标显示企业信息平台数据库EAMS中人员基本信息mrBaseInf中存储的人员姓名列表。该示例显示了从声明游标、打开游标提取数据、关闭游标和释放游标的全生命过程。
USE&[EAMS]
/*定义变量*/
DECLARE&@name varchar(50)
/*打印表头*/
PRINT&'--------------------- 姓名信息----------------------------------'
PRINT&' &&姓名 &&&&&&&&&&&&&&&&&&&&&&&&&&&'
PRINT&'--------------------------------------------------------------------'
/*声明游标*/
DECLARE&name_cursor CURSOR&FOR&
SELECT&EmpName
FROM&mrBaseInf
ORDER&BY&EmpName
/*打开游标*/
OPEN&name_cursor
/*通过游标获取数据*/
FETCH&NEXT FROM&name_cursor
INTO&@name
WHILE&@@FETCH_STATUS&=&0
SELECT&@name =&CONVERT(CHAR(50),&@name)
PRINT&@name
FETCH&NEXT FROM&name_cursor
INTO&@name
/*关闭游标*/
CLOSE&name_cursor
/*释放游标*/
DEALLOCATE&name_cursor
执行该存储过程,可以得到如图39所示的结果。
图 39 &执行结果
触发器不能被直接执行,它们只能为表上的insert、update、delete事件所触发。触发器可以帮助数据库开发人员和管理人员自动维护数据库,增强数据的完整性。本节我们首先介绍触发器的相关知识,然后结合具体的实例分析触发器的创建和删除操作。
1 &触发器基础
触发器是一种特殊的存储过程,它在插入、删除或修改特定表中的数据时触发执行,它比数据库本身标准的功能有更精细和更复杂的数据控制能力。使用触发器具有许多优点,可以帮助开发人员实现一些自动特性。本节介绍触发器的一些基础知识及相关操作。
触发器主要是通过事件进行触发而被执行的。当对某一表进行诸如UPDATE、 INSERT、 DELETE 这些操作时,SQL Server 就会自动执行触发器所定义的SQL 语句,从而确保对数据的处理必须符合由这些SQL 语句所定义的规则。
触发器的主要作用就是其能够实现由主键和外键所不能保证的复杂的参照完整性和数据的一致性。除此之外,触发器还有其它许多不同的功能:
l&强化约束(Enforce restriction),触发器能够实现比CHECK 语句更为复杂的约束。
l&跟踪变化Auditing changes,触发器可以侦测数据库内的操作,从而不允许数据库中未经许可的指定更新和变化。
l&级联运行(Cascaded operation),触发器可以侦测数据库内的操作,并自动地级联影响整个数据库的各项内容。例如,某个表上的触发器中包含有对另外一个表的数据操作(如删除,更新,插入)而该操作又导致该表上触发器被触发。
l&存储过程的调用(Stored procedure invocation),为了响应数据库更新触,发器可以调用一个或多个存储过程,甚至可以通过外部过程的调用而在DBMS( 数据库管理系统)本身之外进行操作。
由此可见,触发器可以解决高级形式的业务规则或复杂行为限制以及实现定制记录等一些方面的问题。例如,触发器能够找出某一表在数据修改前后状态发生的差异,并根据这种差异执行一定的处理。此外一个表的同一类型(INSERT、 UPDATE、 DELETE)的多个触发器能够对同一种数据操作采取多种不同的处理。
总体而言,触发器性能通常比较低。当运行触发器时,系统处理的大部分时间花费在参照其它表的这一处理上,因为这些表既不在内存中也不在数据库设备上,而删除表和插入表总是位于内存中。可见触发器所参照的其它表的位置决定了操作要花费的时间长短。
2 &创建触发器概述
在设计DML触发器时,需要注意以下几个方面的问题:
对于DML触发器和DDL触发器,SQL Server创建触发器的语法有一些差异,其中创建DML触发器的语法如下:
在上的语法
在、、、、或者语句上创建DDL触发器的语法如下:
l&,DML触发器所属于的模式名,对于DDL触发器,不能定义该参数。
l&,应用DDL触发器的范围为当前数据库。如果定义了该参数,在当前数据库中,只要任何或者发生,将激活触发器。
l&,应用DDL触发器的范围为当前服务器。如果定义了该参数,在当前服务器中,只要任何或者发生,将激活触发器。
l&,定义触发器执行的安全上下文。
l&,是Transact-SQL语句事件的名称,当事件触发之后,将激活DDL触发器。表4显示了数据库范围内的DDL语句。
表 4 &数据库范围内的DDL语句
表5显示了服务器范围内的DDL语句。
表5 &服务器范围内的DDL语句
l&,是预先定义的Transact-SQL语句事件的组名。DDL在组中事件任何一个触发时激活。
l&,对于CLR触发器,该参数定义同触发器绑定的方法。方法不带参数,无返回值。
创建DDL触发器和创建DML触发器的语法中都包含了字句,这是因为SQL Server引入了定义用户自定义模块的执行上下文:函数、过程、队列和触发器。通过定义模块执行的上下文,用户可以控制模块执行的特定权限,从而为对象权限管理提供了更多的灵活性。对于不同情况,语法存在一定差异。
对于函数、存储过程和DML触发器,其语法如下:
对于具有数据库范围的DDL触发器,其语法如下:
对于具有服务器范围的DDL触发器,其语法如下:
对于队列,其语法如下:
3 &创建DML触发器
DML触发器在数据库服务器数据操纵语言事件发生时执行的操作。DML事件包括对表或者视图执行UPDATE、INSERT、DELETE语句。DML触发器主要用于在数据修改时增强业务规则,扩展SQL Server约束、默认值和规则的完整性检查。
SQL Server提供的DML触发器包括以下几种类型:
l&触发器,
l&触发器,
l&触发器,触发器要么是AFTER触发器,要么是INSTEAD OF触发器。除了执行Transact-SQL存储过程,触发器可以执行更多.NET框架下执行的更多方法。
约束和DML触发器具有自己的特性。DML触发器的主要好处在于能够包含复杂的处理逻辑。因此,DML触发器支持约束的所有功能。但是,使用触发器有时并非最佳方法。当约束无法满足应用功能需求时,使用DML触发器可以带来很多好处。
在设计DML触发器时提供了两种选项:
表6 &AFTER 触发器和 INSTEAD OF 触发器功能比较
4 &创建DDL触发器
DDL触发器,同普通触发器一样,能够在触发器事件激活时,激活存储过程。但是同DML触发器不同,DDL触发器不是在UPDATE、INSERT、DELETE语句上事件作出响应,而是在数据定义语言上定义的触发器,数据定义语言一般以CREATE、ALTER和DROP语句开头。因此,DDL触发器主要用于执行管理任务,如执行审计和规范数据库操作。
在下面这些时候,可以考虑使用DDL触发器:
l&希望防止对数据库模式进行特定的修改
l&当在数据库模式中执行修改操作时,希望在数据库中执行特定操作
l&希望记录在数据库模式中执行的修改或者事件
DDL触发器只有在执行DDL语句之后才触发,不能是INSTEAD OF触发器。下面的示例显示了一个DDL触发器如何防止在数据库表上执行修改和删除操作。
当设计DDL触发器时,首先必须:
l&理解DDL触发器的范围
l&确定哪些Transact-SQL语句或者语句组激活触发器
DDL触发器能够在当前数据库或者服务器上响应Transact-SQL事件。触发器的范围依赖于时间。例如,DDL触发器可以响应CREATE TABLE事件,只要在数据库上执行CREATE TABLE语句,触发器将被触发执行。
在下面的实例中,DDL触发器Safety在DROP TABLE或者ALTER TABLE事件发生的时候触发。
DDL触发器可以响应一个或者多个Transact-SQL语句。注意并非所有的DDL事件都能用于DDL触发器中。有些事件只用于异步、非事务语句。例如,CREATE DATABASE事件不能用于DDL触发器。
当需要捕获触发DDL触发器的事件信息时,可以使用EVENTDATA函数。改函数返回XML类型数据,XML模式包含以下信息:
l&事件发生的时间
l&触发器执行过程中连接的系统进程ID
l&激活触发器的事件类型
而且,对于不同的事件类型,模式还包含其他信息,如事件发生的数据库、事件发生的对象和事件的Transact-SQL命令。
例如,考虑在数据库EAMS数据库创建以下DDL触发器:
然后执行下面的CREATE TABLE语句:
则DDL触发器的PRINT EVENTDATA()语句将输入以下XML文档:
EVENTDATA函数可以用于创建事件日志。在下面的示例中,创建一个表存储事件信息。然后在当前数据库上创建触发器,当任何数据库级DDL事件发生时,下面这些信息将存储到表中。
l&事件触发的时间
l&数据库用户
l&事件类型
l&包括事件的Transact-SQL命令
测试触发器
5 &修改触发器
修改DML触发器的语法如下:
修改DDL触发器的语法如下:
参数的具体说明请读者参考CREATE TRIGER的相关说明。
6 &启用和禁用触发器
禁用触发器的语法如下:
l&,触发器所在的模式名;
l&,需要禁用的触发器名;
l&,触发器所在的表、试图或者队列名;
l&,对于DDL触发器,表示触发器所在的数据库名;
l&,对于DDL触发器,表示触发器所在的服务器名。
下面的实例禁用safety触发器。
启用触发器的语法如下:
其参数与DISABLE TRIGGER的对应参数说明相同。
下面的示例启用safety触发器。
safetyDATABASE
safetyDATABASE
7 &删除触发器
删除触发器的语法对于DML和DDL触发器是不同的,其中DML触发器的删除语法如下:
而DDL触发器的删除语法如下:
l&,表示触发器所在的模式名。
l&,需要删除的触发器名。
l&,表示DDL触发器的范围是当前数据库。
l&,表示DDL触发器的范围是当前服务器。
下面的示例删除触发器safety。
阅读(...) 评论() &
当一个人奋斗了很久,看到梦想如此之近,它是不会轻易放弃的! —— 《了不起的盖茨比》
此时,一位靓仔偶然路过~~
这孩子....或许能拯救地球吧!!!~~
最疼苦的事,不是失败,是我本可以。 -----咪蒙
我会瞬间移动哦!看得清我吗!
我爱编程,编程使我快乐

我要回帖

更多关于 sql server ddl触发器 的文章

 

随机推荐