In der akzeptierten Antwort auf dieser Serverfault-Seite sollten Sie einige nützliche Informationen finden:https://serverfault.com/questions/65407/best-tool-to-migrate-a-postgresql-database-to-ms-sql- 2005.
Wenn Sie das Schema ohne die Daten konvertieren können, können Sie möglicherweise die Schritte für die Daten verkürzen, indem Sie diesen Befehl verwenden:
pg_dump --data-only --column-inserts your_db_name > data_load_script.sql
Dieser Ladevorgang wird ziemlich langsam sein, aber die --column-inserts
Die Option generiert die generischsten INSERT-Anweisungen, die für jede Datenzeile möglich sind, und sollte kompatibel sein.
BEARBEITEN:Vorschläge zum Konvertieren des Schemas folgen:
Ich würde damit beginnen, das Schema zu sichern, aber alles zu entfernen, was mit Eigentum oder Berechtigungen zu tun hat. Das sollte reichen:
pg_dump --schema-only --no-owner --no-privileges your_db_name > schema_create_script.sql
Bearbeiten Sie diese Datei, um die Zeile BEGIN TRANSACTION;
hinzuzufügen an den Anfang und ROLLBACK TRANSACTION;
bis zum Ende. Jetzt können Sie es laden und in einem Abfragefenster in SQL Server ausführen. Wenn Sie Fehler erhalten, stellen Sie sicher, dass Sie zum Ende der Datei gehen, markieren Sie die ROLLBACK-Anweisung und führen Sie sie aus (indem Sie F5 drücken, während die Anweisung hervorgehoben ist).
Grundsätzlich muss man jeden Fehler beheben, bis das Skript sauber durchläuft. Dann können Sie die ROLLBACK TRANSACTION
ändern zu COMMIT TRANSACTION
und ein letztes Mal ausführen.
Leider kann ich Ihnen nicht helfen, welche Fehler Sie möglicherweise sehen, da ich noch nie von PostgreSQL zu SQL Server gewechselt bin, nur umgekehrt. Einige Dinge, von denen ich jedoch erwarten würde, dass sie ein Problem darstellen (offensichtlich keine vollständige Liste):
- PostgreSQL inkrementiert Felder automatisch, indem es einen
NOT NULL INTEGER
verknüpft Feld zu einerSEQUENCE
mit einemDEFAULT
. In SQL Server ist dies eineIDENTITY
Spalte, aber sie sind nicht genau dasselbe. Ich bin mir nicht sicher, ob sie gleichwertig sind, aber wenn Ihr ursprüngliches Schema voller "id"-Felder ist, könnten Sie in Schwierigkeiten geraten. Ich weiß nicht, ob SQL ServerCREATE SEQUENCE
hat , daher müssen Sie diese möglicherweise entfernen. - Datenbankfunktionen/gespeicherte Prozeduren werden nicht zwischen RDBMS-Plattformen übersetzt. Sie müssen alle
CREATE FUNCTION
entfernen Anweisungen und übersetzen die Algorithmen manuell. - Achten Sie auf die Codierung der Datendatei. Ich bin ein Linux-Benutzer, daher habe ich keine Ahnung, wie die Codierung in Windows überprüft wird, aber Sie müssen sicherstellen, dass das, was SQL Server erwartet, mit der Datei übereinstimmt, die Sie aus PostgreSQL importieren.
pg_dump
hat eine Option--encoding=
Damit können Sie eine bestimmte Codierung festlegen. Ich meine mich zu erinnern, dass Windows dazu neigt, Zwei-Byte-UTF-16-Codierung für Unicode zu verwenden, wo PostgreSQL UTF-8 verwendet. Ich hatte ein Problem beim Wechsel von SQL Server zu PostgreSQL aufgrund der UTF-16-Ausgabe, also wäre es eine Recherche wert. - Der PostgreSQL-Datentyp
TEXT
ist einfach einVARCHAR
ohne maximale Länge. In SQL ServerTEXT
ist ... kompliziert (und veraltet). Jedes Feld in Ihrem ursprünglichen Schema, das alsTEXT
deklariert ist muss auf einen geeigneten SQL Server-Datentyp überprüft werden. - SQL Server hat zusätzliche Datentypen für
UNICODE
Daten. Kenne mich da nicht gut genug aus um Vorschläge zu machen. Ich weise nur darauf hin, dass es ein Problem sein könnte.