仓酷云

 找回密码
 立即注册
搜索
热搜: 活动 交友 discuz
查看: 780|回复: 7
打印 上一主题 下一主题

[学习教程] MYSQL教程之把Oracle数据库移植到Microsoft SQL Se...

[复制链接]
若相依 该用户已被删除
跳转到指定楼层
楼主
发表于 2015-1-16 22:40:13 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有帐号?立即注册

x
解决方案提供商应记住DBaaS通常仅仅是解决方案的一部分。客户之所以与他们的解决方案提供商协同工作,不仅是因为他们出售的产品,而且还因为他们所提供的服务。oracle|server|数据|数据库把Oracle数据库移植到MicrosoftSQLServer7.0

择要:本文是为那些想把本人的Oracle使用程序转换为MicrosoftSQLServer使用程序的开辟职员编写的。本文形貌了一个乐成的转换所必要的工具、历程和手艺。同时夸大了创建高功能、高度并行的SQLServer使用程序的基础的计划要素。

本文的读者应当具有:Oracle干系型数据办理体系(RDBMS)的坚固基本。一般数据库办理常识。熟习OracleSQL和PL/SQL言语。C/C++编程言语的事情履历。在sysadmin组中设定服务器划定规矩的成员资历
本文假定你熟习OracleRDBMS的术语、观点和工具。假如想要懂得关于OracleRDBMS和它的布局的更多信息,请参考Oracle7ServerConceptsManual。关于利用Oracle剧本和示例,仍旧假定你熟习OracleServerManager和OracleSQL*Plus工具。要失掉更具体的信息,请参看Oracle文档。


目次开辟和使用程序平台概述本文的构造情势布局和术语安装和设置MicrosoftSQLServer界说数据库工具增强数据完全性和贸易划定规矩事件、锁定和并行逝世锁SQL言语撑持完成游标调剂SQL语句利用ODBC开辟和办理数据库复制移植你的数据和使用程序数据库示例


开辟和使用程序平台
为了便于分明的表述,本文参照的开辟和使用程序平台假定为MicrosoftVisualStudioversion6.0、MicrosoftWindowsNTversion4(ServicePack4)、SQLServer7.0、Oracle7.3。Oracle7.3利用VisigenicSoftwareODBC(版本2.00.0300)驱动,SQLServer7.0利用MicrosoftCorporationODBC(版本3.70)驱动。MicrosoftSQLServer7.0包含针对Oracle的OLEDB驱动,可是该驱动程序在本章中并没有普遍的会商。

概述
使用程序的移植仿佛十分庞大。在分歧的干系数据办理体系之间有太多的布局差别。用来形貌Oracle布局的用词和术语一般与该词在MicrosoftSQLServer中的意义完整分歧。别的,Oracle和SQLServer都对SQL-92尺度做了很多自有的扩大。

从一个使用程序开辟职员的概念来看,Oracle和SQLServer是以类似的办法来办理数据的。在Oracle和SQLServer之间有侧重年夜的外部区分,可是假如办理妥当,能够把这些区分对移植的影响减到最小。

SQL言语扩大
开辟职员面对的最主要的移植成绩是实行SQL-92言语尺度和每个干系数据办理体系供应的言语扩大。有一些开辟职员只利用尺度的SQL语法,喜好尽量的坚持他们的程序代码的广泛性。一般,这类办法把程序代码限定在SQL-92尺度的登录级别(entry-level)上,而这个级别是被很多的数据库产物完成了的,包含Oracle和SQLServer。

这类办法将会发生一些不用要的程序代码庞大性并且还会对程序的功能形成很年夜的影响。比方,Oracle的DECODE函数是一个非尺度的SQL扩大。MicrosoftSQLServer的CASE表达式是一个超出了登录级其余SQL-92扩大,并且在一切其他的数据库产物中都没有完成。

Oracle的DECODE和SQLServer的CASE都是可选的,你能够不必这两个函数而完成它们的功效,而这必要从干系数据办理体系中提取更多的数据。

另有,对SQL言语的程序扩大也会形成坚苦。Oracle的PL/SQL和SQLServer的Transact-SQL言语在函数上是类似的,可是在语法上分歧。在两种数据库和程序扩大两头没有明白的对称性。因而,你大概会决意不利用想程序和触发器如许的存储的程序。这是很不幸的,由于它们供应了其余任何体例都没法完成的功能和平安性上的长处。

公有开辟接口的利用带来了新的成绩。用OracleOCI(OracleCallInterface)举行程序转换一般必要良多资本。开辟一个大概用到多个干系数据办理体系的使用程序,最好是思索利用开放数据库毗连(OpenDatabaseConnectivity,ODBC)接口。

ODBC
ODBC是为同多个数据库办理体系协同事情而计划的。ODBC供应了一个分歧的使用程序编程接口(applicationprogramminginterface,API),该接口利用一个针对数据库的驱动程序同分歧的数据库协同事情。

分歧的使用程序编程接口意味着程序用来创建毗连、实行命令和猎取了局的函数是一样的,不管该程序是和Oracle仍是SQLServer对话。

ODBC同时还界说了一个尺度化的挪用级其余接口而且针对那些分歧数据库里完成一样义务但语法分歧的SQL函数利用尺度的出口序次。ODBC驱动器能够主动的把这个ODBC语法转化为Oracle大概SQLServer的当地语法,这个历程不必要对程序代码做任何的订正。在某些情形下,最好的办法是编写一个程序而且让ODBC在运转工夫实行转换处置。

ODBC并非一个全能的能够针对任何数据库完成完整自力的、完全功效和高功能的办理计划。分歧数据库和第三方经销商供应了对ODBC分歧级其余撑持。一些驱动器仅仅完成了中心的API函数,这些函数映照了顶层大概其他接口库。其他一些驱动器,比方MicrosoftSQLServer的驱动器,在一个当地的、高功能的驱动器中供应了完全的2级撑持。

假如一个程序仅利用中心的ODBCAPI,它极可能会抛弃某些数据库的特性和功能。别的,并非一切的当地SQL扩大都能够在ODBC出口序次中形貌的(比方Oracle的DECODE和SQLServer的CASE表达式)。

别的,誊写SQL语句来使用数据库优化器是定见很天然的事变。可是在Oracle顶用来扩大数据库功能的手艺和办法在MicrosoftSQLServer7.0中纷歧定是最好的。ODBC接口其实不能把一个体系所用的手艺翻译为另外一个体系的手艺。

ODBC其实不影响一个使用程序利用数据库专有的特性和调剂来进步功能,可是使用程序必要某些数据库专有的代码部分。ODBC使得在多个数据库间坚持程序布局和多半程序代码分歧变得简单。

OLEDB
OLEDB是下一代数据会见手艺。MicrosoftSQLServer7.0使用包括在其本身的组件当中的OLEDB。如许,使用程序开辟职员能够思索利用OLEDB来举行新的SQLServer7.0开辟。微软在SQLServer7.0中还供应了撑持Oracle7.3的OLEDB。

OLEDB是微软用来办理跨构造的数据的计谋性的体系级编程接口。OLEDB是在ODBC特性上创建的具有开放性的计划。ODBC是计划来会见相干的数据库的,而OLEDB则是计划来会见相干的大概不相干的信息源,比方主机上的ISAM/VSAM和分层数据库,电子邮件和文件体系存储,文本、图象和地舆数据和定制的营业工具。

OLEDB了一组COM接口以紧缩分歧的数据库办理服务,同时还同意创立软件组件来完成这些服务.OLEDB组件包括了数据供应者(坚持和显现数据)、数据消耗者(利用数据)和服务组件(处置和传输数据,比方查询处置器和光标引擎)。

OLEDB接口的计划目标是匡助完成组件的光滑集成,如许的话OLEDB组件供应商就能够敏捷的向市场供应高质量的OLEDB组件了。别的、OLEDB还包括一座毗连ODBC的桥梁,云云就能够为明天能够失掉的大批的ODBC相干的数据库驱动程序持续供应撑持了。

本文的构造体例
为了匡助你一步一步的完成从Oracle到SQLServer的转换,本文的每部分都有一个关于Oracle7.3和MicrosoftSQLServer7.0的分歧的地方的概述。同时还包含转换的思索,SQLServer7.0的上风和多个实例。

