Wie kann ich das Schema zweier Datenbanken vergleichen?

19

Gibt es eine Möglichkeit, die Unterschiede in zwei SQL Server-Datenbanken zu finden (nur Schema). Einer ist lokal und der zweite ist beim Kunden vor Ort. Es treten Probleme mit Crystal Reports-Berichten auf, in denen einige Berichte ausgeführt werden, und einige Codes werden nicht ausgeführt, und es scheint, dass die Schemas nicht übereinstimmen.

Kann ich denselben Befehl für beide Datenbanken ausführen und die Ergebnisse vergleichen, um festzustellen, wo die Unterschiede liegen?

user1571430
quelle
Diese Frage zu SO hat einige gute Vorschläge.
LowlyDBA

Antworten:

13

Wenn Sie eines der vielen Tools aufgrund von Verbindungsproblemen nicht verwenden können und einen "Offline" -Vergleich wünschen, können Sie mit SSMS Skripte für alle Datenbankobjekte generieren, indem Sie mit der rechten Maustaste auf die Datenbank klicken und "Aufgaben ... / Generieren" verwenden "Skripte", und stellen Sie sicher, dass Sie eine Datei pro Objekt erstellen.

Wenn Sie dies für beide Datenbanken getan haben, laden Sie die beiden Skriptsätze in zwei separaten Ordnern auf einen lokalen Computer und vergleichen Sie sie mit WinMerge (oder einem ähnlichen Programm).

Herr Magoo
quelle
6

Eine andere Option ist die Verwendung von SQL Server Data Tools (SSDT), einer Erweiterung von Visual Studio. Sie können Ihr Datenbankschema als .dacpac-Datei extrahieren und mit einer anderen .dacpac-Datei oder einer vorhandenen Datenbank vergleichen. SSDT ist in den SQL Server 2012-Clienttools enthalten und daher ziemlich leicht zugänglich. Die vollständigen Anweisungen zum Ausführen des Vergleichs finden Sie auf der MSDN-Site .

Mike Fal
quelle
6

Nachdem ich mit einer einfachen Möglichkeit zu kämpfen hatte, dieselbe Aufgabe zu erledigen, habe ich das folgende SQL-Skript geschrieben, das zwei Schemata vergleicht, um neue und gelöschte Spalten zu ermitteln

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
John Adams
quelle
Für eine schnelle und schmutzige Lösung, die keine zusätzliche Software erfordert, ist dies großartig! Es ist genau das, was ich brauchte. Vielen Dank!
Mir
2

Wenn Sie mehr als eine Datenbankdatei vergleichen müssen, können Sie ein Skript erstellen SQLPackage.exe.

Ich habe keinen Arbeitscode für Sie, aber Sie können sich in der Dokumentation zu SQLPackage.exe inspirieren lassen.

Sie extrahieren Ihre master-Datenbank in eine Dacpac-Datei und vergleichen die Dacpac-Datei dann mit dem Rest Ihrer Datenbanken. Das Ergebnis des Vergleichs kann entweder ein XML-Bericht der Änderungen oder eine .sql-Datei sein, die Sie zum Synchronisieren der Datenbanken ausführen können.

Etwas wie das:

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

und dann

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 

Sie können auf einen Blick dieser Artikel oder diese ein für Beispielcode.

Tom V - Team Monica
quelle
1

Wenn Sie nach "SQL Server Compare" suchen, werden Sie viele Tools finden. Die, die wir in meinem Job verwenden, ist Red Gate SQLCompare . Es hat eine 14-tägige Testversion. Aber da Sie über zwei verschiedene Umgebungen sprechen, denke ich, dass dies für Sie nicht funktionieren würde, es sei denn, der Client sendet Ihnen eine Sicherungskopie seiner Datenbank. Die andere Möglichkeit besteht darin, Abfragen für die Systemtabellen zu schreiben (z. B. sys.indexes, sys.tables usw.).

Chris Woods
quelle
SQL Compare funktioniert einwandfrei, wenn Sie sich bei beiden Servern angemeldet haben. Sie können für jede Datenbank ein anderes Login verwenden, sodass der Client sicherstellen muss, dass Sie Zugriff haben.
Mark Sinkinson
1

Am einfachsten ist es , ein für diesen Zweck erstelltes automatisiertes Tool zu verwenden . Wenn Sie jedoch keinen Zugriff auf eines haben, können Sie alle grundlegenden Informationen, die Sie benötigen, aus den INFORMATION_SCHEMAAnsichten abrufen.

