2つのデータベースのスキーマを比較するにはどうすればよいですか?


19

2つのSQL Serverデータベースの違いを見つける方法はありますか(スキーマのみ)。1つはローカルで、もう1つは顧客のサイトにあります。一部のレポートを実行しているクリスタルレポートと実行されていないコードで問題が発生しており、スキーマが一致していないようです。

両方のデータベースで同じコマンドを実行し、結果を比較して違いがどこにあるかを確認できますか?


SOに関するこの質問には、いくつかの良い提案があります。
LowlyDBA

回答:


13

接続の問題のために多くのツールのいずれかを使用できず、「オフライン」比較が必要な場合は、SSMSを使用してデータベースを右クリックし、「タスク... /生成」を使用してすべてのデータベースオブジェクトのスクリプトを生成できますスクリプト」機能を使用して、オブジェクトごとに1つのファイルを作成することを選択してください。

両方のデータベースでこれを行ったら、2セットのスクリプトを2つの別々のフォルダーのローカルマシンに取得し、WinMerge(または同様の)を使用して2つを比較します。


6

別のオプションは、Visual Studioの拡張機能であるSQL Server Data Tools(SSDT)を使用することです。データベーススキーマを.dacpacファイルとして抽出し、別の.dacpacファイルまたは既存のデータベースと比較できます。SSDTはSQL Server 2012クライアントツールに含まれているため、非常にアクセスしやすくなっています。MSDNサイトで比較を実行する方法の完全な手順を見つけることができます。


6

この同じタスクを簡単に行う方法に苦労した後-2つのモデル間で何が変更されたかを確認し、2つのスキーマを比較して新しい列と削除された列を決定する次の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

余分なソフトウェアを必要としない迅速で汚れたソリューションには、これは素晴らしいことです!それはまさに私が必要としていたものです。ありがとう!
ミール

2

複数のデータベースファイルを比較する必要がある場合は、スクリプトを作成できますSQLPackage.exe

動作するコードはありませんが、インスピレーションについてはSQLPackage.exeのドキュメントご覧ください。

マスターデータベースをdacpacファイルに抽出し、dacpacファイルを他のデータベースと比較します。比較の結果は、変更のxmlレポートか、データベースを同期するために実行できる.sqlファイルのいずれかです。

このようなもの:

sqlpackage.exe /a:Extract /scs:Server=MyLaptopSQL2014;Database=Test; /tf:C:UsersKevin3NFDocumentsSQLScriptsDACPACSTest.dacpac  

その後

sqlpackage.exe /a:Script /sf:C:UsersKevin3NFDocumentsSQLScriptsDACPACSTest.dacpac /tsn:MyLaptopSQL2014 /tdn:Test1 /op:C:UsersKevin3NFDocumentsSQLScriptsDACPACSDeltasTest1.sql /p:DropObjectsNotInSource=True /p:DropIndexesNotInSource=True 
 sqlpackage.exe /a:Script /sf:C:UsersKevin3NFDocumentsSQLScriptsDACPACSTest.dacpac /tsn:MyLaptopSQL2014 /tdn:Test2 /op:C:UsersKevin3NFDocumentsSQLScriptsDACPACSDeltasTest2.sql /p:DropObjectsNotInSource=True /p:DropIndexesNotInSource=True 

サンプルコードについてはこの記事またはこれをご覧ください。


1

「SQL Server Compare」を検索すると、多くのツールが見つかります。私の仕事で使用するのはRed Gate SQLCompareです。14日間の試用版があります。ただし、2つの異なる環境について話しているので、クライアントからDBのバックアップが送信されない限り、それがうまくいくとは思いません。もう1つのオプションは、システムテーブル(sys.indexes、sys.tablesなど)に対してクエリを作成することです。


両方のサーバーにログインしている場合、SQL Compareは正常に機能します。各DBに異なるログインを使用できるため、クライアントはアクセス権を確保する必要があります。
マークシンキンソン

1

最も簡単な方法は、この目的のため構築された自動化ツール使用することですが、アクセスできない場合は、INFORMATION_SCHEMAビューから必要な基本情報をすべて取得できます。

でメタデータを使用INFORMATION_SCHEMAする方が、おそらくDDLスクリプトを生成してソース比較を行うよりも簡単なオプションです。データの表示方法をはるかに制御できるからです。生成されたスクリプトがデータベース内のオブジェクトを表示する順序を実際に制御することはできません。また、スクリプトにはデフォルトで実装に依存する可能性のある大量のテキストが含まれており、おそらく本当に注目する必要があるのはテーブル、ビュー、列、または列データ型の欠落である場合、多くの不一致「ノイズ」を引き起こす可能性がありますまたはサイズの不一致。

INFORMATION_SCHEMAビューからコードに重要な情報を取得するクエリを作成し、SSMSから各SQL Serverで実行します。その後、結果をファイルにダンプしてテキストファイル比較ツール(MS Wordを含む)を使用するか、結果をテーブルにダンプしてSQLクエリを実行して不一致を見つけることができます。


1

重複としてマークされた新しい質問のために、この回答を含めています。