布局和术语
作为乐成移植的入手下手,你应当把握MicrosoftSQLServer7.0所用的基础的布局和术语。这一部分中的很多例子都是从本文包括的Oracle和SQLServer使用程序中截取上去的。
数据库的界说

在Oracle中,数据库是指全部OracleRDBMS情况,而且包括以下组件。
Oracle数据库处置历程和数据缓存(实例)。

包括一个会合的体系目次的SYSTEM表空间。DBA界说的别的表空间(可选的)。两个大概多个Redo日记。存档的Redo日记(可选)各类别的文件(把持文件、Init.ora等等)。
一个MicrosoftSQLServer数据库供应了数据、使用程序和平安机制的逻辑辨别,更像一个表空间(tablespaces)。正如Oracle撑持多个表空间,SQLServer也撑持多个数据库。表空间也用来供应数据的物理安排,SQLServer经由过程文件组(filegroups)来供应一样的功效。

MicrosoftSQLServer将缺省的安装以下数据库。model数据库是一切新建用户数据库的模板。Tempdb数据库跟Oracle中的一时表空间很相象,都是用来举行一时的事情贮存和排序操纵。分歧的是,当用户加入登录时,MicrosoftSQLServer主动删除其创立的一时表空间。Msdb数据库撑持SQLServer代办署理和其预定的事情、警报和复制信息。Northwind和pubs数据库是用于培训的实例数据库。
假如想取得缺省数据库的更多信息,请参看SQLServer联机图书。
数据库体系目次
每一个Oracle数据库都在一个会合体系目次(大概是数据字典(datadictionary))上运转,该目次存在于SYSTEM表空间中。而每一个MicrosoftSQLServer7.0数据库都保护一个本人的体系目次,该目次包括以下信息:
数据库工具(表、索引、存储程序、视图、触发器等等)。
束缚(Constraints)。用户和允许。用户界说数据范例。复制订义。数据库所用的文件。
SQLServer同时在master数据库中保留一个会合体系目次,该目次包括体系目次和每一个数据库的某些信息:数据库名和每一个数据库的初始文件地位。SQLServer登录账号。体系动静。数据库设置值。远程和/或已毗连的服务器。以后举动信息。体系存储历程。

像Oracle中的SYSTEM表空间一样,SQLServer的master数据库也必需能会见任何其他数据库。一样,对数据库做了任何严重的改动今后,经由过程备份master数据库来避免失利是很主要的。数据库办理员也应当可以为构成master数据库的文件做镜象。

