快捷搜索:  as  1111

如何由Sybase向SQL Server移植数据库

只管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

事务治理模式

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在表示隔离水平时的区别。

Sybase SQL Server

0 READ UNCOMMITTED

1 READ COMMITTED

2 REPEATABLE READ

3 SERIALIZABLE

游标语法

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

CREATE PROCEDURE sql_cursor AS

DECLARE @lname char(20), @fname char(20)

DECLARE mycursor CURSOR FOR

SELECT au_lname, au_fname FROM authors

OPEN mycursor

FETCH FROM mycursor INTO @lname, @fname

WHILE @@ FETCH_STATUS = 0

/* Sybase数据库应用@SQLSTATUS而不是@@ FETCH_STATUS */

BEGIN

FETCH FROM mycursor INTO @lname, @fname

/*

** 这里该当是一些营业逻辑

*/

END

CLOSE mycursor

DEALLOCATE /* 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)

GO

CREATE TRIGGER trigger1 on table1 FOR INSERT

AS

IF EXISTS (SELECT 1 FROM inserted WHERE a = 100)

BEGIN

ROLLBACK TRIGGER with RAISERROR 50000 Invalid value for column a

END

INSERT INTO table2

SELECT a, GETDATE() from inserted

RETURN

GO

在上面的代码中,除非a = 100,则所有插入table1的数据也被作为审计行插入table2中,假如a = 100,ROLLBACK TRIGGER敕令被触发,而INSERT敕令没有被触发,批敕令的其它部分继承履行,这时会呈现差错信息,注解在一个INSERT敕令中呈现了差错。下面是所有的INSERT敕令:

BEGIN TRAN

INSERT INTO table1 valueS (1, 1)

INSERT INTO table1 valueS (100,2)

INSERT INTO table1 valueS (3, 3)

GO

SELECT * 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 INSERT

AS

SAVE TRAN trigger1

IF EXISTS (SELECT * FROM inserted WHERE a = 100)

BEGIN

ROLLBACK TRAN trigger1

RAISERROR 50000 ROLLBACK

END

INSERT INTO table2

SELECT a, GETDATE() FROM inserted

GO

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

BEGIN TRAN

SAVE TRAN save1

INSERT INTO table1 valueS (1, 1)

IF @@error = 50000

ROLLBACK TRAN save1

SAVE TRAN save2

INSERT INTO table1 valueS (100, 1)

IF @@error = 50000

ROLLBACK TRAN save2

SAVE TRAN save3

INSERT INTO table1 valueS (3, 3)

IF @@error = 50000

ROLLBACK TRAN save3

COMMIT TRAN

我们可以发明,改变弗成谓不大年夜。因为ROLLBACK TRIGGER敕令能够使任何批敕令不能成功履行,是以在移植的SQL Server存储历程代码中必须包括别的的逻辑,根据ROLLBACK TRIGGER的应用,这可能是一个艰难而需要的义务,没有什么捷径可走。假如在移植后所有的ROLLBACK TRIGGER敕令被改变为ROLLBACK TRANSACTION,触发器的履行也会发生变更,是以我们该当十分小心。

您可能还会对下面的文章感兴趣: