使用所有新主键克隆SQL Server数据库

时间:2011-12-22 20:19:00

标签: sql-server sql-server-2008 tsql

我们需要创建一个用于克隆小型SQL Server数据库的自动化流程,但在目标数据库中,所有主键都应与源不同(我们对所有主键使用UNIQUEIDENTIFIER ids)。我们有数千个数据库都具有相同的模式,并且需要使用此“克隆”过程来创建具有所有非关键数据匹配的新数据库,但保持参照完整性。

有一种简单的方法吗?

更新 - 示例:

每个数据库都有大约250个需要克隆的事务表。考虑以下几个表及其关系的简单示例(每个表都有一个UniqueIdentifier主键= 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。这非常费时,所以希望有更好的方法。

2 个答案:

答案 0 :(得分:0)

我这样做是通过创建数据库的基本还原,并将主键中的所有值更新为新的GUID。

要使用CASCADE关键字向数据库添加约束,需要自动更新所有外键,即

CREATE TABLE Orders
(

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

etc...

现在,当您更新Customer表的CustomerID时,Order表的CustomerID也会更新。

您可以使用简单的更新查询对整个表执行此操作:

UPDATE TABLE Customer SET CustomerID = NewID();

您需要对每个表执行此操作,并使用uniqueidentifier作为主键。

答案 1 :(得分:0)

您可以创建Integration Services(SSIS)包来执行此操作。您将在控制流中创建新数据库,然后使用数据流将数据从源复制到目标,这也将替换GUID或在此过程中进行其他所需的转换。

如果数据库有大量的表,并且只需要修改其中的一些表,那么最好只制作MDF / LDF文件的副本,并使用新的数据库名称重新附加它们,并使用脚本更新ID。

使用SSIS的优势在于它更容易完全自动化。缺点是可能需要更长时间才能完成设置。