本文作者参与了一个将Sybase数据库移植到Microsoft SQL Server 2000上的项目,并在这一项目上获得了经验。通过本文,相信能对Sybase数据库管理员把Sybase数据库移植到SQL Server 2000平台上有一定的帮助。
虽然Sybase和SQL Server之间的一些不同是相当大的,例如Sybase数据库办理体系中的存储进程在SQL Server就不能被编译,而其它不同则不太大。在完结这一转化前,对脚本文件和存储进程中编程逻辑的行为和成果进行测验是很有必要的。
鄙人面的部分中,咱们将评论这二种数据库体系之间的一些首要的不同点,在移植的规划阶段,咱们有必要细心研讨这些差异。
数据兼容形式
对SQL Server 2000和Sybase之间的一些兼容性不同的一个临时性解决方案是改动SQL Server中的数据库兼容性等级,使之与Sybase相符。为此,咱们可以运用sp_dbcmptlevel存储进程。
下面表中的句子和成果显示出不同版别数据库之间的不同:
留意:
1.当兼容性形式被设置为70时,下面的词汇不能被用作目标名和标识符:BACKUP、DENY、PRECENT、RESTORE和TOP;
2.当兼容性形式被设置为65时,下面的词汇不能被用作目标名和标识符:AUTHORIZATION、CASCASE、CROSS、DISTRIBUTED、ESCAPE、FULL、INNER、JOIN、LEFT、OUTER、PRIVILEGES、RESTRICT、RIGHT、SCHEMA和WORK。
下面是sp_dbcmptlevel的语法:
sp_dbcmptlevel [[@dbname=] name][,[@new_cmptlevel=]version]
@dbname是用于查看和改动兼容性水平的数据库姓名;
@new_cmptlevel决议数据库被设置的兼容性水平(将它设置为70、65、60,缺省值为NULL)。
例如:
sp_dbcmptlevel pubs |
这一行代码回来下面的成果:
The current compatibility level is 70.(当时的兼容性等级为70) |
现在咱们来看一下别的一个比如:
sp_dbcmptlevel pubs, 65 |
它回来如下的成果:
DBCC execution completed. (DBCC履行完毕) |
果DBCC打印出过错信息,则需求与体系办理员联络。咱们可以运用rerunsp_dbcmptlevel验证pubs数据库是否修正得正确:
sp_dbcmptlevel pubs |
它回来下面的成果:
The current compatibility level is 65(当时的兼容性等级为65) |
除了上面的比如外,兼容性等级的不同还扩展到了保留字。Sybase和SQL Server都有许多不能被用作数据库中目标姓名的的保留字,二种产品的保留字类似,但并不完全相同。
因为可以在Sybase中运用的目标或许不能在SQL Server中运用,这一问题使得由Sybase向SQL Server的移植凭添了许多困难。下面是在SQL Server中是保留字,而在Sybase中不是保留字的词汇清单。
留意:姓名为下列清单中词汇的Sybase数据库中的目标在移植到SQL Server数据库时有必要换为其它姓名。
BACKUP COLUMN COMMITTED CONTAINS CONTAINSTABLE
CROSS CURRENT_DATE CURRENT_TIME CURRENT_TIMESTAMP CURRENT_USER
DENY DISTRIBUTED FILE FLOPPY FREETEXT
FREETEXTTABLE FULL IDENTITYCOL INNER JOIN
#p#
业务办理形式
Sybase SQL Server Set chained [ on : off ] Set implicit_transactions [on : off ] |
在Sybase中运用下面的代码判别业务形式:
SELECT @@tranchained GO |
下面是或许回来的成果:
0 标明运用的对错链锁式业务形式
1 标明衔接运转在链锁形式下
在SQL Server中运用下面的代码判别业务形式:
IF (@@options & 2) > 0 PRINT on ELSE PRINT off |
下面是或许的回来成果:
0 off >0 on |
阻隔水平
在一个联系数据库这样的多线程应用软件中,数据库引擎对运转的进程间的数据是怎么被阻隔的办理对错常重要的,在标明阻隔水平常,Sybase和SQL Server的语法是不同的。下面的表格标明晰Sybase和SQL Server在标明阻隔水平常的不同。
The current compatibility level is 70.(当时的兼容性等级为70) 0 |
游标语法
二种产品中存储进程的创建和履行根本类似,但在移植时,游标句子中的一些破例是咱们应当留意的。下面是一个比如:
The current compatibility level is 70.(当时的兼容性等级为70) 1 |
#p#
退回触发器
SQL Server中不存在这个指令,因而在向SQL Server移植时,运用了ROLLBACK TRIGGER指令的Sybase存储进程有必要被进行修正。在修正带有触发器的数据库表中的数据时,运用ROLLBACK TRIGGER指令简单引起误解,一个ROLLBACK TRIGGER指令只退回触发器以及触发触发器的数据修正,假如现已被提交了,则业务的其它部分会持续,被写到数据库中。因而,业务中的一切句子或许没有被成功地完结,但数据现已被提交了。
下面是Sybase数据库中一个运用ROLLBACK TRIGGER的样例触发器:
The current compatibility level is 70.(当时的兼容性等级为70) 2 |
在上面的代码中,除非a = 100,则一切刺进table1的数据也被作为审计行刺进table2中,假如a = 100,ROLLBACK TRIGGER指令被触发,而INSERT指令没有被触发,批指令的其它部分持续履行,这时会呈现过错信息,标明在一个INSERT指令中呈现了过错。下面是一切的INSERT指令:
The current compatibility level is 70.(当时的兼容性等级为70) 3 |
在履行这些指令后,table1和table2二个数据库表将各有2个记载,Table1表中的值为1,1以及3,3,因为ROLLBACK TRIGGER指令,第二个INSERT指令没有履行;Table2表中的值为1,(当时日期)以及3,(当时日期),因为当a = 100时ROLLBACK TRIGGER被触发,触发器中的一切处理被间断,100没有被刺进到Table2表中。
在SQL Server中模仿这一操作需求更多的代码,外部的业务有必要与保存点一起运用,如下所示:
The current compatibility level is 70.(当时的兼容性等级为70) 4 |
这一触发器以一个存储点开端,ROLLBACK TRANSACTION只退回触发逻辑,而不是整个业务(规划要小于Sybases数据库中的ROLLBACK TRIGGER句子。对批指令的修正如下:
The current compatibility level is 70.(当时的兼容性等级为70) 5 |
咱们可以发现,改动不可谓不大。因为ROLLBACK TRIGGER指令可以使任何批指令不能成功履行,因而在移植的SQL Server存储进程代码中有必要包含别的的逻辑,依据ROLLBACK TRIGGER的运用,这或许是一个艰巨而必要的使命,没有什么捷径可走。假如在移植后一切的ROLLBACK TRIGGER指令被改动为ROLLBACK TRANSACTION,触发器的履行也会发生变化,因而咱们应当非常当心。
【修改引荐】
- Sybase数据备份之BCP用法简介
- 怎么设置Sybase的用户权限来处理进程
- 在Sybase Adaptive Server Enterprise中维护数据隐私