第7章 数据库及数据库对象

Source

7.1创建及维护数据库 
7.1.1SQL Server数据库概述 
SQL Server 2008 中的数据库由包含数据的表集合以及其他对象(如视图、索引、存储过程等)组成,目的是为执行与数据有关的活动提供支持。 
安装好 SQL Server 2008 后,系统会自动安装 5 个系统数据库,分别是:master,msdb,model,tempdb和 Rescourse,各数据库的主要用途如下: 
●master:是 SQL Server 2008 中最重要的数据库,记录 SQL Server 实例的所有系统级信息,包括实例范围的元数据(例如登录账户)、端点、连接服务器和系统配置设置。此外,master 数据库还记录了所有其他数据库的存在、数据库文件的位置以及 SQL Server 的初始化信息。 
●msdb:供 SQL Server 代理服务调度报警和作业以及记录操作员时使用,保存关于调度报警、作业、操作员等信息,作业是在 SQL Server 中定义的自动执行的一系列操作的集合,作业的执行不需要任何人工干预。 
●model:用作 SQL Server 实例上创建的所有数据库的模板。对 model 数据库进行的修改如数据库大小、排序规则、恢复模式和其他数据库选项)将应用于以后创建的所有用户数据库。当用户创建一个数据库时,系统自动将 model 数据库中的全部内容复制到新建数据库中。 
●tempdb: 临时数据库,用于保存临时对象或中间结果集,并为数据的排序等操作提供一个临时工作空间。每次启动 SQL Server 时都会重新创建 tempdb 数据库。 
●Resource: 是一个只读数据库,包含了 SQL Server 中的所有系统对象。SQL Server 系统对象在
物理上保存在 Resource 数据库中,但在逻辑上却显示在每个数据库的 sys 架构中。在 SSMS 的对象资源管理器中,在“系统数据库”下看不到这个数据库。 
7.1.2SQL Server数据库的组成 
SQL Server 将数据库映射为一组操作系统文件,这些文件被划分为两类:数据文件和日志文件。数据文件包含数据和对象,日志文件包含恢复数据库中的所有事务需要的信息。 
1.数据文件 
数据文件用于存放数据库数据。数据文件又分为主要数据文件和次要数据文件。 
●主要数据文件。主要数据文件的推荐扩展名是.mdf,它包含数据库的系统信息,也可存放用户数据。每个数据库都有且只能有一个主要数据文件。主要数据文件是为数据库创建的第一个数据文件。SQL Server 2008 要求主要数据文件的大小不能小于 3MB。 
●次要数据文件。次要数据文件的推荐扩展名是.ndf。一个数据库可以不包含次要数据文件,也可以包含多个次要数据文件,而且这些次要数据文件可以建立在一个磁盘上,也可以分别建立在不同的磁盘上。 次要数据文件的使用和主要数据文件的使用对用户来说是没有区别的,对用户也是透明的,用户无须关心自己的数据是存放在主要数据文件上还是次要数据文件上。 
让一个数据库包含多个数据文件,并且让这些数据文件分别建立在不同的磁盘上,不仅有利于充分利用多个磁盘上的存储空间,而且可以提高数据的存取效率。 
2.事务日志文件 
事务日志文件的推荐扩展名为.ldf,用于存放恢复数据库的所有日志信息。每个数据库必须至少有一个日志文件,也可以有多个日志文件。 
SQL Server2008 不强制使用.mdf、.ndf 和.ldf 文件扩展名,但建议使用这些扩展名以利于标识文件的用途。 
3.数据库存储空间的分配 
在创建数据库时,了解 SQL Server 如何存储数据是很有必要的,这样可以比较准确地估算出数据库需占用的空间大小以及如何为数据文件和日志文件分配磁盘空间。 
在考虑数据库的空间分配时,需了解如下规则: 
●在创建用户数据库时,model 数据库自动被复制到新建用户数据库中,而且是复制到主要数据文件中。 
●在 SQL Server2008 中,数据的存储分配单位是数据页(Page,也简称为页)。一页是一块 8KB(8xl024B,其中用 8060B 存放数据,另外的 132B 存放系统信息)的连续磁盘空间。页是存储数据的最小单位,页的大小决定了数据库表中一行数据的最大大小。 
SQL Server 不允许表中的一行数据存储在不同页上,即行不能跨页存储。因此表中一行数据的大小不能超过 8060B。这意味着在设计关系表时要考虑每行数据的大小,以提高空间利用率。 
根据一行数据不能跨页存储、一个表中包含的数据行数以及每行占用的字节数,可以估算出一个数据表所需占用的大致空间。例如,假设一个数据表有 10000 行数据,每行 3000 字节,每个数据页可存放两行数据,则此表需要的空间为:(10000/2)*8KB=40MB。其中,每页中有 6000B 用于存储数据,有 2060B是浪费的。因此该数据表的空间大约浪费 25%。 
7.1.3数据库文件组 
SQL Server 有两种类型的文件组:主文件组和用户定义的文件组。 
1.主文件组 
主文件组(PRIMARY)是系统定义好的一个文件组,它包含主要数据文件和任何没有明确分配给其他文件组的其他数据文件。系统表的所有页均分配在主文件组中。 
2.用户定义文件组 
用户可以创建自己的文件组,以将数据文件组织起来,便于管理和数据分配。例如,可以分别在三个磁盘驱动器上创建三个文件 Datal.ndf、Data2.ndf 和 Data3.ndf,然后将它们分配到文件组 fgmupl 上,之后就可以明确地在文件组 fgmupl 上创建新表,而对表中数据的查询将分散到三个磁盘上,从而提高数据查询性能。用户定义文件组是通过在 CREATE DATABASE 或 ALTER DATABASE 语句中使用 FILE GROUP 关键字指定的任何文件组。 
说明: 
(1)日志文件不包括在文件组内,日志空间与数据空间是分开管理的。 
(2)一个文件不可以是多个文件组的成员。 
(3)如果文件组中有多个文件,则它们在所有文件被填满之前不会自动增长,而填满后这些文件会循环增长。 
如果在定义数据文件时没有指定其所属的文件组,则新建数据文件将被分配到默认文件组。每个数据库只能指定一个文件组为默认文件组。如果用户没有显式地用 ALTER DATABASE 语句修改默认文件组,则SQL Server 的默认文件组是 PRIMARY。 
7.1.4数据库文件的属性 
在定义数据库时,除了指定数据库的名字之外,其余要做的工作就是定义数据库的数据文件和日志文件,定义这些文件需要指定的信息包括: 
1.文件名及其位置 
数据库的每个数据文件和日志文件都具有一个逻辑文件名和物理文件名。逻辑文件名是在所有 T-SQL语句中引用物理文件时所使用的名称,该文件名必须符合 SQL Server 标识符规则,而且在一个数据库中逻辑文件名必须是唯一的。物理文件名包括存储文件的路径和物理磁盘文件名,该文件名必须符合操作系统文件命名规则。 
2.初始大小 
可以指定每个数据文件和日志文件的初始大小。在指定主要数据文件的初始大小时,其大小不能小于model 数据库主要数据文件的大小,因为系统是将 model 数据库主要数据文件的内容复制到用户数据库的主要数据文件上。 
3.增长方式 
如果需要的话,可以指定文件是否自动增长。该选项的默认配置为自动增长,即当数据文件的空间不足后,系统自动扩大文件空间,这样可以防止由于空间用完而造成的不能插入新数据或不能进行数据操作的错误。 
4.最大大小 
文件的最大大小指的是文件增长的最大空间限制。默认情况是无限制。建议用户设定允许文件增长的最大空间大小,因为,如果用户不设定最大空间大小,但设置了文件自动增长方式,则文件将会无限制增长直到磁盘空间用完为止。 

