由Sybase向SQL Server移植数据库

鑫晴29

鑫晴29

2016-02-19 17:46

人生本是一个不断学习的过程,在这个过程中,图老师就是你们的好帮手,下面分享的由Sybase向SQL Server移植数据库懂设计的网友们快点来了解吧!

  简介

  我最近参与了将一个Sybase数据库移植到Microsoft SQL Server 2000上的项目,我在这一项目上获得的经验,将对Sybase数据库管理员把Sybase数据库移植到SQL Server 2000平台上有一定的帮助。

  尽管二者之间的一些差别是相当大的,例如Sybase数据库管理系统中的存储过程在SQL Server就不能被编译,而其它差别则不太大。在完成这一转换前,对脚本文件和存储过程中编程逻辑的行为和结果进行测试是很有必要的。

  在下面的部分中,我们将讨论这二种数据库系统之间的一些主要的不同点,在移植的规划阶段,我们必须仔细研究这些区别。

  数据兼容模式

  对SQL Server 2000和Sybase之间的一些兼容性差别的一个临时性解决方案是改变SQL Server中的数据库兼容性级别,使之与Sybase相符。为此,我们可以使用sp_dbcmptlevel存储过程。

  下面表中的语句和结果显示出不同版本数据库之间的差别:

  (Untitled-1)

  注意:

  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 CONTAINSTABLECROSS CURRENT_DATE CURRENT_TIME CURRENT_TIMESTAMP CURRENT_USERDENY DISTRIBUTED FILE FLOPPY FREETEXTFREETEXTTABLE FULL IDENTITYCOL INNER JOIN

  事务管理模式

  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 onELSE PRINT off

  下面是可能的返回结果:

  0 off

  0 on

  隔离水平

  在一个关系数据库这样的多线程应用软件中,数据库引擎对运行的进程间的数据是如何被隔离的管理是非常重要的,在表示隔离水平时,Sybase和SQL Server的语法是不同的。下面的表格表明了Sybase和SQL Server在表示隔离水平时的差别。

  

Sybase SQL Server0 READ UNCOMMITTED1 READ COMMITTED2 REPEATABLE READ3 SERIALIZABLE

  游标语法

  二种产品中存储过程的创建和执行基本相似,但在移植时,游标语句中的一些例外是我们应当注意的。下面是一个例子:

  

