2011-12-22 91 views
3

我們需要創建一個用於克隆小型SQL Server數據庫的自動化進程,但在目標數據庫中,所有主鍵都應該與源代碼不同(我們使用UNIQUEIDENTIFIER ids for all主鍵)。我們有成千上萬的數據庫都具有相同的模式,並且需要使用這個「克隆」過程來創建所有非密鑰數據匹配的新數據庫,但是保持了參照完整性。克隆具有所有新主鍵的SQL Server數據庫

有沒有簡單的方法來做到這一點?

更新 - 例如:

每個數據庫具有需要被克隆〜250個事務表。考慮這幾個表和它們之間的關係(每個表都有一個唯一標識符的主鍵= ID)以下簡單的例子:

location 
doctor 
    doctor_location (to doctor.id via doctor_id, to location.id via location_id) 
patient 
    patient_address (to patient.id via patient_id) 
    patient_medical_history (to patient.id via patient_id) 
    patient_doctor (to patient.id via patient_id, to doctor.id via doctor_id) 
    patient_visit (to patient.id via patient_id) 
    patient_payment (to patient.id via patient_id) 

我們需要克隆數據庫的原因是由於辦公室被買斷或更改所有權(由於合作伙伴的變化,這種情況發生得比較頻繁)發生這種情況時,辦公室的稅務和保險信息會發生變化。在法律上,這需要一個全新的公司結構,並且辦公室之間的財務需要完全分開。

但是,大多數辦公室都希望保留所有患者病史,因此他們選擇「克隆」數據庫。新的數據庫將被剝離財務記錄,但所有的患者/醫生數據將被保留。舊數據庫將擁有所有信息直至「克隆」。

需要新的GUID的原因是我們將所有數據庫合併到單個關係數據庫中用於報告目的。由於所有事務表都有GUID,所以這很有效......除了克隆的情況。

到目前爲止,我們唯一的解決方案是將數據庫轉儲到文本文件並搜索並替換GUID。這是非常耗時的,所以希望有一個更好的方法。

+0

你想要帶什麼類型的數據,主要是查找數據?所以你想克隆你的數據庫並克隆所有數據,或者只是查找數據?例如,非關鍵數據是什麼意思? – peter 2011-12-22 20:40:35

+0

查找數據並不重要,因爲它總是相同的,我們可以編寫腳本(並且它有固定的整數鍵)。交易數據是我們主要關心的問題。我會用一個例子來更新q。 – 2011-12-22 20:47:09

回答

0

我會通過創建數據庫的基本恢復,並將主鍵中的所有值更新爲新的GUID來做到這一點。

爲了使這個自動更新所有你需要約束與CASCADE關鍵字添加到數據庫中的外鍵即

CREATE TABLE Orders 
(

    OrderID uniqueidentifier, 
    CustomerID uniqueidentifier REFERENCES Customer(CustomerID) ON UPDATE CASCADE, 

etc... 

現在,當你更新客戶表的客戶ID訂單表的客戶ID過更新。

您可以使用一個簡單的更新查詢這樣對整個表:

UPDATE TABLE Customer SET CustomerID = NewID(); 

你會需要一個唯一標識符這樣對每個表,因爲它的主鍵。

0

您可以創建一個Integration Services(SSIS)包來執行此操作。您可以在控制流中創建新的數據庫,然後使用數據流將數據從源複製到目標,這些數據流也可以替代GUID或在此過程中進行其他所需的轉換。

如果數據庫有大量的表,並且只有少數表需要修改,那麼最好是複製MDF/LDF文件,將它們重新附加到新的數據庫中名稱,並使用腳本更新ID。

使用SSIS的優勢在於它更容易完全自動化。缺點是可能需要更長時間才能完成設置。