Windows XP Tablet Ed.Visual Studio .NET 2002SQL Server 2000.NET 1.0DBAVisual Studio .NET 2003Windows 2003.NET 1.1Visual Studio 2005ADO.NETWindows 2000ArchitectWindows XP.NET 2.0SQL Server 2005C# 2.0IntermediateDevVisual StudioSQL ServerSQLWindows.NETC#
数据库架构比较工具
一篇描述查找两个数据库实例之间差异的方法的文章。

引言
当大多数开发人员开发数据库代码(包括表、视图、存储过程和函数)时,他们倾向于在开发环境中进行开发,然后将这些更改迁移到其他服务器(暂存、生产等)。虽然我们中的一些人善于跟踪这些更改,但我们中的大多数人并不擅长。
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
脚本并且需要知道首先创建什么。