U zou wat nuttige informatie moeten kunnen vinden in het geaccepteerde antwoord op deze Serverfault-pagina:https://serverfault.com/questions/65407/best-tool-to-migrate-a-postgresql-database-to-ms-sql- 2005.
Als u het schema kunt laten converteren zonder de gegevens, kunt u de stappen voor de gegevens mogelijk verkorten met deze opdracht:
pg_dump --data-only --column-inserts your_db_name > data_load_script.sql
Dit laden zal vrij langzaam zijn, maar de --column-inserts
optie genereert de meest generieke INSERT-instructies die mogelijk zijn voor elke rij met gegevens en zou compatibel moeten zijn.
EDIT:Suggesties voor het converteren van het schema volgen:
Ik zou beginnen met het dumpen van het schema, maar alles verwijderen dat te maken heeft met eigendom of machtigingen. Dit zou genoeg moeten zijn:
pg_dump --schema-only --no-owner --no-privileges your_db_name > schema_create_script.sql
Bewerk dit bestand om de regel BEGIN TRANSACTION;
. toe te voegen naar het begin en ROLLBACK TRANSACTION;
naar het einde. Nu kunt u het laden en uitvoeren in een queryvenster in SQL Server. Als u fouten krijgt, ga dan naar de onderkant van het bestand, markeer de ROLLBACK-instructie en voer deze uit (door op F5 te drukken terwijl de instructie is gemarkeerd).
Kortom, u moet elke fout oplossen totdat het script netjes is uitgevoerd. Dan kunt u de ROLLBACK TRANSACTION
. wijzigen om COMMIT TRANSACTION
en ren nog een laatste keer.
Helaas kan ik niet helpen met welke fouten je kunt zien, aangezien ik nooit van PostgreSQL naar SQL Server ben gegaan, alleen andersom. Sommige dingen waarvan ik zou verwachten dat ze een probleem zouden zijn (uiteraard GEEN uitputtende lijst):
- PostgreSQL verhoogt automatisch velden door een
NOT NULL INTEGER
te koppelen veld naar eenSEQUENCE
met behulp van eenDEFAULT
. In SQL Server is dit eenIDENTITY
kolom, maar ze zijn niet precies hetzelfde. Ik weet niet zeker of ze gelijkwaardig zijn, maar als je oorspronkelijke schema vol is met "id"-velden, kun je problemen krijgen. Ik weet niet of SQL ServerCREATE SEQUENCE
heeft , dus het kan zijn dat u deze moet verwijderen. - Databasefuncties/opgeslagen procedures vertalen niet tussen RDBMS-platforms. Je moet alle
CREATE FUNCTION
. verwijderen instructies en vertaal de algoritmen handmatig. - Wees voorzichtig met het coderen van het gegevensbestand. Ik ben een Linux-persoon, dus ik heb geen idee hoe ik de codering in Windows moet verifiëren, maar je moet ervoor zorgen dat wat SQL Server verwacht hetzelfde is als het bestand dat je importeert uit PostgreSQL.
pg_dump
heeft een optie--encoding=
waarmee u een specifieke codering kunt instellen. Ik meen me te herinneren dat Windows de neiging heeft om UTF-16-codering van twee bytes voor Unicode te gebruiken, terwijl PostgreSQL UTF-8 gebruikt. Ik had een probleem om van SQL Server naar PostgreSQL te gaan vanwege de UTF-16-uitvoer, dus het zou het onderzoeken waard zijn. - Het PostgreSQL-gegevenstype
TEXT
is gewoon eenVARCHAR
zonder maximale lengte. In SQL Server,TEXT
is... ingewikkeld (en verouderd). Elk veld in uw oorspronkelijke schema dat is gedeclareerd alsTEXT
moet worden gecontroleerd op een geschikt SQL Server-gegevenstype. - SQL Server heeft extra datatypes voor
UNICODE
gegevens. Ik ben er niet bekend genoeg mee om suggesties te doen. Ik wijs er alleen op dat het een probleem kan zijn.