天天看點

Oracle資料庫切換SQLServer資料庫解決方案 -- 序列

序列(Sequence)是Oracle資料庫中獨有的,由于在項目中使用Sequence生成的資料做為主鍵,是以必須有一套完整可行的轉換方案來替代。

涉及到的程式應該改動盡可能的小。

我們應該提供一個跟Oracle資料庫取序列方法差不多的函數,來緩解由于資料庫不同,導緻的額外工作量。

這裡我們來看一下微軟的解決方案。

使用到的工具為Microsoft SQL Server Migration Assistant 2005 for Oracle(以下簡稱SSMA)

該工具可以從微軟網上免費下載下傳。

在源資料庫Oracle中建立一個測試資料庫TestDB_Seq,裡面隻有一個序列Seq_Test

在目标資料庫SQLServer中建立一個空資料庫TestDB_Ssq。

之後我們将兩個資料庫加載到SSMA中 Convert Schema一下

Oracle資料庫切換SQLServer資料庫解決方案 -- 序列

這裡我們還可以在Type Mapping 中看到微軟對兩種不同資料庫之間,提供的資料類型解決方案

Oracle資料庫切換SQLServer資料庫解決方案 -- 序列

這裡,Oracle中的序列最終被生成到dbo的Sequence Emulations中

Oracle資料庫切換SQLServer資料庫解決方案 -- 序列

右鍵SQLServer資料源中的SEQ_TEST,選擇Synchronize with Database

Oracle資料庫切換SQLServer資料庫解決方案 -- 序列

點選OK,就完成了使用SSMA對Sequence的移植。

下面我們來看看SQLServer中到底發生了什麼。

Oracle資料庫切換SQLServer資料庫解決方案 -- 序列

在表裡面,對應的生成了一個名為$SSMA_seq_SEQ_TEST的表。

表中隻有一個ID字段,類型為numeric(38,0),非空,自增

同時在存儲過程中生成了一個名為$SSMA_sp_get_nextval_SEQ_TEST的存儲過程。

執行該存儲過程,通過參數curval,我們就可以每次得到一個不同的增量。

以下為存儲的内容和執行的結果。

1  set  ANSI_NULLS  ON

2  set  QUOTED_IDENTIFIER  ON

3  go

5  ALTER   proc   [ dbo ] . [ $SSMA_sp_get_nextval_SEQ_TEST ]   @curval  numeric( 38 , 0 ) out  as   insert   [ dbo ] . [ $SSMA_seq_SEQ_TEST ]   default   values   set   @curval   =   scope_identity ()

Oracle資料庫切換SQLServer資料庫解決方案 -- 序列

好吧,文章就到這裡,相信你也看到了微軟對不同資料庫之間轉移的解決方案,希望上面存儲過程裡面的代碼,會對你有所幫助。

BTW:終于明白前輩們為什麼這樣寫代碼

public User BuildUser()
{
    User.ID = getSEQ("SEQ_USer");
    User.Name = "Gavin";
}
           

當時天真的認為,這樣生成實體的話,在Insert操作時候,需要連接配接兩次資料庫,一次用來讀取ID,另一次執行Insert操作。

不如不給User.ID指派,直接在Insert語句中使用SEQ_User.nextval。慚愧,慚愧!

轉載于:https://www.cnblogs.com/CGavin/archive/2010/04/26/1721502.html