物理和逻辑存储布局(PhysicalandLogicalStorageStructures)
OracleRDBMS是由表空间构成的,而表空间又是由数据文件构成的。表空间数据文件被格局化为外部的块单元。块的巨细,是由DBA在Oracle第一次创立的时分设置的,能够在512到8192个字节的局限内变化。当一个工具在Oracle表空间中创立的时分,用户用叫做长度的单元(初始长度((initialextent)、下一个长度(nextextent)、最小长度(minextents)、和最年夜长度(maxextents))来标明该工具的空间巨细。一个Oracle长度的巨细能够变更,可是要包括一个由最少五个一连的块组成的链。

MicrosoftSQLServer在数据库级别利用文件组来把持表和索引的物理安排。文件组是一个大概多个文件的逻辑容器,一个文件组中的数据按比例添补属于该文件组的全体文件。
假如没有明显的界说和利用文件组,数据库工具将安排在一个缺省的文件组中,该文件组是在数据库的创立过程当中隐含界说的。文件组同意你举行以下操纵:
把年夜的表散布在多个文件中以进步I/O吞吐量。
把索引存储在分歧的文件中,而不是放在各自的表中,再一次进步I/O吞吐量和完成磁盘并行操纵。
把text、ntext、和imagecolumns(年夜工具)贮存在一个表的分歧文件中。
把数据库工具安排在特定的磁盘锭(diskspindles)上。
在一个文件组中备份和恢复一般表和表的设置。

SQLServer把文件格局化为叫做页(pages)的单元。页的巨细流动为8192字节(即8K)。页按流动为8个一连页巨细的格局构造为长度。当创立表大概索引时,SQLServer主动为其分派一页,比起分派一个长度来讲,贮存较小的表和索引,这类办法要更无效些。

标志数据(StripingData)
(译注:Strip--在海量存储体系(MSS)中,可由给定磁头地位会见的数据盒式磁带中的那部分)
Oracle范例的段关于年夜多半MicrosoftSQLServer安装来讲都不必要。取而代之的是,SQLServer能够使用基于硬件的RAID大概WindowsNT软件RAID来较好的完成数据的散布大概标志。基于硬件的RAID大概WindowsNT软件RAID能够设置一个由多个硬盘构成的标志安装,使它们看起来就像一个逻辑驱动器一样。假如数据库文件是在这个标志安装上创立的,磁盘子体系就假定为卖力经由过程多个磁盘来举行散布式的I/O装载。倡议办理员利用RAID来将数据散布在多个物理磁盘上。

针对SQLServer的RAID保举设置是RAID1(镜象)大概RAID5(具有一个作为冗余的分外的驱动器的标志设备)。RAID10(对有奇偶的标志设备的镜象)也是保举的,但它比起前两个来要高贵的多。标志设备在分离数据库文件上一般的随机I/O来讲是很好的。

假如不克不及利用RAID,文件组就是一个很有吸引力的选择了,它供应了RAID能够供应的某些一样的优点。别的,关于那些大概超过多个物理RAID阵列的十分年夜的数据库来讲,文件组多是一个很好的选择,它能够经由过程一种受把持的体例将I/O散布在多个RAID阵列上。

必需优化事件日记文件(Transactionlogfiles),使之顺应一连的I/O,而且必需回护该文件以避免单点失利。因而,倡议接纳RAID1(镜象)来办事务日记。该驱动器的巨细最少应当和在线恢复日记(onlineredologs)和反转段表空间二者加起来的巨细一样才行。创立一个大概更多个日记文件,把逻辑驱动器上界说的空间占满。和存储在文件组中的数据分歧,事件日记条目老是按按次写进的,而不是按比例添补的。

欲取得关于RAID的更多信息,请参看SQLServer联机图书,你的WindowsNT服务器文档,和MicrosoftWindowsNT资本指南。

事件日记和主动恢复(TransactionLogsandAutomaticRecovery)
OracleRDBMS在每次启动时实行主动修复。它反省表空间文件的目次与在线恢复日记文件中的目次是不是一样。假如纷歧样,Oracle就利用在线恢复日记文件掩盖表空间文件(rollforward、前滚),然后往失落它在后滚段中发明的一切未完成的事件(rollback,后滚)。假如Oracle不克不及从在线恢复日记中失掉必要的信息,则Oracle就乞助于存档的恢复日记文件。
MicrosoftSQLServer7.0一样在每次启动时经由过程反省体系中的每一个数据库来实行主动恢复。它起首反省master数据库,然后启动线程以掩盖体系中的一切数据库。关于每个SQLServer数据库,主动修复机制将反省事件日记。假如事件日记中包括任何未完成的事件,则该事件后滚。然后主动修复机制再反省事件日记以找出那些还没有写进数据库的未完成事件。假如找到,则实行该事件,前滚。

SQLServer事件日记包括了Oracle后滚段和Oracle在线恢复日记二者总的功效。每一个数据库都有本人的事件日记,该日记纪录了数据库产生的任何改动,而且日记由数据库的一切用户共享。当一个事件入手下手而且产生一次数据修正,则一个BEGINTRANSACTION事务(同modification事务一样)被纪录在日记中。在主动恢复的过程当中利用该事务来断定事件的肇端点。每收到一个数据修正事务,改动都被记进事件日记中,优先写进其数据库中。欲懂得更多信息,请参看本章前面的"事件、锁定和并行"部分。

SQLServer有一个主动反省点机制,该机制确保完成了的事件划定规矩的从SQLServer磁盘缓存中写进事件日记文件。从数据库的上一个反省点算起,任何修正过的缓存页将被写进一个反省点。向数据库上的这些缓存页(dirtypages,污损页)写进反省点,确保了一切已完成的事件被写到磁盘上。该历程延长了产生失利(比方能量消耗,poweroutage)时修复体系的所花的工夫。该设置能够用SQLServerEnterpriseManager修正,还能够用Transact-SQL修正(sp_configure体系存储程序)。

备份和恢单数据
MicrosoftSQLServer供应了几种备份数据的选择:
完整的数据库备份
要举行完整的数据库备份,利用BACKUPDATABASE语句大概"备份导游"(BackupWizard)。
微分备份(Differentialbackup)
在经由完整的数据库备份今后,按期利用BACKUPDATABASEWITHDIFFERENTIAL语句大概"备份导游"来备份改动过的数据和索引页。

事件日记备份
MicrosoftSQLServer中的事件日记有一个自力的数据库。该数据库仅在备份大概被删除今后才添补。SQLServer7.0中的缺省设置是事件日记主动增加,直到它用完了一切的可用空间大概到达其设置的最年夜空间。当事件日记过满时,它会天生一个毛病而且制止任何的数据修正,直到该日记被备份大概被删除。其他的数据库不会遭到影响。能够用BACKUPLOG语句大概"备份导游"举行事件日记备份。

文件大概文件组备份
SQLServer能够备份文件大概文件组。欲知概况,请参看SQLServer联机图书。
备份能够在数据库正在利用的时分举行,如许就能够使那些必需不休运转的体系举行备份。SQLServer7.0的备份历程和数据布局已年夜年夜的改善,可使备份在对事件吞吐量影响最小的情形下到达最年夜的数据传输率。

Oracle和SQLServer都必要一个特别的日记文件格局。在SQLServer中,这些叫做备份设备的文件是用SQLServerEnterpriseManager、Transact-SQL的sp_addumpdevice存储程序大概等价的SQL-DMO命令创立的。

固然备份能够经由过程手工操纵举行,可是倡议你利用SQLServerEnterpriseManager和/大概"数据库保护企图导游"举行按期的备份,大概基于数据库举动举行备份。
使用事件日记备份和/大概微分备份,一个数据库能够定时贮存在一个完整备份数据库(设备)的特定的点上。数据库利用备份中包括的信息恢单数据。能够用SQLServerEnterpriseManager、Transact-SQL(RESTOREDATABASE)大概SQL-DMO举行恢复。

就像你能够关失落Oracle存档器以跳过备份一样,在MicrosoftSQLServer中,db_owner组中的成员能够强迫事件日记在反省点产生的时分抹往目次。能够用SQLServerEnterpriseManager(删除反省点上的日记),Transact-SQL(sp_dboption存储历程)大概SQL-DMO来完成。
收集

OracleSQL*Net撑持Oracle数据库和其客户真个收集毗连。它们经由过程通明收集层数据流协定举行通讯,而且同意用户运转很多分歧的收集协定,而不必要编写任何特别的代码。SQL*Net未包括在中心Oracle数据库软件产物中。

在MicrosoftSQLServer中,Net库(收集库)撑持客户端和服务器的毗连,它们经由过程列表数据流协定举行通讯。这使得能够同时和运转名字管道(NamedPipes)、TCP/IP套接字大概其他交互处置机制(Inter-ProcessCommunication、IPC)的客户端毗连。SQLServerCD-ROM包括了一切的客户端Net库,不必要别的购置这些产物了。

SQLServerNet库选项能够在安装后修正。客户端收集工具为运转WindowsNT、Windows95、大概Windows98的客户端设置缺省的Net库和服务器毗连信息。除非在ODBC数据源的安装过程当中改动大概在ODBC毗连字串中显式的标明,一切的ODBC客户端也利用一样的Net库和服务器毗连信息。欲懂得关于Net库的更多信息,请参看SQLServer联机手册。
数据库平安性和脚色(DatabaseSecurityandRoles)
为了把你的Oracle使用程序完全的移植到MicrosoftSQLServer7.0上,你必要分明SQLServer是怎样完成数据库的平安性和脚色的。

登录账号
登录账号同意一个用户会见SQLServer数据大概办理选项。登录账号同意用户仅仅是登录到SQLServer上而且显现那些可让访客(guest)会见的数据库。(guest账号不是缺省设置的,必需创立)

SQLServer供应了两品种型的登录平安性。WindowsNT考证形式(也称为集成的)和SQLServer考证形式(也称为尺度的)。SQLServer7.0还撑持尺度的和集成的平安性的团结利用,称为夹杂的。

WindowsNT考证形式在查验登录毗连时利用WindowsNT内建的平安机制,而且依附用户的WindowsNT平安信托。用户不必要为SQLServer输出登录ID和口令--其登录信息间接从收集毗连上截取。当产生毗连时,一个条目就被写进syslogins表,而且在WindowsNT和SQLServer之间加以考证。这类体例叫做可托毗连,其事情道理同两台WindowsNT服务器之间的可托干系是一样的。此功效同Oracle顶用于用户账号的IDENTIFIEDEXTERNALLY选项是相似的。

SQLServer考证形式在用户哀求会见SQLServer时请求用户输出登录ID和口令。这类体例又叫做不信托毗连。此功效同Oracle顶用于用户账号的IDENTIFIEDBYPASSWORD选项是相似的。利用尺度平安形式,登录仅仅供应用户会见SQLServer数据库引擎的才能,不同意用户会见用户数据库。

欲懂得关于平安机制的更多信息,请参看SQLServer联机手册。
组、脚色和允许(Groups,roles,andpermissions)

MicrosoftSQLServer和Oracle都利用允许来增强数据库平安性。SQLServer用语句级的允许来限定创立新的数据库工具的才能。(同Oracle一样)

SQLServer还供应了工具级的允许。像Oracle一样,工具级一切权是分派给工具的创立者的,而且不克不及过户。在其他用户能够会见工具之前必需赐与他们工具级的允许。sysadmin流动服务器脚色、db_owner流动数据库脚色、大概db_securityadmin流动数据库脚色的成员一样能够赐与其他用户对某个用户工具的允许。

SQLServer语句级和工具级的允许能够间接付与数据库用户账号。可是,一般更复杂的办法是付与数据库脚色办理员允许。SQLServer脚色用来付与大概取消数据库用户组的特权(同Oracle脚色十分相象)。脚色(Roles)是一个带有特别数据库的数据库工具。每次安装都有一些流动的服务器脚色,这些脚色在数据库之上事情。一个流动服务器脚色的例子是sysadmin。WindowsNT组也能够作为SQLServer登录,就像数据库用户一样。允许能够付与一个WindowsNT组大概一个WindowsNT用户。

一个数据库能够有恣意数目的脚色大概WindowsNT组。缺省的public脚色老是能够在任何一个数据库上找到,这些脚色不克不及被扫除。public脚色的功效很像Oracle中的PUBLIC账号。每一个数据库用户都是public脚色的成员。在public脚色以外,一个数据库用户还能够是恣意数目脚色的成员。WindowsNT用户或组也能够是恣意数目脚色的成员,一样,他们也是public脚色的成员。

数据库用户和Guest账号(Databaseusersandtheguestaccount)
在MicrosoftSQLServer中,一个用户登录账号必需被受权利用一个数据库和它的工具。登录账号能够用上面办法中的一种来会见数据库:
登录账号能够被设定为数据库用户。
登录账号能够在数据库中利用访客(Guest)账号。
一个WindowsNT组登录能够被映照为一个数据库脚色。作为该构成员的单个WindowsNT账号就能够毗连到数据库上。

db_owner大概db_accessadmin脚色大概sysadmin流动服务器脚色的成员能够创立数据库用户账军号色。一个账号能够包括一些参数:SQLServer登录ID,数据库用户名(可选)、和一个脚色名(可选)。数据库用户名纷歧定要和用户登录ID一样。假如未供应一个数据库用户名,则用户的登录ID和数据库用户名就是一样的。假如未供应一个脚色名,则该数据库用户就仅是public脚色的成员。在创立了数据库用户以后,用户能够依据必要分派恣意的脚色。
db_owner大概db_accessadmin脚色的成员也能够创立一个guest账号。guest账号同意恣意无效的SQLServer登录账号会见一个数据库,乃至不必要无数据库用户账号。缺省情形下,guest账号承继了分派给public脚色的特权;可是,这些特权能够修正为多于大概少于public账号的特权。

一个WindowsNT用户大概一个组的账号能够被付与会见数据库的权力,就像SQLServer登录所能做的一样。假如一个WindowsNT组的一个成员毗连数据库,该用户会收到分派给这个组的允许。假如该用户是不止一个WindowsNT组的成员,则他会收到一切这些组对数据库的权限的汇合。

Sysadmin脚色(Thesysadminrole)
MicrosoftSQLServersysadmin流动服务器脚色中的成员具有与OracleDBA组中的成员类似的权限。在SQLServer7.0中,假如SQLServer是安装在一台WindowsNT盘算机上,那末以saSQLServer考证形式登录的账号缺省为该脚色的成员,也就是当地Administrator组中的成员。一个sysadmin脚色中的成员能够增添大概删除WindowsNT用户和组,和SQLServer登录账号。典范的该脚色中的成员有以下职责:
安装SQLServer。

设置服务器和客户端。
创立数据库。*
设立登录权限和用户允许。*
将数据导进大概导出SQLServer数据库。*
备份和恢单数据库。*
实行和保护复制。
布置无人值守的操纵。*
监督和调试SQLServer的功能。*
诊断体系成绩。
*这些项目能够委派给其他平安性脚色和用户。

在SQLServer7.0中,关于sysadmin流动服务器脚色中的成员无能甚么是没无限制的。因而,该脚色中的成员能够经由过程一个特别的SQLServer实例会见任何数据库、一切的工具(包含数据)。像一个OracleDBA一样,有一些命令和体系程序是只要sysadmin脚色中的成员才干利用的。

db_owner脚色

固然MicrosoftSQLServer数据库在利用上和Oracle表空间很类似,可是它们在办理上是纷歧样的。每一个SQLServer数据库都是一个矜持的办理域。每一个数据库都标了然数据库一切者(dbo)。该用户老是db_owner流动数据库脚色的成员。其他用户也能够是db_owner脚色的成员。该脚色中的一切成员都能够办理与他的数据库相干的办理义务。(不象在Oracle中,DBA办理一切数据库的办理义务)。这些办理义务包含:
办理数据库会见。
修正数据库设置(只读,单用户,等等)。
备份和恢单数据库目次。
授与和作废数据库允许。
创立和删除数据库工具。
db_owner脚色中的成员能够在他们的数据库上做任何事变。分派给该脚色的年夜多半权力被分给一些流动数据库脚色,大概也能够付与数据库用户。在数据库下行使db_owner特权其实不必要付与sysadmin服务器局限特权。

安装和设置MicrosoftSQLServer

懂得了Oracle和SQLServer之间基础布局上的差别今后,你就能够入手下手举行移植历程的第一步了。SQLServerQueryAnalyzer将用来运转上面的剧本:

 利用WindowsNT基于软件的RAID大概基于硬件的RAID第五级来创立一个充足放下你的一切数据的逻辑驱动器。对空间的预算能够经由过程盘算被Oracle体系、一时文件和使用程序表空间占用的文件空间巨细来举行。
利用WindowsNT基于软件的RAID大概基于硬件的RAID第一级创立一个第二逻辑驱动器来放事件日记。该驱动器的巨细最少应当和在线恢复和后滚表空间的总的巨细分歧。
利用SQLServerEnterpriseManager创立一个和Oracle使用程序表空间名字一样的数据库。(示例使用程序利用的数据库名字叫做USER_DB)标明文件地位,使它们分离和你在第一步和第二步中为数据和事件创立的磁盘地位分歧。假如你利用多个Oracle表空间,不必要也倡议你不要创立多个SQLServer数据库,RAID会主动为你分派的。创立SQLServer登录账号:USEMASTER
EXECSP_ADDLOGINSTUDENT_ADMIN,STUDENT_ADMIN

EXECSP_ADDLOGINDEPT_ADMIN,DEPT_ADMIN

EXECSP_ADDLOGINENDUSER1,ENDUSER1

GO
为数据库增加脚色:USEUSER_DB
EXECSP_ADDROLEDATA_ADMIN

EXECSP_ADDROLEUSER_LOGON

GO
为脚色授与允许:GRANTCREATETABLE,CREATETRIGGER,CREATEVIEW,
CREATEPROCEDURETODATA_ADMIN

GO
增添作为数据库用户账号的登录账号:EXECSP_ADDUSERENDUSER1,ENDUSER1,USER_LOGON
EXECSP_ADDUSERDEPT_ADMIN,DEPT_ADMIN,DATA_ADMIN

EXECSP_ADDUSERSTUDENT_ADMIN,STUDENT_ADMIN,DATA_ADMIN

GO

 

界说数据库工具

Oracle数据库工具(表、视图和索引)能够很简单的移植到MicrosoftSQLServer上,这是由于两个数据库都基础遵守SQL-92尺度,该尺度供认工具界说。把OracleSQL的表、索引和视图的界说转换为SQLServer的表、索引和视图的界说只必要做绝对复杂的语法改动。下表指出了Oracle和MicrosoftSQLServer之间的数据库工具的某些分歧的地方。
种别MicrosoftSQL ServerOracle列数1024254行尺寸8060byte,外加16byte用来指向每个text大概image列无穷制(每行只同意有一个long大概longraw)最年夜行数无穷制无穷制BLOB范例存储行中存储一个16-byte指针。数据存储在其他数据页。每表一个long大概longraw。必需外行的开头。数据存储外行的统一个块里。分簇表索引每表一个每表一个(index-organizedtables)未分簇的表索引每表249无穷制在单一索引中的最年夜索引列数1616索引中列值的最年夜长度900bytes?block表名商定[[[server.]database.]owner.]
table_name[schema.]table_name视图名商定[[[server.]database.]owner.]
table_name[schema.]table_name索引名商定[[[server.]database.]owner.]
table_name[schema.]table_name
 

假定你是从一个Oracle剧本大概程序入手下手的,该剧本大概程序用来创立你的数据库工具。拷贝你的剧本大概程序而且举行以下修正。这些修正将在本部分的其他中央加以会商。该例子是从示例使用程序剧本Oratable.sql和Sstable.sql中截取的:确保数据库工具标识遵守MicrosoftSQLServer定名法例。你大概只必要修正索引的名字。修正数据存储参数使之能在SQLServer下事情。假如你利用RAID,就不必要任何存储参数了。修正Oracle束缚界说使之能在SQLServer中事情。假如必要的话,创立一个触发器以撑持内部键DELETECASCADE语句。假如表跨数据库的话,利用触发器来加强内部键的干系。修正CREATEINDEX语句以使用分簇的索引。利用数据转换服务来创立新的CREATETABLE语句。回忆该语句,注重Oracle数据范例是怎样映照到SQLServer数据范例上的。扫除一切的CREATESEQUENCE语句。在CREATETABLE大概ALTERTABLE语句中利用一律列来交换按次的利用。假如必要的话,修正CREATEVIEW语句。扫除一切对同义字的援用。评价对MicrosoftSQLServer一时表的利用和其在你的使用程序中的用途。把一切的Oracle的CREATETABLE…ASSELECT命令改成SQLServer的SELECT…INTO语句。评价潜伏的对用户界说划定规矩、数据范例和缺省的利用。
 

数据工具标识符

下表对照了Oracle和MicrosoftSQLServer是怎样处置工具标识符的。在很多情形下,当移植到SQLServer上时,你不必要改动工具的名字。
OracleMicrosoftSQL 1-30字符长度。
数据库称号:最多8个字符长度。
数据库毗连称号:最多128个字符长度。1-128Unicode字符长度。
一时表称号:最多116个字符。标识符的称号必需用:字母、包括笔墨数字的字符、大概字符_,$,和#开首标识符称号能够用:字母数字字符、大概_开首,实践上能够用任何字符开首。
假如标识符用空格开首,大概包括了不是_、@、#、大概$的字符,你必需用[](定界符)包抄标识符称号

假如一个工具用上面这些字符开首:
@则标明该工具是一个当地变量。
#则该工具是一个当地一时工具。
##则该工具是一个全局一时工具
表空间名必需独一.数据库名必需独一标识符名在用户账号(企图,Schema)局限内必需独一。标识符名在数据库用户账号局限内必需独一列名在表和视图局限内必需独一。列名在表和视图局限内必需独一。索引名在用户账号(Schema)局限内必需独一。索引名在数据库表名局限内必需独一
 

润色表名

当会见存在于你的用户账号中的表时,该表能够复杂的经由过程未经限定的表名来选中。会见其他Oracle企图中的表就必要把该企图的名字作为前缀加到表名上,二者之间用点号(.)离隔。Oracle同义字能够供应更高的地位通明度。

触及到表时,MicrosoftSQLServer接纳一种分歧的办法。由于一个SQLServer登录账号能够在多个数据库顶用统一个名字创立一个表,以是接纳上面的办法来会见表和视图:[[数据库名字]一切者名字]表名]
用……会见一个表OracleMicrosoftSQL Server你的用户账号SELECT*
FROMSTUDENTSELECT*FROMUSER_DB.STUDENT_
ADMIN.STUDENT其他形式(schema)SELECT*FROMSTUDENT_ADMIN.STUDENTSELECT*FROMOTHER_DB.STUDENT_
ADMIN.STUDENT
 

