我们需要创建一个自动的过程来克隆小型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。这是荒谬的时间消耗,所以希望有一个更好的方法。
发布于 2011-12-22 20:55:43
为此,我将创建数据库的基本还原,并将主键中的所有值更新为新的GUID。
要使它自动更新所有外键,需要使用叶栅关键字向数据库添加约束,即
CREATE TABLE Orders
(
OrderID uniqueidentifier,
CustomerID uniqueidentifier REFERENCES Customer(CustomerID) ON UPDATE CASCADE,
etc...现在,当您更新Customer表的CustomerID时,Order表的CustomerID也会被更新。
您可以使用简单的update查询对整个表执行此操作:
UPDATE TABLE Customer SET CustomerID = NewID();您需要对每个表执行此操作,并将其作为主键。
发布于 2011-12-27 00:02:44
为此,可以创建Integration (SSIS)包。您将在控制流中创建新的数据库,然后使用数据流将数据从源复制到目的地,数据流还将替换GUID或进行其他所需的转换。
如果DB有大量表,并且只需要修改其中的几个表,那么最好只复制MDF/LDF文件,用新的DB名称重新附加它们,并使用脚本更新ID。
使用SSIS的优点是更容易完全自动化。缺点是,可能需要更长的时间才能把事情做好。
https://stackoverflow.com/questions/8609271
复制相似问题