数据库元数据版本控制和同步

时间:2010-06-03 10:16:38

标签: sql-server version-control synchronization compare

我们的应用程序的数据库(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

第二个DB包含:
类型
1,'第一类' 2,'第三类' 3,'第二类' 的表格
1,'第一种形式',1
2,'第二种形式',3

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

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

1 个答案:

答案 0 :(得分:0)

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

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


如果您已经有办法识别跨数据库的行,那么您应该能够将这些标识符与Red Gate的SQL数据比较一起使用(我相信它可以使用唯一索引而不是PK作为选项)。

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