2つのSQL Serverデータベースの違いを見つける方法はありますか(スキーマのみ)。1つはローカルで、もう1つは顧客のサイトにあります。一部のレポートを実行しているクリスタルレポートと実行されていないコードで問題が発生しており、スキーマが一致していないようです。
両方のデータベースで同じコマンドを実行し、結果を比較して違いがどこにあるかを確認できますか?
2つのSQL Serverデータベースの違いを見つける方法はありますか(スキーマのみ)。1つはローカルで、もう1つは顧客のサイトにあります。一部のレポートを実行しているクリスタルレポートと実行されていないコードで問題が発生しており、スキーマが一致していないようです。
両方のデータベースで同じコマンドを実行し、結果を比較して違いがどこにあるかを確認できますか?
回答:
この同じタスクを簡単に行う方法に苦労した後-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
複数のデータベースファイルを比較する必要がある場合は、スクリプトを作成できます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
「SQL Server Compare」を検索すると、多くのツールが見つかります。私の仕事で使用するのはRed Gate SQLCompareです。14日間の試用版があります。ただし、2つの異なる環境について話しているので、クライアントからDBのバックアップが送信されない限り、それがうまくいくとは思いません。もう1つのオプションは、システムテーブル(sys.indexes、sys.tablesなど)に対してクエリを作成することです。
最も簡単な方法は、この目的のために構築された自動化ツールを使用することですが、アクセスできない場合は、INFORMATION_SCHEMA
ビューから必要な基本情報をすべて取得できます。
でメタデータを使用INFORMATION_SCHEMA
する方が、おそらくDDLスクリプトを生成してソース比較を行うよりも簡単なオプションです。データの表示方法をはるかに制御できるからです。生成されたスクリプトがデータベース内のオブジェクトを表示する順序を実際に制御することはできません。また、スクリプトにはデフォルトで実装に依存する可能性のある大量のテキストが含まれており、おそらく本当に注目する必要があるのはテーブル、ビュー、列、または列データ型の欠落である場合、多くの不一致「ノイズ」を引き起こす可能性がありますまたはサイズの不一致。
INFORMATION_SCHEMA
ビューからコードに重要な情報を取得するクエリを作成し、SSMSから各SQL Serverで実行します。その後、結果をファイルにダンプしてテキストファイル比較ツール(MS Wordを含む)を使用するか、結果をテーブルにダンプしてSQLクエリを実行して不一致を見つけることができます。
重複としてマークされた新しい質問のために、この回答を含めています。
2つの実稼働データベースを比較し、それらの間のスキーマの違いを見つける必要がありました。関心のある項目は、追加または削除されたテーブルと、追加、削除、または変更された列のみでした。私が開発したSQLスクリプトはもうありませんが、次は一般的な戦略です。また、データベースはSQL Serverではありませんでしたが、同じ戦略が適用されると思います。
最初に、メタデータベースとして最もよく説明できるものを作成しました。このデータベースのユーザーテーブルには、運用データベースのシステムテーブルからコピーされたデータの説明が含まれていました。テーブル名、列名、データ型、精度など。実稼働データベースのいずれにも存在しなかったもう1つの項目、データベース名がありました。
次に、実稼働データベースのシステムテーブルからの選択と、メタデータベースのユーザーテーブルへの挿入を組み合わせたスクリプトを開発しました。
最後に、一方のデータベースには存在するが他方には存在しないテーブル、一方のデータベースにのみ存在する両方のデータベースのテーブルの列、および2つのデータベース間で矛盾した定義を持つ列を見つけるクエリを開発しました。
約100のテーブルと600の列から、いくつかの不整合、1つのデータベースで浮動小数点、もう1つのデータベースで整数として定義された1つの列を見つけました。最後の1つは、長年データベースの1つを悩ませてきた問題を発掘したため、天の恵みであることが判明しました。
メタデータベースのモデルは、問題のシステムテーブルによって提案されました。クエリを作成するのは難しくなく、主にgroup byを中心にcount(データベース名)= 1でした。
700個の実稼働データベースを使用する場合、最初の2つのステップを、2つのデータベースだけで比較するよりも自動化したい場合があります。しかし、考え方は似ています。
これとまったく同じ質問がありましたが、Microsoft SQL Server Management Studio(SSMS)には、ここで見たどのソリューションよりもはるかに簡単でシンプルなソリューションがあると思います。MS SQL Server Expressを使用した実稼働サイトがあり、VisualStudioやSSMS以外の他のアプリケーションをインストールする必要のない場所がもうすぐあります。
そのため、SSMS内で、スキーマを取得するデータベースを右クリックします。[ タスク]> [ スクリプトの生成...]を選択して、データベース全体(または必要に応じて選択したオブジェクト)のスキーマと構成をスクリプト化するウィザードを開きます。パス/ファイル名を除くすべてのデフォルトオプションを保持しましたが、ツールには多くのオプションがあります。ウィザードは1つのSQLを作成し、OneDriveを介してPCにコピーしました。次に、Notepad ++を使用して、SQLを、SITデータベースに対して同じ方法で生成されたファイルと比較しました。コメントの日付/時刻からヒットを除外する必要がありますが、それ以外の場合は、2つのデータベースの優れた比較になります。
プレスト!これを記述することは、実際の比較を行うよりもかなり困難でした。
私が使用する優れたツールは(しばらく更新されていませんが) AdeptSqlDiffです
両方のスキーマがデータ比較と同様に比較しますか。RedGateと同様に、コストがかかりますが、30日間の試用版もあります。そして、価格はかなりリーズナブルです。
たぶん、この無料のスクリプトhttps://github.com/dlevsha/compalexが役立つん。Microsoft SQL Serverをサポートしています。
Compalexは、2つのデータベーススキーマを比較するための無料の軽量スクリプトです。MySQL、MS SQL Server、PostgreSQLをサポートしています。
ここでデモを試すことができます
あなたが仕事を成し遂げるために使うかもしれない多くのツールが市場にあります。私の会社はAzureで無料なので、比較と同期の両方にApexSQL Diffを使用していますが、DevartまたはRedgateのツールを間違えることはありません。
私はSQL DBDiffのファンです。SQLDBDiffは、SQL Serverデータベースの2つのインスタンスのテーブル、ビュー、関数、ユーザーなどを比較し、ソースデータベースと宛先データベース間で変更スクリプトを生成するために使用できるオープンソースツールです。
私が作ったMssqlMergeの MSSQLデータベース、構造およびデータの両方を比較することができますユーティリティを。テーブル定義、ビュー、ストアドプロシージャ、関数を比較できる無料版があります。また、より多くのオブジェクトタイプをサポートし、システムビューに対するクエリを含むクエリ結果を実行および比較して、すぐに使用できない他の詳細を比較できる「クエリ結果の差分」機能を備えたProバージョンもあります。
これをチェックしてください:
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
私はこの無料の(そしてオープンソースの)ツールを使用しています:OpenDBDiff
DBDiffはこれに最適なツールです。こちらで見つけることができます。