第七章 SQL Server 2000 数据库管理系统

Download Report

Transcript 第七章 SQL Server 2000 数据库管理系统

第7章 SQL Server 2000
数据库管理系统
返回
1
关于 SQL Server
SQL Server 是一个关系数据库管理系统。
它最初是由Microsoft、Sybase和Ashton-Tate三家
公司联合开发的,于1988年推出了第一个OS/2版本。
后来,Ashton-Tate公司退出了SQL Server的开发。
而在Windows NT推出后,Microsoft与Sybase在SQL
Server的开发上就分道扬镳了:
Microsoft将SQL Server 移植到Windows NT系统上,
专注于开发推广SQL Server的Windows NT版本;
Sybase 则较专注于SQL Server在UNIX操作系统上的
应用。
我们介绍的是Microsoft SQL Server 。
返回
2
 SQL Server 2000是Microsoft公司推出的SQL
Server数据库管理系统的最新版本。
该版本继承了SQL Server 7.0版本的优点,同
时又比它增加了许多更先进的功能:
具有使用方便、可伸缩性好与相关软件集成程度高
等优点。
可跨越从运行Microsoft Windows 98的膝上型电脑
到运行Microsoft Windows 2000的大型多处理器的服
务器等多种平台使用。
SQL Server 2000包括4个常见版本:
返回
3
(1)企业版(Enterprise Edition)
 支持所有的SQL Server 2000 特性,可作为大型Web 站点、
企业OLTP(联机事务处理)以及数据仓库系统等的产品数据
库服务器。
(2)标准版(Standard Edition)
 用于小型的工作组或部门。
(3)个人版(Personal Edition)
 用于单机系统或客户机。
(4)开发者版(Developer Edition)
 用于程序员开发应用程序,这些程序需要SQL Server 2000
作为数据存储设备。
此外,SQL Server 2000 还有Desktop Engine(桌
面引擎)和Windows CE 版,用户可以根据实际情况
选择所要安装的SQL Server 2000 版本。
返回
4
7.1
7.1.1
SQL Server 2000的新特性
数据库增强
1. 支持扩展标示语言XML(Extensible Markup Language)
SQL Server 2000 对XML 的支持表现在以下几个方面:
可以通过URL(Uniform Resource Locator)访问SQL Server
支持XML-Data 模式
可检索编写XML 数据
SQL Server 2000 OLE DB 增加了对XML 文档的支持
2. 新的数据类型
SQL Server 2000 中增加了3 种新的数据类型:BIGINT、
SQL_VARIANT和TABLE。
3. 数据行中的Text类型数据
 SQL Server 2000 中可以将TEXT 和IMAGE 类型的数据直接存放到
表的数据行中,而不是存放到不同的数据页中,这就减少了用于存
储TEXT 和IMAGE 类型的空间并相应减少了磁盘处理这类数据的I/O
数量。
返回
5
4. 用户自定义函数
 SQL Server 2000 扩展了Transact-SQL语言的可编程性,用户可
以创建自己的Transact-SQL函数。用户自定义函数可以返回一个数
量值或表。
5. 索引增强
 可以在计算列上创建索引,这是一个很大的改进。
6. 全文检索增强
 全文检索中增加了改变跟踪和图形过滤的功能,其中,图形过滤
功能允许对存储在IMAGE类型列中的文档数据进行查询和创建索引。
7. 索引化视图
 索引化视图允许在视图上创建索引,这就大大提高了需要频繁进
行连接查询的程序的性能。
8. 分布式查询增强
 SQL Server 2000 引入了OPENROWSET()的函数,它可以指定在分
布式查询中的一个特定的连接信息,分布式查询优化器的功能有了
进一步的提高,授予了OLE DB 数据源更多的SQL 操作权。
9. 触发器类型
 创建触发器时可以通过FOR 子句来指定触发器类型为INSTEAD OF
型或AFTER 型,不同类型的触发器执行的时机不同。
返回
6
10. 级联参考完整性约束
 级联参考完整性约束可以控制在删除或更新有外键约束的
数据时所采取的操作,这种控制是通过在CREATE TABLE 或
ALTER TABLE 命令中的REFERENCES 子句中加入ON DELETE 或
ON UPDATE 子句来实现的。
11. Collation 增进
 SQL Server 2000 用Collation 来替代Code pages 和Sort
Orders,它比以前的版本提供了更多对Collation 的支持,
并引入了一个基于Windows Collations 的新的Collation集
合,可以指定数据库级或列级的Collation。
返回
7
7.1.2 联合数据库服务器
SQL Server 2000 支持分布式的分区视图,可
以跨越多个服务器水平地分割表。
1. 多个SQL Server 实例
 SQL Server 2000 支持在同一计算机上同时运行多个关系
数据库实例,每个实例有其独立的系统和用户数据库集合,
应用程序采用与连接不同计算机上的SQL Server 实例大致相
同的方式连接同一计算机上的各个实例。
2. Failover 群集增强
 对Failover 群集的管理有了较大的改善,可以方便地安装、
配置和管理一个SQL Server 2000的Failover 群集。
3. 网络库(Net-Library)增强
 简化了客户机配置并支持同一计算机上的多实例连接。
4. Kerberos 和安全授权
 SQL Server 2000 使用Kerberos 来支持客户机和服务器之
间相互的身份验证,使用Kerberos 和授权来支持复合认证以
及SQL Server 注册。
返回
8
5. 备份(Backup)和还原(Restore)增强
 SQL Server 2000 引入了一个更容易理解的模型来指定备
份和还原的选项,同时还支持使用事务日志标识来还原工作
到指定点或进行数据库的部分还原。
6. 对公用操作的可伸缩性增强
 增强的公用操作包括快速差异备份并行的数据库一致性校
验和并行扫描。
7. 复制增强
 SQL Server 2000 改进并增强了合并复制、快照复制和事
务复制等功能,并在复制中增加了可变化的订阅功能,因而
实施、监视和管理复制变得更加容易。
8. 数据转换服务增强
(1)支持键和约束。
(2)DTS 支持键和约束可以使用数据导入导出向导
从源表向目标表移动主键、外键和约束。
返回
9
(3)新的定制任务
 SQL Server 2000 DTS Designer 和DTS 对象模型提供了新的自定
义任务功能从而可以创建执行任务的包或设置基于实时环境属性的
变量,包括从或向Internet 以及FTP 站点导入数据、发送数据、以
异步方式运行包、创建互相发送消息的包、创建执行其它包的包以
及在同一事务中包含多个包执行。
(4)将DTS 包保存在VB 文件中
 将DTS 包保存到Microsoft® Visual Basic 文件中,可以允许将
通过DTS 导入向导、DTS导出向导或DTS Designer 创建的包与
Visual Basic 程序结合在一起或被需要引用DTS 对象模型组件的
Visual Basic 开发者用作原型。
9. SQL Server Analysis Services
 SQL Server 7.0 中的OLAP(Online Analytical Processing)服
务转变为SQL Server 2000 中的分析服务(Analysis Services),
分析服务还包括了新的数据挖掘功能。
10. SQL Server Meta Data Services
 SQL Server 7.0 中的贮藏室(Repository)部分在SQL Server
2000 中转化为元数据服务(Meta Data Services)。
返回
10
7.2
SQL Server 2000的主要组件
SQL Server 2000 提供了一整套的管理工具和实用程序,使
用这些工具和程序,可以设置和管理SQL Server 进行数据库
管理和备份,并保证数据的安全和一致。
下面,对这些组件做一个简单的介绍。
1.企业管理器(Enterprise Manager)
企 业 管 理 器 是 SQL Server 中 最 重 要 的 管 理 工 具 , 在 使 用 SQL
Server的过程中大部分的时间都是和它打交道。
通过企业管理器可以管理所有的数据库系统工作和服务器工作,也
可以调用其它的管理开发工具。
2.查询分析器(Query Analyzer)
查询分析器用于执行Transaction-SQL 命令等SQL 脚本程序,以查
询分析或处理数据库中的数据,这是一个非常实用的工具,对掌握
SQL 语言、理解SQL Server 的工作有很大帮助。
使用查询分析器的熟练程度是衡量一个SQL Server 用户水平的标
准。
返回
11
3.服务管理器(Service Manager)
服务管理器用于启动、暂停或停止SQL Server 的4种服务:、
DTC(Distributed Transaction Coordinator 分布式事务协调器)
MSSQL Server OLAP service
SQL Server
SQL Server Agent
4.客户端网络实用工具(Client Network Utility)
客户端网络实用工具用于配置客户端的连接、测定网络库的
版本信息以及设定本地数据库的相关选项。
5.服务器网络实用工具(Server Network Utility)
服务器网络实用工具用于配置服务器端的连接、测定网络库
的版本信息。
6.导入和导出数据(Import and Export Data)
导入和导出数据采用 DTS Import/Export 向导来完成,此
向导包含了所有的DTS(Data Transformation Services 数
据转换服务)工具提供了在OLE DB数据源之间复制数据的最
简捷的方法。
返回
12
7 . 在 IIS 中 配 置 SQL XML 支 持 ( Configure SQL
XML Support in IIS)
IIS(Internet Information Services 因特网信息服务),
此工具可以在运行IIS的计算机上定义、注册虚拟目录,并在
虚拟目录和SQL Server 实例之间创建关联。
8.事件探查器(Profiler)
事件探查器的功能是监视SQL Server 数据库系统引擎事件,
主要用于监听SQL Server 系统的运行性能。
9.联机丛书(Books Online)
SQL Server 2000 提供了大量的联机文档,用户可以便捷地
查询到许多很有价值的信息。
一个优秀的SQL Server 管理员必然是使用联机文档的高手。
另外,在安装SQL Server 2000 的同时,安装了SQL
Server的升级向导
在“开始”菜单的“程序”项中,将鼠标移到“Microsoft
SQL Server—版本切换”上即可看到SQL Server 升级向导。
SQL Server 升级向导用于将一个6.5 版本的SQL Server 的
设置和数据库复制升级到本机上安装的SQL Server 2000 中。
返回
13
7.3
Transact-SQL程序设计
在Transact-SQL 语言中标准的SQL 语句畅通
无阻。
Transact-SQL 也有类似于SQL 语言的分类不
过做了许多扩充。
在第3章中,我们曾介绍了标准SQL语言的语法
及其基本使用方法,在此只介绍Transact-SQL
语言中的其它部分。
7.3.1
7.3.2
7.3.3
7.3.4
变量
流程控制命令
其它命令
常用函数
返回
14
7.3.1
变量
Transact-SQL 中可以使用两种变量:局部变量和全局变量。
1.局部变量
局部变量是用户可自定义的变量,它的作用范围仅在程序内部。
在程序中通常用来储存从表中查询到的数据,或当作程序执行
过程中暂存变量使用。
局部变量必须以@ 开头,而且必须先用DECLARE 命令说明后才
可使用。其说明形式如下:
DECLARE @变量名 变量类型[,@变量名变量类型…]
在Transact-SQL 中不能像在一般的程序语言中一样使用“变
量=变量值”来给变量赋值,必须使用SELECT 或SET 命令来设定
变量的值。其语法如下:
SELECT @局部变量= 变量值
SET @局部变量量= 变量值
【例】声明一个长度为 8 个字符的变量id,并赋值。
declare @id char(8)
select @id =‘10010001’
返回
15
2.全局变量
全局变量是SQL Server 系统内部使用的变量,其作用范围并
不局限于某一程序,而是任何程序均可随时调用。
全局变量通常存储一些SQL Server 的配置设定值和效能统计
数据。用户可在程序中用全局变量来测试系统的设定值或
Transact-SQL 命令执行后的状态值。
全局变量不是由用户的程序定义的,它们是在服务器级定义的,
只能使用预先说明及定义的全局变量。
引用全局变量时必须以“@@”开头。
局部变量的名称不能与全局变量的名称相同,否则会在应用中
出错。
3.注释符
在Transact-SQL 中可使用两类注释符:
1.ANSI 标准的注释符“--”用于单行注释。
2.与C 语言相同的程序注释符号,即“/*……*/”,/* 用
于注释文字的开头,*/用于注释文字的结尾,可在程序中标识多
行文字为注释。
返回
16
7.3.2
流程控制命令
Transact-SQL 语言使用的流程控制命令与常见的程序
设计语言类似,主要有以下几种控制命令。
7.3.2.1 BEGIN…END
其语法如下:
BEGIN
<命令行或程序块块>
END
BEGIN…END 用来设定一个程序块,将在BEGIN…END
内的所有程序视为一个单元执行。
BEGIN…END 经常在条件语句(如IF…ELSE)中使用。
在BEGIN…END 中可嵌套另外的BEGIN…END 来定义另
一程序块。
返回
17
7.3.2.2 IF … ELSE
其语法如下:
IF <条件表达式式>
<命令行或程序块块>
[ELSE [条件表达式式]
<命令行或程序块块>]
其中:
<条件表达式>可以是各种表达式的组合,但表达式的值
必须是逻辑值“真”或“假”。
ELSE 子句是可选的,最简单的IF 语句没有ELSE 子句部
分。
IF…ELSE 用来判断当某一条件成立时执行某段程序,条
件不成立时执行另一段程序。
如果不使用程序块,IF 或ELSE 只能执行一条命令。
IF ELSE 可以进行嵌套,在Transact-SQL 中最多可嵌套
32 级。
返回
18
【例】从SC数据表中求出学号为S1同学的平均
成绩,如果此平均成绩大于或等于60分,则输出
“pass”信息。
if (select avg(score) from sc where sno='S1'
group by sno)>=60
begin
print 'pass'
end
返回
19
7.3.2.3 CASE
CASE 命令有两种语句格式:
格式1:
CASE <运算式>
WHEN <运算式> THEN <运算式>
…
WHEN <运算式> THEN <运算式>
[ELSE <运算式>]
END
该语句的执行过程是:
将CASE后面表达式的值与各WHEN子句中的表达式的值进行比较,
如果二者相等,则返回THEN后的表达式的值,然后跳出CASE语
句,否则返回ELSE子句中的表达式的值。
ELSE子句是可选项。当CASE语句中不包含ELSE子句时,如果所
有比较失败时,CASE语句将返回NULL。
返回
20
【例】从学生表S中,选取SNO,SEX,如果SEX
为“男”则输出“M”,如果为“女”输出“F”。
SELECT SNO,
SEX=
CASE sex
WHEN '男' THEN 'M'
WHEN '女' THEN 'F'
END
FROM S
返回
21
格式2:
CASE
WHEN <条件表达式> THEN <运算式>
…
WHEN <条件表达式> THEN <运算式>
[ELSE <运算式>]
END
该语句的执行过程是:
首先测试WHEN后的表达式的值
如果其值为真,则返回THEN后面的表达式的值,否
则测试下一个WHEN子句中的表达式的值
如果所有WHEN子句后的表达式的值都为假,则返回
ELSE后的表达式的值
如果在CASE语句中没有ELSE子句,则CASE表达式返
回NULL。
返回
22
注:CASE 命令可以嵌套到SQL 命令中。
【例】从SC表中查询所有同学选课成绩情况,凡成绩为
空者输出“未考”、小于60分输出“不及格”、60分至
70分输出“及格”、70分至90分输出“良好”、大于或
等于90分时输出“优秀”。
SELECT SNO,CNO,
SCORE=
CASE
WHEN SCORE IS NULL THEN '未考'
WHEN SCORE<60 THEN '不及格'
WHEN SCORE>=60 AND SCORE<70 THEN '及格'
WHEN SCORE>=70 AND SCORE<90 THEN '良好'
WHEN SCORE>=90 THEN '优秀'
END
FROM SC
返回
23
7.3.2.4 WHILE…CONTINUE…BREAK
其语法如下:
WHILE <条件表达式>
BEGIN
<命令行或程序块>
[BREAK]
[CONTINUE]
[命令行或程序块]
END
WHILE 命令在设定的条件成立时,会重复执行命令行
或程序块。
CONTINUE 命令可以让程序跳过CONTINUE 命令之后的
语句,回到WHILE 循环的第一行,继续进行下一次循环。
BREAK 命令则让程序完全跳出循环,结束WHILE 命令
的执行。
WHILE 语句也可以嵌套。
返回
24
如:以下程序计算1-100之间所有能被3整除的数的个
数及总和。
DECLARE @S SMALLINT,@I SMALLINT,@NUMS SMALLINT
SET @S=0
SET @I=1
SET @NUMS=0
WHILE (@I<=100)
BEGIN
IF (@I%3=0)
BEGIN
SET @S=@S+@I
SET @NUMS=@NUMS+1
END
SET @I=@I+1
END
PRINT @S
PRINT @NUMS
返回
25
7.3.2.5 WAITFOR
其语法如下:
WAITFOR {DELAY <‘时间’> | TIME <‘时间’>
| ERROREXIT | PROCESSEXIT | MIRROREXIT}
WAITFOR 命令用来暂时停止程序执行,直到所设定的
等待时间已过或所设定的时间已到才继续往下执行。
其中‘时间’必须为DATETIME 类型的数据,但不能包
括日期。
各关键字含义如下:
1.DELAY:用来设定等待的时间,最多可达24 小时
2.TIME:用来设定等待结束的时间点
3.ERROREXIT:直到处理非正常中断
4.PROCESSEXIT:直到处理正常或非正常中断
5.MIRROREXI: 直到镜像设备失败
返回
26
【例】等待1 小时2 分零3 秒后才执行SELECT
语句。
waitfor delay ‘01:02:03’
select * from employee
返回
27
7.3.2.6 GOTO
语法如下:
GOTO 标识符
GOTO 命令用来改变程序执行的流程,使程序
跳到标有标识符的指定的程序行再继续往下执行。
作为跳转目标的标识符可为数字与字符的组合。
但必须以“:”结尾。
在GOTO 命令行,标识符后不必跟“:”
返回
28
如:求1+2+3+…+10的总和。
DECLARE @S SMALLINT,@I SMALLINT
SET @I=1
SET @S=0
BEG:
IF (@I<=10)
BEGIN
SET @S=@S+@I
SET @I=@I+1
GOTO BEG
END
PRINT @S
返回
29
0
程序执行成功
-1
找不到对象
-2
数据类型错误
-3
死锁
RETURN ([整数值])
-4
违反权限原则
语法错误
RETURN 命令用于结束当前程 -5
用户造成的一般错误
序的执行,返回到上一个调用 -6
-7
资源错误如磁盘空间不足
它的程序或其它程序。
-8
非致命的内部错误
已达到系统的极限
在括号内可指定一个返回值。-9
-10 -11 致命的内部不一致性错误
表或指针破坏
如果没有指定返回值,SQL -12
数据库破坏
Server 系统会根据程序执行 -13
-14
硬件错误
7.3.2.7 RETURN
语法如下:
的结果返回一个内定值,如:
如果运行过程产生了多个错误,SQL Server 系统将返
回绝对值最大的数值;
如果此时用户定义了返回值,则以返回用户定义的值。
RETURN 语句不能返回NULL值。
返回
30
7.3.3
其它命令
1.BACKUP
BACKUP 命令用于将数据库内容或其事务处理日志备
份到存储介质上(软盘、硬盘、磁带等)。
2.CHECKPOINT
CHECKPOINT 命令用于将当前工作的数据库中被更改
过的数据页或日志页从数据缓冲器中强制写入硬盘。
3.DBCC
DBCC(Database Base Consistency Checker 数据
库一致性检查程序)命令用于验证数据库完整性、查
找错误、分析系统使用情况等。
DBCC 命令后必须加上子命令,系统才知道要做什么。
如:DBCC CHECKALLOC 命令检查目前数据库内所有数据页的
分配和使用情况。
返回
31
4.DECLARE
DECLARE 命令用于声明一个或多个局部变量、游标变量或表变
量。
在用DECLARE命令声明之后,所有的变量都被赋予初值NULL。
需要用SELECT 或SET 命令来给变量赋值。
变量类型可为系统定义的或用户定义的类型,但不能为TEXT、
NTEXT和IMAGE类型。CURSOR 指名变量是局部的游标变量。
如果变量为字符型,那么在data_type 表达式中应指明其最大
长度,否则系统认为其长度为1。如:
declare @x char,@y char(10)
select @x =‘123',@y =‘data_type'
print @x
print @y
则运行结果为:
1
data_type
返回
32
5.EXECUTE
EXECUTE 命令用来执行存储过程。
6.KILL
KILL 命令用于终止某一过程的执行。
7.PRINT
PRINT 命令向客户端返回一个用户自定义的信息,
即显示一个字符串、局部变量或全局变量。
如果变量值不是字符串的话,必须先用数据类型转
换函数CONVERT()将其转换为字符串。
8.RAISERROR
RAISERROR 命令用于在SQL Server 系统返回错误信
息时,同时返回用户指定的信息。
返回
33
9.READTEXT
READTEXT 命令语法如下:
READTEXT {table.column text_pointer offset size}
[HOLDLOCK]
 READTEXT 命令用于从数据类型为TEXT、NTEXT 或IMAGE 的列
