web-dev-qa-db-ja.com

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

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

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

22
user1571430

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

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

15
Mister Magoo

これと同じタスクを実行する簡単な方法に苦労した後、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
8
John Adams

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

7
Mike Fal

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

動作するコードはありませんが、インスピレーションを得るために SQLPackage.exeのドキュメント を見ることができます。

Masterデータベースを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 

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

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

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

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

2
RBrown

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

1
Chris Woods

多分この無料のスクリプト https://github.com/dlevsha/compalex が役立つでしょう。 Microsoft SQL Serverをサポートしています。

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

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

http://demo.compalex.net/

1
DLevsha

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

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

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

1
Joel Brown

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

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

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

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

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

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

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

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

1
Walter Mitty

私が使用する優れたツール(しばらくの間は更新されませんが、まだ機能します)は AdeptSqlDiff です。

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

0
TombMedia

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

0
sarh

スキーマとデータの比較、および同期を行うサードパーティのツールは数多くあります。使用できる2つのツールは、私のチームと私が開発したツールです。スキーマ比較用の xSQLスキーマ比較 と、同じスキーマを持つオブジェクト間のデータ比較用の xSQLデータ比較 です。お役に立てれば!
免責事項:私はxSQLに所属しています

0
Endi Zhupani

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

0
Mspaja

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

0
Shridhar