序列(Sequence)是Oracle資料庫中獨有的,由于在項目中使用Sequence生成的資料做為主鍵,是以必須有一套完整可行的轉換方案來替代。
涉及到的程式應該改動盡可能的小。
我們應該提供一個跟Oracle資料庫取序列方法差不多的函數,來緩解由于資料庫不同,導緻的額外工作量。
這裡我們來看一下微軟的解決方案。
使用到的工具為Microsoft SQL Server Migration Assistant 2005 for Oracle(以下簡稱SSMA)
該工具可以從微軟網上免費下載下傳。
在源資料庫Oracle中建立一個測試資料庫TestDB_Seq,裡面隻有一個序列Seq_Test
在目标資料庫SQLServer中建立一個空資料庫TestDB_Ssq。
之後我們将兩個資料庫加載到SSMA中 Convert Schema一下
這裡我們還可以在Type Mapping 中看到微軟對兩種不同資料庫之間,提供的資料類型解決方案
這裡,Oracle中的序列最終被生成到dbo的Sequence Emulations中
右鍵SQLServer資料源中的SEQ_TEST,選擇Synchronize with Database
點選OK,就完成了使用SSMA對Sequence的移植。
下面我們來看看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
4
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 ()
好吧,文章就到這裡,相信你也看到了微軟對不同資料庫之間轉移的解決方案,希望上面存儲過程裡面的代碼,會對你有所幫助。
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