• <ruby id="5koa6"></ruby>
    <ruby id="5koa6"><option id="5koa6"><thead id="5koa6"></thead></option></ruby>

    <progress id="5koa6"></progress>

  • <strong id="5koa6"></strong>
    • 軟件測試技術
    • 軟件測試博客
    • 軟件測試視頻
    • 開源軟件測試技術
    • 軟件測試論壇
    • 軟件測試沙龍
    • 軟件測試資料下載
    • 軟件測試雜志
    • 軟件測試人才招聘
      暫時沒有公告

    字號: | 推薦給好友 上一篇 | 下一篇

    如何由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,觸發器的執行也會發生變化,因此我們應當十分小心。 

    延伸閱讀

    文章來源于領測軟件測試網 http://www.kjueaiud.com/

    22/2<12

    關于領測軟件測試網 | 領測軟件測試網合作伙伴 | 廣告服務 | 投稿指南 | 聯系我們 | 網站地圖 | 友情鏈接
    版權所有(C) 2003-2010 TestAge(領測軟件測試網)|領測國際科技(北京)有限公司|軟件測試工程師培訓網 All Rights Reserved
    北京市海淀區中關村南大街9號北京理工科技大廈1402室 京ICP備10010545號-5
    技術支持和業務聯系:info@testage.com.cn 電話:010-51297073

    軟件測試 | 領測國際ISTQBISTQB官網TMMiTMMi認證國際軟件測試工程師認證領測軟件測試網

    老湿亚洲永久精品ww47香蕉图片_日韩欧美中文字幕北美法律_国产AV永久无码天堂影院_久久婷婷综合色丁香五月

  • <ruby id="5koa6"></ruby>
    <ruby id="5koa6"><option id="5koa6"><thead id="5koa6"></thead></option></ruby>

    <progress id="5koa6"></progress>

  • <strong id="5koa6"></strong>