2011-12-22 92 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的优势在于它更容易完全自动化。缺点是可能需要更长时间才能完成设置。