MS SQL Server复制数据库之间的关系数据

时间:2014-02-14 16:48:37

标签: sql sql-server database

我们在MS SQL Server 2005(实际上是开发数据库)中有一个数据库,它托管了许多保存应用程序工作空间的关系表。使用此应用程序,用户可以定义许多新的数据结构,每个数据结构作为行存储在不同的表中,名为“finalized”的bit类型的列表示复制到另一个数据库的数据集(其作用只有最终数据的发布数据库)与开发数据库完全具有相同的模式。

当用户完成他的工作时,他启动一组数据的同步过程(其最终字段尚未设置为1),并且在执行一些验证规则后,如果一切似乎都正常,我们将复制此集合在开发数据库中释放数据库并将相关表的最终字段标记为1。是否有一个简单的机制,我们可以使用而不是从第一个数据库中选择数据并以编程方式将其插入目标?有太多的表可供选择,这些表实际上包含在id值上连接的关系数据。

发布数据库似乎主要有来自源数据库的表的视图,条件为'where finalized = 1',但我们还应该在用户开始同步数据集时添加一个集合,而最终的字段仍为0(如果验证过程没问题。)

提前致谢

1 个答案:

答案 0 :(得分:0)

在此方案中,用于提升这些新表条目的SQL脚本(存储过程)可能是您的最佳选择。

一些替代方案是:

将开发标识插入生产表 - 如果可以通过任何其他方法插入数据,则存在风险。同样值得考虑启用标识插入时发生的表锁 - 您的最终用户可能无法在生成表时查询生产表。这可以使用以下语法完成:

SET IDENTITY_INSERT [myTABLE] ON
INSERT INTO PROD.DBO.myTABLE (COL1,COL2,COL3)
SELECT COL1,COL2,COL3 FROM DEV.DBO.myTABLE WHERE...
SET IDENTITY_INSERT [myTABLE] OFF

这是一个KB。 http://technet.microsoft.com/en-us/library/ms188059.aspx

另一种选择是从dev到prod的过滤复制 - 再次,这只有在没有其他方法将数据插入到生产中时才有效,并且如果dev条目可以在它们之后被更改,则还有其他风险因素。标记为已批准 - 因为更改将立即复制到生产中,可能会影响最终用户。在这种情况下,您的生产表不可修改。

以下是有关已过滤复制的KB:http://technet.microsoft.com/en-us/library/ms146925(v=sql.105).aspx

理想情况下,生产环境完全与开发环境隔离 - 这意味着我刚才建议的选项不会被使用 - 但我将它们表示为FYI。

也就是说,假设你的表模式是相同的,你可以看看在生产中添加一个新的标识列,从而允许你在它旁边插入dev id。

即:

dev.dbo.myTable
id int identity(1,1) primary key,
val1 int,
val2 int,
flag bit

prod.dbo.myTable
newid int identity(1,1) primary key, -- new column in prod
id int,
val1 int,
val2 int,
flag bit

您需要为每个生产表添加一个新标识,因此每个生产表都将保留开发标识...并且您的前端代码将保持不变。如果架构更改是一个选项,这将是我的方法。

这将允许你从dev到prod的直接插入,保持dev id的完整性,并且还提供了一种将prod同时匹配到dev的方法。

希望这有帮助。