我们需要创建一个用于克隆小型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。这非常费时,所以希望有更好的方法。
答案 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的优势在于它更容易完全自动化。缺点是可能需要更长时间才能完成设置。