sql >> Database teknologi >  >> RDS >> PostgreSQL

Hvordan migrerer man en PostgreSQL-database til en SQLServer-database?

Du burde være i stand til at finde nogle nyttige oplysninger i det accepterede svar på denne Serverfault-side:https://serverfault.com/questions/65407/best-tool-to-migrate-a-postgresql-database-to-ms-sql- 2005.

Hvis du kan få skemaet konverteret uden dataene, kan du muligvis forkorte trinene for dataene ved at bruge denne kommando:

pg_dump --data-only --column-inserts your_db_name > data_load_script.sql

Denne indlæsning vil være ret langsom, men --column-inserts option genererer de mest mulige generiske INSERT-sætninger for hver række data og bør være kompatible.

EDIT:Forslag til konvertering af skemaet følger:

Jeg ville starte med at dumpe skemaet, men fjerne alt, der har med ejerskab eller tilladelser at gøre. Dette burde være nok:

pg_dump --schema-only --no-owner --no-privileges your_db_name > schema_create_script.sql

Rediger denne fil for at tilføje linjen BEGIN TRANSACTION; til begyndelsen og ROLLBACK TRANSACTION; til slutningen. Nu kan du indlæse den og køre den i et forespørgselsvindue i SQL Server. Hvis du får nogen fejl, skal du sørge for at gå til bunden af ​​filen, fremhæve ROLLBACK-sætningen og køre den (ved at trykke på F5, mens sætningen er fremhævet).

Dybest set skal du løse hver fejl, indtil scriptet kører rent igennem. Derefter kan du ændre ROLLBACK TRANSACTION til COMMIT TRANSACTION og kør en sidste gang.

Jeg kan desværre ikke hjælpe med hvilke fejl du kan se, da jeg aldrig er gået fra PostgreSQL til SQL Server, kun omvendt. Nogle ting, som jeg dog ville forvente var et problem (selvfølgelig IKKE en udtømmende liste):

  • PostgreSQL øger automatisk felter ved at linke et NOT NULL INTEGER felt til en SEQUENCE ved hjælp af en DEFAULT . I SQL Server er dette en IDENTITY kolonne, men de er ikke helt det samme. Jeg er ikke sikker på, om de er ækvivalente, men hvis dit originale skema er fyldt med "id"-felter, kan du få nogle problemer. Jeg ved ikke, om SQL Server har CREATE SEQUENCE , så du skal muligvis fjerne dem.
  • Databasefunktioner/lagrede procedurer oversættes ikke mellem RDBMS-platforme. Du skal fjerne enhver CREATE FUNCTION udsagn og oversæt algoritmerne manuelt.
  • Vær forsigtig med kodningen af ​​datafilen. Jeg er en Linux-person, så jeg aner ikke, hvordan man verificerer kodning i Windows, men du skal sikre dig, at det, SQL Server forventer, er det samme som den fil, du importerer fra PostgreSQL. pg_dump har en mulighed --encoding= som vil lade dig indstille en specifik kodning. Jeg synes at huske, at Windows har en tendens til at bruge to-byte, UTF-16-kodning til Unicode, hvor PostgreSQL bruger UTF-8. Jeg havde et problem med at gå fra SQL Server til PostgreSQL på grund af UTF-16 output, så det ville være værd at undersøge.
  • PostgreSQL-datatypen TEXT er simpelthen en VARCHAR uden max længde. I SQL Server, TEXT er ... kompliceret (og forældet). Hvert felt i dit originale skema, der er erklæret som TEXT skal gennemgås for en passende SQL Server-datatype.
  • SQL-serveren har ekstra datatyper til UNICODE data. Jeg er ikke bekendt nok med det til at komme med forslag. Jeg påpeger bare, at det kan være et problem.


  1. Stærke referencemarkører med tabelbaseret postdatatype

  2. Opdeling af afgrænsede værdier i en SQL-kolonne i flere rækker

  3. Installation af PostgreSQL på Ubuntu til Ruby on Rails

  4. Sådan aktiveres den langsomme forespørgselslog i MySQL