Ответ 1
Я считаю, что вы, возможно, получили пониженные голоса из-за удивительной легкости создания простого SQL script из PostgreSQL, который может (теоретически) запускаться снова практически в любой СУБД. Если вы являетесь обычным пользователем PostgreSQL, это звучит как немой вопрос.
Это не справедливо, так как выясняется, что это на самом деле умеренно трудная проблема (хотя больше из-за нечетного синтаксиса и интерфейса SQL Server, чем любой отказ PostgreSQL).
Вы должны найти полезную информацию в принятом ответе на этой странице 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
Эта загрузка будет довольно медленной, но опция --column-inserts
генерирует самые общие инструкции INSERT для каждой строки данных и должна быть совместимой.
EDIT: Предложения по преобразованию схемы следует:
Я начал бы сбрасывать схему, но удаляя все, что связано с правами собственности или правами. Этого должно быть достаточно:
pg_dump --schema-only --no-owner --no-privileges your_db_name > schema_create_script.sql
Отредактируйте этот файл, чтобы добавить строку BEGIN TRANSACTION;
в начало и ROLLBACK TRANSACTION;
до конца. Теперь вы можете загрузить его и запустить в окне запроса на SQL Server. Если вы получите какие-либо ошибки, убедитесь, что вы переместились в нижнюю часть файла, выделите инструкцию ROLLBACK и запустите ее (нажав F5, когда вы подсвечиваете оператор).
В принципе, вы должны разрешить каждую ошибку до тех пор, пока script не пройдет чисто. Затем вы можете изменить ROLLBACK TRANSACTION
на COMMIT TRANSACTION
и выполнить одно последнее время.
К сожалению, я не могу помочь, с какими ошибками вы можете видеть, поскольку я никогда не переходил от PostgreSQL к SQL Server, только наоборот. Некоторые вещи, которые я ожидал бы быть проблемой, однако (очевидно, НЕ полный список):
- PostgreSQL выполняет автоматическое увеличение полей путем привязки поля
NOT NULL INTEGER
кSEQUENCE
с помощьюDEFAULT
. В SQL Server это столбецIDENTITY
, но они не совсем то же самое. Я не уверен, что они эквивалентны, но если ваша исходная схема заполнена полями "id", у вас могут быть проблемы. Я не знаю, имеет ли SQL ServerCREATE SEQUENCE
, поэтому вам, возможно, придется удалить их. - Функции базы данных/Хранимые процедуры не переводятся между платформами РСУБД. Вам нужно будет удалить любые инструкции
CREATE FUNCTION
и перевести алгоритмы вручную. - Соблюдайте осторожность при кодировании файла данных. Я человек Linux, поэтому я понятия не имею, как проверить кодировку в Windows, но вам нужно убедиться, что ожидаемый SQL Server такой же, как файл, который вы импортируете из PostgreSQL.
pg_dump
имеет опцию--encoding=
, которая позволит вам установить конкретную кодировку. Я, кажется, помню, что Windows имеет тенденцию использовать двухбайтную кодировку UTF-16 для Unicode, где PostgreSQL использует UTF-8. У меня возникла проблема с SQL Server на PostgreSQL из-за вывода UTF-16, поэтому было бы интересно исследовать. - Тип данных PostgreSQL
TEXT
- это простоVARCHAR
без максимальной длины. В SQL ServerTEXT
является... сложным (и устаревшим). Каждое поле в исходной схеме, объявленное какTEXT
, должно быть просмотрено для соответствующего типа данных SQL Server. - SQL Server имеет дополнительные типы данных для данных
UNICODE
. Я недостаточно знаком с этим, чтобы делать предложения. Я просто указываю, что это может быть проблемой.