PostgreSQL
 sql >> Base de données >  >> RDS >> PostgreSQL

Comment migrer une base de données PostgreSQL vers une base SQLServer ?

Vous devriez pouvoir trouver des informations utiles dans la réponse acceptée sur cette page Serverfault :https://serverfault.com/questions/65407/best-tool-to-migrate-a-postgresql-database-to-ms-sql- 2005.

Si vous pouvez convertir le schéma sans les données, vous pourrez peut-être raccourcir les étapes pour les données en utilisant cette commande :

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

Ce chargement sera assez lent, mais le --column-inserts L'option génère les instructions INSERT les plus génériques possibles pour chaque ligne de données et doit être compatible.

EDIT :les suggestions sur la conversion du schéma sont les suivantes :

Je commencerais par vider le schéma, mais en supprimant tout ce qui a à voir avec la propriété ou les autorisations. Cela devrait suffire :

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

Modifiez ce fichier pour ajouter la ligne BEGIN TRANSACTION; au début et ROLLBACK TRANSACTION; jusqu'à la fin. Vous pouvez maintenant le charger et l'exécuter dans une fenêtre de requête dans SQL Server. Si vous obtenez des erreurs, assurez-vous d'aller au bas du fichier, mettez en surbrillance l'instruction ROLLBACK et exécutez-la (en appuyant sur F5 pendant que l'instruction est en surbrillance).

Fondamentalement, vous devez résoudre chaque erreur jusqu'à ce que le script s'exécute proprement. Ensuite, vous pouvez modifier le ROLLBACK TRANSACTION pour COMMIT TRANSACTION et exécutez une dernière fois.

Malheureusement, je ne peux pas vous aider avec les erreurs que vous pouvez voir car je ne suis jamais passé de PostgreSQL à SQL Server, seulement l'inverse. Cependant, je m'attendrais à ce que certaines choses soient un problème (évidemment, PAS une liste exhaustive):

  • PostgreSQL incrémente automatiquement les champs en liant un NOT NULL INTEGER champ à une SEQUENCE en utilisant un DEFAULT . Dans SQL Server, il s'agit d'un IDENTITY colonne, mais ce n'est pas exactement la même chose. Je ne sais pas s'ils sont équivalents, mais si votre schéma d'origine est rempli de champs "id", vous risquez d'avoir des problèmes. Je ne sais pas si SQL Server a CREATE SEQUENCE , vous devrez donc peut-être les supprimer.
  • Les fonctions de base de données/procédures stockées ne sont pas traduites entre les plates-formes RDBMS. Vous devrez supprimer toute CREATE FUNCTION instructions et traduisez les algorithmes manuellement.
  • Faites attention à l'encodage du fichier de données. Je suis une personne Linux, donc je ne sais pas comment vérifier l'encodage dans Windows, mais vous devez vous assurer que ce que SQL Server attend est le même que le fichier que vous importez depuis PostgreSQL. pg_dump a une option --encoding= qui vous permettra de définir un encodage spécifique. Il me semble me rappeler que Windows a tendance à utiliser le codage UTF-16 à deux octets pour Unicode, là où PostgreSQL utilise UTF-8. J'ai eu un problème pour passer de SQL Server à PostgreSQL en raison de la sortie UTF-16, il vaudrait donc la peine de faire des recherches.
  • Le type de données PostgreSQL TEXT est simplement un VARCHAR sans longueur max. Dans SQL Server, TEXT est... compliqué (et obsolète). Chaque champ de votre schéma d'origine déclaré comme TEXT devra être examiné pour un type de données SQL Server approprié.
  • SQL Server a des types de données supplémentaires pour UNICODE Les données. Je ne le connais pas assez pour faire des suggestions. Je signale simplement que cela peut poser problème.