这是一些为MicrosoftSQLServer表和视图定名的引导目标:利用数据库名字和用户名字是可选的。假如一个表只经由过程名字加以援用(比方,STUDENT),SQLServer在以后数据库中以以后用户帐号搜刮该表。假如没有找到,就在数据库中寻觅由dbo的保存用户名具有的具有一样名字的工具。表名在统一个数据库中的统一个用户帐号下必需是独一的。统一个SQLServer登录账号能够在多个数据库中具有一样名字的表。比方,ENDUSER1账号具有以下数据库工具:USER_DB.ENDUSER1.STUDENT和OTHER_DB.ENDUSER1.STUDENT。这里所加的限定是数据库用户名而不是SQLServer登录名,由于二者纷歧定要一样。
同时,这些数据库的其他用户能够有一样名字的工具:USER_DB.DBO.STUDENTUSER_DB.DEPT_ADMIN.STUDENTUSER_DB.STUDENT_ADMIN.STUDENTOTHER_DB.DBO.STUDENT
 

因而,倡议你在援用数据库工具时包括一切者的名字。假如使用程序有多个数据库,倡议你再把数据库名字也包括在援用中。假如查询超过多个服务器,还要包含服务器名。

SQLServer的每一个毗连都有一个以后数据库高低文,这是在登录时用USE语句设置的。比方,假定有上面的场景:一个用户,利用ENDUSER1账号,登录到USER_DB数据库上。用户哀求STUDENT表。SQLServer就查询ENDUSER1.STUDENT表。假如找到,SQLServer就在USER_DB.ENDUSER1.STUDENT表上做请求的数据库操纵。假如在ENDUSER1数据库账号下没有找到该表,SQLServer就为该数据库以dbo账号征采USER_DB.DBO.STUDENT。假如仍是找不到该表,SQLServer就前往一个毛病动静,指出该表不存在。假如另外一个用户,比方DEPT_ADMIN具有该表,则该表必需以数据库用户名作为前缀(DEPT_ADMIN.STUDENT)。别的,数据库名字缺省为在以后高低文中的数据库名字。假如被援用的表在另外一个数据库中,则数据库名必需作为援用的一部分。比方,要会见在OTHERDB数据库中由ENDUSER1具有的表STUDENT,就必要用OTHER_DB.ENDUSER1.STUDENT来援用。
能够在数据库和表名之间加两个点号来省略工具的一切者名。比方,假如使用程序援用STUDENT_DB..STUDENT,SQLServer就做以下征采:STUDENT_DB.current_user.STUDENTSTUDENT_DB.DBO.STUDENT
 

