SQL Server应用开发概述
SQL Server是新一代的数据库平台,集成了更多、更优秀的功能特性。本章主要对SQL Server概要介绍,主要介绍如何创建数据库、如何管理权限、如何执行备份与恢复。
1 SQL Server简介
SQL Server是微软推出的新一代数据库管理系统,支持企业应用的开发与数据存储。本节对SQL Server进行简单介绍。主要内容包括:
l 概述
l SQL Server工具简介
1.1 概述
当今组织机构面临着多项前所未有的数据技术挑战:在整个企业范围内实现数据与系统的高度分布;为内部员工、目标客户与合作伙伴提供针对相关数据的持续访问调用能力;以切实有效的信息资料武装信息工作者,促进科学决策;在不必牺牲应用程序可用性、安全性或可靠性的前提下控制成本费用水平。
新一版SQL Server的设计目标正是帮助企业单位应对上述挑战。作为Microsoft公司的新一代数据管理与分析软件,SQL Server有助于简化企业数据与分析应用的创建、部署和管理,并在解决方案伸缩性、可用性和安全性方面实现重大改进。
基于SQL Server 2000技术优势构建的SQL Server将提供集成化信息管理解决方案,可帮助任何规模的组织机构:
l 创建并部署更具伸缩性、可靠性和安全性的企业级应用。
l 降低数据库应用创建、部署与管理的复杂程度,进而实现IT效率最大化。
l 凭借可供创建更具安全保障之数据库应用的丰富、灵活、现代化开发环境增强开发人员工作效能。
l 跨越多种平台、应用和设备实现数据共享,进而简化内部系统与外部系统连接。
l 实现功能强劲的集成化商务智能解决方案,从而在整个企业范围内推进科学决策,提高工作效率。
l 在不必牺牲性能表现、可用性或伸缩性的前提下控制成本费用水平。
在当今这个网络互连无处不在的世界上,必须随时随地为用户提供数据资料和数据管理系统。SQL Server将帮助机构中的用户和IT专业人员从明显缩短的应用故障时间、得到增强的伸缩能力与性能表现和牢固可靠的安全控制中获益。SQL Server还将包含有助于组织机构和IT人员提高自身工作效率的新增和改进功能特性。基于SQL Server 2000所提供的灵活技术手段构建的SQL Server可为从千兆级(TB)数据仓库到运行Microsoft SQL Server Windows CE Edition(SQL Server CE)之移动设备的一系列解决方案实现方式提供支持。
SQL Server针对企业数据管理实现的重大改进主要体现在以下几方面:
l 可用性,在高度可用性技术、补充备份与恢复功能以及复制增强特性等方面的投资将有助于企业单位创建并部署高度可靠的应用解决方案。数据库镜像、故障转移群集和改进联机操作等具有创新意义的高度可用特性可将故障时间控制在最低限度,并有助于确保关键企业系统随时接受访问调用。
l 伸缩性,表分区、快照隔离和64位支持等伸缩改进特性将允许运用SQL Server创建并部署要求最为严苛的应用程序。针对大型数据表和索引的分区功能极大改进了超大型数据库的查询操作。
l 安全性,“缺省安全保障”设置、数据库加密和改进安全模型等增强特性有助于为企业数据提供高度安全保障。
l 易管理性,新式管理工具套件、自我调节能力和功能强大的新式编程模型将允许数据库管理员针对数据库的日常运转加以灵活掌控。针对SQL事件探查器及其它工具的改进还可帮助数据库管理员将服务器调节至最佳性能状态。这些改进特性将允许数据库管理员从数据库日常运转工作中解脱出来,并集中精力从事数据库体系结构设计等更具价值的任务。
l 交互操作能力,SQL Server实现的技术进步允许在日益扩展的企业范围内将相对独立应用程序和数据库整合并连接起来,从而,实现新增和既有系统投资效益的最大化目标。SQL Server可面向行业标准、Web服务和Microsoft .NET Framework提供高水平支持,并在此基础上实现与多种平台、应用和设备之间的交互操作能力。SQL Server与其它Microsoft软件产品(从Microsoft Windows Server操作系统到Microsoft Visual Studio开发软件包和Microsoft Office应用程序)高度集成,并可帮助您所在机构运用协同技术手段节省时间和金钱。
对于大规模在线事务处理、数据仓库应用和电子商务应用,SQL Server是一个优秀的数据库和数据分析平台。它主要包括以下几种关键技术:
l SQL Server数据库引擎,数据库引擎是存储、处理和维护数据安全的核心服务。它为企业应用提供了访问控制能力和快速事务处理能力,从而能够满足大多数企业应用的需求。而且,数据库引擎为维护高可用性,还提供了其他支持能力。
l 分析服务,分析服务为业务智能应用提供了联机分析处理和数据开采功能特性。开发人员能够设计、创建和管理多种数据源多多维数据结构,并且能够设计、创建和可视化数据开采模型。
l 数据转换服务(DTS),SQL Server 数据转换服务是企业数据转换和数据集成的解决方案,能够帮助开发人员和数据库管理员提取、转换和集成数据。
l 复制,复制是一组解决方案,使您得以在企业范围内复制、分发和可能修改数据。SQL Server 包括几种用于设计、执行、监视和管理复制的方案和选项,这些选项提供了分发数据和维护数据一致性所需的功能和灵活性。
l 报表服务,报表服务是新的、基于服务器的报表平台,能够创建、管理表格型、矩阵型、图表型、自由形式的报表,这些报表可以包含来自多个关系和多维数据源的数据。所创建的报表能够在Web上进行查看和管理。
l 通知服务,通知服务是用于开发、部署生成和发送通知的应用的平台。应用开发人员和管理员可以使用通知服务生成、发送通知给多个订阅者,将消息发送给多种设备。
l 服务代理,服务代理是创建可靠的、大规模的、安全的数据库应用的解决方案。它驻留在数据库引擎中,提供队列的本地支持。服务代理提供了一个基于消息的通信平台,能够用于连接不用的应用构件,形成一个应用整体。
l 全文搜索,SQL Server包含了对表中对字符数据执行全文查询对功能特性。全文查询可以包含关键字和语句。
l SQL Server提供的其他工具,SQL Server提供了设计、开发、部署和管理关系数据库、分析服务立方体、数据转换包、复制拓扑结构、报表服务和通知服务的工具。
对于开发效率,长期以来,阻碍开发人员工作效率提高的一大关键因素就是缺乏用于数据库开发和调试的集成化工具手段。SQL Server 2000实现了与Microsoft Visual Studio之间的高度集成,从而有助于消除上述障碍。而SQL Server则提供从根本上改变数据库开发与部署方式的更多改进特性。具备丰富扩展标记语言(XML)支持特性并与.NET技术和Microsoft开发工具实现高度集成的SQL Server,促使开发人员工作效率和灵活性得到显著提高。
针对开发人员工作效率的改进主要体现在以下几方面:
l 得到改进的工具手段。开发人员将可为Transact-SQL、XML、多维表达式(MDX)和分析性XML(XML/A)使用单一开发工具。与Visual Studio开发环境的高度集成有助于提高专业和商务智能应用的开发与调试效率。
l 得到扩展的语言支持。开发人员可凭借基于数据库引擎的通用语言运行时(CLR)特性从包括Transact-SQL、Microsoft Visual Basic .NET和Microsoft Visual C# .NET在内的多种数据库应用开发语言中选择自己最熟悉的一种。CLR托管特性将对用户定义类型和函数加以运用,并在此基础上增强开发人员的工作灵活性。此外,CLR还将创造利用第三方代码加速数据库应用开发的宝贵机遇。
l XML与Web服务。诸如Xquery和本地XML数据类型等改进特性有助于组织机构实现内部系统与外部系统之间的无缝化连接。SQL Server将为关系型数据和XML数据提供本地支持,从而使企业单位能够以最适合自身需要的格式进行数据存储、管理和分析。针对超文本传输协议(HTTP)、XML、简单对象访问协议(SOAP)、Xquery和XML架构定义(XSD)等既有和新兴开放标准的支持能力还将为跨越日益扩展企业系统的信息交流提供便利。
商务智能的前景与挑战都围绕着在正确的时间为企业员工提供适当的信息这一课题展开。这种构想的实现依赖于全面完整、安全可靠、随时可用并与运营系统高度集成的商务智能解决方案。SQL Server产品家族将凭借SQL Server帮助企业单位实现上述目标。
商务智能方面的改进主要包括:
l 集成化平台,基于SQL Server 2000构建的SQL Server将为端到端商务智能平台赋予包括联机分析处理(OLAP),数据挖掘,提取、转换与加载(ETL)工具,数据仓库和报告功能等在内的集成化分析处理特性。这种高度综合与集成的技术手段有助于组织机构在控制成本费用水平的同时,完成强大商务智能应用的无缝化创建与部署。
l 得到改进的决策过程,针对现有商务智能特性的改进(如OLAP与数据挖掘)和新型报告服务器的引入可赋予企业单位在从信息工作者到首席执行官(CEO)的所有组织层次上将信息资源转化为优选业务决策的能力。
l 安全性和可用性,伸缩性、可用性和安全性方面的改进将为用户提供针对商务智能应用和报告的不间断访问调用支持。
l 企业级分析能力,得到改进的ETL工具将允许组织机构以更加简便快捷的方式对出自多种不同信息来源的数据资料进行集成化和分析处理。组织机构可基于一系列运营系统开展数据分析活动,并在此基础上通过对自身业务的全面理解赢得宝贵的竞争优势。
从以上几个方面,SQL Server为企业用户和开发人员提供了全新的体验,将大大提高企业应用的整体特性。
1.2 SQL Server 工具简介
SQL Server简单易用,它提供了大量的图形工具,能够完成对SQL Server的管理和开发任务,主要工具包括:
l SQL Server管理控制台
l 业务智能开发工具
l SQL Profiler
l SQL 计算机管理器
l 数据库调试建议工具
l 命令行工具
(1) SQL Server管理控制台
SQL Server将服务器管理和应用开发集成到单个环境中进行,这就是SQL Server管理控制台(SQL Server Management Studio)和业务智能开发工具(Business Intelligence Development Studio)。工具使用解决方案和工程进行管理和操作。它提供了完整的源代码控制功能,能够同Microsoft Visual Studio .NET集成,但并非是其一部分。控制台主要用于支持业务应用开发,能够支持对SQL Server、SQL Server Mobile、分析服务、数据转换服务和报表服务应用的开发,但是,无法创建自定义应用和更大的开发工程。SQL Server管理控制台是一个集成的开发环境,能够访问、配置、管理和维护SQL Server的所有工具。SQL Server管理控制台可以集成更多的图形工具,提供对SQL Server控制的更多编辑环境。
(2) 业务智能开发工具
业务智能开发工具(Business Intelligence Development Studio),用于开发业务智能结构,如立方体、数据源、报表和数据转换包。业务智能开发工具包括工程模板,为开发专用结构提供上下文。例如,如果希望创建包含立方体、维和开采模型的分析服务数据库,可以选择分析服务工程。
(3) SQL Profiler
SQL Profiler是用于捕获来自服务器的SQL Server事件的工具。事件保存到跟踪文件中,支持后续分析和问题重新演示。SQL Profiler能够支持多种活动,例如:
l 深入问题查询,发现问题原因;
l 诊断运行时间很长、速度很慢的查询;
l 捕获导致问题的SQL语句;
l 监视SQL Server 的性能,调试工作负载。
SQL Profiler还支持对SQL Server实例执行的活动进行审计。
(4) SQL 计算机管理器
SQL 计算机管理器(SQL Computer Manager)用于管理同SQL Server相关的服务,并能够配置SQL Server使用的网络协议。SQL 计算机管理器能够添加到Microsoft管理控制台插件中。SQL计算机管理器集成了以下SQL Server 2000的工具:服务器网络工具、客户网络工具和服务管理器。SQL计算机管理器和SQL Server管理控制台都使用Window管理工具(WMI)查看和修改服务器配置。WMI提供了访问调用和管理服务器和客户网络工具功能的注册表操作的统一方式。对计算机管理其插件的SQL服务提供操纵能力。使用SQL 计算机管理器,可以启动、停止、暂停、恢复和配置其它计算机上的服务。SQL 计算机管理器能够显示如下服务:
l SQL Server
l SQL Server Agent
l Microsoft SQL Server分析服务
l 报表服务器
l Microsoft Search
l 分布式事务协调器(DTC)
l 全文搜索
同时,可以查看所选服务的属性,包括:
l 名称
l 描述
l 状态(启动、停止或者暂停)
l 启动类型(手动、自动或者禁止)
l 登录情况
l 最后启动的时间
l 最后停止的时间
l PID——进程标识符
使用SQL计算机管理器可以修改SQL Server和SQL Server Agent服务所使用的账号,也可以修改账号的口令。除了修改账号的名称之外,SQL 计算机管理器还可以在Windows注册表中配置权限。使用SQL计算机管理器,还可以配置服务器和客户网络协议,以及连接选项。在大多数情况下,不需要修改服务器网络连接。但是,如果希望重新配置服务器连接,使得SQL Server能够在特定网络协议上进行侦听,可以使用SQL计算机管理器。
(5) 数据库调试建议工具
数据库调试建议工具(Database Tuning Advisor Tool),可以帮助用户选择和创建索引、索引视图和分区,并不要求用户具有数据库结构、工作负载和SQL Server内核的专业知识。
(6) 命令行工具
SQL Server提供了命令行工具,使用这些命令,如表1所示,可以同SQL Server进行交互。
表1 命令行工具
| 工具 |
说明 |
安装位置 |
| bcp 工具 |
用于在SQL Server实例之间复制数据 |
x:\Program Files\Microsoft SQL Server\90\Tools\Binn |
| dtexec工具 |
用于配置和执行DTS服务包 |
x:\Program Files\Microsoft SQL Server\90\DTS\binn |
| dtutil工具 |
用于管理数据转换服务包 |
x:\Program Files\Microsoft SQL Server\90\DTS\Binn |
| dta工具 |
用于分析工作负载 |
x:\Program Files\Microsoft SQL Server\90\Tools\Binn |
| nscontrol工具 |
用于管理通知服务 |
x:\Program Files\Microsoft SQL Server\90\NotificationServices\9.0.242\bin |
| sqlcmd工具 |
允许在命令行输入Transact-SQL语句、系统过程、脚本文件 |
x:\Program Files\Microsoft SQL Server\90\Tools\Binn |
| osql工具 |
允许在命令行输入Transact-SQL语句、系统过程、脚本文件 |
x:\Program Files\Microsoft SQL Server\90\Tools\Binn |
| 复制分发代理 |
用于在命令行配置和启动分布式代理 |
x:\Program Files\Microsoft SQL Server\90\COM |
| 复制日志阅读器代理 |
用于配置和启动日志阅读器代理 |
x:\Program Files\Microsoft SQL Server\90\COM |
| 复制合并代理 |
用于配置和其他合并代理 |
x:\Program Files\Microsoft SQL Server\90\COM |
| 复制队列阅读器代理 |
用于配置和启动复制队列阅读器代理 |
x:\Program Files\Microsoft SQL Server\90\COM |
| 复制快照代理 |
用于启动和配置复制快照代理 |
x:\Program Files\Microsoft SQL Server\90\COM |
| rs工具 |
用于运行用于管理报表服务的报表服务器的脚本 |
x:\Program Files\Microsoft SQL Server\90\Tools\Binn |
| rsactivate工具 |
用于初始化一个报表服务器 |
x:\Program Files\Microsoft SQL Server\90\Tools\Binn |
| rsconfig工具 |
用于配置报表服务器连接 |
x:\Program Files\Microsoft SQL Server\90\Tools\Binn |
| rskeymgmt工具 |
用于在报表服务器上管理加密键 |
x:\Program Files\Microsoft SQL Server\90\Tools\Binn |
2 创建数据库
SQL Server提供了多种方式创建、修改和删除数据库。本节主要介绍如何创建、修改和删除数据库。主要内容包括:
l 创建数据库
l 修改数据库
l 删除数据库
2.1 创建数据库
在SQL Server中创建数据库主要有两种方法,第一种是在SQL Server Management Studio中使用向导创建数据库;第二种是执行Transact-SQL语句创建数据库。下面我们分别进行介绍。
(1)使用SQL Server Management Studio创建数据库
在SQL Server Management Studio中,可以使用向导创建数据库,步骤如下:
1. 打开SQL Server Management Studio,如图1所示。