Die Verwendung der Metadaten in INFORMATION_SCHEMAist wahrscheinlich eine einfachere Option als das Generieren von DDL-Skripten und das Durchführen eines Quellenvergleichs, da Sie viel mehr Kontrolle darüber haben, wie die Daten dargestellt werden. Sie können die Reihenfolge, in der die Objekte in einer Datenbank angezeigt werden, nicht wirklich steuern. Außerdem enthalten die Skripte eine Reihe von Text, der möglicherweise standardmäßig implementierungsabhängig ist und eine Menge "Rauschen" verursacht, wenn Sie sich wahrscheinlich wirklich auf eine fehlende Tabelle, Ansicht oder Spalte oder möglicherweise einen Spaltendatentyp konzentrieren müssen oder Größeninkongruenz.

Schreiben Sie eine Abfrage (oder Abfragen), um die für Ihren Code INFORMATION_SCHEMAwichtigen Informationen aus den Ansichten abzurufen, und führen Sie sie auf jedem SQL Server von SSMS aus. Sie können dann entweder die Ergebnisse in eine Datei sichern und ein Textdatei-Vergleichstool (sogar MS Word) verwenden oder die Ergebnisse in Tabellen sichern und SQL-Abfragen ausführen, um Unstimmigkeiten zu finden.

Joel Brown
quelle
1

Ich füge diese Antwort hinzu, um eine neue Frage zu beantworten, die als Duplikat markiert wurde.

Ich musste einmal zwei Produktionsdatenbanken vergleichen und alle möglichen Schemaunterschiede zwischen ihnen finden. Die einzigen interessanten Elemente waren Tabellen, die hinzugefügt oder gelöscht wurden, und Spalten, die hinzugefügt, entfernt oder geändert wurden. Ich habe nicht mehr die SQL-Skripte, die ich entwickelt habe, aber was folgt, ist die allgemeine Strategie. Und die Datenbank war nicht SQL Server, aber ich denke, die gleiche Strategie gilt.

Zuerst habe ich eine Metadatenbank erstellt, die am besten als Metadatenbank beschrieben werden kann. Die Benutzertabellen dieser Datenbank enthielten Datenbeschreibungen, die aus den Systemtabellen der Produktionsdatenbanken kopiert wurden. Dinge wie Tabellenname, Spaltenname, Datentyp und Genauigkeit. Es gab ein weiteres Element, den Datenbanknamen, das in keiner der Produktionsdatenbanken vorhanden war.

Als Nächstes entwickelte ich Skripte, die Auswahlen aus den Systemtabellen der Produktionsdatenbanken mit Einfügungen in die Benutzertabellen der Metadatenbank koppelten.

Schließlich entwickelte ich Abfragen, um Tabellen zu finden, die in einer Datenbank vorhanden waren, aber nicht in der anderen, sowie Spalten aus Tabellen in beiden Datenbanken, die sich nur in einer Datenbank befanden, und Spalten mit inkonsistenten Definitionen zwischen den beiden Datenbanken.

Aus etwa 100 Tabellen und 600 Spalten habe ich eine Handvoll Inkonsistenzen gefunden, und eine Spalte wurde als Gleitkomma in einer Datenbank und eine Ganzzahl in der anderen definiert. Letzteres erwies sich als Glücksfall, da es ein Problem aufdeckte, das eine der Datenbanken seit Jahren plagte.

Das Modell für die Metadatenbank wurde von den betreffenden Systemtabellen vorgeschlagen. Die Abfragen waren nicht schwer zu konstruieren, drehten sich hauptsächlich um group by und hatten count (Datenbankname) = 1.

In Ihrem Fall möchten Sie mit 700 Produktionsdatenbanken die ersten beiden Schritte möglicherweise mehr automatisieren als mit nur zwei zu vergleichenden Datenbanken. Aber die Idee ist ähnlich.

Walter Mitty
quelle
1

Ich hatte genau die gleiche Frage und glaube, dass das Microsoft SQL Server Management Studio (SSMS) eine viel einfachere Lösung hat als alles, was ich hier gesehen habe. Ich habe eine Produktionsstätte mit MS SQL Server Express und in Kürze weitere, in denen ich VisualStudio oder andere Anwendungen außer SSMS nicht installieren möchte.