假如使用程序一次只利用一个数据库,在做工具援用时省略数据库名字,如许的话,该使用程序能够便利的用于其他数据库。一切的工具援用都隐含的会见以后所用的数据库。这关于你要想在统一台服务器上保持一个测试数据库和一个产物数据库时很有效

 

创立表

由于Oracle和SQLServer都撑持SQL-92条目级(entry-level)的关于标识RDBMS工具的协定,CREATETABLE的语法是类似的。
OracleMicrosoftSQL CREATETABLE
[schema.]table_name
(
{col_namecolumn_properties
[default_expression][constraint[constraint
[...constraint]]]|[[,]constraint]}
[[,]{next_col_name|next_constraint}...]
)
[OracleSpecificDataStorageParameters]CREATETABLE[server.][database.][owner.]table_name
(
{col_namecolumn_properties[constraint
[constraint[...constraint]]]|[[,]constraint]}
[[,]{next_col_name|next_constraint}...]
)
[ONfilegroup_name]
 

Oracle数据库工具名字是不分巨细写的。在MicrosoftSQLServer中,数据库工具的名字能够是巨细写敏感的,这要看安装时的设置。

当SQLServer第一次设置的时分,缺省的排序按次是字典按次,辨别巨细写。(能够用SQLServerSetup来做分歧的设置)由于Oracle工具的名字老是独一的,你在把数据库工具移植到SQLServer上时不会碰到任何的贫苦。倡议你把Oracle和SQLServer中的一切的表和列的名字都写成年夜写的以免万一有效户安装了辨别巨细写的SQLServer时出成绩。

 

表和索引存储参数

关于MicrosoftSQLServer,利用RAID一般能够简化数据库工具的安排。在表的布局中集成了一个SQLServer的分簇的索引,就像一个Oracle索引构造表一样。
OracleMicrosoftSQL CREATETABLEDEPT_ADMIN.DEPT(
DEPTVARCHAR2(4)NOTNULL,
DNAMEVARCHAR2(30)NOTNULL,
CONSTRAINTDEPT_DEPT_PK
PRIMARYKEY(DEPT)
USINGINDEXTABLESPACEUSER_DATA
PCTFREE0STORAGE(INITIAL10KNEXT10K
MINEXTENTS1MAXEXTENTSUNLIMITED),
CONSTRAINTDEPT_DNAME_UNIQUE
UNIQUE(DNAME)
USINGINDEXTABLESPACEUSER_DATA
PCTFREE0STORAGE(INITIAL10KNEXT10K
MINEXTENTS1MAXEXTENTSUNLIMITED)
)
PCTFREE10PCTUSED40
TABLESPACEUSER_DATA
STORAGE(INITIAL10KNEXT10K
MINEXTENTS1MAXEXTENTSUNLIMITED
FREELISTS1)CREATETABLEUSER_DB.DEPT_ADMIN.DEPT(
DEPTVARCHAR(4)NOTNULL,
DNAMEVARCHAR(30)NOTNULL,
CONSTRAINTDEPT_DEPT_PK
PRIMARYKEYCLUSTERED(DEPT),
CONSTRAINTDEPT_DNAME_UNIQUE
UNIQUENONCLUSTERED(DNAME)
)
 

用SELECT语句创立表

利用Oracle,一个表能够用任何无效的SELECT命令创立。MicrosoftSQLServer供应了一样的功效,可是语法纷歧样。
OracleMicrosoftSQL CREATETABLESTUDENTBACKUPASSELECT*FROMSTUDENTSELECT*INTOSTUDENTBACKUP
FROMSTUDENT
 

要SELECT…INTO可以起感化,必需将利用该程序的数据库的选项selectinto/bulkcopy设定为true。(数据库一切者能够用SQLServerEnterpriseManager大概Transact-SQL的sp_dboption体系存储程序来设置该选项)。用sp_helpdb体系存储历程来反省数据库的形态。假如selectinto/bulkcopy未设定为true,你仍旧能够用SELECT语句拷贝光临时表中,就像上面如许:

SELECT*INTO#student_backupFROMuser_db.student_admin.student

当用SELECT..INTO语句来创立新的表时,其参考的完全性界说不会转换到新的表中。

将selectinto/bulkcopy设定为true的请求大概会使移植的历程变得庞大。假如你必需用SELECT语句拷贝数据到表中,请起首创立表,然后再用INSERTINTO…SELECT语句来载进该表。关于Oracle和SQLServer来讲,语法是一样的,也不必要设置任何数据库选项。

 

视图

在MicrosoftSQLServer中创立视图的语法同Oracle一样。
OracleMicrosoftSQL CREATE[ORREPLACE][FORCE|
NOFORCE]VIEW[schema.]view_name
[(column_name[,column_name]...)]
ASselect_statement
[WITHCHECKOPTION[CONSTRAINT
   name]]
[WITHREADONLY]CREATEVIEW[owner.]view_name
[(column_name[,column_name]...)]
[WITHENCRYPTION]
ASselect_statement[WITHCHECKOPTION]
 