CREATE PROCEDURE sql_cursor ASDECLARE @lname char(20), @fname char(20)DECLARE mycursor CURSOR FORSELECT au_lname, au_fname FROM authorsOPEN mycursorFETCH FROM mycursor INTO @lname, @fnameWHILE @@ FETCH_STATUS = 0/* Sybase数据库使用@SQLSTATUS而不是@@ FETCH_STATUS */BEGINFETCH FROM mycursor INTO @lname, @fname/*** 这里应当是一些业务逻辑*/ENDCLOSE mycursorDEALLOCATE /* Sybase数据库在这里需要CURSOR这个词 * / mycursor

  Sybase SQL Server

  Fetch命令执行成功 0 0

  Fetch命令执行失败 1 -2

  没有可存取的记录了 2 -1

  退回触发器

  SQL Server中不存在这个命令,因此在向SQL Server移植时,使用了ROLLBACK TRIGGER命令的Sybase存储过程必须被进行修改。在修改带有触发器的数据库表中的数据时,使用ROLLBACK TRIGGER命令容易引起误解,一个ROLLBACK TRIGGER命令只退回触发器以及触发触发器的数据修改,如果已经被提交了,则事务的其它部分会继续,被写到数据库中。因此,事务中的所有语句可能没有被成功地完成,但数据已经被提交了。

  下面是Sybase数据库中一个使用ROLLBACK TRIGGER的样例触发器:

(本文来源于图老师网站,更多请访问http://m.tulaoshi.com/bianchengyuyan/)

  

CREATE TABLE table1 (a int, b int)GOCREATE TRIGGER trigger1 on table1 FOR INSERTASIF EXISTS (SELECT 1 FROM inserted WHERE a = 100)BEGINROLLBACK TRIGGER with RAISERROR 50000 Invalid value for column aENDINSERT INTO table2SELECT a, GETDATE() from insertedRETURNGO

  在上面的代码中,除非a = 100,则所有插入table1的数据也被作为审计行插入table2中,如果a = 100,ROLLBACK TRIGGER命令被触发,而INSERT命令没有被触发,批命令的其它部分继续执行,这时会出现错误信息,表明在一个INSERT命令中出现了错误。下面是所有的INSERT命令:

  

BEGIN TRANINSERT INTO table1 VALUES (1, 1)INSERT INTO table1 VALUES (100,2)INSERT INTO table1 VALUES (3, 3)GOSELECT * FROM table1

  在执行这些命令后,table1和table2二个数据库表将各有2个记录,Table1表中的值为1,1以及3,3,由于ROLLBACK TRIGGER命令,第二个INSERT命令没有执行;Table2表中的值为1,(当前日期)以及3,(当前日期),由于当a = 100时ROLLBACK TRIGGER被触发,触发器中的所有处理被中止,100没有被插入到Table2表中。

  在SQL Server中模拟这一操作需要更多的代码,外部的事务必须与保存点同时使用,如下所示:

  

CREATE trigger1 on table1 FOR INSERTASSAVE TRAN trigger1IF EXISTS (SELECT * FROM inserted WHERE a = 100)BEGINROLLBACK TRAN trigger1RAISERROR 50000 ROLLBACKENDINSERT INTO table2SELECT a, GETDATE() FROM insertedGO

  这一触发器以一个存储点开始,ROLLBACK TRANSACTION只退回触发逻辑,而不是整个事务(规模要小于Sybases数据库中的ROLLBACK TRIGGER语句。对批命令的修改如下:

  

BEGIN TRANSAVE TRAN save1INSERT INTO table1 VALUES (1, 1)IF @@error = 50000ROLLBACK TRAN save1SAVE TRAN save2INSERT INTO table1 VALUES (100, 1)IF @@error = 50000ROLLBACK TRAN save2SAVE TRAN save3INSERT INTO table1 VALUES (3, 3)IF @@error = 50000ROLLBACK TRAN save3COMMIT TRAN

  我们可以发现,改变不可谓不大。由于ROLLBACK TRIGGER命令能够使任何批命令不能成功执行,因此在移植的SQL Server存储过程代码中必须包括另外的逻辑,根据ROLLBACK TRIGGER的使用,这可能是一个艰巨而必要的任务,没有什么捷径可走。如果在移植后所有的ROLLBACK TRIGGER命令被改变为ROLLBACK TRANSACTION,触发器的执行也会发生变化,因此我们应当十分小心。

  命令优化

  SQL Server能够对SELECT、INSERT、UPDATE和DELETE命令进行优化,Sybase数据库则只支持对SELECT命令进行优化。下面是SQL Server和Sybase在GUI方面的对比:

  Sybase SQL Server

  使用被称作SHOWPLAN的基于文本的查询分析工具 使用Query Analyzer。

(本文来源于图老师网站,更多请访问http://m.tulaoshi.com/bianchengyuyan/)

  在ISQL中启动SHOWPLAN的命令按钮 多Query Analyzer中启动SHOWPLAN_ALL或 SHOWPLAN_TEXT的命令

  SET SHOWPLAN ON SET SHOWPLAN_ALL

  GO GO

  临时数据库表的名字

  表名字的类型    最大长度

  SQL Server表名字   128

  SQL Server临时表名字 116

  Sybase表名字      30

  Sybase临时表名字    13

  数据类型

  数据类型 Sybase SQL Server

  

  char(n) 255 8000    varchar(n) 255 8000    nchar(n) 255 4000    nvarchar(n) 255 4000    binary 255 8000    varbinary 255 8000

  注意:

  1)SQL Server中的bit类型数据的值可以被设置为0、1或NULL。

  2) Sybase中的bit类型数据的值不可以被设置为NULL。

  同一性列

  Sybase SQL Server

  Numeric(x,0) Tinyint,smallint,int,decimal(x,0) or numeric(x,0)

  打印语法

  在进行移植时,所有使用替换语法的打印语句必须被改变为RAISERROR语句。

  结论

  将Sybase数据库转换为SQL Server数据库并非是不可能的,但二种产品之间存在许多差异,在转换时需要加以解决。根据应用程序的规模,这种转换可能需要大量的时间。尽管无需重新编写所有的应用程序,但需要完成的工作并不少。

  我目前还没有发现这二种数据库间转换的更简单的方法。由于二种产品在许多方面都非常相似,我们非常容易成功地将Sybase数据库转换为SQL Server数据。

展开更多 50%)
分享

猜你喜欢

由Sybase向SQL Server移植数据库

编程语言 网络编程
由Sybase向SQL Server移植数据库

将Access数据库移植到SQL Server 7.0

SQLServer
将Access数据库移植到SQL Server 7.0

s8lol主宰符文怎么配

英雄联盟 网络游戏
s8lol主宰符文怎么配

把Access数据库移植到SQL SERVER7.0

编程语言 网络编程
把Access数据库移植到SQL SERVER7.0

将Access数据库移植到Microsoft SQL Server 7.0

SQLServer
将Access数据库移植到Microsoft SQL Server 7.0

lol偷钱流符文搭配推荐

英雄联盟 网络游戏
lol偷钱流符文搭配推荐

SQL Server数据库检修

SQLServer
SQL Server数据库检修

SQL Server数据库导入MySQL数据库体验

MySQL mysql数据库
SQL Server数据库导入MySQL数据库体验

lolAD刺客新符文搭配推荐

英雄联盟
lolAD刺客新符文搭配推荐

css之!important

css之!important

解读分析服务中的数据挖掘功能

解读分析服务中的数据挖掘功能
下拉加载更多内容 ↓