2010-06-03 190 views
0

我们的应用程序的数据库(SQL Server 2005)具有应用程序元数据的表。这些元数据表(我的意思是插入/更新/删除)的更改可以通过GUI(不使用SSMS)完成。数据库元数据版本控制和同步

大多数时候开发人员都会更改自己的数据库副本。问题是 - 如何将这些更改与元数据记录“合并”为一个?问题是没有“更新”脚本,并且具有相同主键的行可能意味着不同的事情。一种可能的方法是使用像SQL Data Compare(来自RedGate)这样的工具来查看哪些行发生了变化并通过唯一键进行比较。

CREATE TABLE [dbo].[Type](
    [ID] [int] IDENTITY(1,1) NOT NULL, 
    [Type] [nvarchar](50) NOT NULL, 
    CONSTRAINT [PK_Type] PRIMARY KEY CLUSTERED ([ID] ASC) 
    ) ON [PRIMARY] 

CREATE UNIQUE NONCLUSTERED INDEX [Type] ON [dbo].[Type] ([Type] ASC) 

CREATE TABLE [dbo].[Form](
    [ID] [int] IDENTITY(1,1) NOT NULL, 
    [Name] [nvarchar](50) NOT NULL, 
    [TypeID] [int] NOT NULL, 
    CONSTRAINT [PK_Form] PRIMARY KEY CLUSTERED ([ID] ASC) 
) ON [PRIMARY] 

CREATE UNIQUE NONCLUSTERED INDEX [Name] ON [dbo].[Form] ([Name] ASC) 

ALTER TABLE [dbo].[Form] WITH CHECK ADD CONSTRAINT [FK_Form_Type] FOREIGN KEY([TypeID]) REFERENCES [dbo].[Type] ([ID]) 
ALTER TABLE [dbo].[Form] CHECK CONSTRAINT [FK_Form_Type] 

第一DB包含:该问题可以通过例如将更好地理解
类型
1, '第一类型'
2, '第二类型'

1, '第一种形式',1
2,'第二种形式',2

第二个数据库包含:
类型
1, '第一类型'
2, '第三类型'
3, '第二类型'

1, '第一形式',1
2,“第二表格',3

表格“表格”外键到表格“类型”是不同的,但逻辑上它们是相同的(因为它们引用相同的类型名称)。

我们如何才能以更“智能”的方式比较这些数据库?没有Red Gate(或任何其他第三方)工具,是否有可能做到这一点?另外,如何修改元数据,而不是使用“更新”脚本,而是通过GUI进行更改?

回答

0

你刚刚遇到了使用无意义主键的几个问题之一。如果类型的名称标识它,那么至少应该有一个唯一的索引。然后,您可以使用它来进行合并,并且可以自动执行,而不是依靠人为干预来确定2 = 3。

即使您想使用代理键,您的表格仍应该通常具有某种与现实世界相关的标识列。


如果你已经有一个方法来识别跨数据库的行,那么你应该能够使用与红门SQL数据的标识符进行比较(我相信它可以使用唯一索引,而不是PK作为一个选项)。

或者,您可以使用SSIS指向两个数据库并使其同步。这将允许处理更复杂的情况,在这种情况下,您不是简单地创建一个数据库,而是实际合并差异。您仍然需要处理冲突解决(在SSIS中比红门工具IMO更容易),但这完全取决于您自己的业务规则,哪些数据库是“主数据库”,哪些项目可以包含来自两个数据库的所有子项只是简单地相互添加而不是替换物品等。

+0

我们有独特的索引,但我们仍然需要小时的建议来智能“合并”更改 – Sazug 2010-06-03 14:51:24

+0

使用SSIS进行同步的任何示例? – Sazug 2010-06-04 08:25:25

+0

我认为在这里发布整个SSIS解决方案并不合理。只需最少的搜索,你应该能够找到几个SSIS教程。如果您没有太多的SSIS经验,那么开箱即用,仅仅将对象从一个地方转移到另一个地方会更有用 - 而不是合并两个不同的来源。在这种情况下,您可能更适合使用第三方产品。 – 2010-06-04 13:28:24