sql >> Database >  >> RDS >> PostgreSQL

Hoe een PostgreSQL-database migreren naar een SQLServer-database?

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 een SEQUENCE met behulp van een DEFAULT . In SQL Server is dit een IDENTITY 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 Server CREATE 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 een VARCHAR zonder maximale lengte. In SQL Server, TEXT is... ingewikkeld (en verouderd). Elk veld in uw oorspronkelijke schema dat is gedeclareerd als TEXT 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.


  1. Multi-DC PostgreSQL:een stand-byknooppunt instellen op een andere geografische locatie via een VPN

  2. PDO-ondersteuning voor meerdere zoekopdrachten (PDO_MYSQL, PDO_MYSQLND)

  3. Wizard Importeren/Exporteren gebruiken in SQL Server - SQL Server / TSQL-zelfstudie, deel 104

  4. Oracle SQL:gebruik volgorde in insert met Select Statement