作为成功移植的开始,你应该掌握Microsoft SQL Server
7.0所用的基本的结构和术语。这一部分中的许多例子都是从本文包含的Oracle和SQL Server应用程序中截取下来的。 数据库的定义 在Oracle中,数据库是指整个Oracle RDBMS环境,并且包含以下组件。 一个Microsoft SQL
Server数据库提供了数据、应用程序以及安全机制的逻辑区分,更像一个表空间(tablespaces)。正如Oracle支持多个表空间,SQL
Server也支持多个数据库。表空间也用来提供数据的物理放置,SQL Server通过文件组(filegroups)来提供同样的功能。 Microsoft SQL Server将缺省的安装下列数据库。 如果想获得缺省数据库的更多信息,请参看SQL Server联机图书。 数据库系统目录 每个Oracle数据库都在一个集中系统目录(或者是数据字典(data
dictionary))上运行,该目录存在于SYSTEM表空间中。而每个Microsoft SQL Server
7.0数据库都维护一个自己的系统目录,该目录包含下列信息: SQL Server同时在master数据库中保存一个集中系统目录,该目录包含系统目录和每个数据库的某些信息: 像Oracle中的SYSTEM表空间一样,SQL
Server的master数据库也必须能访问任何其他数据库。同样,对数据库做了任何重大的改变以后,通过备份master数据库来防止失败是很重要的。数据库管理员也应该能够为组成master数据库的文件做镜象。 Oracle
RDBMS是由表空间组成的,而表空间又是由数据文件组成的。表空间数据文件被格式化为内部的块单位。块的大小,是由DBA在Oracle第一次创建的时候设置的,可以在512到8192个字节的范围内变动。当一个对象在Oracle表空间中创建的时候,用户用叫做长度的单位(初始长度((initial
extent)、下一个长度(next extent)、最小长度(min extents)、以及最大长度(max
extents))来标明该对象的空间大小。一个Oracle长度的大小可以变化,但是要包含一个由至少五个连续的块构成的链。 Microsoft SQL
Server在数据库级别使用文件组来控制表和索引的物理放置。文件组是一个或者多个文件的逻辑容器,一个文件组中的数据按比例填充属于该文件组的全部文件。 如果没有显明的定义和使用文件组,数据库对象将放置在一个缺省的文件组中,该文件组是在数据库的创建过程中隐含定义的。文件组允许你进行下列操作: SQL
Server把文件格式化为叫做页(pages)的单位。页的大小固定为8192字节(即8K)。页按固定为8个连续页大小的格式组织为长度。当创建表或者索引时,SQL
Server自动为其分配一页,比起分配一个长度来说,储存较小的表和索引,这种方法要更有效些。 标记数据(Striping Data) (译注:Strip——在海量存储系统(MSS)中,可由给定磁头位置访问的数据盒式磁带中的那部分) Oracle类型的段对于大多数Microsoft SQL Server安装来说都不需要。取而代之的是,SQL
Server可以利用基于硬件的RAID或者Windows NT软件RAID来较好的完成数据的分布或者标记。基于硬件的RAID或者Windows
NT软件RAID可以设置一个由多个硬盘组成的标记装置,使它们看起来就像一个逻辑驱动器一样。如果数据库文件是在这个标记装置上创建的,磁盘子系统就假定为负责通过多个磁盘来进行分布式的I/O装载。建议管理员使用RAID来将数据分布在多个物理磁盘上。 针对SQL Server的RAID推荐配置是RAID 1(镜象)或者RAID 5(拥有一个作为冗余的额外的驱动器的标记设备)。RAID
10(对有奇偶的标记设备的镜象)也是推荐的,但它比起前两个来要昂贵的多。标记设备在分散数据库文件上通常的随机I/O来说是很好的。 如果不能使用RAID,文件组就是一个很有吸引力的选择了,它提供了RAID可以提供的某些同样的好处。此外,对于那些可能跨越多个物理RAID阵列的非常大的数据库来说,文件组可能是一个很好的选择,它可以通过一种受控制的方式将I/O分布在多个RAID阵列上。 必须优化事务日志文件(Transaction log
files),使之适应连续的I/O,并且必须保护该文件以防止单点失败。因此,建议采用RAID1(镜象)来做事务日志。该驱动器的大小至少应该和在线恢复日志(online
redo
logs)以及反转段表空间两者加起来的大小一样才行。创建一个或者更多个日志文件,把逻辑驱动器上定义的空间占满。和存储在文件组中的数据不同,事务日志条目总是按顺序写入的,而不是按比例填充的。 欲获得关于RAID的更多信息,请参看SQL Server联机图书,你的Windows NT服务器文档,以及Microsoft Windows
NT资源指南。 事务日志和自动恢复(Transaction Logs and Automatic
Recovery) Oracle
RDBMS在每次启动时执行自动修复。它检查表空间文件的目录与在线恢复日志文件中的目录是否一样。如果不一样,Oracle就使用在线恢复日志文件覆盖表空间文件(roll
forward、前滚),然后去掉它在后滚段中发现的所有未完成的事务(roll
back,后滚)。如果Oracle不能从在线恢复日志中得到需要的信息,则Oracle就求助于存档的恢复日志文件。 Microsoft SQL Server
7.0同样在每次启动时通过检查系统中的每个数据库来执行自动恢复。它首先检查master数据库,然后启动线程以覆盖系统中的所有数据库。对于每一个SQL
Server数据库,自动修复机制将检查事务日志。如果事务日志中包含任何未完成的事务,则该事务后滚。然后自动修复机制再检查事务日志以找出那些还没有写入数据库的未完成事务。如果找到,则执行该事务,前滚。 SQL
Server事务日志包含了Oracle后滚段和Oracle在线恢复日志两者总的功能。每个数据库都有自己的事务日志,该日志记录了数据库发生的任何改变,并且日志由数据库的所有用户共享。当一个事务开始并且发生一次数据修改,则一个BEGIN
TRANSACTION事件(同modification事件一样)被记录在日志中。在自动恢复的过程中使用该事件来确定事务的起始点。每收到一个数据修改事件,改变都被记入事务日志中,优先写入其数据库中。欲了解更多信息,请参看本章后面的“事务、锁定和并行”部分。 SQL Server有一个自动检查点机制,该机制确保完成了的事务规则的从SQL
Server磁盘缓存中写入事务日志文件。从数据库的上一个检查点算起,任何修改过的缓存页将被写入一个检查点。向数据库上的这些缓存页(dirty
pages,污损页)写入检查点,确保了所有已完成的事务被写到磁盘上。该过程缩短了发生失败(例如能量损耗,power
outage)时修复系统的所花的时间。该设置可以用SQL Server Enterprise
Manager修改,还可以用Transact-SQL修改(sp_configure系统存储程序)。 备份和恢复数据 Microsoft SQL Server提供了几种备份数据的选择: 完全的数据库备份 要进行完全的数据库备份,使用BACKUP DATABASE语句或者“备份向导”(Backup Wizard)。 微分备份(Differential backup) 在经过完全的数据库备份以后,定期使用BACKUP DATABASE WITH
DIFFERENTIAL语句或者“备份向导”来备份改变过的数据和索引页。 事务日志备份 Microsoft SQL Server中的事务日志有一个独立的数据库。该数据库仅在备份或者被删除以后才填充。SQL Server
7.0中的缺省设置是事务日志自动增长,直到它用完了所有的可用空间或者达到其设置的最大空间。当事务日志过满时,它会生成一个错误并且阻止任何的数据修改,直到该日志被备份或者被删除。其他的数据库不会受到影响。可以用BACKUP
LOG语句或者“备份向导”进行事务日志备份。 文件或者文件组备份 SQL Server可以备份文件或者文件组。欲知详情,请参看SQL Server联机图书。 备份可以在数据库正在使用的时候进行,这样就可以使那些必须不断运行的系统进行备份。SQL Server
7.0的备份过程和数据结构已经大大的改进,可以使备份在对事务吞吐量影响最小的情况下达到最大的数据传输率。 Oracle和SQL Server都需要一个特殊的日志文件格式。在SQL Server中,这些叫做备份设备的文件是用SQL Server
Enterprise
Manager、Transact-SQL的sp_addumpdevice存储程序或者等价的SQL-DMO命令创建的。 虽然备份可以通过手工操作进行,但是建议你使用SQL Server Enterprise
Manager和/或者“数据库维护计划向导”进行定期的备份,或者基于数据库活动进行备份。 应用事务日志备份和/或者微分备份,一个数据库可以按时储存在一个完全备份数据库(设备)的特定的点上。数据库使用备份中包含的信息恢复数据。可以用SQL
Server Enterprise Manager、Transact-SQL (RESTORE
DATABASE)或者SQL-DMO进行恢复。 就像你可以关掉Oracle存档器以跳过备份一样,在Microsoft SQL
Server中,db_owner组中的成员可以强制事务日志在检查点发生的时候抹去目录。可以用SQL Server Enterprise
Manager(删除检查点上的日志),Transact-SQL(sp_dboption存储过程)或者SQL-DMO来完成。 网络 Oracle
SQL*Net支持Oracle数据库和其客户端的网络连接。它们通过透明网络层数据流协议进行通信,并且允许用户运行许多不同的网络协议,而不需要编写任何特殊的代码。SQL*Net未包含在核心Oracle数据库软件产品中。 在Microsoft SQL
Server中,Net库(网络库)支持客户端和服务器的连接,它们通过列表数据流协议进行通信。这使得可以同时和运行名字管道(Named
Pipes)、TCP/IP套接字或者其他交互处理机制(Inter-Process Communication、IPC)的客户端连接。SQL
Server CD-ROM包含了所有的客户端Net库,不需要另外购买这些产品了。 SQL Server Net库选项可以在安装后修改。客户端网络工具为运行Windows NT、Windows 95、或者Windows
98的客户端配置缺省的Net库和服务器连接信息。除非在ODBC数据源的安装过程中改变或者在ODBC连接字串中显式的标明,所有的ODBC客户端也使用同样的Net库和服务器连接信息。欲了解关于Net库的更多信息,请参看SQL
Server联机手册。 数据库安全性和角色(Database Security and Roles) 为了把你的Oracle应用程序完整的移植到Microsoft SQL Server 7.0上,你需要明白SQL
Server是如何实现数据库的安全性和角色的。 登录账号 登录账号允许一个用户访问SQL Server数据或者管理选项。登录账号允许用户仅仅是登录到SQL
Server上并且显示那些可以让访客(guest)访问的数据库。(guest账号不是缺省设置的,必须创建) SQL Server提供了两种类型的登录安全性。Windows NT验证模式(也称为集成的)和SQL
Server验证模式(也称为标准的)。SQL Server 7.0还支持标准的和集成的安全性的联合使用,称为混合的。 Windows NT验证模式在检验登录连接时使用Windows NT内建的安全机制,并且依赖用户的Windows
NT安全信任。用户不需要为SQL
Server输入登录ID和口令——其登录信息直接从网络连接上截取。当发生连接时,一个条目就被写入syslogins表,并且在Windows
NT和SQL Server之间加以验证。这种方式叫做可信连接,其工作原理同两台Windows
NT服务器之间的可信关系是一样的。此功能同Oracle中用于用户账号的IDENTIFIED EXTERNALLY选项是类似的。 SQL Server验证模式在用户请求访问SQL
Server时要求用户输入登录ID和口令。这种方式又叫做不信任连接。此功能同Oracle中用于用户账号的IDENTIFIED BY
PASSWORD选项是类似的。使用标准安全模式,登录仅仅提供用户访问SQL Server数据库引擎的能力,不允许用户访问用户数据库。 欲了解关于安全机制的更多信息,请参看SQL Server联机手册。 组、角色和许可(Groups, roles, and
permissions) Microsoft SQL Server和Oracle都使用许可来加强数据库安全性。SQL
Server用语句级的许可来限制创建新的数据库对象的能力。(同Oracle一样) SQL
Server还提供了对象级的许可。像Oracle一样,对象级所有权是分配给对象的创建者的,并且不能过户。在其他用户可以访问对象之前必须给予他们对象级的许可。sysadmin固定服务器角色、db_owner
固定数据库角色、或者db_securityadmin 固定数据库角色的成员同样可以给予其他用户对某个用户对象的许可。 SQL Server语句级和对象级的许可可以直接赋予数据库用户账号。但是,通常更简单的方法是赋予数据库角色管理员许可。SQL
Server角色用来赋予或者撤消数据库用户组的特权(同Oracle角色非常相象)。角色(Roles)是一个带有特殊数据库的数据库对象。每次安装都有一些固定的服务器角色,这些角色在数据库之上工作。一个固定服务器角色的例子是sysadmin。Windows
NT组也可以作为SQL Server登录,就像数据库用户一样。许可可以赋予一个Windows NT组或者一个Windows NT用户。 一个数据库可以有任意数量的角色或者Windows
NT组。缺省的public角色总是可以在任何一个数据库上找到,这些角色不能被清除。public角色的功能很像Oracle中的PUBLIC账号。每个数据库用户都是public角色的成员。在public角色之外,一个数据库用户还可以是任意数量角色的成员。Windows
NT用户或组也可以是任意数量角色的成员,同样,他们也是public角色的成员。 数据库用户和Guest账号(Database
users and the guest account) 在Microsoft SQL
Server中,一个用户登录账号必须被授权使用一个数据库和它的对象。登录账号可以用下面方法中的一种来访问数据库: db_owner或者db_accessadmin角色或者sysadmin固定服务器角色的成员可以创建数据库用户账号角色。一个账号可以包含一些参数:SQL
Server登录ID,数据库用户名(可选)、以及一个角色名(可选)。数据库用户名不一定要和用户登录ID一样。如果未提供一个数据库用户名,则用户的登录ID和数据库用户名就是一样的。如果未提供一个角色名,则该数据库用户就仅是public角色的成员。在创建了数据库用户之后,用户可以根据需要分配任意的角色。 db_owner或者db_accessadmin角色的成员也可以创建一个guest账号。guest账号允许任意有效的SQL
Server登录账号访问一个数据库,甚至不需要有数据库用户账号。缺省情况下,guest账号继承了分配给public角色的特权;但是,这些特权可以修改为多于或者少于public账号的特权。 一个Windows NT用户或者一个组的账号可以被赋予访问数据库的权利,就像SQL Server登录所能做的一样。如果一个Windows
NT组的一个成员连接数据库,该用户会收到分配给这个组的许可。如果该用户是不止一个Windows
NT组的成员,则他会收到所有这些组对数据库的权限的集合。 Sysadmin角色(The sysadmin
role) Microsoft SQL Server sysadmin固定服务器角色中的成员拥有与Oracle
DBA组中的成员相似的权限。在SQL Server 7.0中,如果SQL Server是安装在一台Windows
NT计算机上,那么以sa SQL
Server验证模式登录的账号缺省为该角色的成员,也就是本地Administrator组中的成员。一个sysadmin角色中的成员可以增加或者删除Windows
NT用户和组,以及SQL Server登录账号。典型的该角色中的成员有以下职责: *这些项目可以委派给其他安全性角色和用户。 在SQL Server
7.0中,对于sysadmin固定服务器角色中的成员能干什么是没有限制的。因此,该角色中的成员可以通过一个特殊的SQL
Server实例访问任何数据库、所有的对象(包括数据)。像一个Oracle
DBA一样,有一些命令和系统程序是只有sysadmin角色中的成员才能使用的。 db_owner角色 虽然Microsoft SQL Server数据库在使用上和Oracle表空间很相似,但是它们在管理上是不一样的。每个SQL
Server数据库都是一个自持的管理域。每个数据库都标明了数据库所有者(dbo)。该用户总是db_owner固定数据库角色的成员。其他用户也可以是db_owner角色的成员。该角色中的所有成员都可以管理与他的数据库相关的管理任务。(不象在Oracle中,DBA管理所有数据库的管理任务)。这些管理任务包括: db_owner角色中的成员可以在他们的数据库上做任何事情。分配给该角色的大多数权利被分给一些固定数据库角色,或者也可以赋予数据库用户。在数据库上行使db_owner特权并不需要赋予sysadmin服务器范围特权。
|