Você deve encontrar algumas informações úteis na resposta aceita nesta página do Serverfault:https://serverfault.com/questions/65407/best-tool-to-migrate-a-postgresql-database-to-ms-sql- 2005.
Se você conseguir converter o esquema sem os dados, poderá encurtar as etapas para os dados usando este comando:
pg_dump --data-only --column-inserts your_db_name > data_load_script.sql
Este carregamento será bastante lento, mas o
--column-inserts
A opção gera as instruções INSERT mais genéricas possíveis para cada linha de dados e deve ser compatível. EDIT:Seguem sugestões sobre como converter o esquema:
Eu começaria despejando o esquema, mas removendo qualquer coisa que tenha a ver com propriedade ou permissões. Isso deve ser suficiente:
pg_dump --schema-only --no-owner --no-privileges your_db_name > schema_create_script.sql
Edite este arquivo para adicionar a linha
BEGIN TRANSACTION;
para o início e ROLLBACK TRANSACTION;
até o fim. Agora você pode carregá-lo e executá-lo em uma janela de consulta no SQL Server. Se você receber algum erro, certifique-se de ir até o final do arquivo, destacar a instrução ROLLBACK e executá-la (pressionando F5 enquanto a instrução estiver destacada). Basicamente, você precisa resolver cada erro até que o script seja executado de forma limpa. Então você pode alterar a
ROLLBACK TRANSACTION
para COMMIT TRANSACTION
e execute uma última vez. Infelizmente, não posso ajudar com quais erros você pode ver, pois nunca passei do PostgreSQL para o SQL Server, apenas o contrário. Algumas coisas que eu esperaria serem um problema, no entanto (obviamente, NÃO uma lista exaustiva):
- O PostgreSQL faz auto-incremento de campos vinculando um
NOT NULL INTEGER
campo para umaSEQUENCE
usando umDEFAULT
. No SQL Server, esta é umaIDENTITY
coluna, mas eles não são exatamente a mesma coisa. Não tenho certeza se eles são equivalentes, mas se seu esquema original estiver cheio de campos "id", você pode ter alguns problemas. Não sei se o SQL Server temCREATE SEQUENCE
, então talvez seja necessário removê-los. - Funções de banco de dados/procedimentos armazenados não traduzem entre plataformas RDBMS. Você precisará remover qualquer
CREATE FUNCTION
instruções e traduza os algoritmos manualmente. - Tenha cuidado com a codificação do arquivo de dados. Eu sou uma pessoa do Linux, então não tenho ideia de como verificar a codificação no Windows, mas você precisa ter certeza de que o que o SQL Server espera é o mesmo que o arquivo que você está importando do PostgreSQL.
pg_dump
tem uma opção--encoding=
que permitirá que você defina uma codificação específica. Parece que o Windows tende a usar a codificação UTF-16 de dois bytes para Unicode, onde o PostgreSQL usa UTF-8. Eu tive alguns problemas ao passar do SQL Server para o PostgreSQL devido à saída UTF-16, então valeria a pena pesquisar. - O tipo de dados PostgreSQL
TEXT
é simplesmente umVARCHAR
sem comprimento máximo. No SQL Server,TEXT
é... complicado (e obsoleto). Cada campo em seu esquema original declarado comoTEXT
precisará ser revisado para um tipo de dados apropriado do SQL Server. - O SQL Server tem tipos de dados extras para
UNICODE
dados. Eu não estou familiarizado o suficiente com ele para fazer sugestões. Estou apenas apontando que pode ser um problema.