SQLServer视图请求表必需存在,而且视图的一切者必需有会见在SELECT语句中标明的数据库的权限(同Oracle中的FORCE选项类似)。

缺省情形下,不会反省视图上的数据修正语句来判断受影响的行是不是在视图的局限内。要反省一切的修正,请利用WITHCHECKOPTION。关于WITHCHECKOPTION次要的分歧的地方在于,Oracle将其作为束缚来界说,而SQLServer不是。别的,二者的功效是一样的。

在界说视图的时分,Oracle供应了一个WITHREADONLY选项。SQLServer使用程序能够用仅向视图用户供应SELECT权限的办法来到达一样的了局。

SQLServer和Oracle视图都撑持派生列、利用数学表达式、函数和常量表达式。SQLServer的某些特别的分歧的地方是:假如数据修正只影响一个基础表,则数据修正语句(INSERT大概UPDATE)能够存在于多个视图上。单个语句中的数据修正语句不克不及用在凌驾一个表上。READTEXT大概WRITETEXT不克不及用于视图中的列。不克不及利用ORDERBY、COMPUTE、FORBROWSE、大概COMPUTEBY子句。在视图中不克不及利用INTO关头字。
当一个视图是和一个内部毗连一同界说的,而且查询限制在内部接合点的外部表上时,SQLServer和Oracle的了局会有所分歧。在年夜多半情形下,Oracle视图很简单转化为SQLServer视图。
OracleMicrosoftSQL CREATEVIEWSTUDENT_ADMIN.STUDENT_GPA
   (SSN,GPA)
ASSELECTSSN,   ROUND(AVG(DECODE(grade
,A,4
,A+,4.3
,A-,3.7
,B,3
,B+,3.3
,B-,2.7
,C,2
,C+,2.3
,C-,1.7
,D,1
,D+,1.3
,D-,0.7
,0)),2)
FROMSTUDENT_ADMIN.GRADE
GROUPBYSSNCREATEVIEWSTUDENT_ADMIN.STUDENT_GPA
   (SSN,GPA)
ASSELECTSSN,ROUND(AVG(CASEgrade
WHENATHEN4
WHENA+THEN4.3
WHENA-THEN3.7
WHENBTHEN3
WHENB+THEN3.3
WHENB-THEN2.7
WHENCTHEN2
WHENC+THEN2.3
WHENC-THEN1.7
WHENDTHEN1
WHEND+THEN1.3
WHEND-THEN0.7
ELSE0
END),2)
FROMSTUDENT_ADMIN.GRADE
GROUPBYSSN
 

索引

MicrosoftSQLServer供应了分簇和未分簇的索引布局。这些索引是由来自于一个叫做B-tree的树型布局中的页组成的(同Oracle中的B-tree索引布局类似)。肇端页(“根”级)申明了表中值的局限。“根”级页中的每个局限指向其他页(判别节点),该节点包括了表中值的更小的局限。以此类推,该节点又能够指向其他的判别节点,如许就减少了搜刮的局限。树型布局的最初一级叫做“叶”级。



分簇的索引

分簇的索引在Oracle中是以索引构造表的情势完成的。一个分簇的索引是一个物理的包括在一个表中的索引。表和索引分享统一块存储空间。分簇的索引按索引按次物理的重排数据行,创建起两头判别节点。索引的“叶”页包括了实在的表数据。这个布局同意每一个表只要一个分簇的索引。MicrosoftSQLServer为表主动的创立一个分簇的索引,不管该表设置了PRIMARYKEY仍是UNIQUE束缚。分簇的索引对上面这些是有效的:主键(Primarykeys)不克不及被更新的列。前往一个值的局限的查询,利用诸如BETWEEN、>、>=、<、和<=如许的操纵符,比方:
SELECT*FROMSTUDENTWHEREGRAD_DATE

BETWEEN1/1/97AND12/31/97
前往一个年夜的了局汇合的查询:
SELECT*FROMSTUDENTWHERELNAME=SMITH
被用做排序操纵的列(ORDERBY、GROUPBY)
比方,在STUDENT表上,在ssn的主键上包括一个未分簇的索引是很有效的,而分簇的索引能够在lname、fname(lastname、firstname)上创立,由于这是一种经常使用的辨别先生的办法。
散布表上的更新举动能够避免呈现“热门”。热门一般是因为多个用户向一个有上升键的表中添补而引发的。如许的情形常常招致行级其余锁定。
删除和重修一个分簇的索引在SQLServer中是一种很一般的从头构造表的手艺。这是一种确保数据页在磁盘上是一连的和重修表中的一些可用空间的复杂的办法。这同Oracle中导出、删除和导进一个表是很类似的。

一个SQLServer分簇的索引与Oracle的簇在基本上是纷歧样的。一个Oracle的簇。一个Oracle的簇是两个大概更多的表的物理汇合,它们分享统一个数据块,利用一个大众的列来作为簇键。SQLServer没有与Oracle簇类似的布局。

作为一个广泛的准绳,在表上界说一个分簇的索引将进步SQLServer的功能而且增强空间办理。假如你不晓得关于给定表的查询和更新形式,你能够在主键上创立一个分簇的索引。

下表摘录自示例使用程序的源代码。请注重SQLServer“簇”化索引的利用。
OracleMicrosoftSQL CREATETABLESTUDENT_ADMIN.GRADE(
SSNCHAR(9)NOTNULL,
CCODEVARCHAR2(4)NOTNULL,
GRADEVARCHAR2(2)NULL,
CONSTRAINT    GRADE_SSN_CCODE_PK
    PRIMARYKEY(SSN,CCODE)
CONSTRAINTGRADE_SSN_FK
FOREIGNKEY(SSN)REFERENCES
STUDENT_ADMIN.STUDENT(SSN),
CONSTRAINTGRADE_CCODE_FK
FOREIGNKEY(CCODE)REFERENCES
DEPT_ADMIN.CLASS(CCODE)
)CREATETABLESTUDENT_ADMIN.GRADE(
SSNCHAR(9)NOTNULL,
CCODEVARCHAR(4)NOTNULL,
GRADEVARCHAR(2)NULL,
CONSTRAINT
    GRADE_SSN_CCODE_PK
    PRIMARYKEYCLUSTERED(SSN,    CCODE),
CONSTRAINTGRADE_SSN_FK
    FOREIGNKEY(SSN)REFERENCES
    STUDENT_ADMIN.STUDENT(SSN),
CONSTRAINTGRADE_CCODE_FK
    FOREIGNKEY(CCODE)REFERENCES
    DEPT_ADMIN.CLASS(CCODE)
)
 

未分簇的索引

在未分簇的索引中,索引数据和表数据在物理上是分隔的,而且表中的行并非按按次存储在索引中的。你能够把Oracle索引界说移植到MicrosoftSQLServer未分簇的索引界说上(就像鄙人表中显现的一样)。但是,思索到功能的原因,你大概但愿选择表的个中一个索引把它创立为分簇的索引。
OracleMicrosoftSQL CREATEINDEX
STUDENT_ADMIN.STUDENT_
   MAJOR_IDX
ONSTUDENT_ADMIN.STUDENT   (MAJOR)
TABLESPACEUSER_DATA
PCTFREE0
STORAGE(INITIAL10KNEXT10K
    MINEXTENTS1MAXEXTENTS
    UNLIMITED)CREATENONCLUSTEREDINDEX
STUDENT_MAJOR_IDX
ONUSER_DB.STUDENT_
   ADMIN.STUDENT(MAJOR)
 

索引语法和定名

在Oracle中,一个索引的名字在一个用户账号中是独一的。在InMicrosoftSQLServer,一个索引的名字在一个表名中必需是独一的,可是不用在用户名和数据库名中独一。因而,在SQLServer中创立大概删除索引时,你必需申明表名和索引名。别的,SQLServer的DROPINDEX语句能够一次删除多个索引。
OracleMicrosoftSQLCREATE[UNIQUE]INDEX[schema].index_name
    ON[schema.]table_name(column_name
    [,column_name]...)
[INITRANSn]
[MAXTRANSn]
[TABLESPACEtablespace_name]
[STORAGEstorage_parameters]
[PCTFREEn]
[NOSORT]
DROPINDEXABC;
CREATE[UNIQUE][CLUSTERED|NONCLUSTERED]
    INDEXindex_nameONtable(column    [,…n])