2つの実稼働データベースを比較し、それらの間のスキーマの違いを見つける必要がありました。関心のある項目は、追加または削除されたテーブルと、追加、削除、または変更された列のみでした。私が開発したSQLスクリプトはもうありませんが、次は一般的な戦略です。また、データベースはSQL Serverではありませんでしたが、同じ戦略が適用されると思います。

最初に、メタデータベースとして最もよく説明できるものを作成しました。このデータベースのユーザーテーブルには、運用データベースのシステムテーブルからコピーされたデータの説明が含まれていました。テーブル名、列名、データ型、精度など。実稼働データベースのいずれにも存在しなかったもう1つの項目、データベース名がありました。

次に、実稼働データベースのシステムテーブルからの選択と、メタデータベースのユーザーテーブルへの挿入を組み合わせたスクリプトを開発しました。

最後に、一方のデータベースには存在するが他方には存在しないテーブル、一方のデータベースにのみ存在する両方のデータベースのテーブルの列、および2つのデータベース間で矛盾した定義を持つ列を見つけるクエリを開発しました。

約100のテーブルと600の列から、いくつかの不整合、1つのデータベースで浮動小数点、もう1つのデータベースで整数として定義された1つの列を見つけました。最後の1つは、長年データベースの1つを悩ませてきた問題を発掘したため、天の恵みであることが判明しました。

メタデータベースのモデルは、問題のシステムテーブルによって提案されました。クエリを作成するのは難しくなく、主にgroup byを中心にcount(データベース名)= 1でした。

700個の実稼働データベースを使用する場合、最初の2つのステップを、2つのデータベースだけで比較するよりも自動化したい場合があります。しかし、考え方は似ています。


1

これとまったく同じ質問がありましたが、Microsoft SQL Server Management Studio(SSMS)には、ここで見たどのソリューションよりもはるかに簡単でシンプルなソリューションがあると思います。MS SQL Server Expressを使用した実稼働サイトがあり、VisualStudioやSSMS以外の他のアプリケーションをインストールする必要のない場所がもうすぐあります。

そのため、SSMS内で、スキーマを取得するデータベースを右クリックします。[ タスク]> [ スクリプトの生成...]を選択して、データベース全体(または必要に応じて選択したオブジェクト)のスキーマと構成をスクリプト化するウィザードを開きます。パス/ファイル名を除くすべてのデフォルトオプションを保持しましたが、ツールには多くのオプションがあります。ウィザードは1つのSQLを作成し、OneDriveを介してPCにコピーしました。次に、Notepad ++を使用して、SQLを、SITデータベースに対して同じ方法で生成されたファイルと比較しました。コメントの日付/時刻からヒットを除外する必要がありますが、それ以外の場合は、2つのデータベースの優れた比較になります。

プレスト!これを記述することは、実際の比較を行うよりもかなり困難でした。


0

私が使用する優れたツールは(しばらく更新されていませんが) AdeptSqlDiffです

両方のスキーマがデータ比較と同様に比較しますか。RedGateと同様に、コストがかかりますが、30日間の試用版もあります。そして、価格はかなりリーズナブルです。


0

たぶん、この無料のスクリプトhttps://github.com/dlevsha/compalexが役立つん。Microsoft SQL Serverをサポートしています。

Compalexは、2つのデータベーススキーマを比較するための無料の軽量スクリプトです。MySQL、MS SQL Server、PostgreSQLをサポートしています。

ここでデモを試すことができます

http://demo.compalex.net/



0

あなたが仕事を成し遂げるために使うかもしれない多くのツールが市場にあります。私の会社はAzureで無料なので、比較と同期の両方にApexSQL Diffを使用していますが、DevartまたはRedgateのツールを間違えることはありません。


0

私はSQL DBDiffのファンです。SQLDBDiffは、SQL Serverデータベースの2つのインスタンスのテーブル、ビュー、関数、ユーザーなどを比較し、ソースデータベースと宛先データベース間で変更スクリプトを生成するために使用できるオープンソースツールです。


0

私が作ったMssqlMergeの MSSQLデータベース、構造およびデータの両方を比較することができますユーティリティを。テーブル定義、ビュー、ストアドプロシージャ、関数を比較できる無料版があります。また、より多くのオブジェクトタイプをサポートし、システムビューに対するクエリを含むクエリ結果を実行および比較して、すぐに使用できない他の詳細を比較できる「クエリ結果の差分」機能を備えたProバージョンもあります。


-1

これをチェックしてください:

SELECT TABLE_SCHEMA ,
       TABLE_NAME ,
       COLUMN_NAME ,
       ORDINAL_POSITION ,
       COLUMN_DEFAULT ,
       DATA_TYPE ,
       CHARACTER_MAXIMUM_LENGTH ,
       NUMERIC_PRECISION ,
       NUMERIC_PRECISION_RADIX ,
       NUMERIC_SCALE ,
       DATETIME_PRECISION
FROM   INFORMATION_SCHEMA.COLUMNS
where TABLE_SCHEMA in ('dbo','meta')
and table_name in (select name from sys.tables)
order by TABLE_SCHEMA ,       TABLE_NAME ,ORDINAL_POSITION

ここに画像の説明を入力してください


3
これは本当にただのスキーマを取得していない、比較についてである必要があります
マーク・Sinkinson

他の人を助けるためにここに置いておきます。それは私を助けた
ジェレミートンプソン


弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.