sql >> Databasteknik >  >> RDS >> PostgreSQL

Hur migrerar man en PostgreSQL-databas till en SQLServer-databas?

Du bör kunna hitta en del användbar information i det accepterade svaret på denna Serverfault-sida:https://serverfault.com/questions/65407/best-tool-to-migrate-a-postgresql-database-to-ms-sql- 2005.

Om du kan få schemat konverterat utan data kan du kanske förkorta stegen för data genom att använda det här kommandot:

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

Denna laddning kommer att vara ganska långsam, men --column-inserts alternativet genererar de mest generiska INSERT-satser som är möjliga för varje rad med data och bör vara kompatibla.

EDIT:Förslag på att konvertera schemat följer:

Jag skulle börja med att dumpa schemat, men ta bort allt som har med ägande eller behörighet att göra. Detta borde räcka:

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

Redigera den här filen för att lägga till raden BEGIN TRANSACTION; till början och ROLLBACK TRANSACTION; till slutet. Nu kan du ladda den och köra den i ett frågefönster i SQL Server. Om du får några fel, se till att du går till botten av filen, markerar ROLLBACK-satsen och kör den (genom att trycka på F5 medan satsen är markerad).

I grund och botten måste du lösa varje fel tills skriptet körs igenom rent. Sedan kan du ändra ROLLBACK TRANSACTION till COMMIT TRANSACTION och kör en sista gång.

Tyvärr kan jag inte hjälpa till med vilka fel du kan se då jag aldrig har gått från PostgreSQL till SQL Server, bara tvärtom. Vissa saker som jag förväntar mig är ett problem, dock (uppenbarligen INTE en uttömmande lista):

  • PostgreSQL ökar fält automatiskt genom att länka ett NOT NULL INTEGER till en SEQUENCE med en DEFAULT . I SQL Server är detta en IDENTITY kolumn, men de är inte exakt samma sak. Jag är inte säker på om de är likvärdiga, men om ditt ursprungliga schema är fullt av "id"-fält kan du få problem. Jag vet inte om SQL Server har CREATE SEQUENCE , så du kanske måste ta bort dem.
  • Databasfunktioner/Lagrade procedurer översätts inte mellan RDBMS-plattformar. Du måste ta bort eventuell CREATE FUNCTION satser och översätt algoritmerna manuellt.
  • Var försiktig med kodningen av datafilen. Jag är en Linux-person, så jag har ingen aning om hur man verifierar kodning i Windows, men du måste se till att vad SQL Server förväntar sig är detsamma som filen du importerar från PostgreSQL. pg_dump har ett alternativ --encoding= som låter dig ställa in en specifik kodning. Jag tycks komma ihåg att Windows brukar använda UTF-16-kodning på två byte för Unicode där PostgreSQL använder UTF-8. Jag hade problem med att gå från SQL Server till PostgreSQL på grund av UTF-16-utgång så det skulle vara värt att undersöka.
  • PostgreSQL-datatypen TEXT är helt enkelt en VARCHAR utan maxlängd. I SQL Server, TEXT är... komplicerat (och föråldrat). Varje fält i ditt ursprungliga schema som deklareras som TEXT kommer att behöva granskas för en lämplig SQL Server-datatyp.
  • SQL Server har extra datatyper för UNICODE data. Jag är inte tillräckligt bekant med det för att komma med förslag. Jag påpekar bara att det kan vara ett problem.


  1. SQL Server Operativsystem fel 5:5 (Åtkomst nekas.)

  2. Hur man distribuerar applikationer med SQL Server-databas på klienter

  3. Speciella öar

  4. TO_TIMESTAMP_TZ() Funktion i Oracle