[WITH
        [PAD_INDEX]
        [[,]FILLFACTOR=fillfactor]
        [[,]IGNORE_DUP_KEY]
        [[,]DROP_EXISTING]
        [[,]STATISTICS_NORECOMPUTE]
]
[ONfilegroup]
   DROPINDEX   USER_DB.STUDENT.DEMO_IDX,   USER_DB.GRADE.DEMO_IDX

 

索引数据存储参数

MicrosoftSQLServer功效选项中的FILLFACTOR选项在良多方面与Oracle中的PCTFREE变量类似。当表的尺寸增添的时分,索引页也响应改动以包容新的数据。索引必需本人举行从头组合以包容新的数据。只要在创立索引的时分,才利用添补参数百分比,并且在这以后也不加以保护。

FILLFACTOR选项(0~100)把持着在创立索引时应当留下几空间。假如没有标明参数,就利用缺省参数,该参数是0,暗示将完整添补索引的“叶”页,而且在每一个判别节点为最少一个条目留下空间(假如有两个条目,则暗示是一个不惟一的“簇”化索引)。



一个较低的添补因数将会削减索引页的决裂,可是会增添B-tree布局的层数。较高的添补因数能更无效的利用索引页空间,只必要较少的磁盘I/O来会见索引数据,而且将会削减B-tree布局的层数。

PAD_INDEX选项暗示,添补因数也将使用到判别节点页上,就象要用在索引的数据页上一样。

固然在 Oracle中大概必要调剂PCTFREE参数以优化功能。可是在CREATEINDEX语句中很少利用FILLFACTOR参数。添补因数是为功能优化而供应的。可是它仅仅在一个表上为已无数据创立索引时才有效,而且只要在你能准确的展望数据在将来的变更时才有效。

假如你将Oracle中的PCTFREE参数设为0,能够思索将它设为100。这在表中不会产生数据输出和修正(只读表)时是很有效的。假如添补因数设为100,服务器将创立如许一个索引,它的每页都是完整填满的。

 

疏忽反复的关头字

不管在Oracle仍是在MicrosoftSQLServer中,用户都不克不及在一个大概一些独一索引的列中输出反复的值。如许做将会发生一个毛病动静。但是,SQLServer同意开辟职员选择INSERT大概UPDATE语句将怎样处置这个毛病。

假如在CREATEINDEX语句中利用了IGNORE_DUP_KEY,而且实行了一个创立反复的关头字的INSERT大概UPDATE语句,SQLServer将给出一个告诫信息,而且疏忽反复行。假如没有利用IGNORE_DUP_KEY,SQLServer将给出一个毛病信息,而且后滚全部INSERT语句。假如必要懂得关于这个选项的更多信息,请参看SQLServer联机手册。

 

利用一时表

一个Oracle使用程序大概必需创立一个临时存在的表。使用程序必需确保在某个时分删除一切为此目标创立的表。假如使用程序不如许做,那末表空间将很快变得凌乱,难以办理。

MicrosoftSQLServer供应了一时表数据库工具,这个表就是为下面提到的目标创立的。如许的表老是在tempdb数据库中创立的。表的名字决意了该表在tempdb数据库中要存在多长工夫。
表名形貌#table_name这个当地一时表只在用户会话大概创立它的历程的性命期内存在。在用户加入登录大概创立它的历程完成今后,该表主动删除。该表不克不及在多个用户之间共享。别的数据库用户不克不及会见该表。在该表上不克不及付与大概取消允许。##table_name该表也典范的存在于用户会话大概创立它的历程的性命期内。但该表能够被多个用户共享。在最初一个援用它的用户会话断开今后,该表主动删除。一切别的数据库的用户都能够会见该表。在该表上不克不及付与大概取消允许。
 

能够为一时表界说索引。可是只能在那些在tempdb中明显的创立的表上创立视图,这些表的名字前不加#大概##前缀。上面的例子显现了一个一时表和响应的索引的创立。当用户加入的时分,表和索引就主动删除。
SELECTSUM(ISNULL(TUITION_PAID,0))SUM_PAID,MAJORINTO#SUM_STUDENT
FROMUSER_DB.STUDENT_ADMIN.STUDENTGROUPBYMAJOR

CREATEUNIQUEINDEXSUMSTUDENTIDXON#SUMSTUDENT(MAJOR)

 

在你的程序代码中利用一时表,你能够发明它的优点。

数据范例

同Oracle比起来,MicrosoftSQLServer在数据库范例的选择上更壮大。在Oracle和SQLServer数据范例之间有良多大概的转换体例。我们倡议你利用DTS导游来主动创立新的CREATETABLE语句。必要的时分,你还能够修正它。
OracleMicrosoftSQL CHAR保举利用char。char范例的列比varchar列的会见速率要略微快一点,由于char列利用一个流动的存储长度。VARCHAR2
和LONGvarchar大概text.(假如在你的Oracle列中数据值的长度小于或即是8000bytes,利用varchar;不然,你必需利用text。)RAW和
LONGRAWvarbinary大概image.(假如在你的Oracle列中数据值的长度小于或即是8000bytes,利用varbinary;不然,你必需利用image。)NUMBER假如整数在1到255之间,利用tinyint.
假如整数在-32768到32767之间,利用smallint.
假如整数在-2,147,483,648到2,147,483,647之间,利用int.
假如你必要浮点型的数,利用numeric(准确且能够定标).
注重:不要利用float大概real,由于大概会产生截断(OracleNUMBER和SQL Servernumeric不会截断).
假如你不断定,利用numeric;它同OracleNUMBER数据范例十分类似。DATEdatetime.ROWID利用identity列范例CURRVAL,NEXTVAL利用identity列范例,和@@IDENTITY,IDENT_SEED(),和IDENT_INCR()函数。SYSDATEGETDATE().USERUSER.
 

利用Unicode数据

Unicode标准界说了一个编码计划,该计划利用单一编码体例为全球局限内营业上利用的一切字符编码。一切的盘算机都能利用单一的Unicode编码把Unicode数据中的位形式转换成为字符。这个计划确保了在一切的盘算机上,一样的位形式转换为一样的字符。数据能够自在的从一个数据库大概一台盘算机传送到另外一个下面,而不必思索承受体系可否把位形式准确的转换成字符。

利用一个字节来暗示字符的办法有一个成绩,就是这类数据范例只能暗示256个字符。如许就为分歧的言语发生了多个编码标准(大概叫做代码页)。如许做也不成能处置日文大概韩文如许有上千个字符的言语。

MicrosoftSQLServer把在SQLServer中安装了代码页的字符的位形式转换成char,varchar,大概text范例的列。客户端则利用操纵体系安装的代码页来注释字符的位形式。如今有良多分歧的代码页。有些字符只在某些代码页上才有,在其余代码页上就没有。某些字符在某些代码页上界说为一种位形式,在别的一些代码页上又界说为另外一种位形式。假如你要创建一个必需处置各类言语的国际体系时,为那些满意言语请求大概多个国度的盘算机选择代码页就变得十分坚苦。一样,在和一个利用分歧代码页的体系毗连时,确保每台盘算机都能准确的完成字符转换也十分坚苦。

Unicode标准利用双字节编码计划办理了这个成绩。利用双字节编码,就有充足的空间来掩盖最普遍利用的贸易言语了。由于一切的Unicode体系都接纳一样的位形式来代表一切的字符,在从一个体系转移到另外一个体系的时分,就不会产生字符转换不准确的成绩了。

在SQLServer中,nchat,nvarchar和ntext数据范例撑持Unicode数据。假如必要懂得关于SQLServer数据范例的更多信息,请参看SQLServer联机手册。

 

用户界说数据范例

能够为model数据库大概单用户数据库创立用户界说数据范例。假如是为model界说用户界说数据范例,则该数据范例能够被界说以后一切新创立的用户数据库利用。用户界说数据范例是经由过程sp_addtype体系存储程序来界说的。假如必要懂得更多信息,请参看SQLServer联机手册。

你能够在CREATETABLE和ALTERTABLE语句中利用用户界说数据范例,而且为它绑定缺省体例和划定规矩。假如在表的创立历程利用用户界说数据范例时明显的界说了nullability,则它比在数据界说时界说的nullability优先级高。

下例显现了怎样创立用户界说数据范例。参数是用户范例名字,数据范例和nullability。
sp_addtypegender_type,varchar(1),notnull
go

 

