由Sybase向SQL Server移植数据库

2016-02-19 17:46 6 1 收藏

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

【 tulaoshi.com - 编程语言 】

  简介

  我最近参与了将一个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)。

  例如:

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

  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的样例触发器:

  

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。

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

  SET SHOWPLAN ON SET SHOWPLAN_ALL

  GO GO

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

  临时数据库表的名字

  表名字的类型    最大长度

  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数据。

来源:https://www.tulaoshi.com/n/20160219/1616001.html

延伸阅读
标签: SQLServer
启动服务器的方法有以下几种: 1、用Enterprise Manager 启动 在Enterprise Manager 的SQL Server Group 中用左键单击所要启动的服务器,或在所要启动的服务器上单击右键后,从快捷菜单中选择“Start” 项,即可启动。 2、用SQL Server Service Manager 启动 启动方法如下:  (1)从菜单中选择Service Manager 选项,启动服务...
标签: SQLServer
在计算机中数据有两种特征:类型和长度。所谓数据类型就是以数据的表现方式和存储方式来划分的数据的种类。     在SQL Server 中每个变量、参数、表达式等都有数据类型。系统提供的数据类型分为几大类,如表4-2 所示。     其中,BIGINT、 SQL_VARIANT 和TABLE 是SQL Server 2000 中新增加的3...
标签: SQLServer
4.5.1 注释符(Annotation) 在Transact-SQL 中可使用两类注释符。 ANSI 标准的注释符“--” 用于单行注释; 与C语言相同的程序注释符号,即“/**/”。“/*”用于注释文字的开头,“*/”用于注释文字的结尾,可在程序中标识多行文字为注释。 4.5.2 运算符(Operator)     1 算术运算符 包括:+(加)、―(...
标签: SQLServer
Enterprise Manager 提供了可视化的界面,在其中建立数据库及其对象,如表、视图、缺省值等,很少需要用户自己编辑程序代码。但对用户来说,了解这些对象是如何通过SQL语言建立,的并得到其SQL 语言脚本(Script) 是很有好处。的在Enterprise Manager 中提供了工具,以帮助用户产生这些对象的SQL 语言脚本。 生成对象的SQL 脚本方法如下: (1) ...
标签: SQLServer
4.7.1 BACKUP BACKUP 命令用于将数据库内容或其事务处理日志备份到存储介质上(软盘、硬盘、磁带)。等SQL Server 7.0 以前的版本用的是DUMP 命令来执行此功能,从SQL Server 2000起,不再使用DUMP 命令。关于BACKUP 命令的详情请参见“数据备份与恢复”章节。      4.7.2 CHECKPOINT 语法如下: CHECKPOINT CH...

经验教程

520

收藏

33
微博分享 QQ分享 QQ空间 手机页面 收藏网站 回到头部