如何比较两个数据库的架构?

use*_*430 29 schema sql-server sql-server-2008-r2

有没有办法找到两个 SQL Server 数据库(仅限架构)中的差异。一个是本地的,第二个是在客户的站点。我们遇到运行一些报告的水晶报表和一些未执行的代码的问题,看起来模式不匹配。

我可以在两个数据库上运行相同的命令并比较结果以判断差异在哪里吗?

Mis*_*goo 18

如果由于连接问题而无法使用众多工具中的一种并希望进行“离线”比较,则可以通过右键单击数据库并使用“任务.../生成”来使用 SSMS 为所有数据库对象生成脚本Scripts”功能,并确保您选择为每个对象创建一个文件。

当您为两个数据库完成此操作后,将两组脚本放到本地计算机上的两个单独文件夹中,并使用 WinMerge(或类似工具)来比较两者。


Joh*_*ams 12

在尝试了一种简单的方法来完成同样的任务之后——看看两个模型之间发生了什么变化,我编写了以下 SQL 脚本,它将比较两个模式以确定新的和删除的列

set nocount on;
-- Set the two variables newmodel and oldmodel to the appropriate database names and execute the script

declare @newmodel varchar(50), @oldmodel varchar(50);

Set @newmodel = '[NewModel to Compare]';
set @oldmodel = '[OldModel to Compare]';


Declare @Temp table (TABLE_SCHEMA varchar(40), TABLE_NAME varchar(40), COLUMN_NAME varchar(50), ORDINAL_POSITION int, IS_NULLABLE varchar(5), NullChange varchar(5), Comment varchar(50));

Declare @script varchar(5000);


set @script = '
Select nc.TABLE_SCHEMA, nc.TABLE_NAME, nc.COLUMN_NAME, nc.ORDINAL_POSITION, nc.IS_NULLABLE, IIF(nc.IS_NULLABLE <> oc.IS_NULLABLE, ''Yes'', ''No''), 
        IIF(oc.COLUMN_NAME IS NULL, convert(varchar(20), ''ADDED COLUMN''), convert(varchar(20), ''--'')) as Comment
    from {NEW}.INFORMATION_SCHEMA.COLUMNS nc
        LEFT join {OLD}.INFORMATION_SCHEMA.COLUMNS oc 
            on nc.TABLE_NAME = oc.TABLE_NAME and nc.COLUMN_NAME = oc.COLUMN_NAME
UNION ALL
    Select oc.TABLE_SCHEMA, oc.TABLE_NAME, oc.COLUMN_NAME, oc.ORDINAL_POSITION, oc.IS_NULLABLE, ''No'', ''DELETED COLUMN'' as Comment
    from {OLD}.INFORMATION_SCHEMA.COLUMNS oc
    where CONCAT(oc.TABLE_NAME, ''.'', oc.COLUMN_NAME) 
        not in (Select CONCAT(TABLE_NAME, ''.'', COLUMN_NAME) from {NEW}.INFORMATION_SCHEMA.COLUMNS)
';


Set @script = replace(@script, '{OLD}', @oldmodel);
Set @script = replace(@script, '{NEW}', @newmodel);

--print @script

Insert into @Temp
    exec(@script);

Select * from @Temp where Comment <> '--'
order by TABLE_NAME, ORDINAL_POSITION, COLUMN_NAME;
go
Run Code Online (Sandbox Code Playgroud)


Mik*_*Fal 9

另一种选择是使用 SQL Server Data Tools (SSDT),这是 Visual Studio 的扩展。您可以将数据库架构提取为 .dacpac 文件,并将其与另一个 .dacpac 文件或现有数据库进行比较。SSDT 包含在 SQL Server 2012 客户端工具中,因此非常易于访问。您可以在 MSDN 站点上找到有关如何运行比较的完整说明。


小智 5

也许这个免费脚本https://github.com/dlevsha/compalex可以帮助你。它支持 Microsoft SQL Server。

Compalex 是一个免费的轻量级脚本,用于比较两个数据库模式。它支持 MySQL、MS SQL Server 和 PostgreSQL。

您可以在这里尝试演示

http://demo.compalex.net/


Chr*_*ods 3

搜索“SQL Server Compare”,您会发现很多工具。我们在工作中使用的是Red Gate SQLCompare。它有 14 天的试用期。但由于您正在谈论两种不同的环境,我认为这对您不起作用,除非客户端向您发送其数据库的备份。另一种选择是针对系统表(如 sys.indexes、sys.tables 等)编写查询。