这个才能关于办理与Oracle表创立剧本移植到SQLServer上相干的成绩是很有效的。比方,要增添一个Oracle的DATE数据范例长短常复杂的。
sp_addtypedate,datetime
 

这个功效不克不及用在那些必要变长度的数据范例上,比方Oracle数据范例NUMBER。假如如许做,体系将会前往一个毛病信息,告知你必要标明数据长度。
sp_addtypevarchar2,varchar
Go

Msg15091,Level16,State1

Youmustspecifyalengthwiththisphysicaltype.

 

Microsofttimestamp列

timestamp列使得BROWSE形式修正和游标修正操纵更无效。timestamp是如许一个数据范例,含有timestamp列的行有输出大概修正操纵时,该数据范例主动修正。

timestamp列中的值不是依照实践的日期和工夫存储的,而是作为binary(8)大概varbinary(8)存储的,这个值暗示表中一行产生的事务的频次。一个表只能有一个timestamp列。

假如要懂得更多信息,请参看SQLServer联机手册。

 

工具级允许

MicrosoftSQLServer工具特权能够向任何其他数据库用户、数据库组和public脚色授与、回绝授与、和取消。SQLServer不同意工具的一切者授与其他用户、组大概public脚色ALTERTABLE和CREATEINDEX特权,这一点与Oracle分歧。这些特权必需被工具一切者保存。

GRANT语句创立一个平安体系的出口允许,该允许同意以后数据库中的一个用户能够操纵以后数据库中的数据,大概实行特定的Transact-SQL语句。GRANT语句的语法在Oracle和SQLServer中是一样的。

DENY语句在平安体系中创立一个条目,回绝以后数据库中的一个平安账号的允许,而且克制该平安账号承继自该账号所属的组大概脚色成员的允许。Oracle中没有DENY语句。REVOKE语句扫除之前授与给以后数据库中一个用户的允许大概回绝其允许。
OracleMicrosoftSQL GRANT{ALL[PRIVILEGES][column_list]|permission_list[column_list]}
ON{table_name[(column_list)]
|view_name[(column_list)]
|stored_procedure_name}
TO{PUBLIC|name_list}
[WITHGRANTOPTION]GRANT
    {ALL[PRIVILEGES]|permission[,…n]}
    {
        [(column[,…n])]ON{table|view}
        |ON{table|view}[(column[,…n])]
        |ON{stored_procedure|        extended_procedure}
    }
TOsecurity_account[,…n]
[WITHGRANTOPTION]
[AS{group|role}]
REVOKE[GRANTOPTIONFOR]
    {ALL[PRIVILEGES]|permission[,…n]}
    {
        [(column[,…n])]ON{table|view}
        |ON{table|view}[(column[,…n])]
        |{stored_procedure|        extended_procedure}
    }
{TO|FROM}
    security_account[,…n]
[CASCADE]
[AS{group|role}]

DENY
    {ALL[PRIVILEGES]|permission[,…n]}
    {
        [(column[,…n])]ON{table|view}
        |ON{table|view}[(column[,…n])]
        |ON{stored_procedure|        extended_procedure}
    }
TOsecurity_account[,…n]
[CASCADE]

 

假如必要懂得关于工具级允许的更多信息,请参看 SQLServer联机手册。

在Oracle中,REFERENCES特权只能授与用户。SQLServer则同意把该特权授与数据库用户和数据库组。INSERT、UPDATE、DELETE和SELECT特权的授与在Oracle和SQLServer中以一样的体例处置。

增强数据完全性和贸易划定规矩

增强数据完全性确保数据库中数据的质量。计划表时主要的两个步骤是判定列中值的无效性和怎样增强列中数据的完全性。数据完全性能够分为四类,它们是以分歧的体例举行增强的。
完全性范例怎样强迫EntityintegrityPRIMARYKEYconstraint
UNIQUEconstraint
IDENTITYpropertyDomainintegrityDomainDEFAULTdefinition
FOREIGNKEYconstraint
CHECKconstraint
NullabilityReferentialintegrityDomainDEFAULTdefinition
FOREIGNKEYconstraint
CHECKconstraint
NullabilityUser-definedintegrityAllcolumn-andtable-levelconstraintsinCREATETABLE
Storedprocedures
Triggers
 

实体完全性(EntityIntegrity)

实体完全性把特定表中的一行作为一个独一的实体加以界说。实体完全性经由过程索引、UNIQUE束缚、PRIMARYKEY束缚大概IDENTITY特征增强表中标识列大概主关头字的完全性,

 

为束缚定名

你老是能够显式的定名你的束缚。假如你不如许做,Oracle和MicrosoftSQLServer将利用分歧的定名常规来隐式的为束缚定名。在定名上的分歧会为你的移植带来不用要的贫苦。在删除束缚大概使束缚生效时将会呈现成绩,由于束缚必需经由过程名字来删除。显式定名束缚的语法在Oracle和SQLServer中是一样的。
CONSTRAINTconstraint_name
 

主键和独一列

SQL-92尺度请求主关头字中的一切值都是独一的而且该列不同意空值。Oracle和MicrosoftSQLServer都是经由过程主动创立独一的索引这类体例来强迫完成独一性的,不管是不是界说了PRIMARYKEY大概UNIQUE束缚。

固然能够创立一个未分簇的索引,可是SQLServer缺省的为主关头字创立一个分簇的索引。Oracle在主关头字上的索引能够经由过程删除束缚大概使束缚生效的办法来扫除,而SQLServer的索引只能经由过程删除束缚来完成。

不管在哪一种RDBMS中,其他关头字都能够界说一个UNIQUE束缚。能够在任何表中界说多个UNIQUE束缚。UNIQUE束缚列能够为空。在SQLServer中,除非别的申明,不然将缺省的创立一个未分簇的索引

在移植你的使用程序时,主要的是注重到SQLServer只同意完整独一的关头字(单个大概多个列索引)中有一行是NULL值的,而Oracle则同意完整独一的关头字中恣意行是NULL值。
Or为维持生产环境和非生产环境需要不断地投入管理支持费用MySQL学习教程,最终导致客户为数据库资源投入巨额成本。
活着的死人 该用户已被删除
沙发
发表于 2015-1-28 08:42:17 来自手机 | 只看该作者
作了些试验,发现使用CLR的存储过程或函数在达到一定的阀值的时候,系统性能会呈指数级下滑!这是非常危险的!只使用几个可能没有问题,当一旦大规模使用会造成严重的系统性能问题!
老尸 该用户已被删除
板凳
发表于 2015-2-5 14:34:22 | 只看该作者
比如日志传送、比如集群。。。
飘灵儿 该用户已被删除
地板
发表于 2015-2-12 06:51:35 | 只看该作者
对于微软系列的东西除了一遍遍尝试还真没有太好的办法
蒙在股里 该用户已被删除
5#
发表于 2015-3-2 23:50:23 | 只看该作者
你可以简单地认为适合的就是好,不适合就是不好。
飘飘悠悠 该用户已被删除
6#
发表于 2015-3-11 07:37:49 | 只看该作者
每天坚持做不一样的是,认真做笔录,定时复习。一个月你就可以有一定的收获。当然如果你想在sql方面有一定的造诣,你少不了需要看很多很多的书籍了。
山那边是海 该用户已被删除
7#
发表于 2015-3-17 23:10:22 | 只看该作者
不好!如果出了错;不好调试;不好处理!其实web开发将代码分为3层:web层;业务逻辑层和数据访问层;一般对数据库的操作都在数据访问层来做;这样便于调试和维护!而且将来如果是换了数据库的话;你只需要改数据层的代码;其他层的基本可以不变!要是你在jsp中直接调用sql数据库;那么如果换了数据库呢?岂不都要改?如果报了异常呢?怎么做异常处理?
深爱那片海 该用户已被删除
8#
发表于 2015-3-25 07:21:33 | 只看该作者
SQL语言是学习所有数据库产品的基础,无论你是做数据库管理还是做数据库开发都是这样。不过具体学习的侧重点要看你将来做哪一块,如果是做数据库管理(DBA),侧重点应该放在SQLServer的系统管理上.
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|Archiver|手机版|仓酷云 鄂ICP备14007578号-2

GMT+8, 2024-5-3 06:39

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

快速回复 返回顶部 返回列表