2012-01-10 6 views
0

由於我們正在從MySQL遷移到Oracle,因此我們的數據庫中有很多表格,並且自動增量主鍵ID設置了它們在MySQL中的方式。在沒有觸發器的情況下在oracle中管理/實現自動遞增主鍵

現在在oracle中我最近得知實現這個需要在每個這樣的表的id字段上創建一個序列和一個觸發器。我們的架構中有30到40個表,我們希望避免在我們的產品中使用數據庫觸發器,因爲數據庫管理超出了我們軟件應用的範圍。

我在執行oracle中的自動遞增id功能時有什麼選擇...除了在代碼中手動指定id並在代碼中管理它,這會改變很多現有的insert語句。

...我不知道是否有辦法從grails代碼本身做到這一點? (順便說一下指定ID爲域類映射行不通增量的方法 - 僅適用於MySQL的) 關於我們的應用程序environement一些信息:Grails的-常規,休眠,Oracle,MySQL等支持

+1

您希望通過創建觸發器和序列來引入哪些管理任務?從本質上講,它與MySQL自動增量完成的完全相同,但您自己構建它。 – 2012-01-10 10:36:38

+0

觸發失敗的頻率如何? – 2012-01-10 18:54:20

+0

取決於裏面的代碼。我從來沒有看到觸發器因爲其他原因而失敗,除了序列的問題,也導致其他解決方案失敗。使用觸發器的好處是,PK生成機制不僅適用於您的應用程序,而且適用於使用SQL或其他方式/應用程序插入數據的直接插入。我經常結合這兩種解決方案。讓休眠在我的應用程序中執行PK生成,並使用在沒有提供PK時生成PK的觸發器。 – 2012-01-12 08:11:33

回答

1

This answer會有的Grails /休眠自行處理的順序產生。它會爲主鍵生成的每個表創建一個序列,並且不會緩存任何數字,所以如果緩存超時,則不會丟失任何標識符。 Grails/Hibernate直接調用序列,所以它也不使用任何觸發器。

+0

這是一個非常好的解決方案...考慮到所有依賴關係都在配置中......只是想知道指定的dialiect是從oracle10gdialect創建的custome方言嗎? – 2012-01-10 19:37:07

+0

是的。這是一種爲我們的工作環境開發的自定義方言。作爲一種解決方案,它一直在爲我們工作出色。 – schmolly159 2012-01-10 20:56:59

+0

所以我實現了自定義方言......我是否需要爲表格創建序列,或者方言基本上是否處理所有事情?我沒有在表格中爲id字段映射也.. – 2012-01-11 03:37:30

1

如果您在使用Grails休眠會自動爲你處理。

您可以指定將使用您的域對象以下哪個順序:

static mapping = { 
    id generator:'sequence', params:[sequence:'MY_SEQ'] 
} 
+0

酷...只是爲了確認...我們不需要觸發器呢? – 2012-01-10 09:27:01

+0

不需要觸發器。如果你省略了映射,它將適用於mysql和Oracle,但它只會使用一個名爲hibernate_seq的序列。 – 2012-01-10 13:42:49

+0

所以你的意思是,如果我沒有在oracle中定義我自己的序列,並且我沒有這個映射在域中,並且我沒有指定id插入一個新行...然後id仍然會使用數據庫的公共內部序列遞增是 - hibernate_seq? – 2012-01-10 19:22:19

相關問題