图 1 SQL Server Management Studio
2. 右击“数据库”对象,在弹出式菜单中选择“新建数据库”菜单项,打开“新建数据库”对话框,如图2所示。

图 2 “新建数据库”向导
3. 在“常规”页,可以定义数据库的名称为EAMS、数据库文件、数据库的所有者、排序规则、恢复模型,以及是否使用全文索引。
4. 在“选项”页,可以定义数据库的一些选项,包括自动选项、游标选项、混杂选项、恢复选项、行级版本选项和状态选项,如图3所示。

图 3 “选项”页
5. 在“文件组”页,显示文件组和文件的统计信息,同时还可以设置是否采用默认值,如图4所示。

图 4 “文件组”页
6. 在“扩展属性”页,可以定义数据库的一些扩展属性,如图5所示。
7. 当完成各个选项的定义之后,单击【OK】按钮,SQL Server数据库引擎会创建所定义的数据库。
(2)使用Transact-SQL创建数据库
Transact-SQL提供了创建数据库的语句:CREATE DATABASE,其语法格式如下:
CREATE DATABASE database_name [ ON [ <filespec> [ ,...n ] ] [ , <filegroup> [ ,...n ] ] ] [ [ LOG ON { <filespec> [ ,...n ] } ] [ COLLATE collation_name ] [ FOR { ATTACH [ WITH <service_broker_option> ] | ATTACH_REBUILD_LOG } ] [ WITH <external_access_option> ] ] [;] <filespec> ::= [ PRIMARY ] ( [ NAME = logical_file_name , ] FILENAME = 'os_file_name' [ , SIZE = size [ KB | MB | GB | TB ] ] [ , MAXSIZE = { max_size [ KB | MB | GB | TB ] | UNLIMITED } ] [ , FILEGROWTH = growth_increment [ KB | MB | % ] ] ) [ ,...n ] <filegroup> ::= FILEGROUP filegroup_name <filespec> [ ,...n ] <external_access_option> ::= DB_CHAINING { ON | OFF } | TRUSTWORTHY { ON | OFF } <service_broker_option> ::= ENABLE_BROKER | NEW_BROKER | ERROR_BROKER_CONVERSATIONS Create a Database Snapshot CREATE DATABASE database_snapshot_name ON ( NAME = logical_file_name, FILENAME = 'os_file_name' ) [ ,...n ] AS SNAPSHOT OF source_database_name [;]
参数说明如下:
l database_name,新数据库的名称。数据库名称在服务器中必须唯一,并且符合标识符的规则。database_name 最多可以包含 128 个字符,除非没有为日志指定逻辑名。如果没有指定日志文件的逻辑名,则SQL Server会通过向 database_name 追加后缀来生成逻辑名。该操作要求 database_name 在 123 个字符之内,以便生成的日志文件逻辑名少于 128 个字符。
l ON,指定显式定义用来存储数据库数据部分的磁盘文件(数据文件)。该关键字后跟以逗号分隔的 <filespec> 项列表,<filespec> 项用以定义主文件组的数据文件。主文件组的文件列表后可跟以逗号分隔的 <filegroup> 项列表(可选),<filegroup> 项用以定义用户文件组及其文件。
l N,占位符,表示可以为新数据库指定多个文件。
l LOG ON,指定显式定义用来存储数据库日志的磁盘文件(日志文件)。该关键字后跟以逗号分隔的 <filespec> 项列表,<filespec> 项用以定义日志文件。如果没有指定 LOG ON,将自动创建一个日志文件,该文件使用系统生成的名称,大小为数据库中所有数据文件总大小的 25%。
l FOR LOAD,支持该子句是为了与早期版本的 SQL Server 兼容。数据库在打开 dbo use only 数据库选项的情况下创建,并且将其状态设置为正在装载。
l FOR ATTACH,指定从现有的一组操作系统文件中附加数据库。必须有指定第一个主文件的 <filespec> 条目。至于其它 <filespec> 条目,只需要与第一次创建数据库或上一次附加数据库时路径不同的文件的那些条目。必须为这些文件指定 <filespec> 条目。附加的数据库必须使用与 SQL Server 相同的代码页和排序次序创建。应使用 sp_attach_db 系统存储过程,而不要直接使用 CREATE DATABASE FOR ATTACH。只有必须指定 16 个以上的 <filespec> 项目时,才需要使用 CREATE DATABASE FOR ATTACH。 如果将数据库附加到的服务器不是该数据库从中分离的服务器,并且启用了分离的数据库以进行复制,则应该运行 sp_removedbreplication 从数据库删除复制。
l collation_name,指定数据库的默认排序规则。排序规则名称既可以是 Windows 排序规则名称,也可以是 SQL 排序规则名称。如果没有指定排序规则,则将 SQL Server 实例的默认排序规则指派为数据库的排序规则。
l PRIMARY,指定关联的 <filespec> 列表定义主文件。主文件组包含所有数据库系统表。还包含所有未指派给用户文件组的对象。主文件组的第一个 <filespec> 条目成为主文件,该文件包含数据库的逻辑起点及其系统表。一个数据库只能有一个主文件。如果没有指定 PRIMARY,那么 CREATE DATABASE 语句中列出的第一个文件将成为主文件。
l NAME,为由 <filespec> 定义的文件指定逻辑名称。如果指定了 FOR ATTACH,则不需要指定 NAME 参数。
l logical_file_name,用来在创建数据库后执行的 Transact-SQL 语句中引用文件的名称。logical_file_name 在数据库中必须唯一,并且符合标识符的规则。该名称可以是字符或 Unicode 常量,也可以是常规标识符或定界标识符。
l FILENAME,为 <filespec> 定义的文件指定操作系统文件名。
l os_file_name,操作系统创建 <filespec> 定义的物理文件时使用的路径名和文件名。os_file_name 中的路径必须指定 SQL Server 实例上的目录。os_file_name 不能指定压缩文件系统中的目录。如果文件在原始分区上创建,则 os_file_name 必须只指定现有原始分区的驱动器字母。每个原始分区上只能创建一个文件。原始分区上的文件不会自动增长;因此,os_file_name 指定原始分区时,不需要指定 MAXSIZE 和 FILEGROWTH 参数。
l SIZE,指定 <filespec> 中定义的文件的大小。如果主文件的 <filespec> 中没有提供 SIZE 参数,那么 SQL Server 将使用 model 数据库中的主文件大小。如果次要文件或日志文件的 <filespec> 中没有指定 SIZE 参数,则 SQL Server 将使文件大小为 1 MB。
l Size,<filespec> 中定义的文件的初始大小。可以使用千字节 (KB)、兆字节 (MB)、千兆字节 (GB) 或兆兆字节 (TB) 后缀。默认值为 MB。指定一个整数,不要包含小数位。size 的最小值为 512 KB。如果没有指定 size,则默认值为 1 MB。为主文件指定的大小至少应与 model 数据库的主文件大小相同。
l MAXSIZE,指定 <filespec> 中定义的文件可以增长到的最大大小。
l max_size,<filespec> 中定义的文件可以增长到的最大大小。可以使用千字节 (KB)、兆字节 (MB)、千兆字节 (GB) 或兆兆字节 (TB) 后缀。默认值为 MB。指定一个整数,不要包含小数位。如果没有指定 max_size,那么文件将增长到磁盘变满为止。
l UNLIMITED,指定 <filespec> 中定义的文件将增长到磁盘变满为止。
l FILEGROWTH,指定 <filespec> 中定义的文件的增长增量。文件的 FILEGROWTH 设置不能超过 MAXSIZE 设置。
l growth_increment,每次需要新的空间时为文件添加的空间大小。指定一个整数,不要包含小数位。0 值表示不增长。该值可以 MB、KB、GB、TB 或百分比 (%) 为单位指定。如果未在数量后面指定 MB、KB 或 %,则默认值为 MB。如果指定 %,则增量大小为发生增长时文件大小的指定百分比。如果没有指定 FILEGROWTH,则默认值为 10%,最小值为 64 KB。指定的大小舍入为最接近的 64 KB 的倍数。
l <filegroup>,控制文件组的属性。文件组不能在数据库快照上定义。
l FILEGROUP,定义文件组的逻辑名。
l filegroup_name,表示在创建数据库之后,在Transact-SQL语句中引用文件组的名称。filegroup_name在数据库中必须唯一,不能是系统提供的名称,如PRIMARY和PRIMARY_LOG。名称必须同标识符的规则保持一致。
l default,定义文件组为特定文件组类型的默认数据库文件组。
l DB_CHAINING { ON | OFF },当设置为ON的时候,数据库可以为交叉数据库所有者关系链中的源或者目标。当设置为OFF的时候,数据库不能参与交叉数据库所有者关系链,对于用户数据库,可以修改这个选项,但是不能修改系统数据库的该选项。默认值为OFF。
l TRUSTWORTHY { ON | OFF },当设置为ON的时候,数据库模块(如视图、用户自定义函数或者存储过程)允许访问数据库外的资源。当设置为OFF的时候,数据库模块不能访问数据库之外的资源。默认值为OFF。
l <service_broker_options> ,当授予FOR ATTACH子句的时候,才能设置Service Broker选项。
l ENABLE_BROKER,定义数据库是否启用Service Broker。
l NEW_BROKER,在sys数据库中和恢复数据库中创建新的service_broker_guid。
l ERROR_BROKER_CONVERSATIONS,终止所有发生错误的会话。
l database_snapshot_name,定义新数据库的快照名。
l ON (NAME =logical_file_name, FILENAME ='os_file_name') [ ,... n ] ,对于创建一个数据库快照,在源数据库中定义文件列表。
l AS SNAPSHOT OF source_database_name,定义创建的数据库为一个源数据库的数据库快照。
创建企业信息平台数据库的Transact-SQL语句如下所示。
CREATE DATABASE [EAMS] ON (NAME = N'Hotop100_Data', FILENAME = N'D:\Program Files\Microsoft SQL Server 2000\MSSQL\Data\EAMS_Data.MDF' , SIZE = 9, FILEGROWTH = 10%) LOG ON (NAME = N'Hotop100_Log', FILENAME = N'D:\Program Files\Microsoft SQL Server 2000\MSSQL\Data\EAMS_Log.LDF' , SIZE = 68, FILEGROWTH = 10%) COLLATE Chinese_PRC_CI_AS GO
2.2 修改数据库
当创建数据库之后,可能需要对原始定义进行修改,例如:
l 扩充分配给数据库的数据或事务日志空间。
l 收缩分配给数据库的数据或事务日志空间。
l 添加或删除数据和事务日志文件。
l 创建文件组。
l 创建默认文件组。
l 更改数据库的配置设置。
l 脱机放置数据库。
l 附加新数据库或分离未使用的数据库。
l 更改数据库名称。
l 更改数据库的所有者。
在更改数据库之前,有时需要使数据库退出正常操作模式。在这些情况下,需确定终止事务的适当方法。
(1)扩充数据库
SQL Server可根据在创建数据库时所定义的增长参数,自动扩充数据库。通过在现有的数据库文件上分配其它的文件空间,或者在另一个新文件上分配空间,还可以手动扩充数据库。如果现有的文件已经充满,则可能需要扩充数据或事务日志空间。如果数据库已经用完分配给它的空间而又不能自动增长,则会出现 1105 错误。
扩充数据库时,必须按至少 1 MB 增加该数据库的大小。扩充数据库的权限默认授予数据库所有者,并自动与数据库所有者身份一起传输。数据库扩充后,数据或事务日志文件立即可以使用新空间,这取决于哪个文件进行了扩充。
如果事务日志没有设置为自动扩充,则当数据库内发生某些类型的活动时,该事务日志可能会用完所有空间。备份事务日志时,或者在数据库使用简单恢复模型的每个检查点时,只清除事务日志中非活动(已提交)的部分。然后 SQL Server 可以重新使用该事务日志中被截取的、尚未使用的部分。在备份数据库时,SQL Server 不会截断事务日志。
在扩充数据库时,建议指定文件的最大允许增长的大小。这样做可以防止文件无限制地增大,以至用尽整个磁盘空间。若要指定文件的最大大小,请在使用SQL Server 企业管理器内的"属性"对话框创建数据库时,使用 CREATE DATABASE 语句的 MAXSIZE 参数或者"将文件增长限制为 (MB)"选项。
(2)收缩数据库
SQL Server允许收缩数据库中的每个文件以删除未使用的页。数据和事务日志文件都可以收缩。数据库文件可以作为组或单独地进行手工收缩。数据库也可设置为按给定的时间间隔自动收缩。该活动在后台进行,并且不影响数据库内的用户活动。
当使用 ALTER DATABASE AUTO_SHRINK 选项(或 sp_dboption 系统存储过程)将数据库设置为自动收缩,且数据库中有足够的可用空间时,则会发生收缩。但是,如果不能配置要删除的可用空间的百分比,则将删除尽可能多的可用空间。若要配置将删除的可用空间量,例如只删除数据库中当前可用空间的 50%,请使用SQL Server 企业管理器内的"属性"对话框进行数据库收缩。
不能将整个数据库收缩到比其原始大小还要小。因此,如果数据库创建时的大小为 10 MB,后来增长到 100 MB,则该数据库最小能够收缩到 10 MB(假定已经删除该数据库中所有数据)。但是,使用 DBCC SHRINKFILE 语句,可以将单个数据库文件收缩到比其初始创建大小还要小。必须分别收缩每个文件,而不要试图收缩整个数据库。
事务日志文件可在固定的边界内收缩。虚拟日志的大小决定可能减小的大小。因此,不能将日志文件收缩到比虚拟日志文件还小。另外,日志文件可以按与虚拟日志文件的大小相等的增量收缩。例如,一个初始大小为 1 GB 的较大事务日志文件可以包括五个虚拟日志文件(每个文件大小为 200 MB)。收缩事务日志文件将删除未使用的虚拟日志文件,但会留下至少一个虚拟日志文件。因为此示例中的每个虚拟日志文件都是 200 MB,所以事务日志最小只能收缩到 200 MB,且每次只能以 200 MB的大小收缩。若要让事务日志文件收缩得更小,可以创建一个更小的事务日志,并允许它自动增长,而不要创建一个较大的事务日志文件。
在 SQL Server中,DBCC SHRINKDATABASE 或 DBCC SHRINKFILE 操作试图立即将事务日志文件收缩到所要求的大小(以四舍五入的值为准)。在收缩文件之前应截断日志文件,以减小逻辑日志的大小并将其标记为不包含逻辑日志任何部分的不活动的虚拟日志。
(3)添加和删除数据和事务日志文件
可以添加数据和事务日志文件以扩充数据库,或删除它们以收缩数据库。当添加文件时,数据库可以立即使用该文件。SQL Server 在每个文件组内的所有文件上使用按比例填充的策略,根据文件中的可用空间按比例写入数据量,并允许立即开始使用新文件。通过这种方式,所有文件几乎在同一时间趋于充满。但是,事务日志文件不能作为文件组的一部分;它们是相互独立的。当事务日志增长时,使用填充后往下走的策略,而不是按比例填充策略,首先填充第一个日志文件,然后是第二个,依此类推。因此,当添加日志文件时,事务日志可能不能使用该文件,而需等到其它文件已经先填充。将文件添加到数据库时,可以根据需要指定文件的大小(默认为 1 MB)、文件可以增长的最大大小(如果文件内的空间用完)、文件每次需要增长时所增长的数量(默认是 10%),以及文件所属的文件组。
删除数据或事务日志文件将从数据库删除该文件。仅当文件上不存在已有的数据或事务日志信息时才可能从数据库删除文件;文件必须完全为空后才能删除。若要将数据从一个数据文件迁移到同一文件组中的其它文件中,请使用 DBCC SHRINKFILE 语句,并指定 EMPTYFILE 子句。SQL Server 即不再允许将数据置于文件上,从而通过使用 ALTER DATABASE 语句或 SQL Server 企业管理器内的属性页,使之能够删除。
通过将事务日志数据从一个日志文件迁移到另一个以删除事务日志文件是不可能的。若要从事务日志文件清除非活动的事务,必须截断或备份该事务日志。一旦事务日志文件不再包含任何活动或不活动的事务,该日志文件就可以从数据库中删除。
(4)创建文件组
在首次创建数据库,或者以后将更多文件添加到数据库时,可以创建文件组。但是,一旦将文件添加到数据库,就不可能再将这些文件移到其它文件组。一个文件不能是多个文件组的成员。表格、索引以及 text、ntext 和 image 数据可以与特定的文件组相关联。这意味着它们的所有页都将从该文件组的文件中分配。有三种类型的文件组:
l 主文件组,这些文件组包含主数据文件以及任何其它没有放入其它文件组的文件。系统表的所有页都从主文件组分配。
l 用户定义文件组,该文件组是用 CREATE DATABASE 或 ALTER DATABASE 语句中的 FILEGROUP 关键字,或在 SQL Server 企业管理器内的"属性"对话框上指定的任何文件组。
l 默认文件组,默认文件组包含在创建时没有指定文件组的所有表和索引的页。在每个数据库中,每次只能有一个文件组是默认文件组。如果没有指定默认文件组,则默认文件组是主文件组。
(5)更改默认文件组
更改默认文件组时,最初没有指定文件组的所有对象都被分配到新默认文件组中的数据文件。更改默认文件组可以防止不是专门在用户定义的文件组上创建的用户对象与系统对象和表竞争以获得数据空间。
(6)设置数据库选项
可以为每个数据库都设置若干个决定数据库特点的数据库级选项。只有系统管理员、数据库所有者以及 sysadmin 和 dbcreator 固定服务器角色和 db_owner 固定数据库角色的成员才能修改这些选项。这些选项对于每个数据库都是唯一的,而且不影响其它数据库。可以使用 ALTER DATABASE 语句的 SET 子句、sp_dboption 系统存储过程,或者在某些情况下使用 SQL Server 企业管理器设置数据库选项。设置了数据库选项之后,将自动发出一个检查点,它会使修改立即生效。
若要更改新创建数据库的任意数据库选项的默认值,请更改 model 数据库中的适当数据库选项。例如对于随后创建的任何新数据库,如果希望 AUTO_SHRINK 数据库选项的默认设置都为 ON,则将 model 的 AUTO_SHRINK 选项设置为 ON。
修改数据库同创建数据库类似,可以使用Transact-SQL命令ALTER DATABASE修改数据库,其语法格式如下:
ALTER DATABASE database_name { ADD FILE <filespec> [ ,...n ] [ TO FILEGROUP { filegroup_name | DEFAULT } ] | ADD LOG FILE <filespec> [ ,...n ] | REMOVE FILE logical_file_name | ADD FILEGROUP filegroup_name | REMOVE FILEGROUP filegroup_name | MODIFY FILE <filespec> | MODIFY NAME = new_dbname | MODIFY FILEGROUP filegroup_name { <filegroup_updatability_option> | DEFAULT | NAME = new_filegroup_name } | SET { { <optionspec> [ ,...n ] [ WITH <termination> ] } | ALLOW_SNAPSHOT_ISOLATION {ON | OFF } | READ_COMMITTED_SNAPSHOT {ON | OFF } [ WITH <termination> ] } | COLLATE collation_name } [ ; ] <filespec> ::= ( NAME = logical_file_name [ , OFFLINE ] [ , NEWNAME = new_logical_name ] [ , FILENAME = os_file_name' ] [ , SIZE = size [ KB | MB | GB | TB ] ] [ , MAXSIZE = { max_size [ KB | MB | GB | TB ]| UNLIMITED } ] [ , FILEGROWTH = growth_increment [ KB | MB | % ] ] ) <filegroup_updatability_option> ::= { { READONLY | READWRITE } | { READ_ONLY | READ_WRITE } } <optionspec> ::= { <database_availability_option> | <cursor_option> | <auto_option> | <sql_option> | <recovery_option> | <database_mirroring_option> | <supplemental_logging_option> | <service_broker_option> | <date_correlation_optimization_option> } <database_availability_option> ::= { <db_state_option> | <db_user_access_option> | <db_update_option> | <external_access_option> } <db_state_option> ::= { ONLINE | OFFLINE | EMERGENCY } <db_user_access_option> ::= { SINGLE_USER | RESTRICTED_USER | MULTI_USER } <db_update_option> ::= { READ_ONLY | READ_WRITE } <external_access_option> ::= DB_CHAINING { ON | OFF } | TRUSTWORTHY { ON | OFF } } <cursor_option> ::= { CURSOR_CLOSE_ON_COMMIT { ON | OFF } | CURSOR_DEFAULT { LOCAL | GLOBAL } } <auto_option> ::= { AUTO_CLOSE { ON | OFF } | AUTO_CREATE_STATISTICS { ON | OFF } | AUTO_SHRINK { ON | OFF } | AUTO_UPDATE_STATISTICS { ON | OFF } | AUTO_UPDATE_STATISTCS_ASYNC { ON | OFF } } <sql_option> ::= { ANSI_NULL_DEFAULT { ON | OFF } | ANSI_NULLS { ON | OFF } | ANSI_PADDING { ON | OFF } | ANSI_WARNINGS { ON | OFF } | ARITHABORT { ON | OFF } | CONCAT_NULL_YIELDS_NULL { ON | OFF } | NUMERIC_ROUNDABORT { ON | OFF } | QUOTED_IDENTIFIER { ON | OFF } | RECURSIVE_TRIGGERS { ON | OFF } } <recovery_option> ::= { RECOVERY { FULL | BULK_LOGGED | SIMPLE } | TORN_PAGE_DETECTION { ON | OFF } | PAGE_VERIFY { CHECKSUM | TORN_PAGE_DETECTION | NONE } } <database_mirroring_option> ::= { <partner_option> | <witness_option> } <partner_option> ::= PARTNER { = 'partner_server' | FAILOVER | FORCE_SERVICE_ALLOW_DATA_LOSS | OFF | SUSPEND | RESUME | SAFETY { FULL | OFF } } <witness_option> ::= WITNESS { = 'witness_server' | OFF } <supplemental_logging_option> ::= SUPPLEMENTAL_LOGGING { ON | OFF } <service_broker_option> ::= { ENABLE_BROKER | DISABLE_BROKER | NEW_BROKER | ERROR_BROKER_CONVERSATIONS } <date_correlation_optimization_option> ::= { DATE_CORRELATION_OPTIMIZATION { ON | OFF } } <termination> ::= { ROLLBACK AFTER integer [ SECONDS ] | ROLLBACK IMMEDIATE | NO_WAIT }
参数说明参考2.3节创建数据库Transaction-SQL CREATE DATABASE语句的相关参数说明。
在SQL Server Management Studio中执行下面的脚本,将修改企业信息平台数据库。
USE [master] GO EXEC [ZXXS].[dbo].[sp_fulltext_database] @action = 'enable' GO ALTER DATABASE [EAMS] MODIFY FILE ( NAME = N'ZXXS', SIZE = 102400KB ) GO ALTER DATABASE [EAMS] ADD FILEGROUP [SECONDERY] GO ALTER DATABASE [EAMS] ADD FILE ( NAME = N' EAMS ', FILENAME = N'd:\Program Files\Microsoft SQL Server 2000\MSSQL\data\ EAMS.ndf' , SIZE = 102400KB , FILEGROWTH = 10%) TO FILEGROUP [SECONDERY] GO ALTER DATABASE [EAMS] MODIFY FILE ( NAME = N' EAMS_log', SIZE = 102400KB ) GO
2.3 删除数据库
当不再需要数据库,或如果它被移到另一数据库或服务器时,即可删除该数据库。数据库删除之后,文件及其数据都从服务器上的磁盘中删除。一旦删除数据库,它即被永久删除,并且不能进行检索,除非使用以前的备份。
删除数据库可以在SQL Server Management Studio中或者使用TRANSACT-SQL语句完成。
(1)在SQL Server Management Studio删除数据库
在SQL Server Management Studio删除数据库的操作很简单,执行下面的操作:
1. 打开SQL Server Management Studio,如图6所示。

图 6 SQL Server Management Studio
2. 在“对象资源管理器”中展开“数据库”文件夹,单击鼠标右键,打开弹出式菜单,选择“删除”菜单项即可,如图7所示。

图 7 选择“删除”菜单项
3. 打开“删除对象”对话框,如图8所示。当确定删除的时候,单击“确定”按钮。

图 8 “删除对象”对话框
(2)使用TRANSACT-SQL语句删除数据库
使用TRANSCT-SQL命令可以删除一个或者多个数据库及其数据库快照,其语法格式如下:
DROP DATABASE { database_name | database_snapshot_name } [ ,...n ] [;]
参数说明如下:
l database_name,表示需要删除的数据库的名称。
l database_snapshot_name,表示需要删除的数据库快照的名称。
读者可以使用Transact-SQL语句执行数据库的删除操作,脚本如下:
exec msdb.dbo.sp_delete_database_backuphistory N'EAMS' GO USE [master] GO USE [master] GO DROP DATABASE [EAMS] GO
3 企业信息平台数据库权限管理
SQL Server包含大量的安全特性,可以帮助管理员实现更高程度的安全防御。本节主要内容如下:
l 权限管理基础
l 创建登录帐号
l 角色管理
l 权限管理
3.1 权限管理基础
每个SQL Server的安全都同授予宿主的权限相关联。表3显示了权限应用于特定的安全对象。
表 3 权限应用于的安全对象
| 权限 |
应用于 |
| SELECT |
同义词 表 +列 表-值函数+列 视图 + 列 |
| UPDATE |
同义词 表+ 列 视图+ 列 |
| REFERENCES |
标量或者聚集函数 服务代理队列 表+ 列 表-值函数 + 列 视图+ 列 |
| INSERT |
同义词 表+ 列 视图+ 列 |
| DELETE |
同义词 表+ 列 视图+ 列 |
| EXECUTE |
过程 标量或者聚集函数 同义词 |
| RECEIVE |
服务代理队列 |
| VIEW DEFINITION |
过程 服务代理队列 标量或者聚集函数 同义词 表 表-值函数 视图 |
| ALTER |
过程 标量或者聚集函数 服务代理队列 表 表-值函数 视图 |
| TAKE OWNERSHIP |
过程 标量或者聚集函数 同义词 表 表-值函数 视图 |
| CONTROL |
过程 标量或者聚集函数 服务代理队列 同义词 表 表-值函数 视图 |
SQL Server提供了权限信息视图,如下所示,用户可以查询这些视图,获取权限信息。
l sys.database_principals,显示数据库中每个安全宿主对象(用户、组、角色、应用角色等等)的信息。
l sys.server_role_members,显示每个服务器角色的每个角色。
l sys.certificates,包含数据库中创建的每个证书。
l sys.asymmetric_keys ,包含非对称公钥的信息。
l sys.crypt_properties ,包含同安全对象相关的密码信息。
l sys.credentials,包含使用CREATE CREDENTIAL创建的每个证书。
l sys.symmetric_keys ,包含对称公钥的信息。
l sys.database_role_members,包含每个数据库角色的成员信息。
l sys.sql_logins ,包含SQL登录的每个安全宿主信息。
l sys.key_encryptions,包含使用CREATE SYMMETRIC KEY语句的ENCRYPTION BY子句定义的每个对称公钥的信息。
l sys.database_permissions ,包含每个数据库级权限或者列异常权限的信息。
l sys.server_principals 包含服务器级的每个安全宿主的信息。
l sys.server_permissions,包含每个服务器级权限的信息。
同时,SQL Server提供了固定数据库角色和服务器角色,从而引入更多的权限控制策略。固定服务器角色如表4所示。
表 4 固定服务器角色
| 固定数据库角色 |
数据库级权限 |
| db_accessadmin |
授予的权限:ALTER ANY USER |
| db_accessadmin |
使用CRANT选项授予的权限:CONNECT |
| db_accessadmin |
授予的权限:CREATE SCHEMA |
| db_backupoperator |
授予的权限:BACKUP DATABASE |
| db_backupoperator |
授予的权限:BACKUP LOG |
| db_backupoperator |
授予的权限:CHECKPOINT |
| db_datareader |
授予的权限:SELECT |
| db_datawriter |
授予的权限:DELETE |
| db_datawriter |
授予的权限:INSERT |
| db_datawriter |
授予的权限:UPDATE |
| db_ddladmin |
授予的权限:ALTER ANY ASSEMBLY |
| db_ddladmin |
授予的权限:ALTER ANY CERTIFICATE |
| db_ddladmin |
授予的权限:ALTER ANY CONTRACT |
| db_ddladmin |
授予的权限:ALTER ANY EVENT NOTIFICATION |
| db_ddladmin |
授予的权限:ALTER ANY DATASPACE |
| db_ddladmin |
授予的权限:ALTER ANY FULLTEXT CATALOG |
| db_ddladmin |
授予的权限:ALTER ANY MESSAGE TYPE |
| db_ddladmin |
授予的权限:ALTER ANY REMOTE SERVICE BINDING |
| db_ddladmin |
授予的权限:ALTER ANY ROUTE |
| db_ddladmin |
授予的权限:ALTER ANY SCHEMA |
| db_ddladmin |
授予的权限:ALTER ANY SERVICE |
| db_ddladmin |
授予的权限:ALTER ANY SYMMETRIC KEY |
| db_ddladmin |
授予的权限:ALTER ANY TRIGGER |
| db_ddladmin |
授予的权限:ALTER ANY XML SCHEMA COLLECTION |
| db_ddladmin |
授予的权限:CHECKPOINT |
| db_ddladmin |
授予的权限:CREATE AGGREGATE |
| db_ddladmin |
授予的权限:CREATE ASSEMBLY |
| db_ddladmin |
授予的权限:CREATE CONTRACT |
| db_ddladmin |
授予的权限:CREATE DEFAULT |
| db_ddladmin |
授予的权限:CREATE FUNCTION |
| db_ddladmin |
授予的权限:CREATE MESSAGE TYPE |
| db_ddladmin |
授予的权限:CREATE PROCEDURE |
| db_ddladmin |
授予的权限:CREATE QUEUE |
| db_ddladmin |
授予的权限:CREATE REMOTE SERVICE BINDING |
| db_ddladmin |
授予的权限:CREATE ROUTE |
| db_ddladmin |
授予的权限:CREATE RULE |
| db_ddladmin |
授予的权限:CREATE SCHEMA |
| db_ddladmin |
授予的权限:CREATE SERVICE |
| db_ddladmin |
授予的权限:CREATE SYMMETRIC KEY |
| db_ddladmin |
授予的权限:CREATE SYNONYM |
| db_ddladmin |
授予的权限:CREATE TABLE |
| db_ddladmin |
授予的权限:CREATE TYPE |
| db_ddladmin |
授予的权限:CREATE VIEW |
| db_ddladmin |
授予的权限:CREATE XML SCHEMA COLLECTION |
| db_ddladmin |
授予的权限:REFERENCES |
| db_denydatareader |
禁用的权限: SELECT |
| db_denydatawriter |
禁用的权限: DELETE |
| db_denydatawriter |
禁用的权限: INSERT |
| db_denydatawriter |
禁用的权限: UPDATE |
| db_owner |
使用CRANT选项授予的权限:CONTROL |
| db_securityadmin |
授予的权限:ALTER ANY APPLICATION ROLE |
| db_securityadmin |
授予的权限:ALTER ANY ROLE |
| db_securityadmin |
授予的权限:CREATE SCHEMA |
| db_securityadmin |
授予的权限:VIEW DEFINITION |
固定服务器角色如表5所示:
表 5 固定数据库角色
| 固定服务器角色 |
对应的服务器级权限 |
| bulkadmin |
授予的权限: ADMINISTER BULK OPERATIONS |
| dbcreator |
授予的权限: CREATE DATABASE |
| diskadmin |
授予的权限: ALTER RESOURCES |
| processadmin |
授予的权限: ALTER SERVER STATE |
| processadmin |
授予的权限: ALTER ANY CONNECTION |
| securityadmin |
授予的权限: ALTER ANY LOGIN |
| serveradmin |
授予的权限: ALTER SETTINGS |
| serveradmin |
授予的权限: SHUTDOWN |
| serveradmin |
授予的权限: CREATE ENDPOINT |
| serveradmin |
授予的权限: ALTER SERVER STATE |
| serveradmin |
授予的权限: ALTER ANY ENDPOINT |
| serveradmin |
授予的权限: ALTER RESOURCES |
| setupadmin |
授予的权限: ALTER ANY LINKED SERVER |
| sysadmin |
带GRANT 选项授予的权限:CONTROL SERVER |
在SQL Server权限体系结构中,授予特定的权限可能会隐式转换其他权限。高级权限将覆盖底层权限。
3.2 创建登录帐号
管理SQL Server登录主要包括以下内容:
l 创建登录
l 修改登录
l 删除登录
(1)创建登录
SQL Server提供的用于创建登录的Transact-SQL语句如下:
CREATE LOGIN login_name { WITH < option_list1 > | FROM < sources > } < sources >::= WINDOWS [ WITH windows_options [,...] ] | CERTIFICATE certname | ASYMMETRIC KEY asym_key_name < option_list1 >::= PASSWORD = ' password ' [ HASHED ] [ MUST_CHANGE ] [ , option_list2 [ ,... ] ] < option_list2 >::= SID = sid | DEFAULT_DATABASE = database | DEFAULT_LANGUAGE = language | CHECK_EXPIRATION = { ON | OFF} | CHECK_POLICY = { ON | OFF} [ CREDENTIAL = credential_name ] < windows_options >::= DEFAULT_DATABASE = database | DEFAULT_LANGUAGE = language
其中:
l login_names,定义登录名;
l WINDOWS,定义映射为Windows的登录名;
l CERTIFICATE certname,定义同登录相关的证书名;
l ASYMMETRIC KEY asym_key_name,定义同登录相关的非对称金钥的名称;
l PASSWORD = 'password',定义登录的口令;
l HASHED,只用于SQL Server登录;当PASSWORD参数被哈西处理之后,定义输入的口令。如果没有设置该选项,采用字符串格式存储口令。
l MUST_CHANGE,只用于SQL Server登录;如果定义了该选项,SQL Server将提示用户在第一次登录时修改口令;
l CREDENTIAL = credential_name,定义映射新的SQL Server登录的身份;
l SID = sid,只用于SQL Server登录。定义新SQL登录的GUID;
l DEFAULT_DATABASE = database,定义该登录支持的默认数据库;
l DEFAULT_LANGUAGE = language,定义赋予登录的默认语言;
l CHECK_EXPIRATION = { ON | OFF },只用于SQL Server登录;定义使用对口令采用过期策略。默认为ON;
l CHECK_POLICY = { ON | OFF },只用于SQL Server登录;定义SQL Server所运行的Windows口令策略是否用于该登录。
(2)修改登录
SQL Server提供的用于修改登录的Transact-SQL语句如下:
ALTER LOGIN login_name { < status_option > | WITH set_option [ ,... ] } < status_option >::= ENABLE | DISABLE < set_option >::= PASSWORD = ' password ' [ OLD_PASSWORD = ' oldpassword ' | secadmin_pwd_option [ secadmin_pwd_option ] ] | DEFAULT_DATABASE = database | DEFAULT_LANGUAGE = language | NAME = login_name | CHECK_POLICY = { ON | OFF } | CHECK_EXPIRATION = { ON | OFF } | CREDENTIAL = credential_name | NO_CREDENTIAL < secadmin_pwd_opt >::= MUST_CHANGE | UNLOCK
其中:
l login_name,需要修改的SQL Server登录名;
l ENABLE | DISABLE,启用或者禁用该登录;
l PASSWORD = ' password ',定义新口令;
l OLD_PASSWORD = ' old password ',定义登录的当前口令;
l MUST_CHANGE,,只用于SQL Server登录;如果定义了该选项,SQL Server将提示用户在第一次登录时修改口令;
l DEFAULT_DATABASE = database,定义该登录支持的默认数据库;
l DEFAULT_LANGUAGE = language,定义赋予登录的默认语言;
l NAME = login_name,新的登录名;
l CHECK_EXPIRATION = { ON | OFF },只用于SQL Server登录;定义使用对口令采用过期策略。默认为ON;
l CHECK_POLICY = { ON | OFF },只用于SQL Server登录;定义SQL Server所运行的Windows口令策略是否用于该登录。
l CREDENTIAL = credential_name,映射到该SQL Server登录的身份证名,它必须在服务器中存在;
l NO_CREDENTIAL,删除登录到服务器身份证的映射;
l UNLOCK,定义加锁登录应当被解锁。
(3)删除登录
删除登录的Transact-SQL语句较为简单,具体如下:
DROP LOGIN login_name
其中:
l login_name,需要删除的登录名。
下面的代码显示如何创建一个服务器登录“yjs”,并创建对应的数据库用户“yjs”。
CREATE LOGIN yjs WITH PASSWORD = '1111112221'; USE EAMS; CREATE USER yjs;
3.3 角色管理
角色是一个强大的工具,得以将用户集中到一个单元中,然后对该单元应用权限。对一个角色授予、拒绝或废除的权限也适用于该角色的任何成员。可以建立一个角色来代表单位中一类工作人员所执行的工作,然后给这个角色授予适当的权限。当工作人员开始工作时,只须将他们添加为该角色成员,当他们离开工作时,将他们从该角色中删除。而不必在每个人接受或离开工作时,反复授予、拒绝和废除其权限。权限在用户成为角色成员时自动生效。
前面我们介绍了SQL Server提供的固定服务器角色和固定数据库角色,用户也可以使用Create ROLE Transact-SQL语句创建角色,其语法如下:
CREATE ROLE role_name [ AUTHORIZATION owner_name ]
其中:
l role_name,需要创建的角色名;
l AUTHORIZATION owner_name,拥有新角色的数据库用户名或者角色名。
当创建了角色之后,可以使用存储过程sp_addrolemember将安全帐户作为当前数据库中现有 Microsoft SQL Server数据库角色的成员进行添加,具体语法如下:
sp_addrolemember [ @rolename = ] ' role ' , [ @membername = ] ' security_account '
其中:
l [ @rolename = ] ' role ',当前数据库中 SQL Server 角色的名称。role 的数据类型为 sysname,没有默认值。
l [@membername =] 'security_account',添加到角色的安全帐户。security_account 的数据类型为 sysname,没有默认值。security_account 可以是所有有效的 SQL Server 用户、SQL Server 角色或是所有已授权访问当前数据库的 Microsoft Windows 用户或组。当添加 Windows用户或组时,请指定在数据库中用来识别该 Windows用户或组的名称。
当需要从角色中删除成员时,可以使用sp_droprolemember过程,其语法如下:
| sp_droprolemember [ @rolename = ] 'role' , [ @membername = ] 'security_account' |
其中:
l 'role',某个角色的名称,将要从该角色删除成员。role 的数据类型为 sysname,没有默认值。role 必须已经存在于当前的数据库中。
l 'security_account',正在从角色中删除的安全帐户的名称。security_account 的数据类型为 sysname,没有默认值。
当需要修改角色名时,可以执行ALTER ROLE语句,其语法如下:
| ALTER ROLE role_name WITH NAME = new_name |
其中:
l role_name,需要修改的角色名;
l WITH NAME = new_name,定义角色新的名称。
当需要删除某个角色时,可以执行DROP ROLE语句,其语法如下:
| DROP ROLE role_name |
其中:
l role_name,需要删除的角色名。
下面的代码说明如何创建一个数据库角色:
| USE EAMS; CREATE ROLE buyers AUTHORIZATION BenMiller; |
3.4 权限管理
管理SQL Server权限主要包括:
l 授予权限
l 拒绝权限
l 废除权限
(1)授予权限
授予权限主要是授予允许用户帐户执行下列活动的语句权限和对象权限:
l 在当前数据库中执行活动或处理数据。
l 限制它们执行某些活动或获取某些信息,这些活动或信息都不是其预期功能的一部分。
SQL Server提供的授予权限的Transact-SQL语句是GRANT,其语法如下:
GRANT < permission > [ ,...n ] [ ON < scope > ] TO < principal > [ ,...n ] [ WITH GRANT OPTION ] [ AS { Windows_group | SQL_Server_login | database_user | database_role | application_role } ] < permission >::= ALL [ PRIVILEGES ] | permission_name [ ( column [ ,...n ] ) ] < scope >::= [ securable_class :: ] securable_name < securable_class >::= APPLICATION ROLE | ASSEMBLY | ASYMMETRIC KEY | CERTIFICATE | CONTRACT | DATABASE | ENDPOINT | FULLTEXT CATALOG | LOGIN | MESSAGE TYPE | OBJECT | REMOTE SERVICE BINDING | ROLE | ROUTE | SCHEMA | SERVER | SERVICE | SYMMETRIC KEY | TYPE | USER | XML SCHEMA COLLECTION < principal >::= Windows_login | SQL_Server_login | SQL_Server_login_mapped_to_certificate | SQL_Server_login_mapped_to_asymmetric_key | Database_user | Database_role | Application_role | Database_user_mapped_to_certificate | Database_user_mapped_to_asymmetric_key
其中:
l GRANT OPTION,表示给予了 security_account 将指定的对象权限授予其它安全帐户的能力。WITH GRANT OPTION 子句仅对对象权限有效。
l TO Windows_login,定义将权限授予的Windows登录。
l TO SQL_Server_login,定义将权限授予的SQL Server登录。
l TO SQL_Server_login_mapped_to_certificate,定义将权限授予的证书映射SQL Server登录。
l TO SQL_Server_login_mapped_to_asymmetric_key,定义将权限授予的非对称金钥映射的SQL Server登录。
l TO Database_user,定义将权限授予的数据库用户。
l TO Database_role,定义将权限授予的数据库角色。
l TO Database_user_mapped_to_certificate,定义将权限授予的证书映射数据库用户。
l TO Database_user_mapped_to_asymmetric_key,定义将权限授予的非对称金钥映射数据库用户。
l TO Application_role,定义将权限授予的应用角色。
l AS Windows_group,定义执行查询的安全对象驱动权限授予的Windows组。
l AS SQL_Server_login,定义执行查询的安全对象驱动权限授予的SQL Server登录。
l AS Database_role,定义使用固定数据库角色授予权限。
l AS Application_role,定义使用应用角色授予权限。
l TO Windows_group,定义将权限授予Windows组。
l TO SQL_Server_login,定义将权限授予SQL Server登录。
l TO database_user,定义将权限授予数据库用户。
l TO database_role,定义将权限授予数据库角色。
l TO Application_role,定义将权限授予应用角色。
l AS Windows_group,定义作为Windows组授予权限。
l AS SQL_Server_login,定义作为SQL Server登录授予权限。
l AS Database_role,定义采用数据库角色授权权限。
l AS Application_role,定义作为应用角色授予权限。
l ALL,表示授予所有可用的权限。
l PRIVILEGES,是可以包含在符合 SQL-92 标准的语句中的可选关键字。
l Securable_name,表示安全对象的名称。
l Permission_name,是当前授予的权限。
l Column,是当前数据库中授予权限的列名。
l securable_class,定义授予权限的安全对象类。
l APPLICATION ROLE,表示安全对象是一个应用角色。
l ASSEMBLY,assembly表示安全对象是一个集合。
l ASYMMETRIC KEY,表示安全对象是一个非对称金钥。
l CERTIFICATE,表示安全对象是一个证书。
l CONTRACT,表示安全对象是一个服务代理合同。
l DATABASE,表示安全对象是数据库。
l ENDPOINT,表示安全对象是一个断点。
l FULLTEXT CATALOG,表示安全对象是全文目录。
l LOGIN,表示安全对象是SQL Server登录。
l MESSAGE TYPE,表示安全对象是服务代理消息类型。
l OBJECT,表示安全对象是模式层对象。
l REMOTE BINDING,表示安全对象是服务代理远程绑定。
l ROLE,表示安全对象是服务代理角色。
l ROUTE,表示安全对象是服务代理路由。
l SCHEMA,表示安全对象是模式。
l SERVER,表示安全对象是服务器。
l SERVICE,表示安全对象是服务代理服务。
l SYMMETRIC KEY,表示安全对象是对称金钥。
l TYPE,表示安全对象是类型。
l USER,表示安全对象是用户。
l XML SCHEMA COLLECTION,表示安全对象是XML模式集合。
(2)拒绝权限
拒绝用户帐户上的权限,主要用于:
l 删除以前授予用户、组或角色的权限。
l 停用从其它角色继承的权限。
l 确保用户、组或角色将来不继承更高级别的组或角色的权限。
SQL Server提供的拒绝权限的Transact-SQL语句语法如下:
DENY < permission > [ ,...n ] [ ON < scope > ] TO < principal > [ ,...n ] [ CASCADE ] [ AS { Windows_group | SQL_Server_login | database_role | application_role } ] < permission >::= ALL [ PRIVILEGES ] | permission_name [ ( column [ ,...n ] ) ] < scope >::= [ securable_class :: ] securable_name < securable_class >::= APPLICATION ROLE | ASSEMBLY | ASYMMETRIC KEY | CERTIFICATE | CONTRACT | DATABASE | ENDPOINT | FULLTEXT CATALOG | LOGIN | MESSAGE TYPE | OBJECT | REMOTE SERVICE BINDING | ROLE | ROUTE | SCHEMA | SERVER | SERVICE | SYMMETRIC KEY | TYPE | USER | XML SCHEMA COLLECTION < principal >::= Windows_login | SQL_Server_login | SQL_Server_login_mapped_to_certificate | SQL_Server_login_mapped_to_asymmetric_key | Database_user | Database_role | Application_role | Database_user_mapped_to_certificate | Database_user_mapped_to_asymmetric_key
具体参数说明参考GRANT语法的对应参数。
(3)废除权限
废除权限用于废除以前授予或拒绝的权限。废除类似于拒绝,因为二者都是在同一级别上删除已授予的权限。但是,废除权限是删除已授予的权限,并不妨碍用户、组或角色从更高级别继承已授予的权限。因此,如果废除用户查看表的权限,不一定能防止用户查看该表,因为已将查看该表的权限授予了用户所属的角色。
SQL Server提供用于废除权限的Transact-SQL语句REVOKE,其语法如下:
REVOKE [ GRANT OPTION FOR ] < permission > [ ,...n ] [ ON < scope > ] { TO | FROM } < principal > [ ,...n ] [ CASCADE ] [ AS { Windows_group | SQL_Server_login | database_role | application_role } ] < permission >::= ALL [ PRIVILEGES ] | permission_name [ ( column [ ,...n ] ) ] < scope >::= [ < securable_class > :: ] securable_name < securable_class >::= APPLICATION ROLE | ASSEMBLY | ASYMMETRIC KEY | CERTIFICATE | CONTRACT | DATABASE | ENDPOINT | FULLTEXT CATALOG | LOGIN | MESSAGE TYPE | OBJECT | REMOTE SERVICE BINDING | ROLE | ROUTE | SCHEMA | SERVER | SERVICE | SYMMETRIC KEY | TYPE | USER | XML SCHEMA COLLECTION < principal >::= Windows_login | SQL_Server_login | SQL_Server_login_mapped_to_certificate | SQL_Server_login_mapped_to_asymmetric_key | Database_user | Database_role | Application_role | Database_user_mapped_to_certificate | Database_user_mapped_to_asymmetric_key
具体参数说明请参考GRANT语法的对应参数。
下面的示例给用户 yjs授予多个语句权限。
| GRANT CREATE DATABASE, CREATE TABLE TO yjs |
4 企业信息平台的备份与恢复
备份与恢复对于企业数据库管理是非常重要的一个方面,本节主要讨论如何执行备份与恢复。主要内容包括:
l 企业信息平台的数据库备份
l 企业信息平台的数据库恢复
4.1 企业信息平台的数据库备份
今天,计算机软件、硬件系统的可靠性都有很大改善,而且还可以采用磁盘阵列等设备来提高系统的容错能力,这些技术提高了系统的可靠性。然而这些措施不可能是完美的,也无法保证系统安全做到万无一失,它们只是在一定程度上减少了由于介质故障带来的损失。然而,对于操作人员的意外操作或蓄意的破坏性操作、破坏性病毒的攻击、自然灾害带来的原因所引起的系统故障,以上措施还是存在不足。定期进行数据库备份是保证系统安全的一项重要措施。在意外情况发生时,可以依靠备份数据来恢复数据库。
任何一个数据库管理员应该认识到数据库中数据的重要性和备份它们的重要性。有了备份可以在服务器崩溃之后迅速有效地恢复数据库的备份产品。除了灾难恢复之外,下述原因是数据备份的理由:
l 偶然地或恶意地修改或者删除数据。
l 一些自然灾难,像火灾、水灾或者风暴。
l 设备被盗或遭到破坏。
l 从一台机器到另一台机器所进行的数据传输。
l 永久的数据档案。
总之,对于SQL Server的管理者来说,有许多理由要进行数据备份,而其中最主要的原因就是从数据灾难中恢复。数据备份工作关系到数据灾害发生后是否还会有工作。所以,备份是数据库恢复中采用的基本技术。
SQL Server提供了备份整个数据库、事务日志、一个或者多个文件和文件组的Transact-SQL语句。
备份整个数据库的语法如下:
BACKUP DATABASE { database_name | @database_name_var } TO < backup_device > [ ,...n ] [ [ MIRROR TO < backup_device > [ ,...n ] ] [ ...m ] ] [ WITH [ BLOCKSIZE = { blocksize | @blocksize_variable } ] [ [ , ] { CHECKSUM | NO_CHECKSUM } ] [ [ , ] { STOP_ON_ERROR | CONTINUE_AFTER_ERROR } ] [ [ , ] DESCRIPTION = { 'text' | @text_variable } ] [ [ , ] DIFFERENTIAL ] [ [ , ] EXPIREDATE = { date | @date_var } | RETAINDAYS = { days | @days_var } ] [ [ , ] PASSWORD = { password | @password_variable } ] [ [ , ] { FORMAT | NOFORMAT } ] [ [ , ] { INIT | NOINIT } ] [ [ , ] { NOSKIP | SKIP } ] [ [ , ] MEDIADESCRIPTION = { 'text' | @text_variable } ] [ [ , ] MEDIANAME = { media_name | @media_name_variable } ] [ [ , ] MEDIAPASSWORD = { mediapassword | @mediapassword_variable } ] [ [ , ] NAME = { backup_set_name | @backup_set_name_var } ] [ [ , ] { NOREWIND | REWIND } ] [ [ , ] { NOUNLOAD | UNLOAD } ] [ [ , ] RESTART ] [ [ , ] STATS [ =percentage ] ] [ [ , ] COPY_ONLY ] ]
备份特定文件或者文件组的语法如下:
BACKUP DATABASE { database_name | @database_name_var } < file_or_filegroup > [ ,...f ] TO < backup_device > [ ,...n ] [ [ MIRROR TO < backup_device > [ ,...n ] ] [ ...m ] ] [ WITH [ BLOCKSIZE = { blocksize | @blocksize_variable } ] [ [ , ] { CHECKSUM | NO_CHECKSUM } ] [ [ , ] { STOP_ON_ERROR | CONTINUE_AFTER_ERROR } ] [ [ , ] DESCRIPTION = { 'text' | @text_variable } ] [ [ , ] DIFFERENTIAL ] [ [ , ] EXPIREDATE = { date | @date_var } | RETAINDAYS = { days | @days_var } ] [ [ , ] PASSWORD = { password | @password_variable } ] [ [ , ] FORMAT | NOFORMAT ] [ [ , ] { INIT | NOINIT } ] [ [ , ] { NOSKIP | SKIP } ] [ [ , ] MEDIADESCRIPTION = { 'text' | @text_variable } ] [ [ , ] MEDIANAME = { media_name | @media_name_variable } ] [ [ , ] MEDIAPASSWORD = { mediapassword | @mediapassword_variable } ] [ [ , ] NAME = { backup_set_name | @backup_set_name_var } ] [ [ , ] { NOREWIND | REWIND } ] [ [ , ] { NOUNLOAD | UNLOAD } ] [ [ , ] RESTART ] [ [ , ] STATS [ =percentage ] ] [ [ , ] COPY_ONLY ] ] --定义文件或者文件组 < file_or_filegroup > ::= { FILE = { logical_file_name | @logical_file_name_var } | FILEGROUP = { logical_filegroup_name | @logical_filegroup_name_var } | READ_WRITE_FILEGROUPS }
备份事务日志的语法如下:
BACKUP LOG { database_name | @database_name_var } { TO < backup_device > [ ,...n ] [ [ MIRROR TO < backup_device > [ ,...n ] ] [ ...m ] ] [ WITH [ BLOCKSIZE = { blocksize | @blocksize_variable } ] [ [ , ] { CHECKSUM | NO_CHECKSUM } ] [ [ , ] { STOP_ON_ERROR | CONTINUE_AFTER_ERROR } ] [ [ , ] DESCRIPTION = { 'text' | @text_variable } ] [ [ ,] EXPIREDATE = { date | @date_var } | RETAINDAYS = { days | @days_var } ] [ [ , ] PASSWORD = { password | @password_variable } ] [ [ , ] { FORMAT | NOFORMAT } ] [ [ , ] { INIT | NOINIT } ] [ [ , ] { NOSKIP | SKIP } ] [ [ , ] MEDIADESCRIPTION = { 'text' | @text_variable } ] [ [ , ] MEDIANAME = { media_name | @media_name_variable } ] [ [ , ] MEDIAPASSWORD = { mediapassword | @mediapassword_variable } ] [ [ , ] NAME = { backup_set_name | @backup_set_name_var } ] [ [ , ] NO_TRUNCATE ] [ [ , ] { NORECOVERY | STANDBY = undo_file_name } ] [ [ , ] { NOREWIND | REWIND } ] [ [ , ] { NOUNLOAD | UNLOAD } ] [ [ , ] RESTART ] [ [ , ] STATS [ =percentage ] ] [ [ , ] COPY_ONLY ] ] } < backup_device > ::= { { logical_backup_device_name | @logical_backup_device_name_var } | { DISK | TAPE } = { 'physical_backup_device_name' | @physical_backup_device_name_var } }
参数说明如下:
l DATABASE,指定一个完整的数据库备份。假如指定了一个文件和文件组的列表,那么仅有这些被指定的文件和文件组被备份。
l { database_name| @database_name_var },指定了一个数据库,从该数据库中对事务日志、部分数据库或完整的数据库进行备份。如果作为变量 (@database_name_var) 提供,则可将该名称指定为字符串常量 (@database_name_var = database name) 或字符串数据类型(ntext 或 text 数据类型除外)的变量。
l TO,表示备份设备的协作集要么是非镜像媒体集合,要么是镜像媒体集中的一个镜像。
l MIRROR TO,表示备份设备的协作集是一个镜像媒体集合中的一个镜像。备份设备必须是同一类型,设备的类型在TO子句中指定。在镜像媒体集中,所有的备份设备必须具有相同的属性。
l M,是一个占位符,表示BACKUP语句能够包含最多三个MIRROR TO子句。
l < backup_device >,指定备份操作时要使用的逻辑或物理备份设备。
l { logical_backup_device_name | @logical_backup_device_name_var },是由 sp_addumpdevice 创建的备份设备的逻辑名称,数据库将备份到该设备中,其名称必须遵守标识符规则。如果将其作为变量 (@logical_backup_device_name_var) 提供,则可将该备份设备名称指定为字符串常量 (@logical_backup_device_name_var = logical backup device name) 或字符串数据类型(ntext 或 text 数据类型除外)的变量。
l { DISK | TAPE } = { 'physical_backup_device_name' | @physical_backup_device_name_var },允许在指定的磁盘或磁带设备上创建备份。在执行 BACKUP 语句之前不必存在指定的物理设备。如果存在物理设备且 BACKUP 语句中没有指定 INIT 选项,则备份将追加到该设备。当指定 TO DISK 或 TO TAPE 时,请输入完整路径和文件名。例如,DISK = 'C:\Program Files\Microsoft SQL Server\MSSQL\BACKUP\Mybackup.dat' 或 TAPE = '\\.\TAPE0'。如果使用的是具有统一命名规则 (UNC) 名称的网络服务器或已重新定向的驱动器号,则请指定磁盘的设备类型。当指定多个文件时,可以混合逻辑文件名(或变量)和物理文件名(或变量)。但是,所有的设备都必须为同一类型(磁盘、磁带或管道)。
l n,是表示可以指定多个备份设备的占位符。备份设备数目的上限为 64。
l DESCRIPTION = { 'text'| @text_variable },指定描述备份集的自由格式文本。该字符串最长可以有 255 个字符。
l DIFFERENTIAL,指定数据库备份或文件备份应该与上一次完整备份后改变的数据库或文件部分保持一致。差异备份一般会比完整备份占用更少的空间。对于上一次完整备份时备份的全部单个日志,使用该选项可以不必再进行备份。
l EXPIREDATE ={ date| @date_var },指定备份集到期和允许被重写的日期。如果将该日期作为变量 (@date_var) 提供,则可以将该日期指定为字符串常量 (@date_var = date)、字符串数据类型变量(ntext 或 text 数据类型除外)、smalldatetime 或者 datetime 变量,并且该日期必须符合已配置的系统 datetime 格式。
l RETAINDAYS ={ days| @days_var },指定必须经过多少天才可以重写该备份媒体集。假如用变量 (@days_var) 指定,该变量必须为整型。
l PASSWORD = { password | @password_variable },指定必须经过多少天才可以重写该备份媒体集。假如用变量 (@days_var) 指定,该变量必须为整型。
l FORMAT,指定应将媒体头写入用于此备份操作的所有卷。任何现有的媒体头都被重写。FORMAT 选项使整个媒体内容无效,并且忽略任何现有的内容。
l NOFORMAT,指定媒体头不应写入所有用于该备份操作的卷中,并且不要重写该备份设备除非指定了 INIT。
l INIT,指定应重写所有备份集,但是保留媒体头。如果指定了 INIT,将重写那个设备上的所有现有的备份集数据。
l NOINIT,表示备份集将追加到指定的磁盘或磁带设备上,以保留现有的备份集。NOINIT 是默认设置。
l NOSKIP,指示 BACKUP 语句在可以重写媒体上的所有备份集之前先检查它们的过期日期。
l SKIP,禁用备份集过期和名称检查,这些检查一般由 BACKUP 语句执行以防重写备份集。
l MEDIADESCRIPTION = { text | @text_variable },为整个备份媒体集指明媒体名,最多为 128 个字符。假如指定了 MEDIANAME,则它必须与以前指定的媒体名相匹配,该媒体名已存在于备份卷中。假如没有指定 MEDIANAME,或指定了 SKIP 选项,将不会对媒体名进行验证检查。
l MEDIANAME = { media_name | @media_name_variable },为整个备份媒体集指明媒体名,最多为 128 个字符。假如指定了 MEDIANAME,则它必须与以前指定的媒体名相匹配,该媒体名已存在于备份卷中。假如没有指定 MEDIANAME,或指定了 SKIP 选项,将不会对媒体名进行验证检查。
l MEDIAPASSWORD = { mediapassword | @mediapassword_variable },为媒体集设置密码。MEDIAPASSWORD 是一个字符串。如果为媒体集定义了密码,则在该媒体集上创建备份集时必须提供此密码。另外,从该媒体集执行任何还原操作时也必须提供媒体密码。只有通过格式化才能重写受密码保护的媒体。
l NAME ={ backup_set_name| @backup_set_var },指定备份集的名称。名称最长可达 128 个字符。假如没有指定 NAME,它将为空。
l NORECOVERY,只与 BACKUP LOG 一起使用。备份日志尾部并使数据库处于正在还原的状态。当将故障转移到辅助数据库或在 RESTORE 操作前保存日志尾部时,NORECOVERY 很有用。
l STANDBY =undo_file_name,只与 BACKUP LOG 一起使用。备份日志尾部并使数据库处于只读或备用模式。撤消文件名指定了容纳回滚更改的存储,如果随后应用 RESTORE LOG 操作,则必须撤消这些回滚更改。如果指定的撤消文件名不存在,SQL Server 将创建该文件。如果该文件已存在,则 SQL Server 将重写它。
l NOREWIND,指定 SQL Server 在备份操作完成后使磁带保持打开。NOREWIND 意即 NOUNLOAD。SQL Server 将保留磁带驱动器的所有权,直到 BACKUP或 RESTORE 命令使用 REWIND 为止。
l REWIND,指定 SQL Server 将释放磁带和倒带。如果 NOREWIND 和 REWIND 均未指定,则默认设置为 REWIND。
l CHECKSUM,验证数据库页的页效验和。
l NO_CHECKSUM,显式禁用备份效验和。
l STOP_ON_ERROR,表示如果无法验证效验和,则指示BACKUP失败。
l CONTINUE_AFTER_ERROR,表示当遇到错误,如非法效验和时,BACKUP依旧继续。
l NOUNLOAD,指定不在备份后从磁带驱动器中自动卸载磁带。设置始终为 NOUNLOAD,直到指定 UNLOAD 为止。该选项只用于磁带设备。
l UNLOAD,指定在备份完成后自动倒带并卸载磁带。启动新用户会话时其默认设置为 UNLOAD。该设置一直保持到用户指定了 NOUNLOAD 时为止。该选项只用于磁带设备。
l STATS [ =percentage],每当另一个 percentage 结束时显示一条消息,它被用于测量进度。如果省略 percentage,SQL Server 将每完成 10 个百分点显示一条消息。
l < file_or_filegroup >,指定包含在数据库备份中的文件或文件组的逻辑名。可以指定多个文件或文件组。
l COPY_ONLY,定义备份不会影响备份的正常序列,COPY_ONLY选项的影响对不同的备份类型式不同的。
l FILE ={ logical_file_name| @logical_file_name_var },给一个或多个包含在数据库备份中的文件命名。
l FILEGROUP ={ logical_filegroup_name| @logical_filegroup_name_var },给一个或多个包含在数据库备份中的文件组命名。
l READ_WRITE_FILEGROUPS,指定部分备份,包括主文件组和任何可读写辅助文件组。对于创建部分备份,必须定义该选项。
l F,是一个占位符,表示可以指定多个文件和文件组。对文件或文件组的最大个数没有限制。
l LOG,指定只备份事务日志。该日志是从上一次成功执行了的 LOG 备份到当前日志的末尾。一旦备份日志,可能会截断复制或活动事务不再需要的空间。
l NO_TRUNCATE,允许在数据库损坏时备份日志。
下面的实例用于显示对在线销售管理系统数据库EAMS进行差异备份。
| BACKUP DATABASE EAMS TO EMAS_1 WITH INIT GO BACKUP DATABASE EAMS TO EMAS_1 WITH DIFFERENTIAL GO |
4.2 企业信息平台的数据库恢复
SQL Server提供了3种恢复模型,分别是:
l 简单恢复 ,允许将数据库恢复到最新的备份。
l 完全恢复,允许将数据库恢复到故障点状态。
l 大容量日志记录恢复,允许大容量日志记录操作。
这些模型中的每个都是针对不同的性能、磁盘和磁带空间以及保护数据丢失的需要。例如,当选择恢复模型时,必须考虑下列业务要求之间的权衡:
l 大规模操作的性能(如创建索引或大容量装载)。
l 数据丢失表现(如已提交的事务丢失)。
l 事务日志空间损耗
l 备份和恢复过程的简化。
根据正在执行的操作,可以有多个适合的模型。选择了恢复模型后,设计所需的备份和恢复过程。表6提供了三种恢复模型的优点和含义的概述。
表 6备份模型之间的比较
| 恢复模型 |
优点 |
工作损失表现 |
能否恢复到即时点? |
| 简单 |
允许高性能大容量复制操作。 收回日志空间以使空间要求最小。 |
必须重做自最新的数据库或差异备份后所发生的更改。 |
可以恢复到任何备份的结尾处。随后必须重做更改。 |
| 完全 |
数据文件丢失或损坏不会导致工作损失。 可以恢复到任意即时点(例如,应用程序或用户错误之前)。 |
正常情况下没有。 如果日志损坏,则必须重做自最新的日志备份后所发生的更改。 |
可以恢复到任何即时点。 |
| 大容量日志记录的 |
允许高性能大容量复制操作。大容量操作使用最少的日志空间。 |
如果日志损坏,或者自最新的日志备份后发生了大容量操作,则必须重做自上次备份后所做的更改。否则不丢失任何工作。 |
可以恢复到任何备份的结尾处。随后必须重做更改。 |
简单恢复所需的管理最少。在简单恢复模型中,数据只能恢复到最新的完整数据库备份或差异备份的状态。不使用事务日志备份,而使用最小事务日志空间。一旦不再需要日志空间从服务器故障中恢复,日志空间便可重新使用。与完整模型或大容量日志记录模型相比,简单恢复模型更容易管理,但如果数据文件损坏,则数据损失表现会更高。
完全恢复和大容量日志记录恢复模型为数据提供了最大的保护性。这些模型依靠事务日志提供完全的可恢复性,并防止最大范围的故障情形所造成的工作损失。完全恢复模型提供最大的灵活性,可将数据库恢复到更早的即时点。
大容量日志记录模型为某些大规模操作(如创建索引或大容量复制)提供了更高的性能和更低的日志空间损耗。不过这将牺牲时点恢复的某些灵活性。很多数据库都要经历大容量装载或索引创建的阶段,因此可能希望在大容量日志记录模型和完全恢复模型之间进行切换。
SQL Server支持单独使用一种备份方式或组合使用多种备份方式。选择的恢复模型将决定总体备份策略,包括可以使用的备份类型。表7说明适用于每种恢复模型的备份类型。
表 7 支持每种恢复模型的备份类型
| 模型 |
备份类型 |
|||
| 数据库 |
数据库差异 |
事务日志 |
文件或文件差异 |
|
| 简单 |
必需 |
可选 |
不允许 |
不允许 |
| 完全 |
必需(或文件备份) |
可选 |
必需 |
可选 |
| 大容量日志记录 |
必需(或文件备份) |
可选 |
必需 |
可选 |
下面的示例恢复创建的完全数据库备份,并使用该备份实现数据库恢复操作。
RESTORE DATABASE EAMS FROM EAMS_1 WITH NORECOVERY RESTORE DATABASE EAMS FROM EAMS_1 WITH FILE = 2
