第一讲 Sybase基础知识 一、客户/服务器体系结构 Sybase是一种建立在客户/服务器体系结构上的数据库管理系统。 ●什么是客户/服务器体系结构? 从硬件角度看,客户/服务器体系结构是指将某项任务在两台或多台机器之间进行分配,其中客户机 (Client)用来运行提供用户接口和前端处理的应用程序,服务器机(Server)提供客户机使用的各种 资源和服务。从软件角度看,客户/服务器体系结构是把某项应用或软件系统按逻辑功能划分为客户软件 部分和服务器软件部分。客户软件部分一般负责数据的表示和应用,处理用户界面,用以接收用户的数 据处理请求并将之转换为对服务器的请求,要求服务器为其提供数据的存储和检索服务;服务器端软件 负责接收客户端软件发来的请求并提供相应服务。客户/服务器融合了大型机的强大功能和中央控制以及 PC机的低成本和较好的处理平衡。客户/服务器为任务的集中/局部分布提供了一种新的方法,这种体系 能够使用户对数据完整性、管理和安全性进行集中控制。在缓解网络交通和主机负荷以及满足用户需要 方面,客户/服务器体系提供了良好的解决方案。 总之,客户/服务器的工作模式是:客户与服务器之间采用网络协议(如TCP/IP、IPX/SPX)进行连接 和通讯,由客户端向服务器发出请求,服务器端响应请求,并进行相应服务。 数据库应用的客户/服务器模式如下图所示: 二、访问Sybase服务器的基本过程 1.建立客户与服务器之间的连接,包括网络连接、客户进程与服务器进程之间的连接; 2.客户端通过网络发送SQL语句给服务器,用来查询或操作服务器中的数据或数据库对象; 3.服务器接收到SQL语句后,对其进行语法分析、优化和编译后执行; 4.如果执行的语句产生一个结果集,服务器通过网络把结果集返回给客户; 5.客户端对收到的结果作相应的处理。 在客户/服务器体系,有两种数据库引擎结构,即多进程数据库引擎和单进程、多线程引擎结构。 多进程结构即多个可执行程序同时运行。每当用户登录到数据库系统时实际上都启动了数据库引擎 的一个独立实例。存在起协调作用的进程协调进行之间的通讯以保证当多用户访问相同数据时数据的 完整性。多进程数据库引擎一般用在大型机数据库上。 单进程多线程数据库引擎在原理上和多进程数据库引擎类似,不同的是多线程数据库引擎自己负责调 度各应用程序占用CPU的时间,而不依赖于操作系统。这样,多线程数据库引擎自我保护的能力更强。 Oracle Server是一个真正的多进程数据库引擎,Sybase数据库管理系统采用的是单进程多线程的引擎结构。 三、Sybase产品概述 1.Sybase软件的组成 Sybase软件可划分为三个部分:一是进行数据管理与维护的联机关系数据库管理系统Sybase SQL Server;二是支持数据库应用系统的建立和开发的一组前端工具软件Sybase SQL Tools;三是可把异 构环境下其他厂商的应用软件和任何类型的数据连接在一起的接口软件Open Client/Open Server。 SQL Server是个可编程的数据库管理系统(DBMS),它是整个Sybase产品的核心软件,起着数据管 理、高速缓冲区管理、事务管理的作用。 2.SQL Server的基本特征 SQL Server是个关系数据库管理系统,它具有如下一些基本特征: a.SQL Server可以放在若干个磁盘设备上,初始安装时所需的磁盘空间至少要17MB。 b.SQL Server支持多库结构,也就是说Sybase系统中可以有多个数据库。Sybase可以管理多个数据库。 c.SQL Server可以编译和运行T-SQL语句,并可返回客户程序所要求的结果。T-SQL语句是标准SQL 的扩充,它除了有数据定义语句、数据操纵语句和数据控制语句之外,主要增加了流程控制语句。 d.SQL Server可以管理多个用户并具有较高的事务吞吐量和较低的事务响应时间。 客户的应用程序可以存取Server中某一个或几个数据库的数据。 四、SQL Server的主要内容 Sybase SQL Server是一个多库结构的RDBMS,体系结构大致如下: 1.数据库 服务器自身所使用的数据库,也可以说是管理服务器和用户数据库的数据库。Sybase在安装时,自动 创建了四个系统数据库: master、model、tempdb、sybsystemprocs (1) master数据库 它是管理和控制用户数据库以及维护服务器正常运行的核心数据库,它保存了大量的系统信息,如服务 器配置、用户、设备等。 在master数据库中不允许普通用户在其中创建数据库对象,否则会使得master数据库的事务日志很快变 满。如果事务日志用尽,就无法使用dump transaction命令释放master数据库中的空间。 (2)model数据库 它是为创建用户数据库而提供的模板。每当创建新的数据库时,SQL Server自动建立model数据库的一 份拷贝,并把它扩充到用户所要求的大小,以此作为新用户数据库。Model数据库中包含每个用户数据库 所要求的系统表。Model数据库可以被修改以便定制新创建的。 (3)tempdb数据库 它是个临时数据库,为服务器运行与处理提供一个共享的存储区域,如group by和order by的中间结果 就存放在这里。Tempdb的空间为服务器中所有数据库的所有用户所共享。 每次重启SQL Server,服务器的一个自动进程都拷贝model数据库到tempdb数据库,并清除tempdb中 原来的内容。因此tempdb中的用户表都是临时的。临时表分为两类:可共享的和不可共享的。不可共 享的临时表在由create table中将符号#置于表名之前创立;可共享的临时表通过create table中指定表 名前缀tempdb..而创立。不可共享的临时表SQL Server自动为其添加数字后缀名,且它只存在于当前会话中。 (4)sybsystemprocs数据库master数据库 它是专门用来保存系统命令(存储过程)的数据库,如sp_help、sp_configure、sp_helpdevice等。当 任一数据库用户运行以sp_开头的存储过程时,SQL Server按照以下顺序查找:当前数据库、 sybsystemprocs数据库、master数据库。 2.用户数据库 用户数据库是我们使用Sybase服务器的真正目的。要管理用户数据,必须在Sybase中创建自己 的数据库,它是指用create database命令创建的数据库。不能存取master数据库的用户是无权创 建新的数据库的。 数据库中的主要内容——数据库对象: 表、视图、临时表 索引、主键、外键 缺省值、规则 存储过程、触发器等 五、Sybase的安装与配置 1.服务器端的安装 安装建立SQL Server以后,要建立放置数据库、日志和索引的逻辑磁盘设备。数据库、日志和索 引的配置应注意以下原则; a.不要把任何用户对象安装在master数据库中。 b.日志应该保存在与数据库分离的磁盘上。 c.可以通过跨越多个设备分配工作优化I/O性能。 2.客户端的安装 3.需要立即更改的内容 (1)更改sa的登录口令;(2)命名服务器;(3)修改文件名(保证Sybase Central正常启动); (4)更改缺省设备;(5)增加tempdb的空间。 4.创建用户数据库 以下通过一个建立数据库的脚本说明建立数据库的过程: //创建数据库设备,设备大小以页(2K)为单位 disk init name=”test_dbdev”, physname=”c:\test\test_dbdev.dat”, vdevno=10, size=10240 go disk init name=”test_logdev”, phyname=”c:\test\test_logdev.dat”, vdevno=11, size=5120 go //创建数据库TEST_DB,其大小为20M,日志大小为10M create database TEST_DB on test_dbdev=20 log on test_logdev=10 go //打开数据库 use TEST_DB go 5.系统管理的主要内容 a.物理资源的管理 b.用户及其权限管理 c.数据库的备份与恢复 6.SQL Server的配置参数 服务器配置是系统管理员的职责,正确的配置对系统性能有重大的影响。有两个系统表存储 配置信息:sysconfigures和syscurconfigs;sysconfigures是永久性的,一旦系统运行,sysconfigures 的信息就拷贝到syscurconfigs中。显示配置和改变配置使用系统过程sp_configure。 有两种配置值:动态的和静态的,动态值一旦改变立即生效,静态值要在系统重启动后才起作用。 第二讲 数据库设备与存储空间管理 一、概述 1.安装初始化 初始安装SQL Server时,安装程序和脚本初始化主设备,并建立master、model、tempdb和 sybsystemprocs数据库。系统数据库、预定义设备和段按下列默认方式组织: a.master、model、tempdb数据库安装在主设备master上; b.sybsystemprocs数据库安装在安装时选择的设备上(sysprocsdev); c.为每个数据库创建三个预定义段:system、default和logsegment; d.所有用户创建数据库的默认设备是master设备; e.如果选择安装了审计数据库sybsecurity,它位于自己的设备上。 2.设备与存储管理考虑的主要问题 (1)恢复 物理磁盘崩溃时,磁盘镜像或在单独的物理设备上保存日志为数据库恢复提供了两种机制。 (2)性能 磁盘读写速度是I/O操作的瓶颈,正确地把数据库对象放置到物理设备上有利于改进性能; 把日志和数据库对象置于单独的设备上可以提高系统性能; 把表放在一个硬盘上而把索引放在另一个硬盘上,由于把工作分置于两个硬盘驱动器上,所以 可以确保物理读写速度加快; 磁盘镜像会降低磁盘写的速度。 二、设备(Device) Sybase将数据库中的所有数据存放在设备上。 1.设备的概念 设备是Sybase预先配置的专门存放数据库的一块连续的磁盘空间,并且它被映射到一操作系统 文件或一原始磁盘分区上。它有两个对应的名称:逻辑名和物理名。NT仅支持设备映射到文件。 设备与数据库之间的关系:多对多关系。一个数据库可以被创建或扩充到多个设备上,一个设备 也可以被用来存放多个数据库。不同的设备操作系统可以对其并行地读写,因此我们可以人为地 将一个数据库放置到多个数据库设备上。 设备的分类:Database Device和Dump Device。数据库设备存放数据库和事务日志,转储设备用 来存放数据库或日志的备份。 2.设备的创建 命令语法: DISK INIT Name=’device_name’, Physname=’physical_name’, Vdevno=virtual_device_number Size=number_of_pages […….] 举例说明: DISK INIT Name=’My_Device’, Physname=’D:\database\My_device.dat’, Vdevno=3 Size=5000 注释:逻辑名、物理名、设备虚拟号、设备大小 创建转储设备: sp_addumpdevice{‘disk’|’tape’} Logical_Name, Physical_Name, TapeSize 3.默认设备 在没有指定设备的情况下,用户创建的任何数据对象自动存放在默认设备上。 初始安装后,系统的主设备master被预指定为默认设备,因此要尽快创建自己的默认设备。确保以下 设备不是默认设备:系统主设备、指定仅被日志使用的设备。 Sp_diskdefault 设备名[,DefaultOn|DefaultOff] 4.磁盘镜像 磁盘镜像是出于数据库安全性的考虑,当介质失败时,磁盘镜像能提供不间断恢复。磁盘镜像是磁盘 上的数据的绝对拷贝。如果某一硬盘事故发生,则该被损坏的拷贝就自动变成离线状态,因而所有的 读写都被引向未被损坏的拷贝。 Sybase的磁盘镜像是在设备级上进行的,因此磁盘镜像实质上是设备镜像。当对某一设备进行镜像操 作时,Sybase自动创建一个附加设备,由镜像处理程序将原设备上的所有数据拷贝到镜像设备上。 如果要使某一数据库成为镜像,被分配给该数据库的每一设备都必须成镜像。Master设备在服务器中 地位特殊,如果它损坏了,SQL Server将崩溃。因此,如果有可能总是要镜像Master设备(在另一磁盘上)。 镜像命令语法: Disk Mirror Name=’device_name’,//被镜像的设备 Mirror=’physical_name’ [,writes=serial|noserial] 5.删除设备 sp_dropdevice logical_name[,delfile] 含有数据库的设备不允许删除。 三、创建与使用段 段(Segment)是数据库设备上磁盘空间的逻辑组合,它可以看作是指向一个或多个数据库设备 的标签。利用段可以控制数据库对象的存放位置,可以将数据库对象分类存放到不同的段上。 设备与段之间的关系:多对多关系。一个设备上可以创建多个段,一个段也可以覆盖多个设备。 1.使用段的优点 a. 控制空间的使用:放在一个段上的数据库对象不会在段外增长; b. 提高性能:处于不同磁盘设备上的段可以并行地读写; d.处理大表:利用段,可以将一个大表分段放在独立的物理设备上,如将一个表的文本或图象数据 存储另外的一个段上。 2.创建段 sp_addsegment 段名,数据库名,设备名 说明:在指定设备上为某个数据库创建一个段。 ●扩展段的范围 sp_exetendsegment 段名,数据库名,设备名 说明:设备在数据库中必须可用,否则需要扩展数据库到新的设备上;指定的段、数据库、设备必 须存在。 ●缩小段的范围: sp_dropsegment 段名,数据库名,设备名 说明:带第三个参数时,该命令并不删除段,只是段的范围缩小了。若某个段包含了别的段要独占 的设备,就需要缩小该段的范围。 3.使用段 ●两个数据库放在同一设备的不同段上,它们不会相互影响; ●当数据库增加空间时,增加的空间会自动分配到它的每一个段上; 例如:alter database my_db on data_dev=50 在data_dev设备上为my_db增加50M空间,这50M空间被自动分配到数据库的每一个段中。注意: 如果data_dev对于数据库是新的,system和default段会自动扩展到该设备上。 可以使用alter database命令的log on选项分配附加的日志空间。 (1)在段中创建新对象 create table 表名(列名 数据类型)[on 段名] create [clusterd|non clusterd]index 索引名 on 表名(列名)[on 段名] 注意:按照定义,聚集索引总是与表放在同一段上。 (2)在段上放置现有对象 sp_placeobject 段名,对象名 注意:该命令并不把对象从一个数据库设备移动到另一设备上,它只影响未来的空间分配。 可以将某个大表的text字段或image字段放置到一个单独的设备段上。 Sp_placeobject 段名,“表名.字段名” (3)在段上创建聚集索引 按照定义,聚集索引总是与表放在同一段上。如果在一个段上创建表,而在另一个段上创建聚集 索引,则其表与其索引一起移动,整个表将离开创建表的段而迁移到创建聚集索引的段中。通过 这种方法,可以快速而方便地把指定表移动到指定的设备上。 (4)系统预定义段 当用户创建一个数据库时,Sybase自动创建三个预定义的段: system段:存放系统表(包括所有用户对象的定义) default段:存放用户创建的各种对象,除非它们明显地指定到不同的段上。 Logsegment段:存放数据库的事务日志。 (5)删除段 删除段是缩小段范围的一个特例: sp_dropsegment 段名,数据库名 4.使用阈值管理 阈值(Threshold)管理是一种自动监控数据库自由空间的机制,Sybase的阈值管理允许用户为数 据库的某个段上的自由空间设置阈值并定义相应的存储过程。当该段上的自由空间低于所置头阈值 时,Sybase自动运行相应的存储过程。 在一个实际运行的数据库中,日志的增长速度一般要高于数据的增长,一旦日志段的自由空间用尽 ,SQL Server在默认情况下会挂起所有数据操纵事务,客户端应用程序停止执行。 在每个分离的段上存储其事务日志的数据库均自动设置有最后机会阈值(Last Chance Threshold), 其阈值是备份事务日志所需的自由空间的估计值。当该段上的自由空间低于所置阈值时,Sybase自动 运行名为sp_thresholdaction的存储过程。该过程的名称及参数由系统预定义,内容由用户编写。下 面是一个简单示例。 CREATE PROCEDURE dbo.sp_thresholdaction /*本过程参数通过位置传递,名称可以改变,但其定义及顺序不能变*/ @db_name varchar(30),/*数据库名*/ @seg_name varchar(30),/*段名*/ @space_lefe int,/*剩余自由空间*/ @status int/*最后机会阈值,其值为1,其它阈值,其值为0*/ AS BEGIN /*用户编写过程内容*/ dump transaction @db_name with truncate_only 第三讲 数据库与事务日志 一、创建用户数据库 Create Database 数据库名 On 设备_1=Size_1,//单位:M 设备_2=Size_2, …… log on 日志设备=Log_Size [With Override]//在同一设备上创建数据库和事务日志时使用该选项 [For Load] //禁止用户访问直到数据库的装入或恢复操作完成为止 举例: Create Database test_db On data_dev=100,//单位:M Index_dev=50 Log on log_dev=30 说明: (1)将日志放在单独的设备上,有利于数据库性能的提高; (2)图示: Data_dev Index_dev log_dev (3)如果将数据库和日志放在同一设备上,就不能实现增量备份; (4)通常将System和Default段缩减范围到一个设备上,如删除设备Index_dev上的System段和 Default段,创建新的段,用来存放专门的数据库对象。 二、更改数据库 1.改变数据库属主 通常用户数据库有系统管理员创建,它的默认属主是dbo。系统过程sp_changeddbowner可改变数 据库的属主关系,它必须由数据库管理员在要改变属主关系的数据库中执行。语法如下: sp_changeddbowner login_name[,True] 其中参数True用于将权限一半传递给新属主。 2.扩展数据库 (1)扩展数据库空间 alter database 数据库名 on 设备名=扩展空间 //单位:M 如果扩展的设备对于数据库是新的,System和Default段会自动扩展到该设备上。 (2)扩展事务日志到新的设备上 sp_logdevice 数据库名,设备名 举例:将数据库另外扩充5M,用于存储日志 alter database my_db on my_dev=5 go sp_logdevice my_db,my_dev go 3.删除数据库 drop database 数据库名 删除设备前必须删除其上的所有数据库,删除设备的命令是:sp_dropdevice 三、事务日志 日志文件是用来记录数据库每一次修改活动的文件。SQL Server中的每一个数据库都有自己 的日志文件,即系统表syslogs,也称为事务日志。事务日志是撤消事务和出现故障时恢复事务的依据。 在某些情况下,事务日志比数据本身更为重要。 什么是事务? 数据库的修改是以事务为单位进行的。一个事务就是一个操作序列,这些操作要么全做,要么全 不做,它是一个不可分割的工作单位。任何一个事务具备如下特征。 (1)执行的原子性(Atomic); (2)保持数据的一致性(Consistency); (3)彼此的隔离性(Isolation); (4)作用的持久性(Durability)。 上述事务的四个特征被称为事务的ACID准则。 事务在运行过程中,SQL Server把事务开始、事务结束以及对数据库的插入、删除和更新等每一 个操作作为一个日志记录存放到事务日志中。事务中的更新操作首先在数据库缓冲区(内存)中进 行,缓冲区分别有用来记录操作活动的数据页(data page)和日志页(log page)。当运行到 commit tran时,日志页首先从缓冲区写到磁盘上,而后数据页从缓冲区写到磁盘上,即遵循“先与日志 (write_ahead log)”的原则,这样保证出现故障的情况下,通过日志能够得到最大限度的恢复。恢复 必须撤消发生故障时还未提交的事务,已完成的事务若仍有未从缓冲区写到数据库设备中,还要重新 运行该事务。 附:创建与装载数据库实例 use master decl are @vedvno int select @vdevno=max(convert(tinyint,substring(convert(binary(4),d.low),v.low,1)))+1 from master.dbo.sysdevices d,master.dbo.spt_values v where v.type=’E’and v.number=3 declare @v_str char(2) select @v_str=convert(char(2),@vdevno) print @v_str disk init name=”YDDATA”, physname=”D:\Syb_Data\YDDATA.dat”, vdevno=@vdevno+1, size=153600 disk init name=”YDINDEX”, physname=”D:\Syb_Data\YDINDEX.dat”, vdevno=@vdevno+2, size=102400 disk init name=”YDLOG”, physname=”D:\Syb_Data\YDLOG.dat”, vdevno=@vdevno+3, size=76800 create database YDMISDB on YDDATA=300,YDINDEX=200 log on YDLOG=150 use YDMISDB execute sp_addsegment indexdev,YTMISDB,YTINDEX execute sp_dropsegment “default”,YTMISDB,YTINDEX execute sp_dropsegment system,YTMISDB,YTINDEX use master load database YDMISDB from ‘d:\yd_dump\ydmis_backup.dmp’ online database YDMISDB 第四讲 数据库安全性与用户管理 一、安全管理概述 数据库的安全性是指保护数据库以防止不合法的使用所造成的数据泄露、更改或破坏。 SQL Server的安全管理是一种基于角色(role)的管理方法,位于不同权限层次(或角色)的用户 具有不同的用户权限。 规定用户权限有三个因素:用户、数据对象和操作,即什么用户在哪些数据对象上可以执行什么操作。 访问SQL Server中数据的四道屏障: (1)操作系统——操作系统登录 (2)Sybase服务器——服务器登录 (3)Sybase数据库——数据库用户登录 (4)数据库对象——对象授权 二、理解数据库角色 角色是权限的集合。 1.系统预定义角色 一个真正的数据库管理员应该是整个服务器及其数据库的拥有者,具有管理服务器及其数据库的所 有权限。在一个大的系统中,数据库管理员往往不只由一人承担,而是将管理任务进行功能划分,每 人提当不同的责任。系统预定义角色就是为适应这种要求而设计的。 ●系统管理员(sa_role) sa_role角色拥有执行与数据库具体应用无关的管理权限: ◇安装与更新SQL Server ◇管理服务器的物理存储 ◇配置系统设置参数; ◇创建用户数据库; ◇授予SQL Server用户权限 ◇┅┅ ●系统安全管理员(sso_role) sso_role用来实施安全上敏感的操作,执行有关安全性的任务: ◇建立服务器登录帐户; ◇管理口令; ◇授予除sa_role之外的任何角色; ◇管理审计系统; ◇┅┅ ●操作员(oper_role) oper_role执行全服务器范围的数据库操作,如备份与恢复任意数据库等: ◇转储数据库与日志 ◇转载数据库与日志 ◇┅┅ 2.创建与使用自定义角色 (1)创建新的角色:create role (2)赋予角色权限:grant (3)设置登录帐户的角色权限:sp_role 格式:sp_role “grant”|”revoke”,角色名,登录帐号名 这里的“grant”|”revoke”是指对角色权限是授予还是撤消。 三、服务器的帐户管理 要想成为Sybase系统的一个用户,首先必须拥有自己的登录帐户。通过这一帐户连同自己 的口令向服务器注册后,才能使用Sybase系统中的一些资源,每一个这样的登录帐户在系统 中被赋予Server级的标识SUID。 1.添加登录 sp_addlogin 登录名,口令[,缺省的数据库] 如果不指定缺省的数据库,则该帐户的缺省数据库为master库。 2.更改登录属性 ◇更改口令; ◇锁定帐户; ◇期限设置; ◇赋予角色。Sybase 四、数据库用户管理 通过某一个帐户注册到服务器后,要想使用某一个数据库,必须成为该数据库的一个用户。通过 建立登录与用户之间的联系来管理对数据库的访问。 1.组的概念 组(group)是数据库用户的集合。属于某个组的用户,他自动获得该组所拥有的权限。 Sp_addgroup 组名 ◇将一个用户加入某个组:(1)改变用户属性;(2)创建新用户时指定。 ◇所有用户自动属于public组,即使这个用户已经属于其他组了。 2.创建新的用户 sp_adduser 登录名,用户名[,组名] 3.别名用户 Sybase的别名机制可以使得多个帐户对应于同一个数据库用户,这样使不同的登录在数据库 中拥有同样的权限。这在审计系统中是一种控制责任的一种手段。 Sp_addalias 登录名,数据库中的用户名 别名——相当于给某个用户配一把别人的钥匙(登录)。 五、用户的权限管理 控制用户对数据库对象的访问,有两类权限:命令权限和对象权限。 1.命令权限 Create Database Create Table Create View Create Procedure Create Rule Create default 命令权限授权与收权: Grant 命令权限组合 to 组名|用户名|角色 Revoke 命令权限组合 from 组名|用户名|角色 2.对象权限 Select Update Insert Delete Reference Execute 对象权限授权与收权: Grant 对象权限组合 on 数据库对象 to public|组名|用户名|角色 [With Grant Option] Revoke 对象权限组合 on 数据库对象 to public|组名|用户名|角色 From public public|组名|用户名|角色 [Cascade] 授权与收权举例: ◇Grant Insert,Delete on Employee to user_1,Group_1 ◇Grant Execute on Pro_culculate to public ◇Grant Select on Employee(emp_id,emp_name) to user_3 ◇Grant All on Employee to user_4 ◇Revoke update on Employee(emp_id,emp_name) from user_5 ◇Revoke Create Table,Create Rule from user_6 第五讲 数据库的备份与恢复 数据库的备份与恢复是SQL Server保障数据安全的一种重要手段,为防止意外,数据库管理 员必须定期和经常制作数据库的备份。一旦系统出现故障,数据能够得到及时的恢复。 一、基本概念 1.事务处理及其日志 SQL Server使用事务来跟踪所有数据库变化。事务是SQL Server的工作单元。一个事务包含一条 或多条作为整体成功或失败的T_SQL语句。每个数据库都有自己的事务日志,即系统表syslogs, 事务日志自动记录每个用户发出的每个事务,它饮食了每个事务足够多的信息,以确保数据能够被恢复。 2.检查点(CheckPoint) 服务器在何时更新数据? ——在检查点。在服务器发出一个检查点时:(1)更新数据;(2)在日志中记录下执行检查点 的标记。 检查点可把所有“脏页”写到数据库设备上,“脏页”是指从上一次检查点以来,在内存中修改、但没有 在磁盘上修改的页。SQL Server的自动检查点机制保证了被完成的事务修改的数据页有规律地从内 存中的缓冲区写到数据库设备上。 二、数据库备份 若硬件介质出现故障(如磁盘损坏),当且仅当事先已对数据库及其事务日志作了备份,才 能恢复数据库。 注意:绝对不要使用操作系统的拷贝数据库设备,把这样一个拷贝装入SQL Server将导致大 量数据库受损。 备份的类型: 完全备份() 增量备份——备份事务处理日志 说明: (1)只有把事务日志放在单独的设备上,才能进行增量备份; (2)备份事务日志会截断日志,因此备份的内容是自上次备份以来的事务处理。 (3)备份之前要启动备份服务器,并最好创建转储设备。 命令语法: dump database 数据库名 to 转储设备名/物理文件名 dump transaction 数据库名 {with {truncate_only|no_log} to 转储设备名/物理文件名 [with No_truncate] Truncate_only与no_log选项用于删除事务处理而不作拷贝。Truncate_only截断日志;在事 务处理日志完全满时用no_log,它不为数据库建立检查点。两个选项都会丢掉日志。当使用 了这两个参数后,应及时备份整个数据库。 No_truncate拷贝日志但不截断日志,在出现介质错误时使用该选项。 图形界面的选项与命令参数的对应关系: (1)dump transaction (2)dump transaction…… with no_truncate (3)dump transaction…… with truncate_only (4)dump transaction…… with no_log 三、数据库的恢复 使用load database加载备份到现有数据库,数据库可以是用于创建转储的数据库,也可以 不是。语法为: load database 数据库名 from 转储设备名/物理文件名 load transaction数据库名 from 转储设备名/物理文件名 ●利用备份恢复数据库举例: 某数据库数据和日志分别存储在两个独立的磁盘上,正常运转时的执行的备份计划如下,每天 的17:00执行整个数据库的备份,每天的10:00、12:00、14:00、16:00点执行增量备份: 周一17:00磁带1(100M)周二10:00磁带2(30M)周二12:00磁带3(30M)周二14:00磁带4(30M) 周二16:00磁带5(30M)周二17:00磁带6(30M) DumpdatabaseDumptransactionDumptransactionDumptransactionDumptransactionDumpdatabase 若数据磁盘在周二的下午六点损坏,可以采用如下步骤恢复数据库: (1)使用dump transaction with no_truncate获得当前的事务日志转储,磁带7; (2)使用load database转载最新的数据库转储,磁带6;(offline) (3)使用load transaction提交最新的事务日志转储,磁带7; (4)使用online database把数据库状态设置为online。 若数据磁盘在周二的下午4:50损坏,恢复过程如下: (1)使用dump transaction with no_truncate获得当前的事务日志转储,磁带7; (2)使用load database转载最新的数据库转储,磁带6;(offline) (3)使用load transaction依次装载磁带2、3、4、5上的事务日志; (4)使用load transaction提交最新的事务日志转储,磁带7; (5)使用online database把数据库状态设置为online。 四、制定备份与恢复的策略 由于事务日志在恢复数据库中的特殊作用,应定期备份数据库及其事务日志,而且事务日志 的备份要更频繁一些。如:数据库每周备份一次,事务日志每天备份一次。 第六讲 数据库与T-SQL语言 一、关系模型的基本概念 关系数据库以关系模型为基础,它有以下三部分组成: ●数据结构——模型所操作的对象、类型的集合 ●完整性规则——保证数据有效、正确的约束条件 ●数据操作——对模型对象所允许执行的操作方式 关系(Relation)是一个由行和列组成的二维表格,表中的每一行是一条记录(Record),每 一列是记录的一个字段(Field)。表中的每一条记录必须是互斥的,字段的值必须具有原子性。 二、SQL语言概述 SQL(结构化查询语言)是关系数据库语言的一种国际标准,它是一种非过程化的语言。通过 编写SQL,我们可以实现对关系数据库的全部操作。 ●数据定义语言(DDL)——建立和管理数据库对象 ●数据操纵语言(DML)——用来查询与更新数据 ●数据控制语言(DCL)——控制数据的安全性 T-SQL语言是Sybase对SQL92标准的一种扩展,主要在它的基础上增加了三个方面的功能:自己 的数据类型/特有的SQL函数/流程控制功能 T-SQL中的标识符使用说明: (1)标识符由1-30个字符或数字构成,但首字符必须为字母。临时表的表名以#开头,长度不能 超过13个字符。 (2)数据库对象的标识方法举例 database.owner.tablename.columnname 执行远程存储过程: EXEC server.db.owner.proc_name 当执行语句在批处理的句首时,EXEC可以省略。 三、Sybase的数据类型 在创建表或声明局部变量时,必须使用Sybase系统预定义类型。 1.字符类型 Char(n) VarChar(n) 2.数值类型 整数类型——Integer SmallInt TinyInt 浮点类型——Real Float Number[P,S] Decimal[P,S] 货币类型——Money SmallMoney 3.日期/时间类型 Datetime SmallDatetime 两者时间部分的精度不同,前者精确到分,后者精确到1/30秒。 4.文本和图像类型 Text Image 5.二进制数据类型 Binary(n) VarBinary(n) 四、数据定义语言 用来定义数据库对象。数据库对象是Sybase用来存储数据的逻辑实体,主要有: 表(Table)、视图(View)、临时表(Temp Table); 主键(Primary Key)、外键(Foreign Key)、索引(Index)、规则(Rule)、默认值(Default); 存储过程(Stored Procedure)、触发器(Trigger) ●基本语法 下面给出创建主要数据库对象的语法: 1.表 创建表的基本语法是: Create table[database.[owner].]table_name (column_name datatype [default {constant_expression|user|null}] {[{identity|null|not null}]|[[constraint constraint_name] {{unique|primary key}[clustered|nonclustered] [with{fillfactor|max_rows_per_page}=x] [on segment_name] |references[[database.]owner.]ref_table [(ref_column)] |check(search_condition)}]}… 在建立大型的数据库时,可以考虑将创建表乃至其它数据库对象的过程写到一个文本里,当数据库 系统出现问题时,在最坏的情况下,重建过程可以得到简化,也能比较好的对数据库的建设过 程进行监视。 创建表的过程完成下列活动: ·定义表的每一列; ·定义列名和列的数据类型并指定列是否处理空值; ·指定列是否具有IDENTITY属性; ·定义列级的完整性约束和表级的完整性约束 上述过程可见,创建表的过程可以设定填充因子,将列置于段上,设计索引,外键等等。 2.索引 索引对查询性能的影响很大,要引起重视。 索引加速了数据检索,Adaptive Server有三类索引: ·复合索引——索引包含多列;当两列或多列由于它们的逻辑关系而作为整体被查询时可建立这种索引; ·唯一索引——索引列的值不允许重复; ·簇聚索引和非簇聚索引——簇聚索引强迫Server不断地对表中数据排序或重排序以保证表中数 据的物理顺序和逻辑顺序的一致性,簇聚索引对范围查询性能影响极大;非簇索引没有这样的要 求,非簇聚索引对修改操作有利。 何时建索引? ·如果手动插入identity列,则创建唯一索引以保证不插入已经存在的值; ·经常被排序访问的列,即被列在order by子句中的列,最好对其建立索引以便Adaptive Server能 充分利用索引顺序的优点; ·如果列经常用手连接,则可对列建立索引,这样系统能更快地执行连接; ·包含主键的列一般都有簇聚索引,尤其是当它频繁地和其它表的列相关联; ·经常被范围查询的列最好为其建立簇聚索引,一旦查询范围内的第一个值被发现,则随后的值 在物理上一定相近。簇聚索引对单值查询并没有什么优点。 创建索引的基本语法: Create [unique][clustered|nonclustered]index index_name On [[database.]owner.]table_name (column_name[,column_name]…) [on segment_name][with consumers=x] 上述语法包含了这样的暗示:将簇聚索引和它的基表分离在不同的段上;段是逻辑概念,但段 可以位于不同的物理设备上,也即将簇聚索引和基表物理上分开。 这是不允许的,我们将在 后面讨论设备、数据库、段、表分区时作详细讨论。 3.键(key) 理解键是理解关联的关键。 键和索引往往是一回事。键的意义在概念上,键用于参照完整性约束。 主键是表的单值列的集合,主键通过在放置它们的表上创建一个单值索引来实现其单值性的。 实际上主键是作为标志表的标志符而存在的,一旦主键确定,则由该主键就确定了的表也就确定了。 外键是和其它表中的主键相关的列,主键和外键的关系确定了外键的值域,该值域即为相应主 键的取值范围。这样就从理论上强制实现了表与表之间的参照完整性。 前面创建表的语法里包含了创建键的成分。也可以通过其它途径创建主键和外键。 ◇Unique约束和Primary key约束的区别 Unique约束和Primary key约束用来保证同一表中指定的列上没有重复值,这两个约束都产生 唯一索引确保数据一致性,默认情况下,Unique约束产生唯一的非聚集索引,Primary key约束 产生唯一的聚集索引。Primary key约束比Unique约束严格:Primary key列不允许有空值, Unique列允许有空值。 4.视图 视图是查看多表中数据的方法,视图从基表派生,它并非物理存在,而是逻辑表;视图也系统 提供管理表的一种安全机制。视图使得用户集中精力在感兴趣的数据集上。 创建视图的语法: create view [[database.]owner.]view_name [(column_name[,column_name]…)] as select [distinct] select_statement [with check option] 有distinct关键字的视图不能更新。当视图涉及关联时,定义视图要小心,这时是对多表操作 ,完整性显得很重要。 五、数据操纵语言 1.Select语句 基本语法: SELECT[all|distinct]字段列表 [into表名] [from表名] [where条件表达式] [group by [all]字段列表] [having筛选表达式] [order by 字段列表[asc|desc]] [compute聚集函数列表[by字段列表]] 注意:Select语句中的子句必须按照上述顺序使用。也就是说,若该语句包括一个group by子句 和一个order by子句where,group by子句必须放在order by子句之前。 Having子句类似于where子句,不同之处有两点:(1)Having子句必须结合group by子句使用; (2)where子句不能用聚集函数,而Having子句可以。 下面通过实例来对Select的通常用法加以介绍。 例1:选择所有的列,语法为select * from table_list 如:select * from publishers 例2:选择指定的列,语法为 select column_name[,column_name]… from table_name 如:select pub_id,pub_name from publishers 例3:重命名查询结果中的列,语法为 select column_heading= column_name from table_name 如:select Publisher=pub_name,pub_id from publishers 例4:select列表中的计算值,可以对select列表中的数值数据进行计算,下面列出了算术运算符。 符号运算 +加 -减 /除 *乘 %取模 如select title_id,total_sales,total_sales*2 from titles 例5:使用distinct消除重复的查询结果 可选的关键词消除select语句的结果中的重复行。若不指定distinct,缺省值为all,将检索出 包含重复行的所有行数据。 如:select distinct au_id from titleauthor 例6:选择行——where语句 select语句中的确切指定要检索哪些行的准则,其一般格式为: select select_list from table_list where search_conditions where子句中的搜索条件(或称限制)包括: ·比较运算符(=,<,>,!=等= 如:where advance*2>total_sales*price ·范围(between和not between) 如:where total_sales between 5000 and 10000 ·列表(in和not in) 如:where state in(“CA”,”IN”,”MD”) ·匹配字符(like和not like) 如:where phone like “0535%” ·未知值(is null和is not null) 如:where advance is null ·以上各项的组合(and, or) 如:where advance<5000 or total_sales between 500 and 1000 例7:用集合函数小结查询结果 集合函数用特定列的数据来计算小结值。 集合函数结 果 Sum([all|distinct]expression)数值列中(不重复)值的总和 Avg([all|distinct]expression)数值列中(不重复)值的平均 count([all|distinct]expression)列中(不重复)非空值的数目 Count(*)选定的行数 Max(expression)Expression的最大值 Min(expression)Expression的最小值 如:select avg(advance),sum(total_sales) from titles where type=”as” select count(*) from titles select avg(distinct price) from titles select max(price) from books 例8:分组组织查询结果——group by 子句 group by 子句用在select语句中将一张表分成若干组。 如:select type, advance from titles group by type 例9:选择分组数据——having子句 having为group by 子句设置条件,与where为select语句设置条件一样。Having搜索条 件与where相同,但having可包括集合函数,而where不能包括。 下列语句使用带集合函数having子句的例子。它把title表中的行按类型分组,但去掉了那只包 含一本书的分组。 Select type from titles group by type having count(*)>;1 下面是一个不带集合函数的having子句的例子。它把title表中的行按类型分组,但去掉了那些不 以字母“p”开头的类型。 Select type from titles group by type having type like “p%” 例10:查询结果排序——order by子句 Order by子句允许按一列或多列对查询结果排序。每个排序可以是升序的(asc)或降序的 (desc)。若不特别指明,则按升序进行。下列查询返回按pub_id排序的结果: Select pub_id,type,title_id from titles order by pub_id 例11:连接——从多张表中检索数据 连接两张或两张以上的表是这样一个过程:比较指定字段中的数据,根据比较结果用符合条 件的行组成一张新表。 举例: select publishers.pub_id,publishers.pub_name,authors.* from publishers,authors where publishers.city=authors.city 例12:分组计算子句 Compute是Sybase对SQL标准中Group子句的扩充,可以将其看作带聚集计算的Group子句。例如: Select type,price,advance From titles Order by type Compute sum(price),sum(advance) by type 2.Insert语句 用Insert命令向数据库中添加行有两种方法:使用关键词values或使用select语句。 Insert语句的基本语法为: Insert[into]表名[(字段列表)] {values(值列表)|select_statement} 举例:insert into publishers values(‘1622’,’Jardin,Inc.’,’Camden’,’NJ’) Insert into publishers(pub_id,pub_name) values(‘1756’,’The Health Center’) Insert authors select * from newauthors Insert authors(au_id,address,au_lname,au_fname) Select * from newauthors 3.Delect语句 Delect可以对一行或多行进行操作。 Delect语句的基本语法为: Delect 表名 [from 表名列表] [where条件表达式] 举例:Delect publishers where pub_name=”Jardin,Inc.” Delect titles From authors, titles Where titles.title_id=authors.title_id 4.Update语句 可以使用Update命令来改动表中的单个行、一组行或所有行。 Update语句的基本语法为: Update表名 Set column_name1={expression1|null|(select_statement)} [,column_name2={expression2|null|(select_statement)}] [……] [from 表名列表] [where 条件表达式] 举例: update authors set_au_lname=”Health”,aufname=”Goodbody” where au_lname=”Bloth” update titles set total_sales=total_sales + qty from titles,sales where titles.title_id=sales.title_id 六、Sybase预定义函数 1.聚集函数 sum([all|distinct]表达式) avg([all|distinct]表达式) count([all|distinct]表达式) count(*) max(表达式) min(表达式) 2.字符串函数 upper(字符表达式) lower(字符表达式) char(整型表达式) char_length(字符表达式) ltrim(字符表达式) rtrim(字符表达式) …… 3.数学函数 abs(精确小数型表达式) floor(精确小数型表达式)求小于或等于给定表达式值的最大整数(取底) rand([整数型] round(精确小数型表达式,整数) sign(精确小数型表达式) power(精确小数型表达式,整数幂) …… 4.日期函数 getdate() datepart(日期部分,日期) datediff(日期部分,日期1,日期2) dateadd(日期部分,数值表达式,日期) 5.类型转换函数 convert(数据类型,表达式[,格式]) 6.系统函数 db_name([数据库ID]) host_name() isnull(表达式1,表达式2) …… 七、数据控制语言 用来控制数据的安全性,如权限控制语句GRANT和REVOKE等。 第七讲 数据库编程基础 一、批处理 SQL Server可以处理作为一批而提交的多个SQL语句,既可以是交互式的,也可以是 一个文件。批处理SQL语句由批结束标志终止,该标志指示SQL Server从前面开始执 行该批处理语句,对于独立的SQL实用程序isql而言,其批结束标志为单独占一行的“go”。 举例:选择表title及表authors的行数 select count(*) from titles select count(*) from authors go 二、流程控制语言 1.变量声明与赋值 全局变量由系统预定义,以符号@@打头。 局部变量声明使用Declare语句,这个变量必须以符号@开头,后跟一个标识符。 Declare @变量名 数据类型[,@变量名 数据类型,……] 变量赋值使用Select语句,未赋值的变量其值为Null。 举例: Declare @msg char(50) Select @msg=’How are you?’ Select @msg=emp_name from employee Where emp_id=12345678 2.SQL语句块 Begin Statement Block/*多个顺序执行的SQL 语句*/ End 3.条件语句 If 条件表达式 语句(块) Else 语句(块) 举例: if(select max(id) from sysobjects)<50 print ‘数据库里没有用户创建的对象‘ else select name,type,id from sysobjects where id>;50 4.循环语句 While 条件表达式 语句(块) ●两个特殊的循环控制语句: Continue 执行下一次循环 Break 退出当前循环 举例: While(select avg(price) from titles)>;$20 Begin Update titles set price=price/2 If(select avg(price) from titles)<$40 Break Else Continue End 5.其它控制语句 ◇Return语句——无条件结束当前过程,并可返回给调用者的一个状态值:Return[整数表达式] ◇Print语句 ◇RaiseError语句 ◇Waitfor语句 三、存储过程 存储过程是存储在服务器端的一类数据库对象,它实质上是一段用SQL语言编写的程序, 它在服务器端预先经过编译,并确定出执行计划,因此与同样功能的批处理语句相比,它的 执行速度较快。 基本语法: Create Procedure[owner.]过程名 [@参数名 数据类型[=默认值][Output]] [,@参数名 数据类型[=默认值][Output]] [……] AS Begin SQL语句(块) End 存储过程是数据库对象,和表、索引是一个级别的;是SQL语句和控制流语言的集合,存储 过程在首次运行时被编译,并驻留在过程高速缓存的内存中,所以存储过程的招待非常快。 存储过程可以带参数,可以调用其他过程,返回状态值,返回参数值,并且可以在远程SQL Server 执行。可以在远程SQL Server执行对数据库设计有特别重要的意义。SQL Server提供的存储过程 称为系统过程。 存储过程大大增强了SQL的能力、效率和灵活性,经过编译的存储过程极大地改善SQL语句和批 处理的性能。 存储过程有很多优点: ●存储过程在第一次执行时编译,并存储在过程高速缓存的内存中。编译时系统对其进行优化,以 选择最佳的路径来访问数据集中的数据,这种优化考虑了数据集的实际数据结构。因此存储过程 大大提高了系统的性能。 ●存储过程可以跨服务器运行。这一点是通过触发器来实现的,当然,首先存储过程要能登录到 该远程服务器。 ●应用程序也能执行存储过程,从而实现服务器和客户之间的协同作业。 ●存储过程减少了网络的交通。这是因为存储过程的文本存储在数据库里,调用存储过程时通过 网络的只是存储过程的过程名。 ●利用存储过程可以提供一个附加的安全层。 如(该例子取自pubs2数据库): Create proc titleid_proc(@title_id varchar(80)) As Begin Select @title_id=lower(@title_id)+”%” Select title,title_id,price Form titles Where lower(title_id) like @title_id Return @@rowcount End 注意例子中的黑体部分,这实际上是一条赋值语句。该存储过程有返回值。 存储过程可以变得非常复杂。我们认为,创建存储过程还是要遵循“最简单就是最好”的原则。 建议在创建存储过程时采用缩进风格,否则创建的存储过程三天之后连自己都看不懂。 需要对存储过程作些说明: ●Create procedure 语句不能和其他语句在同一个批命令里。 ●Create procedure 语句不能包括下列语句: use Create View Create default Create rule Create trigger Create procedure 不能使用use语句好理解,存储过程是针对数据库的,不能在一个数据库里访问另外的数据库。 如果在存储过程里访问另外的数据库,则数据库表的参照完整性难于得到保障。 从另外几条语句看,在存储过程里一般不能创建新的数据库对象。但可以创建表和索引, 以及和表相关联的键,表是临时表,在存储过程结束后不能看见创建的临时表;否则的话 每运行一次存储过程就创建一个表,结果可想而知。 存储过程里不能创建一个对象,删除它;然后又在同一存储过程里用相同的名字创建新的对象。 实际上,SQL Server在存储过程运行时而不是在编译时创建对象的。 ●如果存储过程调用另外的存储过程,则第二个存储过程可以调用在第一个存储过程里创建的对象。 ●存储过程包含的最多参数为255个,对存储过程里的局部和全局变量没有限制。 最后讨论一下系统存储过程。系统存储过程以sp_开头,当然用户创建的存储过程也可以以sp_开头 ;系统过程保存在sybsystemprocs数据库里。系统过程的使用有权限,如果打入系统过程名但 没有出现预期的结果,要么是命令名错,要么是使用者没有该过程的权限。一般可通过系统 管理员或数据库所有者对系统过程的execute授权。 系统过程繁多,大致有几类: a. 用户标志和授权。这一类的过程主要由于:增加、删除或报告在SQL Server上的登录, 增加、删除或报告某数据库的用户、分组或别名等。这类过程有sp_addlogin,sp_adduser, sp_helpgroup,sp_dropuser等。 b. 远程过程的调用。这类过程用于:增加、删除或报告能存取本SQL Server的远程服务器; 增加能从远程服务器上存取本SQL Server的用户名。这类过程有:sp_addremotelogin,sp_addserver, sp_dropserver等。 c. 数据定义和数据库对象。这类存储过程用于:连接和定义规则和缺省值,增加、删除或 报告主码、外码和公共码;增加、删除或报告用户定义的数据类型。这类存储过程有: sp_bindfault, sp_bindrule, sp_help, sp_helpdb, sp_foreignkey, sp_helptext等。 d. 系统管理。这类存储过程用于:增加、删除或报告数据库及转储设备;报告锁;设置的数据库 选择及用户正进行的进程;修改及报告配置变量;监控SQL Server的活动。这类过程有: sp_addumpdevice,sp_dropdevice, sp_helpdevice等。 四、触发器 触发器是一种用来保障参照完整性的特殊的存储过程,它维护不同表中数据间关系的有关规则。 当对指定的表进行某种特定操作(如:Insert,Delete或Update)时,触发器产生作用。 触发器可以调用存储过程。 创建触发器的语法: Create Trigger[owner.]触发器名 On [owner.]表名 For {insert,update,delete} As Begin SQL语句(块) End 定义一个好的触发器对简化数据的管理,保证数据库的安全都有重要的影响。 触发器是针对表一级的,这就意味着,只有表的所有者有权创建表的触发器。 举例: 插入一个新行,必须保证外键与主键相匹配,触发器应该首先检查被插入行与主键表的连接。 以下的触发器对inserted表和titles表的title_id进行比较,这里假设正在给外键输入数据, 没有插入空值,若连接失败,事务被回退。insert,update,delete Create trigger forinsertrigl On salesdetail For insert As If(select count(*) From title,inserted Where titles.title_id=inserted.title_id)!=@@rowcount Begin Rollback transaction Print “No,some title_id does not exist in titles.” End Else Print “Added! All the title_id is exist in titles.” 在本例中,@@rowcount代表添加到salesdetail表的行数,这也是添加到inserted 表中的行数。通过连接表titles和表inserted来检测所有添加到salesdetail的title_id是否 在titles中存在。若所连接的行数(count(*))与@@rowcount不同,由有一个或多个插 入不正确,整个事务被取消。 触发器的限制: ●一个表最多只能有三个触发器,insert,update,delete ●每个触发器只能用于一个表 ●不能对视图、临时表创建触发器 ●Truncate table能删除表,但不能触发触发器 ●不能将触发器用于系统表 合理地使用触发器对性能的影响是正面的。在设计和使用触发器时,经常地用sp_depends 命令了解对象所关联的触发器是有好处的,该命令能列出触发器影响的所有对象、表和视等。 在定义几类数据库对象的时候,对存储过程、索引和触发器要给予特别的注意,尤其存储过程, 它设计的好坏对数据库性能的影响很大。 说明:Sybase触发器使用的两个测试表:Deleted表和Inserted表,它们都是临时表, 其结构与触发器的基表结构相同,用来存放与修改相关的数据行。 五、游标 1.游标的概念 游标是指向查询结果集的一个指针,它是一个通过定义语句与一条Select语句相关联 的一组SQL语句。游标包含两方面的内容: ●游标结果集:执行其中的Select语句所得到的结果集; ●游标位置:一个指向游标结果集内的某一条记录的指针 利用游标可以单独操纵结果集中的每一行。游标在定义以后存在两种状态:关闭和打开。 当游标关闭时,其查询结果集不存在;只有当游标打开时,才能按行读取或修改结果集中的数据。 2.使用游标 一个应用程序可以使用两种类型的游标:前端(客户)游标和后端(服务器)游标, 它们是两个不同的概念。 无论使用哪一种游标,都需要经过如下几个步骤: ●定义游标 ●打开游标 ●从游标中操作数据 ●关闭游标 下面讲述的是后端(服务器)游标。 (1)定义游标 在使用游标之前必须声明它。声明指定定义游标结果集的查询。通过使用for update或 for read only关键词将游标显式定义成可更新的或只读的。 Declare cursor语法为: For select_statement [for{read only|update[of colum_name_list]}] 举例: declare pubs_crsr cursor for select pub_name,city,state from publishers for update of city,state (2)打开游标 open的语法为: open 游标名 在声明游标后,必须打开它以便用fetch,update,delete读取、修改、删除行。在打开一个 游标后,它将被放在游标结果集的首行前,必须用fetch语句访问该首行。 (3)从游标中读取数据 在声明并打开一个游标后,可用fetch命令从游标结果集中获取数据行。 Fetch的语法为: Fetch 游标名[into 变量列表] 举例:fetch pub_crsr into @name,@city,@state SQL Server在每次读取后返回一个状态值。可用@@sqlstatus访问该值,下表给出了 可能的@@sqlstatus值及其意义。 值意 义 0Fetch语句成功 1Fetch语句导致一错误 2结果集没有更多的数据,当前位置位于结果集最后一行,而客户对该游标仍发出Fetch语句时。 若游标是可更新的,可用update和delete语句来更新和删除行。 删除游标当前行的语法为: delete[from]表名 where current of 游标名 举例:delete from authors where current of authors_crsr 当游标删除一行后,SQL Server将游标置于被删除行的前一行上。 更新游标当前行的语法为: update 表名 set column_name1={expression1|NULL|(select_statement)} [,column_name2={expression2|NULL|(select_statement)} [……] where current of 游标名 举例: update publishers set city=”Pasadena”,state=”CA” where current of pubs_crsr (4)关闭游标 当结束一个游标结果集时,可用close关闭。该语法为: close 游标名 关闭游标并不改变其定义,可用open再次打开。若想放弃游标,必须使用deallocate 释放它,deallocater的语法为: deallocater cursor 游标名 deallocater语句通知SQL Server释放Declare语句使用的共享内存,不再允许 另一进程在其上执行Open操作。 六、事务——维持数据一致性和恢复 1.事务的定义 事务提供了一种将T-SQL语句分组的方法,从而使它们能够被当成一个单元来处理: 组中所有语句或都执行,或都不执行。 事务是确保一个或多个SQL语句的集合不被当成单一工作单元处理的机制,SQL Server自动 将所有数据修改命令,包括单步改变请求,作为事务处理,缺省时,每个insert、update、 delete语句被当成一个事务处理。 2.事务的作用 事务使SQL Server能保证: ·一致性——同时发生的查询或改变请求彼此不冲突,用户不能对正处于改变过程的数据 进行查看或操作。 ·恢复——在系统失效时,数据库的恢复是完全的和自动的。 3.使用事务 a. 开始和确认事务 begin transaction和commit transaction可将任意数目的SQL语句封装起来,这两名的简单语法为: begin transaction commit transaction b. 回退事务 在commit transaction命令提交前任何时候可取消或回退事务,该命令的简单语法为: rollback transaction 4.检查事务状态 全局变量@@transtate记录了事务当前的状态。在执行一个语句后SQL Server通过记录所有 事务变化来确定返回何种状态。 @@transtate可包含下列值: 值意 义 0事务进行中:一个显式或隐式事务有效;上一语句执行成功 1事务完成:事务完成并提交其变化 2语句异常中止:上一语句异常终止;对事务无影响 3事务异常中止:事务异常中止并回退所有变化 举例:在事务中,可在一个语句(如insert)后使用@@transtate确定该语句成功或失败 对事务的影响。commit transaction Begin transaction Insert into publishers(pub_id)values(‘9999’) (1 row affected) select @@transtate ………………… 0 commit transaction select @@transtate ………………… 0 (1 row affected) 出处:http://bbs.chinaunix.net/viewthread.php?tid=15733 |