Klicken Sie also in SSMS mit der rechten Maustaste auf die Datenbank, um das Schema für zu erhalten. Wählen Sie Tasks> Generate Scripts ... , um einen Assistenten zu öffnen, mit dem Sie das Schema und die Konfiguration für die gesamte Datenbank (oder ausgewählte Objekte, wenn Sie möchten) skripten können. Ich habe alle Standardoptionen mit Ausnahme des Pfads / Dateinamens beibehalten, aber das Tool verfügt über eine Vielzahl von Optionen. Der Assistent hat eine SQL erstellt, die ich über OneDrive zurück auf meinen PC kopiert habe. Ich habe dann Notepad ++ verwendet, um das SQL mit einer Datei zu vergleichen, die auf die gleiche Weise mit meiner SIT-Datenbank erstellt wurde. Sie müssen Treffer aus Datum und Uhrzeit in Kommentaren herausfiltern, ansonsten ist dies ein großartiger Vergleich der beiden Datenbanken.

Presto! Das aufzuschreiben war bedeutend schwieriger als der eigentliche Vergleich.

RBrown
quelle
0

Ein großartiges Tool, das ich benutze (obwohl es schon eine Weile nicht mehr aktualisiert wurde), ist AdeptSqlDiff

Werden sowohl Schema- als auch Datenvergleiche durchgeführt? Genau wie bei RedGate gibt es eine kostenpflichtige, aber auch eine 30-Tage-Testversion. Und der Preis ist ziemlich vernünftig.

TombMedia
quelle
0

Vielleicht kann Ihnen dieses kostenlose Skript https://github.com/dlevsha/compalex helfen. Es unterstützt Microsoft SQL Server.

Compalex ist ein kostenloses kompaktes Skript zum Vergleichen von zwei Datenbankschemata. Es unterstützt MySQL, MS SQL Server und PostgreSQL.

Sie können die Demo hier ausprobieren

http://demo.compalex.net/

DLevsha
quelle
0

Es gibt viele Tools von Drittanbietern, die Schema- und Datenvergleiche sowie Synchronisierungen durchführen. Zwei Tools, die Sie verwenden können, sind diejenigen, die mein Team und ich entwickelt haben: xSQL Schema Compare für Schemavergleiche und xSQL Data Compare für Datenvergleiche zwischen Objekten mit demselben Schema. Hoffe das hilft!
Haftungsausschluss: Ich bin mit xSQL verbunden

Endi Zhupani
quelle
0

Es gibt viele Tools auf dem Markt, mit denen Sie Ihre Arbeit erledigen können. Mein Unternehmen verwendet ApexSQL Diff sowohl zum Vergleichen als auch zum Synchronisieren, da es für Azure kostenlos ist, aber Sie können weder mit Devart- noch mit Redgate-Tools etwas falsch machen.

Mspaja
quelle
0

Ich bin ein Fan von SQL DBDiff , einem Open Source-Tool, mit dem Sie Tabellen, Ansichten, Funktionen, Benutzer usw. von zwei Instanzen von SQL Server-Datenbanken vergleichen und ein Änderungsskript zwischen der Quell- und der Zieldatenbank erstellen können.

Shridhar
quelle
0

Ich habe ein MssqlMerge- Dienstprogramm erstellt, mit dem Sie sowohl die Struktur als auch die Daten von MSSQL-Datenbanken vergleichen können. Es ist eine kostenlose Version verfügbar, mit der Tabellendefinitionen, Ansichten, gespeicherte Prozeduren und Funktionen verglichen werden können. Außerdem gibt es eine Pro-Version, die mehr Objekttypen unterstützt und über die Funktion "Abfrageergebnisvergleich" verfügt, mit der Sie Abfrageergebnisse, einschließlich Abfragen, mit Systemansichten ausführen und vergleichen können, um einige andere, nicht sofort verfügbare Details zu vergleichen.

sarh
quelle
-1

Überprüfen Sie dies heraus:

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

Bildbeschreibung hier eingeben

Jeremy Thompson
quelle
3
Es muss sich wirklich um einen Vergleich handeln, nicht nur um das Schema
Mark Sinkinson
Ich lasse es einfach hier, damit es anderen hilft. Es hat mir geholfen
Jeremy Thompson
-1

Ich benutze dieses kostenlose (und Open Source) Tool: OpenDBDiff

Tommy
quelle
-1

DBDiff ist dafür das beste Tool, das Sie hier finden .

Levisaligue
quelle
Willkommen bei den Datenbankadministratoren! Wie Sie sehen, sind alle gut erhaltenen Antworten hier mehr als nur ein Link . Bitte denken Sie daran, Ihre Antwort zu bearbeiten und weitere Informationen über die Software hinzuzufügen, insbesondere darüber, wie sie den Anforderungen in der Frage entspricht.
Glorfindel