2010-03-08 48 views
3

我使用SQL Developer的GUI進行DDL更改。問題是,我需要對測試環境應用相同的更改。我想知道別人是如何處理這個問題的。目前,我不得不手動編寫ALTER語句,以使測試環境與開發環境保持一致,但這很容易出錯(兩次做同樣的事情)。在測試環境中沒有重要數據的情況下,我通常會把所有東西都丟掉,從dev中導出DDL腳本並在測試中從頭開始運行它們。我應該如何將DDL更改從一個環境遷移到下一個環境?

我知道有觸發器可以存儲每個DDL更改,但這是一個嚴重共享的環境,如果可能,我希望避免這種情況。

也許我應該只是手動編寫DDL的東西,而不是使用GUI?

+0

這是我們在最後一家店使用的手段 - 通過腳本。分解爲組件:表,索引,約束......有時會在放置/禁用和重新創建之間進行細分。 – 2010-03-08 20:41:30

+0

@OMG Ponies您的意思是手動編寫和版本化每個腳本,或者您有一個自動腳本/觸發器跟蹤它們並對它們進行分類? – 2010-03-08 20:43:21

+0

@RI:手冊。我們的客戶使用了Oracle Designer,我被告知它不可靠。 – 2010-03-08 20:54:24

回答

6

我已經看到了一種我不知道怎麼處理這個問題的方法,最後我認爲你只需要維護手動腳本。

現在,你不一定必須自己寫。在MSSQL中,當你做出改變時,有一個生成腳本的按鈕,它將爲你正在做的改變吐出一個SQL腳本。我知道你在談論甲骨文,而且我已經用了幾年的GUI,但我只能想象它們具有相同的功能。

但是,您無法脫離手動處理腳本。您將在預先存在的數據中遇到很多問題,例如新列的默認值或如何處理重命名/刪除/移動列的數據。這只是分析使用數據庫模式進行分析的一部分,您不能遠離。如果您嘗試使用完全自動化的解決方案來完成此任務,那麼您的數據遲早會變得混亂。

爲了讓您的生活更輕鬆一點,我建議的一件事是確保將代碼更改中的架構更改分開。不同之處在於,對錶和列的模式更改必須只運行一次而不再運行,因此必須將其作爲單獨的更改腳本進行版本控制。但是,像存儲過程,函數甚至視圖一樣,代碼更改可以(也應該)反覆運行,並且可以像任何其他代碼文件一樣進行版本控制。我見過的最佳方法是當我們擁有VSS中的所有特效/函數/視圖時,我們的構建過程將全部放棄並在每次更新期間重新創建它們。這與重建C#/ Java /任何代碼的想法是一樣的,因爲它確保所有內容始終保持最新狀態。

+0

@Mike好點...我一直在處理這個問題的方式不一致,並希望有一些明顯的我錯過了,這會讓它更容易。 我會將您的答案標記爲正確,並遵循此處的指導原則,但爲了滿足我的好奇心和作爲備份,我將在單獨的答案中發佈我實施的用於跟蹤DDL更改的數據庫觸發器。 – 2010-03-08 22:25:34

+0

如果你在11g上,有一個方便的打包函數叫做dbms_metadata_diff.compare_alter 給它兩個對象,它會生成ALTER腳本以將其轉換爲另一個。你也可以通過數據庫鏈接指向它。 – 2010-03-08 22:30:30

+0

@加里感謝您的提示......我們還沒有在11g上,但將存儲一個未來的一個。 – 2010-03-08 22:31:39

2

千萬不要使用GUI來做這些事情。編寫腳本並將它們放入源代碼控制。

3

這裏是我用來跟蹤DDL變化的觸發器。來源用於:

http://www.dba-oracle.com/t_ddl_triggers.htm

http://www.orafaq.com/forum/t/68667/0/

CREATE OR REPLACE TRIGGER ddl_trig 
AFTER create OR drop OR alter 
    ON scott.SCHEMA 
DECLARE 
    li ora_name_list_t; 
    ddl_text clob; 
BEGIN 
    for i in 1..ora_sql_txt(li) loop 
    ddl_text := ddl_text || li(i); 
    end loop; 

INSERT INTO my_audit_tbl VALUES 
    (SYSDATE, 
    ORA_SYSEVENT, 
    ORA_DICT_OBJ_TYPE, 
    ORA_DICT_OBJ_NAME, 
    ddl_text 
    ); 
END; 
/
+0

+1感謝您指出'ora_sql_txt'。我可能會誤解,但在FOR循環中引用'ora_sql_txt'可能會導致函數被多次調用 - 如果只調用一次,它可能會稍微好一點。請參閱此處的示例:http://docs.oracle.com/cd/B28359_01/appdev.111/b28370/triggers.htm#LNPLS2014 – 2012-02-01 04:29:29

1

數據庫變更管理/數據庫DIFF 有些工具是 -

1)的Oracle變更管理包

從文檔 -

它允許我們在固定的時間取基線(快照),然後我們可以看到數據庫模式和對象是如何改變的。CMP也可以生成DDL腳本,但我不確定我們是否想要使用它。

詳細

2)PL/SQL開發比較用戶對象設有

 This is available from Tools -> Compare User Objects 

3)的Oracle SQL開發人員數據庫DIFF特徵

  This is available from Tools -> Database diff 
      http://www.oracle.com/technology/products/database/sql_developer/files/what_is_sqldev.html#copy See 「Schema Copy and Compare」 



#1看起來是最通用和最靈活的,但DBA權限可能是必要的。

#2 & 3可供任何開發人員使用。我認爲Oracle SQL Developer更簡單,並提供更多選項。

使用上述任何選項可以幫助 -

  1. 標識改變的對象,也可以作爲提交MAC的前檢查清單。
  2. 相關開發人員可以擁有特定的更改對象。
0

你可以用Toad很好地做到這一點。

您使用比較模式函數來查找所有差異(它非常靈活;您可以指定要查看哪些對象類型以及許多其他選項)。它會顯示你的差異,你可以看看並確保它看起來不錯,然後告訴它爲你生成一個更新腳本。瞧。唯一的問題是,您需要DBA模塊來生成同步腳本,這是額外的成本。但如果你經常這樣做,我會說它是值得的。 (或者,如果你能夠獲得一個較舊的Toad版本,9.0之前的版本我認爲,有一個錯誤可以讓你在沒有DBA模塊的情況下提取同步腳本:))

蟾蜍並不便宜,使用它多年,我認爲它是不可或缺的,並且非常值得任何Oracle開發人員或DBA的價格。

相關問題