7.1.5用T-SQL语句创建数据库 
创建数据库的 T-SQL 语句为 CREATE DATABASE,此语句的简化语法格式为: 

CREATE DATABASE database_name  
         [ON 
              [PRIMARY ] [ <filespec> [,…n ] 
              [,<filegroup> [,…n ] ] 
              [LOG ON { <filespec> [,…n ] } ] 
              ] 
         ] 
<filespec> : : = { 
          (NAME = logical_file_name, 
          FILENAME = { ‘os_file_name ’| ' filestream_path ' } 
          [,SIZE = size [ KB|MB|GB|TB ] ] 
          [,MAXSIZE = { max_size [ KB|MB|GB|TB ] | UNLIMITED } ] 
          [,FILEGROWTH = growth_increment [ KB | MB | GB | TB | % ] ] 
)[,…n ] } 
<filegroup> : : = { 
        FILEGROUP filegroup_name [ DEFAULT ] 
          <filespec> [,…] } 

各参数含义如下: 
●database_name:新数据库名。数据库名在 SQL Server 实例中必须是唯一的。 
如果在创建数据库时未指定日志文件的逻辑名,则 SQL Server 用 database_name 后加_log 作为日志文件的逻辑名和物理名;如果未指定主要数据文件名,则 SQL Server 用 database_name 作为该文件的逻辑名和物理名。 
●ON:指定数据文件。后面是用逗号分隔的、用以定义数据文件的<filespec>项列表。 
●PRIMARY:指定关联数据文件的主文件组。 
●LOG0N:指定日志文件。 
●<filespec>:定义文件的属性。各参数含义如下: 
◆NAME=logical_file_name:指定文件的逻辑名称。在一个数据库中逻辑名必须唯一*,而且必须符合标识符规则。 
◆FILENAME=‘os_file_name’:指定操作系统(物理)文件名。‘os_file_name’是创建文件时由操
作系统使用的路径和文件名。 
◆SIZE=size:指定文件的初始大小。如果没有为主要数据文件提供 size,则数据库引擎将使用 model
数据库主要数据文件的大小。如果指定了次要数据文件或日志文件,但未指定文件的 size,则将以 1MB 作为该文件的大小。为主要数据文件指定的大小应不小于 model 数据库的主要数据文件的大小。 
可以使用千字节(KB)、兆字节(MB)、千兆字节(GB)或兆兆字节(TB)后缀。默认为 MB。size 是一个整数值,不能包含小数位。 
◆MAXSIZE=max_size 指定文件可增大到的最大大小。可以使用 KB、MB、GB 和 TB 后缀。默认为 MB。
max_size 是一个整数值,不能包含小数位。如果未指定 max_size,则表示文件大小无限制,文件将一直增大,直至磁盘空间满。 
◆UNLIMITED;指定文件的增长无限制。在 SQL Server 中,指定为不限制增长的日志文件的最大大小为 2TB,数据文件的最大大小为 16TB。 
◆FILEGROWTH=growth_increment:指定文件的自动增量。FILEGROWTH 的大小不能超过 MAXSIZE 的大小。 
growthjncrement 为每次为文件添加的空间量。该值可以用 MB、KB、GB、TB 或百分比(%)为单位。
如果未指定单位,则默认为 MB。如果指定了“%”,则增量按发生增长时文件大小的百分比增长。
FILEGROWTH=0 表示不允许自动增加空间。 
如果未指定 FILEGROWTH,则数据文件的默认增长值为 1MB,日志文件的默认增长比例为当前文件大小的 10%,最小值为 64KB。 
●<filegroup>:文件组属性。其中各参数含义如下: 
◆FILEGROUPfilegroup_name:文件组的逻辑名称。filegroup_name 在数据库中必须唯一,且不能是系统提供的名称 PRIMARY 和 PRIMARY_LOG,名称必须符合标识符规则. 
◆DEFAULT:指定该文件组为数据库的默认文件组。 
在使用 T-SQL 语句创建数据库时,最简单的情况是省略所有的参数,只提供一个数据库名,这时系统会按各参数的默认值创建数据库。 
【例 1】创建指定一个数据文件和一个日志文件的数据库。创建一个名为 RShDB 的数据库,该数据库由一个数据文件和一个日志文件组成。数据文件只有主要数据文件,其逻辑文件名为 RShDB_Data,物理文件名为 RShDB_Data.mdf,存放在 D:\RShDB_Data 文件夹下,初始大小为 10MB,最大大小为 30MB,自动增长时的递增量为 5MB。日志文件的逻辑文件名为 RShDB_log,物理文件名为 RShDB_log.ldf,也存放在D:\RShDB_Data 文件夹下,初始大小为 3MB,最大大小为 12MB,自动增长时的递增量为 2MB。 
创建该数据库的 T-SQL 语句为: 

