2014-02-14 41 views
-1

我们在MS SQL Server 2005(实际上是开发数据库)中有一个数据库,它托管着许多保存应用程序工作空间的关系表。使用这个应用程序用户可以定义许多新的数据结构,每个数据结构都存储为不同表中的行,并且类型位的名为'finalized'的列表示将该组数据复制到另一个数据库(其作用为仅具有最终数据的发布数据库)与开发数据库完全相同。MS SQL Server复制数据库之间的关系数据

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

发布数据库大多数似乎有来自源数据库的条件为'where finalized = 1'的表的视图,但是当用户开始同步数据集,而最终化字段仍然为0时,我们还应该添加一个集(如果验证过程确定)。

在此先感谢

回答

0

SQL脚本(存储过程),以促进这些新的表项很可能在这种情况下你最好的选择。

一些替代将是:

插入dev的身份进入生产表 - 这是有风险的,如果数据可以通过任何其他方法来插入。同样值得考虑的是,启用身份插入时发生的表锁定 - 您的最终用户在运行时可能无法查询生产表。这可以用语法来完成:

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

理想的情况下,生产环境是从开发环境完全隔离 - 这意味着我刚刚提出的方案将不会被使用 - 但我将他们当作FYIs 。这就是说,假设你的表模式是相同的,你可以看看在生产中添加一个新的标识列,从而允许你将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同时匹配的方法。

希望这会有所帮助。