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 enSEQUENCE
med enDEFAULT
. I SQL Server är detta enIDENTITY
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 harCREATE 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 enVARCHAR
utan maxlängd. I SQL Server,TEXT
är... komplicerat (och föråldrat). Varje fält i ditt ursprungliga schema som deklareras somTEXT
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.