CREATE DATABASER ShDBON 
(NAME=RShDB_Data, 
FILENAME=‘D:\RShDB_Data\RShDB_Data.mdf’, 
SIZE=10, 
MAXSIZE=30, 
FILEGROWTH=5) 
LOGON 
(NAME=RShDBJog, 
FILENAME=‘D:\RShDB_Data\RShDB_log.ldf’, 
SIZE=3, 
MAXSIZE=12, 
FILEGROWTH=2) 

7.1.6修改数据库 
用户在使用过程中可以根据需要对数据库的定义进行修改,下面介绍修改数据库的主要操作。 
1.扩大数据库空间 
如果在创建数据库时没有设置自动增长方式,则数据库在使用一段时间后可能会出现空间不够的情况,这些空间包括数据空间和日志空间。如果数据空间不够则意味着不能再向数据库插入数据;如果日志空间不够,则意味着不能再对数据库进行任何修改操作,因为对数据库的修改操作是要记入日志的。如果出现这种情况就需要扩大数据库空间。扩大数据库空间有两种 
①扩大数据库中巳有文件的大小 
②为数据库添加新的文件。 
扩大数据库空间的 ALTER DATABASE 语句的语法格式为: 

ALTER DATABASE database_name  
{       <add_or_modify_files> } 
< add_or_modify_files > : := 
{ 
        ADD FILE <filespec> [,…n] 
                 [ TO FILEGROUP {filegroup_name | DEFAULT} ] 
| ADD LOG FILE <filespec> [,…n ] 
| MODIFY FILE <filespec> 

各参数含义如下: 
●database_name:要修改的数据库名。 
●<add_or_modify_files>::=:指定要添加或修改的文件。 
●ADDFILE:在数据库中添加新的数据文件。 
●TOFILEGROUP|filegroup_nameIDEFAULT(:说明要将指定文件添加到的文件组。如果指定了 DEFAULT,则将文件添加到当前的默认文件组中。 
●<filespec>:同 CREATE DATABASE 语句的<filespec>。 
●ADDLOGFILE:在数据库中添加新的日志文件。 
●MODIFYFILE:指定要修改的文件。一次只能更改一个<filespec>属性。必须在〈filespec〉中指定
NAME,以标识要修改的文件。如果指定了 SIZE,则新大小必须大于文件当前大小。 
【例 2】为 RShDB数据库添加一个新的数据文件,逻辑文件名为 RShDB_Data2,物理存储位置为 E:\Data文件夹下,物理文件名为 RShDB_Data2.ndf,初始大小为 6MB,不自动增长。 

ALTER DATABASE RShDB 
ADD FILE( 
NAME=RShDB_Data2, 
FILENAME=‘E:\Data\RShDB_Data2.ndf’, 
SIZE=6MB, 
FILEGROWTH=0) 

【例 3】扩大 students 数据库中 students_datal 文件的初始大小,将其初始大小改为 8MB。 

ALTER DATABASE students 
MODIFYFILE( 

NAME=students_datal, 
SIZE=8MB) 

2.收缩数据库空间 
收缩数据库就是释放数据库中未使用的空间,并将释放的空间交还给操作系统。数据文件和日志文件的空间都可以收缩,而且可以成组或单独地手工收缩数据库文件,也可以通过设置数据库选项,使其按照指定的时间间隔自动收缩。文件的收缩都是从末尾开始的。 
手工收缩数据库空间分为两种情况: 
①收缩数据库中某个文件的大小; 
②按比例收缩整个数据库的大小。 
(1)收缩整个数据库的大小。收缩整个数据库大小的 T-SQL 语句是 DBCC-HRINKDATABASE,其语法格式为: 

DBCC SHRINKDATABASE 
(‘database_name’Idatabase_id|0 
[,target_percent] 
[,丨 NOTRUNCATE|TRUNCATEONLY 丨] 
) 

各参数含义如下: 
⚫  ‘database_name’| database_id |0 :要收缩的数据库的名称或 ID。如果指定 0,则表示收缩
当前正在使用的数据库。 
⚫  target_percent :数据库收缩后的文件中所需的剩余可用空间百分比。 
⚫  NOTRUNCATE:在数据库文件中保留所释放的文件空间。如果未指定该选项,则将所释放的空间释放给操作系统。 
⚫  TRUNCATEONLY:将文件中任何未使用的空间均释放给操作系统,并将文件收缩到最后分配的大小,从而无须移动任何数据即可减小文件大小。使用 TRUNCATEONLY 时,将忽略 target_percent 选项。 
【例 4】收缩 Students 数据库,使该数据库中所有的文件都有 20%的可用空间。 
DBCC SHRINKDATABASE(Students,20) 
(2)收缩指定文件的大小。 
收缩指定文件大小的 T-SQL 语句是 DBCC SHRINKFILE,其语法格式为: 

DBCC SHRINKFILE  
       (    ‘file_name ’ 
               { [,EMPTYFILE ] 
               | [ [,target_size ][,{ NOTOUNCATE | TRUNCATEONLY } ] ]  
               }  
         ) 

各参数含义如下: 
⚫  ‘file_name’:要收缩的文件的逻辑名。 
⚫  target_size:指定收缩后目标文件的大小(用整数表示,单位为 MB )。如果未指定,则 DBCC SHRINKFILE 将文件大小减少到默认文件大小,但该语句不会将文件收缩到小于文件中存储数据所需要的大小。 
⚫  EMPTYFILE:指定将文件中的所有数据迁移到同一文件组的其他文件中,使该文件为空。将文件设置为空是为了方便删除。当某文件有 EMPTYFILE 选项时,数据库引擎不会再将数据保存在该文件上。 
⚫  NOTRUNCATE:将释放的文件空间保留在文件中。如果未指定 NOTRUNCATE,则所有释放的文件空间都返回给操作系统。 
⚫  TRUNCATEONLY:将文件中的所有未使用空间都释放给操作系统,并将文件收缩到最后一次分配的大小。该选项并不移动任何数据。使用 TRUNCATEONLY 时,将忽略 targeLsize。 
【例 5】将 Students 数据库中的 students_datal 文件收缩到 4MB。 
DBCC SHRINKFILE(students_datal,4) 
3.添加和删除数据库文件 
可以通过在数据库中添加文件的方法来扩大数据库空间,也可以通过删除文件的方法来减小数据库空间。 
(1)添加文件。 
SQL Server 对每个文件组中的所有数据文件都是按比例填充数据的,这使得各文件中存储的数据量与文件中的可用空间成正比,这种方式使得所有数据文件几乎同时被填满。当添加数据文件时,系统会立刻使用新添加文件。 
日志文件的使用方式与数据文件不同,日志文件彼此是相互独立的,没有文件组。在向日志文件写人信息时,使用的是填充到满的策略而不是按比例填充策略。即先写第一个日志文件,第一个日志文件写满后,再写第二个日志文件,以此类推。因此,当添加日志文件时,系统并不立刻使用该文件,直到其他文件被写满。 
使用 T-SQL 的 ALTER DATABASE 语句可以向数据库添加文件,包括指定文件的初始大小、存放位置、增长方式等属性,这同创建数据库时指定文件属性的方法相同。也可以指定新添加的数据文件所属的文件组。 
(2)删除文件。 
只有当文件完全为空时,才可以从数据库中删除文件。 
若要让某个数据文件为空,需要将该数据文件中的数据移到同一文件组的其他文件中,这可使用 DBCC SHRINKFILE 语句并指定 EMPTYFILE 子句实现。 
但将日志信息从一个日志文件移到另一个日志文件后并不能删除该日志文件。只有当日志文件中不包含任何活动或不活动的事务时才可以从数据库中删除该日志文件。通过截断日志或备份日志的方法可以清除日志文件中的事务记录。 
7.1.7分离和附加数据库 
通过分离和附加数据库的操作可以实现将数据库从一台数据库服务器移动到另一台数据库强务器,而不需要重新创建数据库的目的。 
1.分离数据库 
分离数据库是指将数据库从 SQL Server 实例中删除,但不删除数据库的数据文件和日志文件。这与删除数据库不同,删除数据库会将数据库的所有文件一起删除,而分离数据库会保持数据库的数据文件和日志文件的完整和一致。 
分离数据库实际就是让数据库的文件不受数据库管理系统的管理,使用户可以将数据库的数据文件和日志文件复制到另一台计算机上或者是同一台计算机的其他地方。 
分离数据库使用的是 sp—detach_db 系统存储过程,其简化语法格式为: 

sp_detach_db[@dbname=]*dbname' 
[,[@skipchecks=]'skipchecks'] 

各参数含义如下: 
⚫  [ @ dbname = ] ‘dbname':要分离的数据库名称。 
⚫  [ @ skipchecks = ] ‘skipchecks':指定跳过还是运行“更新统计信息”。如果要跳过“更新统计信息”,则指定 true;如果要显式运行“更新统计信息”,则指定 false。 
【例 6】分离 Students 数据库,并跳过“更新统计信息”。 
EXECsp_detach_db‘Students’,‘true’ 
2.附加数据库 
附加数据库就是将分离的数据库重新附加到数据库管理系统中,可以附加到本机的另一个 SQL Server实例上,也可以附加到另一台数据库服务器上。在附加数据库之前,应先将要附加的数据库所包含的全部数据文件和日志文件放置到合适的位置。 
在附加数据库时,必须指定主要数据文件的物理存储位置和文件名,因为主要数据文件中包含查找组成该数据库的其他文件所需的信息。如果在复制数据库文件时,更改了其他文件存储位置,则还应该明确指出所有已改变了位置的文件的存储信息。否则,SQL Server 将基于存储在主要数据文件中的文件位置信息附加其他文件,而这将导致附加数据库失败。 
附加数据库的 T-SQL 语句是 CREATE DATABASE,语法格式如下: 

CREATE DATABASE database_name  
         ON <filespec> [,…n ] 
         FOR {ATTACH | ATTACH_REBUILD_LOG } 

各参数含义如下: 
⚫  database_name:要附加的数据库名。 
⚫  <filespec>:同创建数据库语句的< filespec >,用于指定要附加的数据库的主要数据文件。 
⚫  FOR ATTACH:指定通过附加一组现有的操作系统文件来创建数据库。必须有一个指定主要数据文件的<filespec>项。至于其他文件的<filespec>项,只需指定与第一次创建数据库或上一次附加数据库时路径不同的文件即可。 
⚫  FOR ATTACH_REBUILD_LOG:指定通过附加一组现有的操作系统文件来创建数据库。该选项只限于可读/写的数据库。如果缺少日志文件,则将重新生成日志文件。 
【例 7】假设已对 Students 数据库进行了分离操作,并将其中的 students_data2.ndf 文件和
students_logl.ldf 文件均移动到了 E:\NewData 文件夹下。移动数据库文件后,附加该数据库。 

CREATEDATABASEStudents 
ON(FILENAME=‘F:\Data\students_datal.mdf’), 
(FILENAME=‘E:\NewData\students_data2.ndf’), 
(FILENAME=‘E:\NewData\students_logl.ldf’) 

FORATTACH 

7.2架构 
架构(Schema,也称为模式)是数据库下的一个逻辑命名空间,可以存放表、视图等数据库对象,它是一个数据库对象的容器。一个数据库可以包含一个或多个架构,架构由特定的授权用户所拥有。在同一个数据库中,架构名必须唯一。属于一个架构的对象称为架构对象,即它们依赖于该架构。架构对象的类型包括基本表、视图、触发器等。 
一个架构可以由零个或多个架构对象组成。架构名可以是显式的,也可以是由 DBMS 提供的默认名。
对数据库中对象的引用可以通过架构名前缀来限定。不带任何架构限定的 CREATE 语句指的是在当前架构中创建对象。 
1.定义架构 
定义架构的 SQL 语句为 CREATE SCHEMA,其语法格式如下: 
CREATE SCHEMA [<架构名>] AUTHORIZATION <用户名> 
如果没有指定<架构名>,则<架构名>隐含为<用户名>。一个<用户名>可以拥有多个架构。执行创建架构语句的用户必须具有数据库管理员的权限,或者是获得了数据库管理员授予的 CREATE SCHEMA 的权限。 
【例 8】为用户 ZHANG 定义一个架构,架构名为 S_C。 
CREATE SCHEMAS_C AUTHORIZATION ZHANG 
在定义架构时还可以同时定义表、视图、为用户授权等,即可以在 CREATE SCHEMA 语句中 3 含 CREATE TABLE,CREATE VIEW,GRANT 等语句。 
2.删除架构 
删除架构的 T-SQL 语句是 DROP SCHEMA,其语法格式如下: 
DROP SCHEMA <架构名> {<CASCADE>丨<RESTRICT>} 
其中: 
⚫  CASCADE:删除架构的同时将该架构中的所有架构对象一起全部删除。 
⚫  RESTRICT 选项:如果被删除的架构中包含架构对象,则拒绝删除此架构。 
SQL Server 的 DROPSCHEMA 语句没有可选项,其语法格式为: 
DROP SCHEMA〈架构名> 
此语句只能删除不包含任何架构对象的架构,如果架构中含有架构对象,则拒绝删除架构。用户必须首先删除架构所包含的全部对象,然后再删除架构。 
7.3分区表 
7.3.1基本概念 
分区表是将表中的数据按水平方式划分成不同的子集,这些数据子集存储在数据库的一个或多个文件组中。是否创建分区表主要取决于表当前的数据量大小以及将来的数据量大小,同时还取决于对表中数据进行的操作特点。通常,如果某个大型表同时满足下列条件,则比较适于进行分区: 
⚫  该表包含(或将包含)以多种不同方式使用的大量数据。 
⚫  数据是分段的,比如数据以年份分隔。 
如果表中大量的数据都是经常使用的数据,而且它们的操作方式基本是一样的,则最好不要使用分区表。 
如果数据量大,而且数据是分段的,并且对不同段的数据使用的操作不同,则适于使用分区表。 
7.3.2创建分区表 
在 SQL Server2008 中,创建分区表通过以下几个步骤实现: 
(1)创建分区函数。创建分区函数的目的是告诉数据库管理系统以什么方式对表进行分区。 
(2)创建分区方案。分区方案的作用是将分区函数生成的分区映射到文件组中。分区函数的作用是告诉 SQL Server 如何将数据进行分区,而分区方案的作用则是告诉 SQL Server 将已分区的数据放在哪个文件组中。 
(3)使用分区方案创建表。 
在创建分区表之前,为了方便管理,可以先创建几个文件组将不同的小表放在不同的文件组里。这样做一方面便于理解,另一方面可以提高运行速度。在创建数据库时还需要为数据库定义多个文件,而且这些文件最好是创建在不同的硬盘分区中,并将这些文件分别放置的不同的文件组中,这样便于系统将分区后的小表分别保存在不同的文件中。 
1.创建分区函数 
在 SQL Server 2008 中,创建分区函数的 SQL 语句是: 
        

 CREATE PARTITION FUNCTION partition_function_name ( input_parameter_type ) 
          AS RANGE [ LEFT |  RIGHT ] 
          FOR VALUES ( [ boundary_value [,…n] ] ) 
          [;] 

各参数含义如下: 

⚫  partition_function_name:分区函数名。分区函数名在数据库中必须唯一。 
⚫  input_parameter_type :用于分区的列的数据类型。数据类型不能是 text、ntext、image、xml、timestamp、varchar(max)、nvarchar(max)、varbinary(max)和用户定义数据类型。 
⚫  boundary _value:为每个分区指定边界值。如果 boundary_value 为空,则分区函数使用
partition_function_name 将整个表或索引映射到单个分区。只能使用在 CREATE TABLE 或 CEATE INDEX语句中指定的分区列。 
⚫  …n:指定 boundaryjalue 提供的值的数目,n≤999。所创建的分区数等于 n+1。不要求按顺序列出各值。如果未按顺序列出各值,则数据库引擎将对它们进行排序、创建函数并返回一个 警告,说明未按顺序提供值。如果 n 包括重复值,则数据库引擎将返回错误。 
⚫  Left | RIGHT:指定当间隔值由数据库引擎按升序从左到右排序时,boundary_value [,… n]
属于每个边界值间隔的哪一侧(左侧还是右侧)。如果未指定,则默认值为 LEFT。 
说明: 
(1)分区函数的作用域仅限于创建该分区函数的数据库。 
(2)分区列为空值的所有行都放在最左侧的分区中,除非将 NULL 指定为边界值并指定了=IGHT。在这种情况下,最左侧分区为空分区,NULL 值被放置在后面的分区中。 
 
2.创建分区方案 
在 SQL Server 2008 中,创建分区方案的 SQL 语句是:         

CREATE PARTITION SCHEME partition_scheme_name  
         AS PARTITION partition_function_name 
         [ALL ] TO ( { file_group_name | [ PRIMARY ] ) } [ , …n ] ) 
         [;] 

各参数含义如下: 
⚫  partition_scheme_name:分区方案名。分区方案名在数据库中必须唯一。 
⚫  partition_function_name:使用分区方案的分区函数名。分区函数所创建的分区将映射到在分
区方案中指定的文件组。 
⚫  ALL:指定所有分区都映射到 file_group_name 中提供的文件组,或映射到主文件组(如果指定了PRIMARY)。 
⚫  file_group_name | [ PRIMARY][,…n]:指定用来持有由 partition_function_name 指定的分
区的文件组名。file_group_name 必须在数据库中已存在。 
【例 11】:创建用于将每个分区映射到不同文件组的分区方案。下列代码首先创建一个分区函数,并将表分为四个分区。然后创建一个分区方案,在其中指定拥有这四个分区中每一个分区的文件组。此示例假定数据库中已经存在文件组。 

       CREATE PARTITION FUNCTION myRangePFl(int) 
             AS RANGE LEFTF OR VALUES(1,100,1000); 
       GO 
       CREATE PARTITION SCHEME myRangePS1 
            AS PARTITION myRangePF1 
            TO(test1fg,test2fg,test3fg,test4fg); 

7.4索引 
在数据库中建立索引是为了加快数据的查询速度,主要介绍创建及删除索引的 T-SQL 语句。 
1.创建索引 
创建索引使用的是 CREATEINDEX 语句。SQL Server2008 创建索引的简化语法格式为: 

CREATE [ UNIQUE ] [ CLUSTERED 丨 NONCLUSTERED ] INDEX index_name  
                                       
        ON<object>( column [ ASC | DESC ] [,…n] ) 
        [ INCLUDE ( column_name [ , …n ] ) ] 
        [ WHERE <filter_predicate> ] 
        [ ON { partition_scheme_name ( column_name ) 
                | filegroup_name  
                | default 
                } 
         ] 
         [FILESTREAM_ON { filestream_filegroup_name | partition_scheme_name | " NULL" } ] 
     [;] 
<object> ::= 
{ 
     [database_name. [ schema_name ]. | schema_name. ] table_or_view_name 
} 

各参数说明如下: 
⚫  UNIQUE:为表或视图创建唯一索引。唯一索引不允许两行具有相同的索引键值。 
⚫  CLUSTERED:创建聚集索引,键值的逻辑顺序决定表中对应行的物理顺序。 
⚫  聚集索引的底层(或称叶级别)包含该表的实际数据行。 
⚫  一个表或视图只允许同时有一个聚集索引。具有唯一聚集索引的视图称为索引视图。 
⚫  在为表创建索引时,应先创建聚集索引,然后再创建非聚集索引,因为在创建聚集索引时系统会重新生成表中现有的非聚集索引。 
⚫  NONCLUSTERED:默认选项,创建一个非聚集索引。对于非聚集索引,数据行的物理排序独立于索引排序。在 SQL Server 2008 中,每个表都最多可包含 999 个非聚集索引。 
⚫  Index_name:索引名。索引名在表或视图中必须唯一,但在数据库中不必唯一。 
⚫  column:索引所基于的一个列或多个列。如果指定多个列名,则可为指定列的组合值创建组合索引。如果是创建组合索引,则在 table_or_view_name 后的括号中。应按排序优先级顺序 列出组合索引中要包括的列,即系统会首先对第一列进行排序,然后再对第二个列进行排序,以此类推。 
⚫  [ ASC | DESC ]:指定索引列的排序方式。ASC 为升序,DESC 为降序。默认为 ASC。 
⚫  INCLUDE ( column [,…n ] ):指定要添加到非聚集索引的叶级别的非键列。非聚集索引可以
唯一,也可以不唯一。 
⚫  WHERE <filter_predicate>:指定索引中要包含的数据行,指定筛选条件后系统将在满足筛选条件的数据行上建立索引。筛选索引必须是对表的非聚集索引。 
⚫  ON partition_scheme_name ( column_name ):指定分区方案。该方案定义要将分区索引的分区映射到的文件组。column_name 指定将作为分区索引的分区依据的列。该列必须与 partition_scheme_name使用的分区函数参数的数据类型、长度和精度相匹配。column_name 不限于索引定义中的列。如果未指定partition_scheme_name 或 filegroup 且该表已分区,则索引会与基本表使用相同分区依据列并被放入同一分区方案中。 
⚫  ON filegroup_name:为指定文件组创建索引。如果未指定位置且表或视图尚未分区,则索引将与基础表或视图使用相同的文件组。 
⚫  ON “default”:为默认文件组创建索引。“default”不是关键字,它是默认文件组的标识符。 
⚫  database_name、schema_name、schema_name 和 table_or_view_name 同 CREATE TABLE。 
【例 12】在 Table_Customer 表的 IdentityCard 列上创建唯一性聚集索引。 

CREATE UNIQUE CLUSTERED INDEX ID_ind ON Table_Customer(IdentityCard) 

【例 13】在 Table_Customer表的 Cname列和 CardID列上创建一个非聚集索引,要求索引键值按 Cname升序和 CardID 降序排序。 
CREATE INDEX COMP_ind ON Table_Customer(Cname ASC,CardID DESC) 
2.删除索引 
如果频繁地对数据进行增加、删除和更改操作,则系统会花费很多时间来维护索引,这会降低数据的修改效率;另外,存储索引需要占用额外的空间,这增加了数据库的空间开销。因此,当不需要某个索引时,可将其删除。 
在 SQL 语言中,删除索引使用的是 DROP INDEX 语句其一般语法格式为: 

DROP INDEX { index_name ON<object>[,…ra ] } 
<object> ::= 
{ 
        [ database_name. [ schema_name] . [schema_name. ] table_or_view_name 
} 
                                       
DROPINDEX|index_nameON〈object〉[,…ra]( 
<object>::= 
I 
[database_name.[schema_name].Ischema—name.]table_or—view 一 name 
I 

各参数含义同 CREATEINDEX。 
【例 12】:删除 Table_Customer 表中的 Cname_ind 索引。 
DROP INDEX Cname_ind 
7.5索引视图 
1.基本概念 
标准视图也称为虚拟表,因为这种视图所返回的结果集的格式与基本表相同,都是由列和行组成,而且在 SQL 语句中引用视图的方式也与引用基本表的方式相同。为每个引用视图的查询动态生成结果集的开销是很大的,特别是那些涉及对大量数据行进行复杂处理(如聚合大量数据或连接许多行)的视图。对基本表中的数据进行更改时,这些更改将反映到索引视图存储的数据中。 
2.适合建立索引视图的场合 
⚫  如果很少更新基础数据,则索引视图的效果最佳。 
⚫  如果经常更新基础数据,则维护索引视图的成本可能超过使用索引视图带来的性能收益。 
⚫  如果基础数据以批处理的形式定期更新,但在更新之间主要作为只读数据进行处理,则可考虑在更新前删除所有索引视图,然后再重建索引视图,这样做可以提高更新的性能。 
索引视图可以提高下列查询类型的性能: 
⚫  处理大量行的连接和聚合。 
⚫  许多查询经常执行的连接和聚合操作。 
索引视图通常不会提高下列查询类型的性能: 
⚫  具有大量写操作的 OLTP 系统。 
⚫  具有大量更新操作的数据库。 
⚫  不涉及聚合或连接的查询。 
3.定义索引视图 
在对视图创建聚集索引之前,该视图必须符合下列要求: 
⚫  定义索引视图时,视图不能引用任何其他视图,只能引用基本表。 
⚫  视图引用的所有基本表必须与视图位于同一个数据库中,并且所有者也与视图相同。 
⚫  必须使用 SCHEMABINDING 选项创建视图。 
⚫  视图中的表达式引用的所有函数必须是确定的。 
⚫  对视图创建的第一个索引必须是唯一聚集索引,之后再创建其他的非聚集索引。