65.9K
CodeProject 正在变化。 阅读更多。
Home

数据库架构比较工具

starIconstarIconstarIconstarIcon
emptyStarIcon
starIcon

4.74/5 (31投票s)

2006 年 10 月 10 日

CPOL

2分钟阅读

viewsIcon

156480

downloadIcon

4097

一篇描述查找两个数据库实例之间差异的方法的文章。

Sample Image - DatabaseCompare.jpg

引言

当大多数开发人员开发数据库代码(包括表、视图、存储过程和函数)时,他们倾向于在开发环境中进行开发,然后将这些更改迁移到其他服务器(暂存、生产等)。虽然我们中的一些人善于跟踪这些更改,但我们中的大多数人并不擅长。

Red-Gate Software 提供了一个工具 SQL Compare 来比较两个数据库的架构并将其显示给用户。此工具价格不便宜,但效果非常好。

本文提供了与 SQL Compare 执行相同操作的基本功能,但价格仅为其一小部分。

背景

SQL 2000 及更高版本使用一系列系统表来存储数据库中所有对象的定义。此项目的重要对象是

  • sysobjects - 存储数据库中所有对象的列表 (MSDN 参考)
  • syscolumns - 存储数据库中对象列的列表 (MSDN 参考)
  • syscomments - 存储数据库中对象的定义 (MSDN 参考)

Using the Code

该代码分为两个项目

  • DatabaseCompare (Winforms 项目)
  • DatabaseCompare.Domain(数据库访问项目)

Winforms 项目中没有什么突破性的东西。 我确实使用了一些委托,以便在执行长时间的任务时,UI 能够更快地响应。

Domain 项目包含实际执行数据库架构收集和两个数据库比较工作的类。

代码相当容易理解,Domain 代码的主要入口点是 Database.TestConnection()Database.LoadObjects()Database.CompareTo()

关注点

较长的函数/存储过程/视图定义保存在 syscomments 数据库的多行中,必须像这样检索

using( SqlCommand command = conn.CreateCommand() )
{
    command.CommandText = "select text from syscomments where id=@id";
    command.Parameters.Add( "@id", this.Id );
    using ( SqlDataReader reader = command.ExecuteReader() )
    {
        while( reader.Read() )
            textDefinition += reader.GetString( 0 ).Trim().ToLower();
    }
}

此代码不会为表创建 drop/create 脚本,但如果您需要该功能,这是一个相当简单的练习。

使用 sysdepends 表,您可以确定对象的依赖关系,以防您创建 CREATE 脚本并且需要知道首先创建什么。

© . All rights reserved.