中读取数据。
 命令从偏移位置offset+1 个字符起读取size 个字符,如果
size 为0,则会读取4KB 的数据。其中,
 text_pointer 是指向存储文本的第一个数据库页的指针,它可以
用TEXTPTR()函数来获取。
 HOLDLOCK 选项用于锁定所读取的数据直到传输结束,这段时间内
其它用户只能读取数据不能更改数据。
 如果数据列为汉字,则offset 值应取0 或其它偶数,如果用
奇数则会出现乱码。
10.RESTORE
 RESTORE 命令用来将数据库或其事务处理日志备份文件由存
储介质回存到SQL Server系统中。
返回
34
11.SELECT
SELECT 命令可用于给变量赋值其语法如下:
SELECT {@local_variable = expression } [,...n]
SELECT 命令可以一次给多个变量赋值。
当表达式expression 为列名时,SELECT 命令可利
用其查询功能一次返回多个值,变量中保存的是其返
回的最后一个值。
如果SELECT命令没有返回值,则变量值仍为其原来
的值。
当表达式expression 是一个子查询时,如果子查询
没有返回值,则变量被设为NULL。
返回
35
12.SET
SET 命令有两种用法:
(1)用于给局部变量赋值
在用DECLARE 命令声明之后,所有的变量都被赋予
初值NULL。
需要用SET 命令来给变量赋值,但与SELECT 命令不
同的是SET 命令一次只能给一个变量赋值。
不过由于SET 命令功能更强且更严密,因此,SQL
Server 推荐使用SET 命令来给变量赋值。
返回
36
(2)用于设定用户执行SQL 命令时,SQL
Server 的处理选项设定。
有以下几种设定方式:
SET:选项ON
SET:选项OFF
SET:选项值
返回
37
13.SHUTDOWN
语法如下:
SHUTDOWN [WITH NOWAIT]
SHUTDOWN 命令用于停止SQL Server 的执行。
当使用NOWAIT 参数时,SHUTDOWN命令立即停止SQL
Server,在终止所有的用户过程并对每一现行的事务
发生一个回滚后,退出SQL Server。
当没有用NOWAIT 参数时SHUTDOWN 命令将按以下步
骤执行:
(1)终止任何用户登录SQL Server
(2)等待尚未完成的Transact-SQL命令或存储过程执行完
毕
(3)在每个数据库中执行CHECKPOINT 命令
(4)停止SQL Server 的执行
返回
38
14.WRITETEXT
语法如下:
WRITETEXT {table.column text_pointer} [WITH
LOG] {data}
WRITETEXT 命令用于向数据类型为TEXT,NTEXT 或
IMAGE 的列中写入数据。其中:
 text_pointer 是指向存储文本的第一个数据库页的指针,
它可以用TEXTPTR() 函数来获取。
WITH LOG选项用于记录所写入的数据。data 可为文字或变
量,其最大长度为120KB。
注:WRITETEXT 命令不能作用于视图。
推荐使用UPDATETEXT 命令来修改TEXT、NTEXT 和
IMAGE 类型的数据:
 因为WRITETEXT 命令将数据列的数据完全替换,而
UPDATETEXT 命令可以只更改数据列的一部分。
返回
39
15.USE
语法如下:
USE {databasename}
USE 命令用于改变当前使用的数据库为指定的数据
库。
用户必须是目标数据库的用户成员或目标数据库建
有GUEST 用户账号时,使用USE 命令才能成功切换
到目标数据库。
返回
40
7.3.4
常用函数
7.3.4.1 统计函数
在SQL Server 2000中,除第3章中所讲述的统计函数外,还提供以下函数。
1.STDEV()
STDEV 函数返回表达式中所有数据的标准差。
表达式通常为表的某一数据类型为NUMERIC 的列,或近似NUMERIC 类
型的列,如MONEY 类型,但BIT 类型除外。
表达式中的NULL 值将被忽略。
其返回值为FLOAT类型。
2.STDEVP()
STDEVP 函数返回总体标准差。
3.VAR()
VAR()函数返回表达式中所有值的统计变异数。
4.VARP()
VARP()函数返回总体变异数。
2、3、4表达式及返回值类型同STDEV()函数。
返回
41
7.3.4.2
算术函数
算术函数可对数据类型为整型、浮点型、实型、货
币型和SMALLMONEY 的列进行操作。
它的返回值是6 位小数,如果使用出错,则返回
NULL值,并显示警告信息。
可以在SELECT 语句的SELECT 和WHERE 子句以及表
达式中使用算术函数。
Transact-SQL 中的算术函数如表7.1所示。
返回
42
函数
表
7
.
1
Transact-SQL
的
算
术
函
数
三角函数
SIN
COS
TAN
COT
反三角函数
ASIN
ACOS
ATAN
角度弧度转换
DEGREES
RADIANS
幂函数
EXP
LOG
LOG10
SQRT
取近似值函数
CEILING
FLOOR
ROUND
功能
返回以弧度表示的角的正弦
返回以弧度表示的角的余弦
返回以弧度表示的角的正切
返回以弧度表示的角的余切
返回正弦是FLOAT 值的以弧度表示的角
返回余弦是FLOAT 值的以弧度表示的角
返回正切是FLOAT 值的以弧度表示的角
把弧度转换为角度返
把角度转换为弧度
返回表达式的指数值
返回表达式的自然对数值
返回表达式的以10 为底的对数值
返回表达式的平方根
返回>=表达式的最小整数
返回<=表达式的最小整数
取整数,小数的第一位上四舍五入
符号函数
ABS
SIGN
返回表达式的绝对值
测试参数的正负号,返回0、1或-1,
其它函数
PI
RAND
返回值为∏,即3.1415926535897936
求0-1间的随机浮点数
返回
43
7.3.4.3 字符串函数
字符串函数对二进制数据、字符串和表达式执行不同
的运算。
此类函数作用于CHAR、VARCHAR、BINARY 和VARBINARY
数据类型以及可以隐式转换为CHAR 或VARCHAR的数据类
型。
可以在SELECT 语句的SELECT 和WHERE 子句以及表达
式中使用字符串函数。
常用的字符串函数有:
1.字符转换函数
(1)ASCII()
 ASCII()函数返回字符表达式最左端字符的ASCII 码值。
在ASCII 函数中,纯数字的字符串可不用“‘’”括起来,但
含其它字符的字符串必须用“‘’”括起来使用,否则会出错。
返回
44
(2)CHAR()
 CHAR()函数用于将ASCII 码转换为字符。
如果没有输入0 ~ 255 之间的ASCII 码值,CHAR()函数会返回一个NULL
值。
(3)LOWER()
 LOWER()函数把字符串全部转换为小写。
(4)UPPER()
 UPPER()函数把字符串全部转换为大写。
(5)STR()
 STR()函数把数值型数据转换为字符型数据。
其语法如下:
STR(<float _expression>[ length[ <decimal>]])
自变量length 和decimal 必须是非负值。
length 指定返回的字符串的长度。
decimal 指定返回的小数位数。
如果没有指定长度,缺省的length 值为10 ,decimal 缺省值为0 。
小数位数大于decimal 值时,STR()函数将其下一位四舍五入。
指定长度应大于或等于数字的符号位数+小数点前的位数+小数点位数+小数
点后的位数。
如果<float _expression>小数点前的位数超过了指定的长度,则返回指定
长度的‘*’。
返回
45
2.去空格函数
(1)LTRIM()
 LTRIM()函数把字符串头部的空格去掉。
(2)RTRIM()
 RTRIM()函数把字符串尾部的空格去掉。
在许多情况下,往往需要得到头部和尾部都没有空
格字符的字符串,这时可将上两个函数嵌套使用。
返回
46
3.取子串函数
(1)LEFT()
 LEFT()函数返回部分字符串。其语法如下:
LEFT(<character_expression>,<integer_expression>)
 LEFT()函数返回的子串是从字符串最左边起到第integer_expression
个字符的部分。
若integer_expression 为负值,则返回NULL 值。
(2)RIGHT()
 RIGHT()函数返回部分字符串。其语法如下:
RIGHT
(<character_expression>,<integer_expression>)
 RIGHT()函数返回的子串是从字符串右边第integer_expression 个字符
起到最后一个字符的部分。
若integer_expression 为负值,则返回NULL 值。
(3)SUBSTRING
SUBSTRING()函数返回部分字符串。其语法如下:
SUBSTRING (<expression> ,<starting_ position>,
length)
 SUBSTRING()函数返回的子串是从字符串左边第starting_ position 个
字符起length个字符的部分。
其中表达式可以是字符串或二进制串或含字段名的表达式。
SUBSTRING()函数不能用于TEXT 和IMAGE
数据类型。
返回
47
4.字符串比较函数
(1)CHARINDEX()
 CHARINDEX()函数返回字符串中某个指定的子串出现的开始位置。
其语法如下:
CHARINDEX (<’substring_expression’>,<expression>)
 其中,substring _expression 是所要查找的字符表达式,
expression 可为字符串也可为列名表达式。
如果没有发现子串,则返回0 值。
此函数不能用于TEXT 和IMAGE 数据类型。
(2)PATINDEX()
 PATINDEX()函数返回字符串中某个指定的子串出现的开始位置。
其语法如下:
PATINDEX (<’%substring _expression%’>,<column_
name>)
 其中子串表达式前后必须有百分号“%” ,否则返回值为0。
与CHARINDEX()函数不同的是,PATINDEX()函数的子串中可以
使用通配符,且此函数可用于CHAR、VARCHAR和TEXT 数据类型。
返回
48
(3)SOUNDEX()
 SOUNDEX()函数返回一个四位字符码。其语法如下:
SOUNDEX (<character _expression>)
 SOUNDEX()函数将character _expression 转换为4 个字
符的声音码。
其中第一个码为原字符串的第一个字符,第二到第四个字符
则为数字,是该字符串的声音字母所对应的数字,但是忽略
了除首字母外的串中的所有元音字母。
SOUNDEX()函数可用来查找声音相似的字符串。
但SOUNDEX()函数对数字和汉字均只返回0 值。
返回
49
(4)DIFFERENCE()
 DIFFERENCE()函数返回由SOUNDEX 函数返回的两个字符表达式
的值的差异。其语法如下:
DIFFERENCE (<character_expression1>,
<character_expression2>)
 值的差异是用0、1、2、3、4 来表示的,含义如下:
0—— 两个SOUNDEX()函数返回值的第一个字符不同
1—— 两个SOUNDEX()函数返回值的第一个字符相同
2—— 两个SOUNDEX()函数返回值的第一、二个字符相
同
3—— 两个SOUNDEX()函数返回值的第一、二、三个字
符相同
4—— 两个SOUNDEX()函数返回值完全相同
返回
50
5.字符串操作函数
(1)QUOTENAME()
 QUOTENAME()函数返回被特定字符括起来的字符串。其语法如下:
QUOTENAME (<’character_expression’>[,quote_
character])
 其中,quote_ character 标明括字符串所用的字符,如“‘”、
