如何将PostgreSQL数据库迁移到SQLServer数据库?

Hut*_*ut8 49 database sql-server migration postgresql

我有一个PostgreSQL数据库,我想转移到SQL Server - 架构和数据.我很穷,所以我不想付钱.我也很懒,所以我不想做很多工作.目前我正在按表格进行此表,并且有大约100个表要做.这非常乏味.

是否有某种技巧可以满足我的需求?

Mat*_*ood 51

您应该能够在此Serverfault页面中的已接受答案中找到一些有用的信息:https://serverfault.com/questions/65407/best-tool-to-migrate-a-postgresql-database-to-ms-sql- 2005年.

如果您可以在没有数据的情况下转换模式,则可以使用以下命令缩短数据的步骤:

pg_dump --data-only --column-inserts your_db_name > data_load_script.sql
Run Code Online (Sandbox Code Playgroud)

此加载速度非常慢,但该--column-inserts选项会为每行数据生成最通用的INSERT语句,并且应该是兼容的.

编辑:有关转换架构的建议如下:

我将首先转储模式,但删除任何与所有权或权限有关的内容.这应该足够了:

pg_dump --schema-only --no-owner --no-privileges your_db_name > schema_create_script.sql
Run Code Online (Sandbox Code Playgroud)

编辑此文件以将行添加BEGIN TRANSACTION;到开头和ROLLBACK TRANSACTION;结尾.现在,您可以加载它并在SQL Server的查询窗口中运行它.如果出现任何错误,请确保转到文件的底部,突出显示ROLLBACK语句并运行它(通过在突出显示语句时按F5).

基本上,您必须解决每个错误,直到脚本干净地运行.然后你可以改变ROLLBACK TRANSACTIONto COMMIT TRANSACTION并运行最后一次.

不幸的是,我无法帮助您看到哪些错误,因为我从未从PostgreSQL转到SQL Server,只是反过来.然而,有些事情我会期望成为一个问题(显然,不是一个详尽的清单):

  • PostgreSQL通过将字段链接NOT NULL INTEGERSEQUENCE使用a 来自动增加字段DEFAULT.在SQL Server中,这是一个IDENTITY列,但它们并不完全相同.我不确定它们是否相同,但如果你的原始模式充满了"id"字段,那么你可能会遇到麻烦.我不知道SQL Server是否有CREATE SEQUENCE,所以你可能不得不删除它们.
  • 数据库函数/存储过程不在RDBMS平台之间转换.您需要删除任何CREATE FUNCTION语句并手动翻译算法.
  • 注意数据文件的编码.我是Linux用户,所以我不知道如何在Windows中验证编码,但是你需要确保SQL Server所期望的与从PostgreSQL导入的文件相同. pg_dump有一个选项--encoding=,可以让您设置特定的编码.我似乎记得Windows倾向于对Unicode使用两字节UTF-16编码,其中PostgreSQL使用UTF-8.由于UTF-16输出,我从SQL Server到PostgreSQL有一些问题所以值得研究.
  • PostgreSQL数据类型TEXT只是VARCHAR没有最大长度.在SQL Server中,TEXT是......复杂(并且已弃用).声明为原始模式中的每个字段TEXT都需要针对相应的SQL Server数据类型进行检查.
  • SQL Server具有额外的数据数据类型UNICODE.我不太熟悉它提出建议.我只是指出这可能是一个问题.