PostgreSQL
 sql >> Datenbank >  >> RDS >> PostgreSQL

Wie migriere ich eine PostgreSQL-Datenbank in eine SQLServer-Datenbank?

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 einer SEQUENCE mit einem DEFAULT . In SQL Server ist dies eine IDENTITY 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 Server CREATE 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 ein VARCHAR ohne maximale Länge. In SQL Server TEXT ist ... kompliziert (und veraltet). Jedes Feld in Ihrem ursprünglichen Schema, das als TEXT 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.