• 软件测试技术
  • 软件测试博客
  • 软件测试视频
  • 开源软件测试技术
  • 软件测试论坛
  • 软件测试沙龙
  • 软件测试资料下载
  • 软件测试杂志
  • 软件测试人才招聘
    暂时没有公告

字号: | 推荐给好友 上一篇 | 下一篇

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

发布: 2008-8-19 17:33 | 作者: 网络转载 | 来源: chinaitlab.com | 查看: 45次 | 进入软件测试论坛讨论

领测软件测试网

隔离水平 

在一个关系数据库这样的多线程应用软件中,数据库引擎对运行的进程间的数据是如何被隔离的管理是非常重要的,在表示隔离水平时,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,触发器的执行也会发生变化,因此我们应当十分小心。 

延伸阅读

文章来源于领测软件测试网 https://www.ltesting.net/

22/2<12

关于领测软件测试网 | 领测软件测试网合作伙伴 | 广告服务 | 投稿指南 | 联系我们 | 网站地图 | 友情链接
版权所有(C) 2003-2010 TestAge(领测软件测试网)|领测国际科技(北京)有限公司|软件测试工程师培训网 All Rights Reserved
北京市海淀区中关村南大街9号北京理工科技大厦1402室 京ICP备10010545号-5
技术支持和业务联系:info@testage.com.cn 电话:010-51297073

软件测试 | 领测国际ISTQBISTQB官网TMMiTMMi认证国际软件测试工程师认证领测软件测试网