“(”、“[”等,缺省值为“[ ]”。
(2)REPLICATE()
 REPLICATE()函数返回一个重复character_expression 指定次
数的字符串。其语法如下:
REPLICATE (character_expression,integer_expression)
 如果integer_expression 值为负值,则REPLICATE 函数返回NULL
串。
(3)REVERSE()
 REVERSE()函数将指定的字符串的字符排列顺序颠倒。其语法如
下:
REVERSE (<character_expression>)
 其中,character_expression 可以是字符串常数或一个列的值。
返回
51
(4)REPLACE()
REPLACE()函数返回被替换了指定子串的字符串。其语法
如下:
REPLACE (<string_expression1>,
<string_expression2>,<string_expression3>)
REPLACE()函数用string_expression3 替换在
string_expression1 中的子串string_expression2。
(5)SPACE()
SPACE()函数返回一个有指定长度的空白字符串。其语法
如下:
SPACE (<integer_expression>)
如果integer_expression 值为负值,则SPACE 函数返回
NULL 串。
返回
52
(6)STUFF()
 STUFF()函数用另一子串替换字符串指定位置长度的子串。
其语法如下:
STUFF(<character_expression1>,
<start_
position>,<length>,
<character_expression2>)
 如果起始位置为负或长度值为负,或者起始位置大于
character_expression1 的长度,则STUFF()函数返回NULL
值。
如果length 长度大于character_expression1 的长度,则
character_expression1 只保留首字符。
返回
53
7.3.4.4 数据类型转换函数
在一般情况下,SQL Server 会自动完成数据类型的转
换。
例如,可以直接将字符数据类型或表达式与DATATIME
数据类型或表达式比较;当表达式中用了INTEGER、
SMALLINT或TINYINT 时,SQL Server 也可将INTEGER 数
据类型或表达式转换为SMALLINT数据类型或表达式,这
称为隐式转换。
如果不能确定SQL Server 是否能完成隐式转换或者使
用了不能隐式转换的其它数据类型,就需要使用数据类
型转换函数做显式转换了。
此类函数有两个:
1.CAST()
 CAST()函数语法如下:
CAST (<expression> AS <data_ type>[ length ])
返回
54
2.CONVERT()
 CONVERT 函数语法如下:
CONVERT (<data_ type>[ length ],<expression> [,style])
 data_ type 为SQL Server 系统定义的数据类型,用户自定义的数据类型
不能在此使用。
length 用于指定数据的长度缺省值为30。
把CHAR 或VARCHAR 类型转换为诸如INT 或SAMLLINT 这样的INTEGER 类型,
结果必须是带正号(+)或负号(-)的数值。
TEXT 类型到CHAR 或VARCHAR 类型的转换最多为8000 个字符,即CHAR 或
VARCHAR数据类型是最大长度。
IMAGE 类型存储的数据转换到BINARY 或VARBINARY 类型,最多为8000 个
字符。
把整数值转换为MONEY 或SMALLMONEY 类型,按定义的国家的货币单位来处
理,如人民币、美元、英镑等。
BIT 类型的转换把非零值转换为1,并仍以BIT 类型存储。
试图转换到不同长度的数据类型,会截短转换值并在转换值后显示“+”,
以标识发生了这种截断。
用CONVERT()函数的style 选项能以不同的格式显示日期和时间。
style 是将DATATIME 和SMALLDATETIME 数据转换为字符串时所选用的由
SQL Server 系统提供的转换样式编号,不同的样式编号有不同的输出格式,
如表7.2所示。
返回
55
表7.2 DATATIME 和SMALLDATETIME 类型数据的转换格式
style1
1
2
3
4
5
6
7
8
9
10
11
12
13
14
20
21
style2
0 或100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
120
121
标准
缺省
USA
ANSI
UK/French
German
Italian
USA
Japan
ISO
Europe
ODBC1
ODBC2
输出格式
mon dd yyyy hh:mi Am/Pm
mm/dd/yy
yy.mm.dd
dd/mm/yy
dd.mm.yy
dd-mm-yy
dd mon yy
mon dd yy
hh:mi:ss
mon dd yyyy
hh:mi:sss Am/Pm
mm=dd-yy
yy/mm/dd
yymmdd
dd mon yyyy
hh:mi:ss:mmm(24h)
hh:mi:ss:mmm(24h)
yyyy-mm-dd
hh:mi:ss(24h)
yyyy-mm-dd
hh:mi:ss:mmm(24h)
返回
56
7.3.4.5 日期函数
日期函数用来操作DATETIME 和SMALLDATETIME 类型的
数据,执行算术运算。
与其它函数一样,可以在SELECT 语句的SELECT 和
WHERE 子句以及表达式中使用日期函数。
1.DAY(<date_expression>)
DAY()函数返回date_expression 中的日期值。
2.MONTH(<date_expression>)
MONTH()函数返回date_expression 中的月份值。
与DAY()函数不同的是,MONTH()函数的参数为整数时,一
律返回整数值1,即SQL Server 认为其是1900 年1 月。
3.YEAR(<date_expression>)
YEAR()函数返回date_expression 中的年份值。
在使用日期函数时,其日期值应在1753 年到9999 年
之间,这是SQL Server 系统所能识别的日期范围,否则
会出现错误。
返回
57
4.DATEADD()
DATEADD()函数语法如下:
DATEADD(<datepart> <number> <date>)
DATEADD()函数返回指定日期date 加上指定的额
外日期间隔number 产生的新日期。
参数“datepart”在日期函数中经常被使用,它用来
指定构成日期类型数据的各组件,如年、季、月、日、
星期等。其取值如表7.3所示。
返回
58
表7.3 日期函数中datepart 参数的取值
datepart
缩写
取值
year
quarter
month
day of year
day
week
weekday
hour
minute
second
millisecond
yy,yyyy
qq,q
mm,m
dy,y
dd,d
wk,ww
dw
hh
mi,n
ss,s
ms
1753 ~ 9999
1 ~ 4
1 ~ 12
1 ~ 366
1 ~ 31
1 ~ 54
1 ~ 7
0 ~ 23
0 ~ 59
0 ~ 59
0 ~ 999
返回
59
5.DATEDIFF()
DATEDIFF()函数语法如下:
DATEDIFF(<datepart>,<date1>,<date2>)
DATEDIFF()函数返回两个指定日期在datepart 方
面的不同之处,即date2 超过date1的差距值,其结
果值是一个带有正负号的整数值针。
对不同的datepart,DATEDIFF()函数所允许的最
大差距值不一样,如:
datepart 为second 时DATEDIFF 函数所允许的最大差距值
为68 年;
datepart 为millisecond 时,DATEDIFF() 函数所允许的
最大差距值为24 天20 小时30 分23 秒647 毫秒。
返回
60
6.DATENAME()
DATENAME()函数语法如下:
DATENAME(<datepart>,<date>)
DATENAME()函数以字符串的形式返回日期的指定
部分此部分,由datepart 来指定。
7.DATEPART()
DATEPART()函数语法如下:
DATEPART(<datepart>,<date>)
DATEPART()函数以整数值的形式返回日期的指定
部分,此部分由datepart 来指定。
DATEPART(dd,date)等同于DAY(date)
DATEPART(mm,date)等同于MONTH(date)
DATEPART(yy,date)等同于YEAR(date)
返回
61
8.GETDATE()
GETDATE()函数语法如下:
GETDATE()
GETDATE()函数以DATETIME 的缺省格式返回系统
当前的日期和时间,它常作为其它函数或命令的参数
使用。
返回
62
7.3.4.6 TEXT 和IMAGE 函数
1.TEXTPTR()
TEXTPTR()函数语法如下:
TEXTPTR(<column>)
TEXTPTR()函数返回一个指向存储文本的第一个数据库页的
指针。
其返回值是一个VARBINARY(16)类型的二进制字符串。
如果数据类型为TEXT、NTEXT或IMAGE的列没有赋予初值,则
TEXTPTR()函数返回一个NULL 指针。
2.TEXTVALID()
TEXTVALID()函数语法如下:
TEXTVALID(<'table.column'>,<text_ pointer>)
TEXTVALID()函数用于检查指定的文本指针是否有效。
如果有效,则返回1;无效则返回0。
如果列未赋予初值,则返回NULL 值。
返回
63
7.3.4.7
用户自定义函数
从SQL Server 2000 开始,用户可以自定义函数了在
SQL Server 2000 中用户自定义函数是作为一个数据库
对象来管理的。
可以使用企业管理器或Transact-SQL 命令来创建、
修改、删除。
返回
64
7.4
企业管理器 (Enterprise Manager )
企业管理器的界面是一个标准的Windows界面,
由标题栏、菜单栏、工具栏、树窗口和任务对象
窗口板(又称任务板)组成。
企业管理器的菜单栏分为两层:
上一层是主菜单栏,下一层是控制台菜单栏。
主菜单栏在程序运行的过程中是基本保持不变的。
控制台菜单栏中的菜单则是动态的,随着所进行操
作的不同而显示不同的菜单内容。
企业管理器的工具栏也是动态的,会随着所进
行操作的不同而增加或减少图标。
返回
65
在Enterprise Manager 中提供了工具可以帮助用户产
生对象的SQL 语言脚本。
生成对象的SQL 脚本方法如下:
1.在Enterprise Manager 中选择要生成SQL 脚本的对象,单击
右键,从快捷菜单中的“所有任务”子菜单中选择“生成SQL脚
本”菜单项。
2.在“生成SQL脚本”对话框中设置选项后,单击“预览”按钮
将会弹出“生成SQL脚本预览”对话框,可以点击“复制”按钮
即可将脚本语句复制到剪贴板中;也可选择“确定”按钮并指定
脚本文件名和存放位置。
由Enterprise Manager 产生的SQL 脚本是一个后缀名
为.sql 的文件,它实际上是一个文本文件(Text
File),可以在Enterprise Manager 或其它文件编辑器
中浏览或修改。
必要时可以生成所有数据库对象的SQL 脚本,将其作
为对数据库的备份,当数据库损坏时可以在Query
Analyzer 中运行此SQL 脚本来重建数据库。
返回
66
7.5
查询分析器(Query Analyzer)
查询分析器分为两个窗口:
左侧窗口为“对象浏览器”窗口,其中:
“对象”选项卡中显示了连接到SQL Server服务器所包含的
数据库以及数据库对象。
“模板”选项卡中则显示了查询分析器所包含的各种
Transact-SQL语句模板,可以使用这些模板方便地创建自己
的SQL语句。
右侧窗口为SQL语句的输入窗口
输入SQL语句或者打开一个SQL脚本文件后,可以单击工具栏
上的“执行查询”按钮 来执行SQL语句。
执行完成后,将在右侧窗口的下部显示执行结果或SQL语句
出错信息。
返回
67
7.6
7.6.1
管理数据库
系统数据库
SQL Server 2000 有四个系统数据库:Master、Model、
Msdb、Tempdb。
这些系统数据库的文件存储在Microsoft SQL Server
默认安装目录的MSSQL子目录的Data 文件夹中。
1. Master 数据库
Master 数据库记录了一个SQL Server 系统的所有系
统信息,这些系统信息主要有:
(1)所有的登录信息
(2)系统设置信息
(3)SQL Server 初始化信息
(4)系统中其它系统数据库和用户数据库的相关信息,包括其
主文件的存放位置等
返回
68
2. Model 数据库
Model 数据库是所有用户数据库和Tempdb 数据库的创
建模板。
当创建数据库时,系统会将Model 数据库中的内容复
制到新建的数据库中去。
由此可见,利用Model 数据库的模板特性,通过更改
Model 数据库的设置,并将时常使用的数据库对象复制
到Model数据库中可以大大简化数据库及其对象的创建设
置工作,为用户节省大量的时间。
通常可以将以下内容添加到Model 数据库中:
(1)数据库的最小容量
(2)数据库选项设置
(3)经常使用的数据库对象,如用户自定义的数据类型、函数
规则、缺省值等
返回
69
3. Msdb 数据库
SQL Server SQL Server Enterprise Manager 和SQL
Server Agent 使用Msdb 数据库来存储计划信息以及与
备份和还原相关的信息,尤其是SQL Server Agent 需要
使用它来执行安排工作和警报记录操作者等操作。
4. Tempdb 数据库
Tempdb 数据库用作系统的临时存储空间。
其主要作用有:
(1)存储用户建立的临时表和临时存储过程
(2)存储用户说明的全局变量值
(3)为数据排序创建临时表
(4)存储用户利用游标说明所筛选出来的数据
在Tempdb 数据库中所做的存储不会被记录,因而在
Tempdb 数据库中的表上进行数据操作比在其它数据库中
要快得多。
返回
70
7.6.2
实例数据库
SQL Server 2000 有两个实例数据库:pubs 和Northwind。
与系统数据库一样,实例数据库的文件也存储在Microsoft
SQL Server 默认安装目录的MSSQL 子目录的Data 文件夹中。
pubs 和Northwind 数据库可以作为SQL Server 的学习工具,
SQL Server Books Online中的实例基本上都是基于这两个数
据库来讲解的,其中:
pubs 实例数据库存储了一个虚构的图书出版公司的基本情况。
Northwind 实例数据库包含了一个公司的销售数据,此公司名为
Northwind 商人(Northwind Traders),是一个虚构的公司,从事食
品的进出口业务。
如果改变了实例数据库的内容或不小心删除了实例数据库想
将其回复到初始状态可以用查询分析器运行安装目录
\MSSQL\Install 中的Instpubs.sql 或Instnwnd.sql程序来
重建pubs 或Northwind 数据库。
返回
71
7.6.3
创建数据库
7.6.3.1 文件与文件组
在SQL Server 中数据库是由数据库文件和事
务日志文件组成的。
一个数据库至少应包含一个数据库文件和一个
事物日志文件。
返回
72
1. 数据库文件(Database File)
数据库文件是存放数据库数据和数据库对象的文件。
一个数据库可以有一个或多个数据库文件,一个数据
库文件只属于一个数据库。
当有多个数据库文件时有一个文件被定义为主数据库
文件(Primary Database File),扩展名为mdf,它用
来存储数据库的启动信息和部分或全部数据。
一个数据库只能有一个主数据库文件。
其它数据库文件被称为次数据库文件(Secondary
Database File),扩展名为ndf,用来存储主文件没存
储的其它数据。
采用多个数据库文件来存储数据的优点体现在:
(1)数据库文件可以不断扩充而不受操作系统文件大小的限制。
(2)可以将数据库文件存储在不同的硬盘中,这样可以同时对
几个硬盘做数据存取,提高了数据处理的效率,这对于服务器型
的计算机尤为有用。
返回
73
2. 事务日志文件(Transaction Log File)
事务日志文件是用来记录数据库更新情况的文
件,扩展名为ldf。
例如,使用INSERT、UPDATE、DELETE 等对数
据库进行更改的操作都会记录在此文件中,而如
SELECT 等对数据库内容不会有影响的操作则不
会记录在案。
一个数据库可以有一个或多个事务日志文件。
返回
74
SQL Server 中采用“Write-Ahead(提前写)”
方式的事务,即对数据库的修改先写入事务日志
中,再写入数据库。
其具体操作是:
系统先将更改操作写入事务日志中。
再更改存储在计算机缓存中的数据,为了提高执行
效率,此更改不会立即写到硬盘中的数据库,而是由
系统以固定4 的时间间隔执行CHECKPOINT 命令,将
更改过的数据批量写入硬盘。
SQL Server 有个特点,它在执行数据更改时会设置
一个开始点和一个结束点,如果尚未到达结束点就因
某种原因使操作中断,则在SQL Server 重新启动时
会自动还原已修改的数据使其返回未被修改的状态。
由此可见,当数据库破坏时可以用事务日志还原数
据库内容。
返回
75
3. 文件组(File Group)
文件组是将多个数据库文件集合起来形成的一个整体,
每个文件组有一个组名。
与数据库文件一样,文件组也分为主文件组和次文件
组。
一个文件只能存在于一个文件组中,一个文件组也只
能被一个数据库使用。
主文件组中包含了所有的系统表。
当建立数据库时,主文件组包括主数据库文件和未指
定组的其它文件。
在次文件组中可以指定一个缺省文件组,那么在创建
数据库对象时:
如果没有指定将其放在哪一个文件组中,就会将它放在缺省文
件组中。
如果没有指定缺省文件组,则主文件组为缺省文件组。
返回
76
用Query Analyzer创建数据库
create database 数据库名
用Enterprise Manager 创建数据库
注:
数据库的名称最长为128 个字符,且不区分大小写;
一个服务器在理论上可以管理32,767 个数据库。
返回
77
7.6.4
查看数据库信息
7.6.4.1 用Enterprise Manager查看数据库信息
SQL Server 提供了目录树的浏览方式,使得浏
览数据库信息非常方便、快捷。
在Enterprise Manager 窗口中查看数据库信息
的方法如下:
方法1:
在Enterprise Manager 窗口中的左侧目录树窗口中,
展开“数据库”文件夹,在某个数据库名称上单击右键,
在出现的快捷菜单中单击“任务板”要浏览的数据库文
件夹。
返回
78
方法2:
在Enterprise Manager 窗口中的左侧目录树窗口中,
展开“数据库”文件夹,单击某个数据库名称,然后
单击“查看”菜单,在其下拉菜单中单击“任务板”。
操作完成后,在Enterprise Manager窗口右侧的
“任务板”窗口中看到数据库的“常规”信息、“表”
信息和“向导”信息。
在打开数据库文件夹目录树后,可以选择各种数据
库对象进行信息浏览。
返回
79
7.6.4.2 用系统存储过程显示数据库信息
SQL Server 提供了许多很有用的系统存储过程,可以
用它们来得到许多从Enterprise Manager 界面中所不易
或不能看到的信息。
可以把存储过程当作函数或命令来用。
1. 用系统存储过程显示数据库结构
可以使用系统提供的系统存储过程Sp_helpdb 来显示数据库结
构,其语法如下:
sp_helpdb [[@dbname=] 'name']
使用Sp_helpdb 系统存储过程可以显示指定数据库的信息。
如果不指定[@dbname=],'name'子句则会显示在
master.dbo.sysdatabases 表中存储的所有数据库信息,命令执
行成功会返回0,否则返回1。
如:显示 Northwind 数据库的信息。
exec sp_helpdb Northwind
返回
80
2. 用系统存储过程显示文件信息
可以使用系统提供的系统存储过程Sp_helpfile 来显
示当前数据库中的文件信息,其语法如下:
sp_helpfile [[@filename =] 'name']
如果不指定文件名称,则会显示当前数据库中所有的
文件信息。命令执行成功会返回0,否则返回1。
如:显示Northwind数据库中northwind文件的信
息。
use Northwind
exec sp_helpfile northwind
返回
81
3. 用系统存储过程显示文件组信息
可以使用系统提供的系统存储过程Sp_helpfilegroup
来显示当前数据库中文件组信息,其语法如下:
sp_helpfilegroup [[@filegroupname =] 'name']
如果不指定文件组名称,则会显示当前数据库中所有
的文件组。
命令执行成功会返回0。否则返回1。
如:显示Northwind数据库中的所有文件组信息。
use Northwind
exec sp_helpfilegroup
返回
82
7.6.5
更改数据库
7.6.5.1 更改文件及其属性
可以在Enterprise Manager 中利用数据库属性设置更
改数据库文件和事务日志文件。
也可以用ALTER DATABASE 命令来更改数据库,ALTER
DATABASE 命令可以增加或删除数据库中的文件也可以修
改文件的属性;应注意的是只有数据库管理员(DBA)或
具有CREATE DATABASE 权限的数据库所有者才有权执行
此命令。
如:修改Northwind数据库中的Northwind文件增容方式
为一次增加2MB。
alter database Northwind
modify file
( name = Northwind,
filegrowth = 2mb)
返回
83
7.6.5.2
更改数据库名
重命名数据库需要使用系统存储过程Sp_renamedb,
其语法如下:
sp_renamedb [@old_name =] 'old_name',
[@new_name =] 'new_name‘
如:假设study数据库已存在,更改study数据
库的名称为Student。
exec sp_renamedb 'study','Student'
返回
84
7.6.6
7.6.6.1
删除数据库
用Enterprise Manager 删除数据库
在Enterprise Manager 中在所要删除的数据库上单击右键,
从快捷菜单中选择“删除”选项即可删除数据库
也可以选择数据库文件夹或图标后从工具栏中选择
图标来
删除数据库
系统会提示确认是否要删除数据库
删除数据库一定要慎重。因为删除数据库后,与此数据库有关
联的数据库文件和事务日志文件都会被删除,存储在系统数据库
中的关于该数据库的所有信息也会被删除。
7.6.6.2
用DROP DATABASE 命令删除数据库
DROP DATABASE 命令可以从SQL Server 中一次删除一个或几
个数据库。数据库所有者DBO 和数据库管理员DBA 才有权执行此
命令。
如:删除数据库study。
drop database study
返回
85
7.6.7
压缩数据库
数据库在使用一段时间后时常会出现因数据删
除而造成数据库中空闲空间太多的情况,这时就
需要减少分配给数据库文件和事务日志文件的磁
盘空间,以免浪费磁盘空间。
当数据库中没有数据时,可以修改数据库文件
属性,直接改变其占用空间;
但当数据库中有数据时这样做会破坏数据库中
的数据,因此需要使用压缩的方式来缩减数据库
空间;
对数据库可以进行自动压缩,也可以进行人工
压缩。
返回
86
7.6.7.1
自动压缩数据库
在Enterprise Manager 中左侧窗口中,右健单击某
个数据库名称,在出现的快捷菜单中,单击“属性”
菜单项,出现“数据库属性”对话框,单击对话框中
的“选项”选项卡,在本页中选择“自动收缩”选项,
让系统自动压缩数据库。
7.6.7.2 人工压缩数据库
人工压缩数据库有以下两种方式:
1.用Enterprise Manager 压缩数据库
在Enterprise Manager 中在所要压缩的数据库上单
击右键,从快捷菜单中的“所有任务”中选择“收缩
数据库”选项,并进行相应的配置。
返回
87
2.用Transact-SQL 命令压缩数据库
可以使用DBCC SHRINKDATABASE 和DBCC SHRINKFILE
命令来压缩数据库。其中,
DBCC SHRINKDATABASE 命令对数据库进行压缩;
DBCC SHRINKFILE 命令对数据库中指定的文件进行压缩。
(1)DBCC SHRINKDATABASE命令
如:压缩数据库study的未使用空间为数据库大
小的20%。
dbcc shrinkdatabase (study, 20)
(2)DBCC SHRINKFILE
如:压缩数据库study中的数据库文件Study的
大小到1MB。
use study
dbcc shrinkfile (Study, 1)
返回
88
7.7
7.7.1
7.7.2
管理数据表
用Enterprise Manager创建数据库表
修改表
7.7.2.1
7.7.2.2
用Enterprise Manager 修改数据表的结构
用存储过程Sp_rename 修改表名和列名
如:更改Study表的列s_no 名称为stu_no。
exec sp_rename 'Study.[s_no]', 'stu_no', 'column‘
如:更改study 表的名称为Student。
exec sp_rename 'study', 'Student'
返回
89
7.7.3
查看表
7.7.3.1
7.7.3.2
查看表的属性
查看数据表中的数据
在Enterprise Manager 中,用右键单击要查看数据的表,
从快捷菜单中选择“打开表”,再选择其子菜单中的“返回
所有行”。
7.7.3.3
用系统存储过程Sp_help 查看表的信息
Sp_help 存储过程可以提供指定的数据库对象的信息和系统
或用户定义的数据类型的信息。
如:显示当前数据库中所有对象的信息。
exec sp_help
如:显示表Student的信息。
exec sp_help Student
返回
90
7.8
用Enterprise Manager管理数据
7.8.1
7.8.2
7.8.3
添加数据
删除数据
修改数据
返回
91
7.9
SQL Server的帐号和存取权限
数据的安全性是指保护数据以防止因不合理的
使用而造成数据的泄密和破坏,这就要采取一定
的安全保护措施。
在数据库管理系统中,用检查口令等手段来检
查用户身份,通过检查的用户才能进入数据库系
统中。
当用户对数据库执行操作时,系统自动检查用
户是否有权限执行这些操作。
返回
92
7.9.1
SQL Server的验证模式
为了实现安全性,SQL Server对用户的访问进行两个阶
段的检验:
(1)验证阶段(Authentication):
用户在SQL Server上获得对任何数据库的访问权限之前,必须
登录到SQL Server上,并且被认为是合法的。
SQL Server或者Windows NT/2000对用户进行验证。
如果验证通过,用户就可以连接到SQL Server上,否则,服务
器将拒绝用户登录。从而保证了系统安全。
(2)许可确认阶段(Permission Validation):
用户验证通过后,登录到SQL Server上,系统检查用户是否有
访问服务器上数据的权限。
在验证阶段,系统是对用户登录进行验证。
SQL Server和Windows NT/2000是结合在一起的,因此
产生了两种验证模式:Windows验证模式和混合验证模式。
返回
93
7.9.1.1 Windows验证模式
在该验证模式下,SQL Server检测当前使用的Windows
用户帐号,并在Syslogins表中查找该帐号,以确定该帐
号是否有权登录。
在这种方式下,用户不必提供密码或者登录名让SQL
Server验证。
Windows验证模式下主要有以下优点:
1.数据库管理员的工作可以集中在管理数据库上面,而不是管
理用户帐户。对用户帐户的管理可以交给Windows NT/2000去完
成。
2.Window NT/2000有着更强的用户帐户管理工具。可以设置
帐户锁定、密码期限等。如果不是通过定制来扩展SQL Server,
SQL Server是不具备这些功能的。
3.Windows NT/2000的组策略支持多个用户同时被授权访问
SQL Server。
返回
94
但是,应该注意的是,要在客户和服务器间建
立连接,使用该验证模式时,必须满足以下两个
条件中的一个:
1.客户端的用户必须有合法的服务器上的Windows
NT/2000帐户,服务器能够在自己的域中或者信任域
中验证该用户。
2.服务器启动了Guest帐户,但是该方法会带来安全
上的隐患,因而不是一个好的方法。
返回
95
7.9.1.2 混合验证模式
混合验证模式允许以SQL Server验证或者Windows验证
模式来进行验证。
使用哪个模式取决于在最初的通信时使用的网络库。
如果一个用户使用的是TCP/IP Sockets进行登录验证,则将使
用SQL Server验证模式;
如果用户使用命名管道,则登录时将使用Windows验证模式。
这 种 模 式 能 更 好地适应用户的各种环境 。但 是 对 于
Windows 9X系列的操作系统,只能使用SQL Server验证
模式。
SQL Server验证模式下,处理登录的过程为:用户在
输入登录名和密码后,SQL Server在系统注册表中检测
输入的登录名和密码。如果输入的登录名存在,而且密
码也正确,就可以登录到SQL Server上。
返回
96
混合验证模式具有以下优点:
1.创建了Windows NT/2000之上的另外一个安全层次。
2.支持更大范围的用户,如非Windows NT客户、Novell网络
等。
3.一个应用程序可以使用单个的SQL Server登录和口令。
由此可以看出:
验证模式的选择通常与网络验证的模型和客户与服务器间的通
信协议有关。
如果网络主要是Windows NT/2000网,则用户登录到Windows
NT/2000时已经得到了确认,因此,使用Windows验证模式将减
轻系统的工作负担;
但是,如果网络主要是Novell网络或者对等网,则使用SPX协
议和SQL Server验证模式将是很方便的。因为,这种情况下,只
需创建SQL Server登录帐户,而不用创建Windows NT/2000帐户。
返回
97
7.9.1.3 设置验证模式
在第一次安装SQL Server,或者使用SQL Server连接
其他服务器的时候,需要指定验证模式。
对于已经指定验证模式的SQL Server服务器,在SQL
Server中还可以进行修改。操作步骤如下:
1.打开企业管理器,展开“服务器组”文件夹,在其中的某个
服务器上单击右键,在弹出的快捷菜单上选择“编辑SQL Server
注册属性”菜单命令,这时打开 “已注册的SQL Server属性”
对话框。
2.在对话框中设置验证模式后,单击“确定”按钮即可。
但要注意:修改验证模式后,必须首先停止SQL
Server服务,然后重新启动SQL Server,才能使新的设
置生效。
返回
98
7.9.2 帐号和角色
在SQL Server中,帐号有两种:
一种是登录服务器的登录帐号(login name)
另外一种是使用数据库的用户帐号(user name)。
登录帐号是指能登录到SQL Server的帐号,属于服务器的层
面,它本身并不能让用户访问服务器中的数据库,而登录者要
使用服务器中的数据库时,必须要有用户帐号才能够存取数据
库。
就如同公司门口先刷卡进入(登录服务器),然后再拿钥匙
打开自己的办公室(进入数据库)一样。
用户名要在特定的数据库内创建,并关联一个登录名(当一
个用户创建时,必须关联一个登录名)。
用户定义的信息存放在服务器的每个数据库的sysusers表中,
用户没有密码同它相关联。
通过授权给用户来指定用户可以访问的数据库对象的权限。
返回
99
7.9.2.1 服务器的登录帐号
1.查看登录帐号
方法1:使用企业管理器
在安装SQL Server后,系统默认创建三个登录帐号。
进入企业管理器,展开“SQL Server组”,找到所
要连接的SQL Server服务器,展开该服务器对应的文
件夹,再展开“安全性”文件夹,单击“登录”选项,
即可看到系统创建的默认登录帐号及已建立的其他登
录帐号。
返回
100
其 中 : BUILTIN\Administrators 、 域 名
\Administrator、sa是默认的登录帐号,它们的
含义如下:
( 1 ) BUILTIN\Administrators : 凡 是 Windows NT
Server/2000 中 Administrators 组 的 帐 号 都 允 许 登 录
SQL Server。
( 2 ) 域 名 \Administrator : 允 许 NT Server 的
Administrator帐号登录。
(3)sa:超级管理员帐号,允许SQL Server的系统
管 理 员 登 录 , 此 SQL Server 的 管 理 员 不 一 定 是
Windows NT Server/2000的管理员(但通常是)。
方法2:使用存储过程
使用sp_helplogins可查看登录帐号。格式是:
exec sp_helplogins
返回
101
2. 创建一个登录帐号
在此介绍两种创建方法:
一种是利用SQL Server的企业管理器。
一种是利用SQL Server提供的存储过程。
方法1:
(1)在SQL Server的企业管理器下,展开“SQL Server组”文
件夹,找到需要建立登录帐号的服务器并展开其文件夹,再展开
“安全性”文件夹,在“登录”选项上右击鼠标,在出现的快捷
菜单中单击“新建登录”菜单命令,打开“SQL Server登录属性”
对话框。
(2)在“名称”文本框中输入要创建的登录帐号名称,如:
“StudyAdm”,在“身份验证”选项组中,单击“SQL Server身
份验证”单选钮,并输入密码,然后在“默认设置”选项组中,
选择数据数据库列表中的某个数据库,如:“Study”,表示该登
录帐号默认登录到Study数据库中。
(3)在对话框中,单击“服务器角色”标签,打开“服务器
角色”选项卡,在此选项卡中,可以设置登录帐号所属的服务器
角色。
102
返回
角色(role)是一组用户所构成的组,可分为服务器角色与数据库角色。
以下先介绍服务器角色,数据库角色放在后面讲解。
服务器角色是负责管理与维护SQL Server的组,一般只会指定需要管理服
务器的登录帐号属于服务器角色。
SQL Server在安装过程中定义几个固定的服务器角色,其具体权限如下:
① sysadmin:全称为System Administrators,可以在SQL Server中执行任何
活动。
② serveradmin:全称为Server Administrators,可以设置服务器范围的配
置选项,关闭服务器。
③ setupadmin:全称为Setup Administrators,可以管理链接服务器和启动
过程。
④ securityadmin:全称为Security Administrators,可以管理登录和创建
数据库的权限,还可以读取错误日志和更改密码。
⑤ processadmin:全称为Process Administrators,可以管理在SQL Server
中运行的进程。
⑥ dbcreator:全称为Database Creators,可以创建、更改和除去数据库。
⑦ diskadmin:全称为Disk Administrators,可以管理磁盘文件。
⑧ bulkadmin:全称为Bulk Insert Administrators,可以执行BULK INSERT
(大容量插入)语句。
注:属于Windows NT/2000 Administrators组的帐号,在SQL Server中被
自动设置为sysadmin服务器角色。
返回
103
(4)在对话框中,单击“数据库访问”标签,
打开“数据库访问”选项卡。在此选项卡中可选
择登录帐号可以访问的数据库,即选中所需要的
数据库左面的复选框。
(5)设置完毕后,单击“确定”按钮,即可完
成该登录帐号的创建。
(6)在步骤(2)中,如果选择“Windows身份
验证”单选钮,则“名称”文本框后面的按钮被
激活,单击可打开选择Windows用户的对话框。
从该对话框中可选择Windows系统的用户作为SQL
Server的登录帐号。
返回
104
方法2:
利用SQL Server提供的存储过程sp_addlogin创建登录
帐号。格式是:
EXEC sp_addlogin
‘使用的语言’
‘登录帐号名称’, ‘密码’, ‘默认数据库名’,
注:
(1)使用的语言如果指定为NULL,则表示使用系统默认语言。
(2)此存储过程只是添加了一个登录帐号,该帐号只能登录到
SQL Server,并不对某特定数据库具有存取权限,所以,还需要
利用sp_adduser存储过程将此登录帐号加入到指定数据库中才行。
EXEC sp_addlogin 'Mike', 'm1934', 'study',NULL
此语句建立了一个名称为Mike的登录帐号。
USE study
EXEC sp_adduser 'Mike‘
此语句将Mike登录帐号加入到数据库study中。
返回
105
3.更改登录帐号属性
(1)进入企业管理器,展开“SQL Server组”,找到所要连接
的SQL Server服务器,展开该服务器对应的文件夹,再展开“安
全性”文件夹,单击“登录”选项,在企业管理器的右侧窗格中
即可看到系统创建的默认登录帐号及已建立的其他登录帐号。
在需要更改属性的帐号上单击右键,在出现的快捷菜单中,单
击“属性”菜单项,即可打开登录帐号的属性对话框,在该对话
框中可以更改有关该帐号的密码、服务器角色、访问的数据库等,
该对话框中各项的含义如同创建登录帐号时的含义相同,在此不
再重复。
(2)使用存储过程sp_password可改变登录帐号的密码。格式是:
EXEC sp_password ‘旧密码’, ‘新密码’, ‘登录帐号名称’
EXEC sp_password ‘m1934’, ‘mike1934’, ‘Mike’
此语句将Mike帐号的密码由原来的m1934改为mike1934。
返回
106
(3)使用存储过程sp_addsrvrolemember可以将登录
帐号加入服务器的角色中。格式是:
EXEC sp_addsrvrolemember ‘登录帐号’, ‘服务器角色名称’
EXEC sp_addsrvrolemember ‘Mike’, ‘dbcreator’
此语句是将登录帐号Mike加入到dbcreator服务
器角色中。
返回
107
4.删除登录帐号
方法1:使用企业管理器
进入企业管理器,展开“SQL Server组”,找到所要连接的
SQL Server服务器,展开该服务器对应的文件夹,再展开“安全
性”文件夹,单击“登录”选项,在企业管理器的右侧窗格中即
可看到系统创建的默认登录帐号及已建立的其他登录帐号。
在需要更改属性的帐号上单击右键,在出现的快捷菜单中,单
击“删除”菜单项,此时会打开一个提示对话框,单击“是”按
钮确定删除。
方法2:使用存储过程
使用存储过程sp_droplogin可删除某一登录帐号。格式是:
USE 数据库
EXEC sp_droplogin ‘登录帐号’
USE study
EXEC sp_droplogin ‘Mike’
该语句可从数据库Study中删除Mike登录帐号。
返回
108
7.9.2.2 数据库的用户
一个SQL Server的登录帐号只有成为该数据库的用户
时,对该数据库才有访问权限。
在 安 装 SQL Server 后 , 默 认 数 据 库 如 : master 、
tempdb、msdb等包含两个用户:dbo和guest。
任何一个登录帐号都可以通过guest用户帐号来存取相
应的数据库。
但是当新建一个数据库时,默认只有dbo用户帐号而没
有guest用户帐号。
每个登录帐号在一个数据库中只能有一个用户帐号,
但每个登录帐号可以在不同的数据库中各有一个用户帐
号。
如果在新建登录帐号过程中,指定对某个数据库具有
存取权限,则在该数据库中将自动创建一个与该登录帐
号同名的用户帐号。
返回
109
注:
(1)master和tempdb数据库中的guest用户帐
号不能删除,而其他数据库中的guest用户帐号可
以删除。
因为master数据库中记录了所有的系统信息,每个
登录的用户若没有特别指定数据库,默认都是使用
master数据库。
而tempdb数据库是临时使用的数据库,所有与服务
器连接的数据都会存储在该处,因此也必须提供guest
用户帐号。
(2)登录帐号具有对某个数据库的访问权限,
并不表示该登录帐号对该数据库具有存取的权限。
如果要对数据库的对象进行插入、更新等操作,
还需要设置用户帐号的权限。
返回
110
1.查看数据库的用户
方法1:使用企业管理器
在企业管理器中,展开SQL Server组及其服务器,在“数据库”
文件夹中,展开某数据库如:Study的文件夹,单击“用户”选
项,则可在企业管理器的右窗格中显示出目前该数据库中所有的
用户。
方法2:利用存储过程
格式是:
USE 数据库名
EXEC sp_helpuser
USE Study
EXEC sp_helpuser
可列出目前Study数据库中所有的数据库用户帐户。
返回
111
2.创建数据库的用户
方法1:使用企业管理器
(1)在企业管理器中,展开SQL Server组及其服务
器,在“数据库”文件夹中,展开某一数据库如:
Study的文件夹,然后在“用户”选项上单击鼠标右键,
在弹出的快捷菜单中选择“新建数据库用户”命令,
打开新建用户对话框。
(2)单击“登录名”下拉列表框右端的下拉箭头,
选择“ZHANGSAN”登录帐号,此时“用户名”文本
框中自动显示为“ZHANGSAN” 。
可以更改“用户名”文本框中的用户名,也可以在“数据库
角色成员”列表框中选择新建用户应该属于的数据库角色。
(3)设置完毕后,单击“确定”按钮,即可在Study
数据库中创建一个新的用户帐号。如果不想创建用户
帐号,单击“取消”按钮即可。
返回
112
方法2:使用存储过程
格式是:
USE 数据库名
EXEC sp_adduser ‘登录帐号’, ‘用户帐号’, ‘所属的数据库角
色’
USE Study
EXEC sp_adduser ‘ZHANGSAN’, ‘ZHANGSAN’, ‘db_owner’
该语句的功能是向Study数据库中,添加一个
名称为ZHANGSAN的用户帐号。
返回
113
3.设置数据库用户帐号的权限
在创建数据库用户帐号对话框中,当新建一个
新的用户帐号时,“登录名”右侧的“权限”按
钮是灰色的,表示不能在创建数据库用户帐号的
同时设置其权限。
但可以在创建后通过其属性对话框来设置其权
限,步骤如下:
(1)在企业管理器的右窗格中的用户帐号上单击鼠
标右键,然后选择“属性”命令,打开“数据库用户
属性”对话框。
返回
114
(2)在“数据库用户属性”对话框中,单击“权限”按钮,打开
权限设置对话框。在此对话框中,可以设置用户对数据库对象所具
有的权限。
在“对象”列中,显示了数据库中所有的对象,而“所有者”列则显
示了相应对象的所有者。其后的6列则是对数据库对象的操作,具体含
义如下:
SELECT:对表或者视图的查询
INSERT:在表或者视图中插入记录
UPDATE:对表或者视图中的数据修改
DELETE:删除表或者视图中的数据
EXEC:执行存储过程
DRI:Declarative Referential Integrity,可对表的外键加上限制,以
达成表的参照完整性。
对某个数据库对象而言,如果选中对应的复选框,则表示具有对
该对象进行相应操作的权限。
每个复选框具有3种状态。
空白时表示未指定权限,或权限还原到未设置状态;
当打“√”时表示具有该权限;
当打“╳”时,表示不具有该权限。
返回
115
(3)如果要设置对表或者视图的某一字段进行操作的
权限,可在列表中选择表或者视图对象,然后单击“列”
按钮,可打开“列权限”对话框。使用该对话框即可进
行相应权限的设置。
4.删除数据库用户帐号
方法1:使用企业管理器
在企业管理器中,展开SQL Server组及其服务器,在“数据库”
文件夹中,展开某一数据库如:Study的文件夹,然后在“用户”
选项上单击鼠标右键,在弹出的快捷菜单中选择“删除”菜单命
令。
方法2:使用存储过程
格式是:
USE 数据库名
EXEC sp_dropuser ‘用户帐号’
USE Study
EXEC sp_dropuser ‘ZHANGSAN’
该语句表示从数据库Study中删除ZHANGSAN用户帐号。
返回
116
7.9.2.3 数据库角色
角色是一个强大的工具,可以将用户集中到一个单元
中,然后对该单元应用权限。
对一个角色授予、拒绝或废除的权限也适用于该角色
的任何成员。
可以建立一个角色来代表单位中一类工作人员所执行
的工作,然后给这个角色授予适当的权限。
和登录帐号类似,用户帐号也可以分成组,称为数据
库角色(Database Roles)。
数据库角色应用于单个数据库。在SQL Server中,数
据库角色可分为两种:
标准角色:由数据库成员所组成的组,此成员可以是用户或者
其他的数据库角色。
应用程序角色:用来控制应用程序存取数据库的,本身并不包
括任何成员。
返回
117
1.标准角色
在创建一个数据库时,系统默认创建10个固定的标准角
色。
在企业管理器中,展开SQL Server组及其服务器,在
“数据库”文件夹中,展开某一数据库如:Study的文件夹,
然后单击“角色”选项,这时可在企业管理器的右侧窗格
中显示出默认的10个标准角色。
public角色是最基本的数据库角色。
db_owner:在数据库中有全部权限。
db_accessadmin:可以添加或删除用户ID。
db_securityadmin:可以管理全部权限、对象所有权、角色和角色
成员资格。
db_ddladmin:可以发出ALL DDL,但不能发出GRANT(授权)、
REVOKE或DENY语句。
db_backupoperator:可以发出DBCC、CHECKPOINT和BACKUP语
句。
db_datareader:可以选择数据库内任何用户表中的所有数据。
db_datawriter:可以更改数据库内任何用户表中的所有数据。
db_denydatareader:不能选择数据库内任何用户表中的任何数据。
db_denydatawriter:不能更改数据库内任何用户表中的任何数据。
返回
118
(1)查看角色的属性:
下面以Study数据库中的db_owner角色为例说明:
① 在企业管理器中,展开SQL Server组及其服务器,
在“数据库”文件夹中,展开某一数据库如:Study的
文件夹,然后单击“角色”选项,这时可在企业管理
器的右侧窗格中显示出该数据库的所有角色。
② 在右侧窗格中,用鼠标右键单击“db_owner”角色,
在出现的快捷菜单中,单击“属性”菜单命令,则打
开“数据库角色属性”对话框 。
此对话框中列出了目前包括在该角色中的数据库用户帐号,
如:对于本例包括abc和dbo两个用户帐号。
默认每个数据库的db_owner中一定包括dbo用户,dbo是默认
就存在的用户,就是指数据库的创建者。
在此对话框中,单击“添加”按钮可为该角色添加一个用户,
单击“删除”按钮,可从角色中删除被选中的用户,但是dbo
是不能被删除的。
返回
119
(2)创建新的角色
方法1:使用企业管理器
在企业管理器中,展开SQL Server组及其服务器
在“数据库”文件夹中,展开某一数据库如:Study的文件夹
然后在“角色”选项上单击鼠标右键,在弹出的快捷菜单中选
择“新建数据库角色”菜单命令
则出现“数据库角色属性――新建角色”对话框
在该对话框中“名称”文本框中输入角色的名称
在“数据库角色类型”中选择角色的类型为标准角色
单击“添加”按钮可向角色中添加成员
设置完成后,单击“确定”按钮。
方法2:使用存储过程
其格式是:
USE 数据库名
EXEC sp_addrole ‘角色名’, ‘拥有者’
USE Study
EXEC sp_addrole ‘Myrole’, ‘dbo’
在Study数据库中创建一名称为Myrole的角色。
返回
120
(3)删除角色
方法1:使用企业管理器
在企业管理器中,展开SQL Server组及其服务器
在“数据库”文件夹中,展开某一数据库如:Study的文件夹
然后单击“角色”选项,这时在企业管理器的右侧窗格中会显
示出目前所有的角色
在某一角色上单击鼠标右键,在弹出的快捷菜单中选择“删除”
菜单命令即可。
方法2:使用存储过程
格式是:
USE 数据库名
EXEC sp_droprole ‘角色名’
USE Study
EXEC sp_droprole ‘Myrole’
删除数据库Study中的Myrole角色。
返回
121
2.应用程序角色
在我们编写数据库的应用程序时,可以自己定义应用程序角色,
让应用程序的操作者能用我们写的程序来存取SQL Server的数据。
也就是说,应用程序的操作者本身并不需要在SQL Server上有
登录帐号以及用户帐号,仍然可以存取数据库(但只能通过我们
写的应用程序来操作 ), 如此可以避免操作者自行登录 SQL
Server。
(1)应用程序角色的创建
使用企业管理器创建应用程序角色的过程与标准角色的创建过
程基本相同,就是在“数据库角色属性――新建角色”对话框中,
选择“应用程序角色”即可。
当用存储过程创建应用程序角色时,应使用以下格式:
USE 数据库名
EXEC sp_setapprole ‘应用程序角色名’, ‘密码’
USE Study
EXEC sp_setapprole ‘approle’, ‘11111’
此语句表示在Study数据库创建一个名称为approle的应用程序角色,
密码为11111。
返回
122
3.public数据库角色
public数据库角色是每个数据库最基本的数据库角
色,每个用户可以不属于其他9个固定数据库角色,但
是至少会属于public数据库角色。
当在数据库中添加新用户帐号时,SQL Server会自
动将新用户帐号加入public数据库角色中。
返回
123
7.9.2.4 用户和角色的权限问题
用户是否具有对数据库存取的权力,要看其权
限设置而定,但是,它还要受其角色的权限的限
制。
1.用户权限继承角色的权限
数据库角色中可以包含许多用户,用户对数据库对
象的存取权限也继承自该角色。
假设用户User1属于角色Role1,角色Role1已经取得了对表
Table1的SELECT权限,则用户User1也自动取得对表Table1的
SELECT权限。
如果Role1对Table1没有INSERT权限,而User1取得了对表
Table1 的 INSERT 权 限 , 则 User1 最 终 也 取 得 对 表 Table1 的
INSERT权限。
而拒绝是优先的,只要Role1和User1中的之一拒绝,
则该权限就是拒绝的。
返回
124
2.用户分属不同角色
如果一个用户分属于不同的数据库角色
如:用户User1既属于角色Role1,又属于角色Role2,则用
户User1的权限基本上是以Role1和Role2的并集为准。
但是只要有一个拒绝,则用户User1的权限就是拒绝
的
返回
125
7.10
索引
7.10.1 建索引
在SQL Server中,除了使用SQL创建索引外,还可用
Enterprise Manager 创建索引,在Enterprise Manager
中创建索引有两种方法:
1.用索引创建向导创建索引
在Enterprise Manager的目录树中选择要创建索引的表所在的
数据库名称,单击任务板中的“向导”选项卡,出现选择向导界
面,选择“创建索引”向导。
2.直接创建索引
选择要创建索引的表,单击右键,从快捷菜单中选择“所有任
务”子菜单中的“管理索引”选项,将会出现 “管理索引”对
话框,其中列出了表中已经存在的索引。
选择“新建”按钮,进入“创建索引”对话框。在其中输入要
创建的索引的名称,再选择用于创建索引的列,并设置索引的各
种选项,单击“”按钮,完成索引的创建。
返回
126
7.10.2 查看与修改索引
7.10.2.1 用Enterprise Manager 查看和修改索引
若想在Enterprise Manager 中查看和修改索引,其方
法是:
1.在Enterprise Manager 的左侧窗格中,展开要为其创建索
的表所在的数据库,然后单击“表”项目。
2.在Enterprise Manager 的右侧窗格中,在要为其创建索引
的表名上面单击右键,此时出现快捷菜单,用鼠标指向快捷菜单
中的“所有任务”菜单项,此时,出现下一级子菜,从中单击
“管理索引”菜单项, 则会出现 “管理索引”对话框。
在此对话框中,显示了当前表上所建立的各个索引的名称及有
关的索引类型:
若想增加新的索引,则单击“新建”按钮;
若想修改现有的某个索引,则可单击该索引,然后再单击“编辑”
按钮;
若想删除现有的某个索引,则可先单击它,然后再单击“删除”按
钮。
返回
127
7.10.2.2 用存储过程Sp_helpindex 查看索引
Sp_helpindex 存储过程可以返回表的所有索引的信息。
其语法如下:
sp_helpindex [@objname =] 'name'
其中[,@objname =] 'name'子句指定当前数据库中的表的名称。
如:查看表Student的索引。
exec sp_helpindex Student
7.10.2.3 用存储过程Sp_rename 更改索引名称
sp_rename 存储过程可以更改索引的名称。其语法如
下:
sp_rename ‘数据表名.原索引名’, ‘新索引名’
如:更改Student表中的索引s_no 名称为stu_no。
exec sp_rename 'Student.[s_no]', 'stu_no', 'index'
返回
128
7.10.3 删除索引
7.10.3.1 用Enterprise Manager 删除索引
在Enterprise Manager 中可以从 “索引管理”
对话框或表的属性对话框中选择要删除的索引,
再选择“删除”按钮来删除索引。
7.10.3.2 用DROP INDEX 命令删除索引
DROP INDEX 命令可以删除一个或多个当前数
据库中的索引。其语法如下:
DROP INDEX 'tablename.indexname' [,...n]
DROP INDEX 命令不能删除由CREATE TABLE 或ALTER TABLE
命令创建的PRIMARY KEY 或UNIQUE 约束索引,也不能删除系
统表中的索引。
如:删除表Student中的索引s_no。
drop index Student.s_no_index
返回
129
7.11
数据完整性
7.11.1 数据完整性概述
数据完整性(Data Integrity)是指数据的精确性和可
靠性。
它是应防止数据库中存在不符合语义规定的数据和防
止因错误信息的输入输出造成无效操作或错误信息而提
出的。
数据完整性分为四类:
实体完整性(Entity Integrity)
域完整性(Domain Integrity)
参照完整性(Referential Integrity)
用户定义的完整性(User-defined Integrity)。
SQL Server 提供了一些工具来帮助用户实现数据完整
性,其中最主要的是规则、默认、约束和触发器。
返回
130
7.11.2 规则
规则(Rule)就是数据库中对存储在表的列或用户自
定义数据类型中的值的规定和限制。
规则是单独存储的独立的数据库对象。
规则与其作用的表或用户自定义数据类型是相互独立
的,即表或用户自定义对象的删除、修改不会对与之相
连的规则产生影响。
规则和约束可以同时使用,表的列可以有一个规则及
多个CHECK 约束。
规则与CHECK 约束很相似。
相比之下,使用在ALTER TABLE 或CREATE TABLE
命令中的CHECK 约束是更标准的限制列值的方法,但
CHECK 约束不能直接作用于用户自定义数据类型。
返回
131
7.11.2.1 创建规则
1.用CREATE RULE 命令创建规则
CREATE RULE 命令用于在当前数据库中创建规则,其
语法如下:
CREATE RULE rule_name AS condition_expression
其中:
 rule_name 是规则的名称
 condition_expression 子句是规则的定义,它可以是能用于
WHERE 条件子句中的任何表达式,可包含算术运算符、关系运算
符和谓词(如IN、LIKE、BETWEEN 等)。
condition_expression 子句中的表达式必须以字符@ 开头
如:创建学生年龄规则。
create rule age_rule
as @age >= 18 and @age <= 50
返回
132
2.用Enterprise Manager 创建规则
在Enterprise Manager 的左侧窗格中,展开要创建
规则的数据库(如:Study)目录。
在数据库的对象“规则”上面单击右键,此时出现
一快捷菜单,从快捷菜单中单击“新建规则”菜单项,
则会弹出“规则属性”对话框。
在此对话框中的“名称”对应的文本框中输入要创
建的规则的名称(如:age_rule),在“文本”对应
的文本框中输入规则的内容(即约束的条件)。
在输入完规则名称和规则的内容之后,单击“确定”
按钮即完成规则的创建。
返回
133
7.11.2.2 查看规则
1.用Enterprise Manager 查看规则
在Enterprise Manager 的左侧窗格中,展开要创建
规则的数据库(如:Study)目录,在数据库的对象
“规则”上面单击,即可在其右边的任务板中看到规
则的大部分信息,包括规则的名称、所有者和创建时
间等。
要查看规则的内容,方法是,选择要查看的规则,
单击右键,从快捷菜单中选择“属性”选项,即会出
现“规则属性”对话框,可以从中编辑规则的表达式。
如果要修改规则的名称可以通过Sp_rename 系统存
储过程进行,也可以直接用右键单击要修改的规则,
从快捷菜单中选择“重命名”菜单项,进行名称修改。
返回
134
2.用存储过程Sp_helptext 查看规则
使用Sp_helptext 存储过程可以查看规则的细
节,其语法如下:
sp_helptext [@objname =] 'name'
其中,[@objname =] ‘name’子句指明对象的名称
用Sp_helptext 存储过程查看的对象可以是当前数据库中的
规则、默认、触发器、视图或未加密的存储过程。
如:查看名称为“age_rule”的规则内容。
EXEC sp_helptext 'age_rule'
返回
135
7.11.2.3 规则的绑定与松绑
创建规则后,规则仅仅只是一个存在于数据库
中的对象,并未发生作用。
需要将规则与数据库表或用户自定义对象联系
起来,才能达到创建规则的目的。
联系的方法称为“绑定”。
所谓绑定就是指定规则作用于哪个表的哪一列
或哪个用户自定义数据类型。
表的一列或一个用户自定义数据类型只能与一
个规则相绑定,而一个规则可以绑定多对象,这
正是规则的魅力所在。
解除规则与对象的绑定称为“松绑”。
返回
136
1.用存储过程Sp_bindrule 绑定规则
存储过程Sp_bindrule 可以绑定一个规则到表的一个
列或一个用户自定义数据类型上。其语法如下:
sp_bindrule [@rulename =] 'rule',
[@objname =] 'object_name'
[, 'futureonly']
各参数说明如下:
(1)[@rulename =] 'rule'
指定规则名称。
(2)[@objname =] 'object_name'
指定规则绑定的对象。
(3)'futureonly‘
此选项仅在绑定规则到用户自定义数据类型上时才可以使用。
当指定此选项时,仅以后使用此用户自定义数据类型的列会应用新
规则,而当前已经使用此数据类型的列则不受影响。
返回
137
如:绑定规则age_rule 到s表的字段age。
EXEC sp_bindrule 'age_rule', 's.age'
注:规则对已经输入表中的数据不起作用。
规则所指定的数据类型必须与所绑定的对象的数据类
型一致,且规则不能绑定一个数据类型为TEXT、IMAGE或
TIMESTAMP 的列。
与表的列绑定的规则优先于与用户自定义数据类型绑
定的列。因此,如果表的列的数据类型与规则A 绑定,
同时列又与规则B 绑定,则以规则B 为列的规则。
可以直接用一个新的规则来绑定列或用户自定义数据
类型,而不需要先将其原来绑定的的规则解除,系统会
将旧规则覆盖。
返回
138
2.用存储过程Sp_unbindrule 解除规则的绑定
存储过程Sp_unbindrule 可解除规则与列或用
户自定义数据类型的绑定,其语法如下:
sp_unbindrule [@objname =] 'object_name'
[,'futureonly']
其中:
‘futureonly’选项同绑定时一样,仅用于用户自定
义数据类型,它指定现有的用此用户自定义数据类型
定义的列仍然保持与此规则的绑定。
如果不指定此项,所有由此用户自定义数据类型定
义的列也将随之解除与此规则的绑定。
如:要解除已绑定到s表的字段age的规则age_rule。
EXEC sp_unbindrule 's.age'
返回
139
3.用Enterprise Manager 管理规则的绑定
在Enterprise Manager 的左侧窗格中,展开相应的
数据库(如:Study)目录
在数据库的对象“规则”上面单击,即可在其右边
的任务板中看到已创建的规则名称
在相应的规则名称上面单击右键,从快捷菜单中选
择“属性”选项
会出现“规则属性”对话框,该对话框中的“绑定
UDTs”按钮用于将规则绑定到用户自定义数据类型,
“绑定列”按钮用于将规则绑定到表的列。
返回
140
在“规则属性”对话框中,单击“绑定UDTs”按钮,
则出现“绑定规则到用户自定义数据类型”的对话框,
单击“绑定列”按钮则出现“绑定规则到表的列”的
对话框
在该对话框中,在“表”所对应的下拉列表中,选
择相应的数据表(如:数据表S),在“未绑定的列”
列表中单击要绑定到的某个列(如:AGE),然后单击
“添加”按钮,将该列添加到“绑定列”中,最后单
击“确定”按钮,这时规则就被绑定到所选定的列上
了。
返回
141
7.11.2.4 删除规则
1.用Enterprise Manager 删除规则
在 Enterprise Manager 的 左 侧 窗 格 中 , 展 开 相 应 的 数 据 库
(如:Study)目录
在数据库的对象“规则”上面单击,即可在其右边的任务板中
看到已创建的规则名称
在相应的规则名称上面单击右键,从快捷菜单中选择“删除”
菜单项
会出现“除去对象”对话框,在该对话框中单击“全部移去”
按钮。
2.使用DROP RULE命令删除规则
使用DROP RULE 命令删除当前数据库中的一个或多个
规则。其语法如下:
DROP RULE {rule_name} [,...n]
注:在删除一个规则前必须先将与其绑定的对象解除
绑定
如:删除age_rule规则,可执行以下命令:
DROP RULE age_rule
返回
142
7.11.3 默认
默认(Default)是往用户输入记录时没有指定具体数
据的列中自动插入的数据。
默认对象与ALTER TABLE 或CREATE TABLE 命令操作表
时用DEFAULT 选项指定的默认功能相似,但默认对象可
以用于多个列或用户自定义数据类型,它的管理与应用
同规则有许多相似之处。
表的一列或一个用户自定义数据类型也只能与一个默
认相绑定。
7.11.3.1 创建默认
1.用CREATE DEFAULT 命令创建默认
CREATE DEFAULT 命令用于在当前数据库中创建默认对象,其语法如下:
CREATE DEFAULT default_name AS constant_expression
其中
default_name是要创建的默认的名称
constant_expression 子句是默认的定义,该子句可以是数学
表达式或函数,也可以包含表的列名或其它数据库对象。
返回
143
如:创建出生日期默认birthday_defa。
CREATE DEFAULT birthday_defa
as '1978-1-1'
这样,当用户在输入记录数据时,未提供字段
birthday的值时,系统将自动默认其值为
“1978-1-1”。
返回
144
2.用Enterprise Manager 创建默认
在Enterprise Manager 的左侧窗格中,展开相应的
数据库(如:Study)目录
在数据库的对象“默认”上面单击右键,从出现的
快捷菜单中选择“新建默认”菜单项
即会弹出“默认属性”对话框,在该对话框中的
“名称”文本框中输入要创建的默认的名称(如:
birthday_defa),在“值”文本框中输入默认的值
单击“确定”按钮,即完成默认的创建
返回
145
7.11.3.2 查看和修默认
1.用Enterprise Manager 查看默认
在 Enterprise Manager 的 左 侧 窗 格 中 , 展 开 相 应 的 数 据 库
(如:Study)目录
在数据库的对象“默认”上面单击,这时在右侧窗格中的任务
板中即可看到已建立的各个默认的信息
在某个默认的名称上面单击右键,从快捷菜单中选择“属性”
菜单项,即会出现“默认属性”对话框,可以从中编辑默认的值。
修改默认名称的方法与修改规则名称的方法相同,可
以用SP_RENAME存储过程修改,也可以在企业管理器的任
务板窗口中直接修改。
2.用存储过程SP_HELPTEXT 查看默认
使用SP_HELPTEXT存储过程可以查看默认的细节。
如:查看默认birthday_defa。
EXEC SP_HELPTEXT birthday_defa
返回
146
7.11.3.3
默认的绑定与松绑
创建默认后,默认仅仅只是一个存在于数据库中的对象,并未发
生作用。
同规则一样,需要将默认与数据库表或用户自定义对象绑定。
1.用Enterprise Manager 管理默认的绑定
在Enterprise Manager 的左侧窗格中,展开相应的数据库
(如:Study)目录
在数据库的对象“默认”上面单击,这时在右侧窗格中的任务
板中即可看到已建立的各个默认的信息
在某个默认的名称上面单击右键,从快捷菜单中选择“属性”
菜单项,即会出现“默认属性”对话框
对话框中的“绑定UDT”按钮用于将默认绑定到用户自定义数据
类型,“绑定列”按钮用于将默认绑定到某个数据表的列。
单击“绑定UDT”按钮,则出现“绑定默认到用户自定义数据类
型”的对话框;单击“绑定列”按钮,则出现“绑定默认到表的
列”的对话框。
用它们来管理默认与表的列以及用户自定义数据类型之间的绑
定非常方便。
此方法与绑定规则到用户自定义类型和表的列的方法完全一致。
返回
147
2.用存储过程Sp_binddefault 绑定默认
存储过程Sp_bindefault 可以绑定一个默认到表的一
个列或一个用户自定义数据类型上。其语法如下:
SP_BINDEFAULT [@defname =] 'default',
[@objname =] 'object_name'
[, 'futureonly']
其中:
‘futureonly’选项仅在绑定默认到用户自定义数据类型上时
才可以使用。
当指定此选项时,仅以后使用此用户自定义数据类型的列会应
用新默认,而当前已经使用此数据类型的列则不受影响。
如:绑定默认birthday_defa到数据表s的birthday列上。
EXEC SP_BINDEFAULT birthday_defa, 's.[birthday]'
返回
148
3.用存储过程Sp_unbindefault 解除默认的绑定
存储过程SP_UNBINDEFAULT 可以解除默认与表的列或
用户自定义数据类型的绑定,其语法如下:
SP_UNBINDEFAULT [@objname =] 'object_name'
[,'futureonly']
其中:
‘futureonly’选项同绑定时一样,仅用于用户自定义数据类
型它指定现有的用此用户自定义数据类型定义的列仍然保持与此
默认的绑定。
如果不指定此项,所有由此用户自定义数据类型定义的列也将
随之解除与此默认的绑定。
如:解除默认birthday_defa与表s的birthday列的绑定。
EXEC SP_UNBINDEFAULT 's.[birthday]'
注:
如果列同时绑定了一个规则和一个默认那么默认应该符合规则
的规定。
不能绑定默认到一个用CREATE TABLE 或ALTER TABLE 命令创
建或修改表时用DEFAULT 选项指定了的默认的列上。
返回
149
7.11.3.4 删除默认
1.用Enterprise Manager 删除默认
在 Enterprise Manager 的 左 侧 窗 格 中 , 展 开 相 应 的 数 据 库
(如:Study)目录
在数据库的对象“默认”上面单击,这时在右侧窗格的任务板
中即可看到已建立的各个默认的信息
在某个默认的名称上面单击右键,从快捷菜单中选择“删除”
菜单项,即会出会出现“除去对象”对话框,在该对话框中单击
“全部移去”按钮。
2.使用DROP DEFAULT命令删除认
使用DROP DEFAULT 命令删除当前数据库中的一个或多
个默认。其语法如下:
DROP DEFAULT {default_name} [,...n]
如:删除学生生日默认birthday_defa。
DROP DEFAULT birthday_defa
在删除一个默认前必须先将与其绑定的对象解除绑定
返回
150
7.12
数据查询
数据库是为更方便有效地管理信息而存在的,人们希望数据
库可以随时提供所需要的数据信息。
因此,对用户来说,数据查询是数据库最重要的功能。
在数据库中数据查询是通过SELECT 语句来完成的。SELECT
语句可以从数据库中按用户要求检索数据,并将查询结果以表
格的形式返回。
关于SELECT语句的使用以及各种查询情况已在第3章中详细
介绍过,在此只介绍将查询结果存储到数据表中的变量中的情
况。
在某些时候,我们需要在程序中使用查询的结果,如在编写
存储过程或触发器时,这时就需要将查询结果存储到变量中去。
如:查询学号为's1'的学生的学号与姓名,并存储到变
量@sno和@sn中。
DECLARE @sno varchar(10) DECLARE @sn varchar(10)
SELECT @sno = sno,@sn = sn FROM s WHERE sno = 's1'
返回
151
7.13
存储过程和触发器
在大型数据库系统中,存储过程和触发器具有
很重要的作用。
无论是存储过程还是触发器,都是SQL 语句和
流程控制语句的集合。
就本质而言,触发器也是一种存储过程。
存储过程在运算时生成执行方式,所以,以后
对其再运行时其执行速度很快。
SQL Server 2000 不仅提供了用户自定义存储
过程的功能,而且也提供了许多可作为工具使用
的系统存储过程。
返回
152
7.13.1
存储过程概述
存储过程(Stored Procedure)是一组为了完
成特定功能的SQL 语句集,经编译后存储在数据
库中。
用户通过指定存储过程的名字并给出参数(如
果该存储过程带有参数)来执行它。
在SQL Server 的系列版本中存储过程分为两
类:
系统提供的存储过程
用户自定义存储过程
返回
153
系统过程主要存储在master 数据库中并以sp_为前缀,
并且系统存储过程主要是从系统表中获取信息,从而为
系统管理员管理SQL Server 提供支持。
通过系统存储过程,SQL Server 中的许多管理性或信
息性的活动(如了解数据库对象、数据库信息)都可以
被顺利有效地完成。
尽管这些系统存储过程被放在master 数据库中,但是
仍可以在其它数据库中对其进行调用,在调用时不必在
存储过程名前加上数据库名。
而且当创建一个新数据库时,一些系统存储过程会在
新数据库中被自动创建。
用户自定义存储过程是由用户创建并能完成某一特定
功能(如查询用户所需数据信息)的存储过程。
返回
154
7.13.2 创建存储过程
 在SQL Server 2000 中创建一个存储过程有两种方法:
 一种是使用Transaction-SQL命令Create Procedure,
 另一种是使用图形化管理工具Enterprise Manager。
 用Transaction-SQL 创建存储过程是一种较为快速的方法,
 但对于初学者,使用Enterprise Manager 更易理解,更为简
单。
 当创建存储过程时,需要确定存储过程的三个组成部分:
 1.所有的输入参数以及传给调用者的输出参数
 2.被执行的针对数据库的操作语句包括调用其它存储过程的
语句
 3.返回给调用者的状态值以指明调用是成功还是失败
 利用“向导”
返回
155
7.13.2.1 用CREATE PROCEDURE 命令创建存储过程
通过运用Create Procedure 命令能够创建存储过程,
在创建存储过程之前应该考虑到以下几个方面:
1.在一个批处理中Create Procedure 语句不能与其它SQL 语
句合并在一起。
2.数据库所有者具有默认的创建存储过程的权限它可把该权限
传递给其它的用户。
3.存储过程作为数据库对象其命名必须符合命名规则。
4.只能在当前数据库中创建属于当前数据库的存储过程。
如:在teach数据库中,创建一个名称为myproc的存储
过程,该存储过程的功能是从数据表s中查询所有男同学
的信息。
GO
CREATE PROCEDURE myproc AS
SELECT * FROM s WHERE sex = '男'
GO
返回
156
定义具有参数的存储过程。
如:在teach数据库中,创建一个名称为InsertRecord
的存储过程,该存储过程的功能是向数据表s中插入一条
记录,新记录的值由参数提供。
USE teach
GO
CREATE PROCEDURE InsertRecord
(
@sno char(6),
@sn char(20),
@age numeric(5),
@sex char(2),
@dept char(10)
)
AS
INSERT INTO s VALUES(@sno,@sn,@sex,@age,@dept)
GO
返回
157
定义具有参数默认值的存储过程。
如 : 在 teach 数 据 库 中 , 创 建 一 个 名 称 为
InsertRecordDefa的存储过程,该存储过程的功能是向
数据表s中插入一条记录,新记录的值由参数提供,如果
未提供系别dept的值时,由参数的默认值代替。
USE teach
GO
CREATE PROCEDURE InsertRecordDefa
(
@sno char(6),
@sn char(20),
@age numeric(5),
@sex char(2),
@dept char(10)='无'
)
AS
INSERT INTO s VALUES(@sno,@sn, @sex , @age, @dept)
GO
返回
158
定义能够返回值的存储过程。
如:在teach数据库中,创建一个名称为Query_Study的
存储过程,该存储过程的功能是从数据表s中根据学号查
询某一同学的姓名和系别。
USE teach
GO
CREATE PROCEDURE Query_Study
(
@sno char(6),
@sn char(20) OUTPUT,
@dept char(10) OUTPUT
)
AS
SELECT @sn=sn,@dept=dept
FROM s
WHERE sno=@sno
GO
返回
159
7.13.2.2 使用Enterprise Manager 创建存储过程
1.启动Enterprise Manager,登录到要使用的服务器。
2.在Enterprise Manager的左窗格中,展开要创建存
储过程的数据库文件夹,单击“存储过程”文件夹,此
时在右窗格中显示该数据库的所有存储过程。
3.用右键单击“存储过程”文件夹,在弹出的快捷菜
单中选择“新建存储过程”,此时打开“新建存储过程”
对话框。
4.在“文本”编辑框中输入存储过程的正文内容。
5.单击“检查语法”按钮,检查语法是否正确。
6.单击“确定”,保存。
7.在右窗格中,右击该存储过程,在弹出菜单中选择
“所有任务”, 选择“管理权限”设置权限。
返回
160
7.13.3
管理存储过程
7.13.3.1 查看存储过程
存 储 过 程 被 创 建 以 后 , 它 的 名 字 存 储 在 系 统 表
sysobjects 中;
它的源代码存放在系统表syscomments 中。
可以通过SQL Server 提供的系统存储过程来查看关于
用户创建的存储过程信息。
1.通过Enterprise Manager 管理工具同样可以查看存
储过程的源代码
(1)启动Enterprise Manager 登录到要使用的服务器。
(2)在Enterprise Manager的左窗格中,展开要创建存储过程
的数据库文件夹,单击“存储过程”文件夹,此时在右窗格中显
示该数据库的所有存储过程。
(3)在右窗格中,右击要查看源代码的存储过程,在弹出的菜
单中选择“属性”选项,此时便可看到存储过程的源代码。
返回
161
2.使用sp_helptext 存储过程查看存储过程的源
代码
sp_helptext 存储过程名称
如:查看数据库Study 中存储过程myproc 的源代
码。
Exec sp_helptext myproc
如果在创建存储过程时使用了WITH ENCRYPTION
选项,那么无论是使用Enterprise Manager 还是
系统存储过程sp_helptext 都无法查看到存储过程
的源代码。
返回
162
7.13.3.2 重新命名存储过程
修改存储过程的名字使用系统存储过程
sp_rename,其命令格式为:
sp_rename 原存储过程名名, 新存储过程名
如:将存储过程myproc修改为mynewproc。
sp_rename myproc, mynewproc
另外,通过Enterprise Manager 也可修改存
储过程的名字,其操作过程与Windows下修改文
件名字的操作类似。
即首先选中需修改名字的存储过程
然后右击鼠标,在弹出菜单中选取“重命名”选项
最后输入新存储过程的名字。
返回
163
7.13.3.3 删除存储过程
删除存储过程使用drop 命令,drop 命令可将
一个或多个存储过程或者存储过程组从当前数据
库中删除。其语法规则为:
DROP PROCEDURE {procedure}} [,…n]
如:将存储过程mynewproc从数据库中删除。
drop procedure mynewproc
返回
164
7.13.3.4 执行存储过程
执行已创建的存储过程使用EXECUTE 命令
如:执行数据库teach中的存储过程myproc。
EXECUTE myproc
如:执行数据库teach中的存储过程InsertRecord。
EXECUTE InsertRecord @sno = ‘S1’, @sn = ‘王大利’, @sex =
‘男’, @age = 18,@dept= ‘计算机系’
如:执行数据库teach中的存储过程InsertRecordDefa。
EXECUTE InsertRecordDefa @sno = 'S10',@sn = ' 高 平 ',
@sex = '女', @age = 18
如:执行数据库teach中的存储过程Query_Study。
DECLARE @sn char(20)
DECLARE @dept char(10)
EXECUTE Query_Study 'S10',@sn OUTPUT,@dept OUTPUT
SELECT '姓名' =@sn, '系别'=@dept
返回
165
7.13.4
触发器概述
 在上面,我们介绍了一般意义的存储过程,即用户自
定义的存储过程和系统存储过程。
 接下来将介绍一种特殊的存储过程,即触发器。
 触发器主要是通过事件进行触发而被执行的,而存储
过程可以通过存储过程名字而被直接调用。
 当对某一表进行诸如UPDATE、NSERT、DELETE 这些操
作时,SQL Server 就会自动执行触发器所定义的SQL
语句。从而确保对数据的处理必须符合由这些SQL 语
句所定义的规则。
 触发器的主要作用就是其能够实现由主键和外键所不
能保证的复杂的参照完整性和数据的一致性。
 除此之外,触发器还有其它许多不同的功能。
返回
166
7.13.5
创建触发器
7.13.5.1 用CREATE TRIGGER 命令创建触发器
如:下面创建一个触发器,当向表s中插入一条记录时,
自动显示表s中的记录。
CREATE TRIGGER Change_Display
ON s
FOR INSERT,UPDATE,DELETE
AS
SELECT * FROM s
该触发器建立完毕后,当执行如下操作时将会显示数
据表s中的全部记录。
EXECUTE InsertRecordDefa @sno = 'S11', @sn = '张建峰',
@age = 17, @sex = '男'
返回
167
7.13.5.2
用管理工具Enterprise Manger 创建触发器
1.启动Enterprise Manager 登录到要使用的服务器。
2.在Enterprise Manager的左窗格中,展开要创建触发器的数
据库文件夹,单击“表”文件夹,此时在右窗格中显示该数据库
的所有表。
3.在右窗格中,右击要创建触发器的数据表,在弹出的快捷菜
单中,将鼠标指向“所有任务”,在出现的下一级子菜单中选择
“管理触发器”菜单项,此时会出现 “触发器属性”对话框。
4.在“名称”下拉框中选择“<新建>”,在“文本”编辑框中
输入触发器的文本命令。
5.单击“检查语法”按钮,检查语句是否正确。
6.单击“应用”按钮,在“名称”下拉列框中会有新创建的触
发器名字。
7.单击“确定”按钮,关闭窗口创建成功。
返回
168
7.13.8
管理触发器
7.13.8.1 使用Enterprise Manager显示触发器信息
1.启动Enterprise Manager 登录到要使用的服务器。
2.在Enterprise Manager的左窗格中,展开要创建
触发器的数据库文件夹,单击“表”文件夹,此时在
右窗格中显示该数据库的所有表。
3.在右窗格中,右击要创建触发器的数据表,在弹
出的快捷菜单中,将鼠标指向“所有任务”,在出现
的下一级子菜单中选择“管理触发器”菜单项,出现
“触发器属性”对话框。
4.在“名称”下拉框中选择所要查看的触发器的名
称,在“文本”编辑框中显示出该触发器的文本命令。
返回
169
7.13.8.2 使用系统存储过程查看触发器
系 统 存 储 过 程 sp_help 、 sp_helptext 和 sp_depends
分别提供有关触发器的不同信息。下面我们将分别对其
进行介绍:
1.sp_help
通过该系统过程,可以了解触发器的一般信息,如触
发器的名字、属性、类型、创建时间。
如:要查看我们已经建立的change_display触发器。
sp_help 'change_display'
2.sp_helptext
通过sp_helptext 能够查看触发器的正文信息
如:要查看我们已经建立的change_display触发器的命
令文本。
sp_helptext 'change_display'
返回
170
3.sp_depends
通过sp_depends 能够查看指定触发器所引用
的表或指定的表涉及到的所有触发器。
其语法形式如下:
sp_depends ‘触发器名字’
sp_depends ‘表名’
如:要查看我们已经建立的change_display触
发器所涉及的表。
Exec sp_depends 'change_display'
注:用户必须在当前数据库中查看触发器的信
息,而且被查看的触发器必须已经被创建。
返回
171
7.13.8.3 修改、删除触发器
通 过 Enterprise Manager 和 系 统 过 程 或
Transaction_SQL 命令,可以修改触发器的名字
和正文。
1.使用sp_rename 命令修改触发器的名字
其语法格式为:
sp_rename oldname,newname
oldname为触发器原来的名称
newname为触发器的新名称。
2.通过Enterprise Manager 修改触发器正文
通过Enterprise Manager 修改触发器正文的操作步
骤与查看触发器信息一样。
修改完触发器后要使用“检查语法”选项对语句进
行检查。
3.通过Alert trigger 命令修改触发器正文
返回
172
4.删除触发器
用户在使用完触发器后可以将其删除。
只有触发器属主才有权删除触发器。
删除已创建的触发器有三种方法:
(1)用系统命令DROP TRIGGER 删除指定的触发器,
其语法形式如下:
DROP TRIGGER 触发器名字
(2)删除触发器所在的表时,SQL Server 将自动删
除与该表相关的触发器。
(3)按前介绍的方法进入“触发器属性”对话框,
在该对话框中选择要删除的触发器,然后单击“删除”
按钮即可。
返回
173
7.14
7.14.1
视图
创建视图
SQL SERVER 提供了使用SQL SERVER Enterprise Manager 和SQL
命令两种方法来创建视图,关于用SQL命令创建视图的方法曾在第3
章介绍过,在此只介绍第一种方法。
使用 Enterprise Manager 来创建视图的方法如下:
1.启动Enterprise Manager,登录到指定的服务器。
2.打开要创建视图的数据库文件夹,选中“视图”图标,此时在右面
的窗格中显示当前数据库的所有视图。右击“视图”图标,在弹出菜单
中选择“新建视图”选项,打开“新建视图”对话框,在此对话框中共
有四个区,从上到下依次为表区、列区、SQL script 区、数据结果区。
3. 在窗口中,首先点击“添加表”按钮
,打开添加表对话框,从
中选择所有要包含到视图中的表,所有已添加的表都将显示到表区中。
4. 在列区中选择将包括在视图的数据列,这此时相应的SQL SERVER
脚本便显示在SQL script 区。
5. 单击
按钮,在数据结果区将显示包含在视图中的数据行。
6. 单击
按钮,在弹出对话框中输入视图名,单击“保存”并输入
视图的名称,完成视图的创建。
返回
174
7.14.2 管理视图
7.14.2.1 查看修改视图
在SQL SERVER 中,通过Enterprise Manager 查
看和修改视图主要执行以下步骤:
方法1:
1. 启动Enterprise Manager,登录到指定的服务器。
2. 打开要创建视图的数据库文件夹,选中“视图”
图标,此时在右面的窗格中显示当前数据库的所有视
图。
3. 在右窗格中右键单击要查看的视图,在弹出菜单
中选择“属性”菜单项,打开“视图属性”对话框。
4. 在该对话框内可浏览到该视图的SQL文本,也可以
对该视图进行修改,然后单击“检查语法”按钮来对
语句合法性进行检查。若要对视图的访问权限进行设
置,请单击“权限”按钮。
返回
175
方法2:
1. 启动Enterprise Manager,登录到指定的服务器。
2. 打开要创建视图的数据库文件夹,选中“视图”
图标,此时在右面的窗格中显示当前数据库的所有视
图。
3. 在右窗格中右键单击要查看的视图,在弹出菜单
中选择“设计视图”菜单项,即可进入到设计视图的
窗口。
4.在该窗口中可按照创建新视图的方法对原有的视
图进行各种修改,最后存盘即可。
返回
176
7.14.2.2 使用存储过程检查视图
在SQL SERVER 中有三个关键存储过程有助于了解视图
信息,它们分别为:
1.sp_depends
2.sp_help
3.sp_helptext
存储过程sp_depends 返回系统表中存储的任何信息,
该系统表指出该对象所依赖的对象。除视图外,这个系
统过程可以在任何数据库对象上运行。其语法如下:
sp_depends 数据库对象名称
系统过程sp_help 用来返回有关数据库对象的详细信
息,如果不针对某一特定对象,则返回数据库中所有对
象信息。其语法如下:
sp_help 数据库对象名称
系统过程sp_helptext 检索出视图、触发器、存储过
程的文本其。语法为:
sp_helptext 视图或触发器或存储过程
返回
177
7.14.2.3 删除视图
除了可以使用第3章中介绍的使用SQL命令来删
除 视 图 外 , 在 SQL SERVER 中 , 通 过 Enterprise
Manager 也可删除视图,主要执行以下步骤:
1. 启动Enterprise Manager,登录到指定的服务器。
2. 打开要创建视图的数据库文件夹,选中“视图”
图标,此时在右面的窗格中显示当前数据库的所有视
图。
3. 在右窗格中右键单击要查看的视图,在弹出菜单
中选择“删除”菜单项。
返回
178
小
结
本章主要讲述了利用SQL Server 2000数据库管理系统
进行数据库管理的方法,本章内容可以说是前面几章所
讲述的理论内容的实践。
重点介绍了企业管理器和查询分析器的使用,对数据
库的各种管理功能都可以利用这两个工具完成;
Transact-SQL是SQL Server对原有标准SQL的扩充,可
以帮助我们完成更为强大的数据库操作功能,尤其是其
在存储过程的设计、触发器的设计方面应用更为广泛。
在SQL Server下,利用Transact-SQL、企业管理器或
查询分析器可以完成各种数据库对象,如:数据库、数
据表、视图、存储过程、触发器、约束、默认的管理
(包括创建、修改、查看、删除等)。
返回
179