科技行者

行者学院 转型私董会 科技行者专题报道 网红大战科技行者

知识库

知识库 安全导航

至顶网软件频道由Sybase向SQL Server移植数据库

由Sybase向SQL Server移植数据库

  • 扫一扫
    分享文章到微信

  • 扫一扫
    关注官方公众号
    至顶头条

我最近参与了将一个Sybase数据库移植到Microsoft SQL Server 2000上的项目...

作者:刘彦青编译 来源:yesky 2007年10月23日

关键字: SQL Server

  • 评论
  • 分享微博
  • 分享邮件

在本页阅读全文(共3页)

退回触发器

  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,触发器的执行也会发生变化,因此我们应当十分小心。

  命令优化

  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

  临时数据库表的名字

  表名字的类型    最大长度

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

查看本文来源

    • 评论
    • 分享微博
    • 分享邮件
    邮件订阅

    如果您非常迫切的想了解IT领域最新产品与技术信息,那么订阅至顶网技术邮件将是您的最佳途径之一。

    重磅专题
    往期文章
    最新文章