Como você deve saber, o Microsoft SQL Server é um RDBMS muito popular com licenciamento altamente restritivo e alto custo de propriedade se o banco de dados for de tamanho significativo ou for usado por um número significativo de clientes. Ele fornece uma interface muito amigável e fácil de aprender. Isso resultou em uma grande base de usuários instalada.
PostgreSQL é o banco de dados de código aberto mais avançado do mundo. A comunidade PostgreSQL é muito forte e aprimora continuamente os recursos existentes e implementa novos recursos. De acordo com o ranking de popularidade do db-engine, o PostgreSQL foi o DBMS do ano de 2017.
Por que migrar do MS SQL Server para o PostgreSQL?
- O MS SQL Server é um banco de dados proprietário da Microsoft, enquanto o PostgreSQL é desenvolvido e mantido por uma comunidade global de desenvolvedores de código aberto. Se o custo for um problema, então definitivamente você deve usar o PostgreSQL. Você pode verificar os preços aqui.
- PostgreSQL é um mecanismo de banco de dados multiplataforma e está disponível para Windows, Mac, Solaris, FreeBSD e Linux, enquanto o SQL Server é executado apenas no sistema operacional Windows. Como você deve saber, o PostgreSQL é de código aberto e totalmente gratuito, enquanto o custo do MSSQL Server depende do número de usuários e do tamanho do banco de dados.
- Licenciamento flexível de código aberto e fácil disponibilidade de provedores de nuvem pública como AWS, Google Cloud etc.
- Aproveite os complementos de código aberto para melhorar o desempenho.
O que você deve saber
Embora o banco de dados Microsoft SQL Server e o banco de dados PostgreSQL sejam compatíveis com ANSI-SQL, ainda há diferenças entre sua sintaxe SQL, tipos de dados, diferenciação de maiúsculas e minúsculas e isso torna a transferência de dados não tão trivial.
Antes da migração, entenda as diferenças entre MSSQL e PostgreSQL. Existem muitos recursos em ambos os bancos de dados, portanto, você deve conhecer o comportamento desses recursos/funções no MSSQL e no PostgreSQL. Verifique algumas diferenças importantes que você deve saber antes da migração.
Mapeamento de tipo de dados
Alguns dos tipos de dados do MSSQL não correspondem diretamente aos tipos de dados do PostgreSQL, portanto, você precisa alterá-los para o tipo de dados do PostgreSQL correspondente.
Por favor, verifique a tabela abaixo.
Microsoft SQL Server | PostgreSQL | |
---|---|---|
GRANDE | inteiro de 64 bits | GRANDE |
BINÁRIO(n) | Cadeia de bytes de comprimento fixo | BYTEA |
BIT | 1, 0 ou NULL | BOOLEANO |
CHAR(n) | String de caracteres de comprimento fixo, 1 <=n <=8000 | CHAR(n) |
VARCHAR(n) | Sequência de caracteres de comprimento variável, 1 <=n <=8000 | VARCHAR(n) |
VARCHAR(max) | String de caracteres de comprimento variável, <=2 GB | TEXTO |
VARBINARY(n) | String de bytes de comprimento variável, 1 <=n <=8000 | BYTEA |
VARBINARY(max) | String de bytes de comprimento variável, <=2 GB | BYTEA |
NVARCHAR(n) | String Unicode UCS-2 de comprimento variável | VARCHAR(n) |
NVARCHAR(máx.) | Dados Unicode UCS-2 de comprimento variável, <=2 GB | TEXTO |
TEXTO | Dados de caracteres de comprimento variável, <=2 GB | TEXTO |
NTEXTO | Dados Unicode UCS-2 de comprimento variável, <=2 GB | TEXTO |
DUPLA PRECISÃO | Número de ponto flutuante de precisão dupla | DUPLA PRECISÃO |
FLOAT(p) | Número de ponto flutuante | DUPLA PRECISÃO |
INTEIRO | inteiro de 32 bits | INTEIRO |
NUMERIC(p,s) | Número de ponto fixo | NUMERIC(p,s) |
DATA | A data inclui ano, mês e dia | DATA |
DATETIME | Data e hora com fração | TIMESTAMP(3) |
DATETIME2(p) | Data e hora com fração | TIMESTAMP(n) |
DATETIMEOFFSET(p) | Data e hora com fração e fuso horário | TIMESTAMP(p) COM FUSO HORÁRIO |
SMALLDATETIME | Data e hora | TIMESTAMP(0) |
TINYINT | Inteiro sem sinal de 8 bits, 0 a 255 | SMALLINT |
IDENTIFICADOR ÚNICO | Dados GUID(UUID) de 16 bytes | CHAR(16) |
ROWVERSION | Dados binários atualizados automaticamente | BYTEA |
PEQUENO DINHEIRO | valor da moeda de 32 bits | DINHEIRO |
IMAGEM | Dados binários de comprimento variável, <=2 GB | BYTEA |
Incompatibilidades no MS SQL Server e PostgreSQL
Existem muitas incompatibilidades presentes no MS SQL Server e PostgreSQL, você pode ver algumas delas aqui. Você pode automatizá-los criando extensões para poder usar a função MS SQL Server como está no PostgreSQL e economizar seu tempo.
DATEPART
DATEPART deve ser substituído por DATE_PART no PostgreSQL.
Exemplo
MSSQL:
DATEPART( datepart , date )
PostgreSQL:
date_part( text , timestamp )
date_part( text , interval )
ISNULO
A função ISNULL deve ser substituída pela função COALESCE no PostgreSQL.
Exemplo
Servidor MS SQL:
ISNULL(exp, replacement)
PostgreSQL:
COALESCE(exp, replacement)
ESPAÇO
A função SPACE no MS SQL Server deve ser substituída pela função REPEAT no PostgreSQL.
Exemplo
Servidor MS SQL:
SPACE($n)
Onde $n é o número de espaços a serem retornados.
PostgreSQL:
REPEAT(‘ ’, $n)
DATAADD
O PostgreSQL não fornece a função DATEADD semelhante ao MS SQL Server, você pode usar aritmética de data e hora com literais de intervalo para obter os mesmos resultados.
Exemplo
Servidor MS SQL:
--Add 2 day to the current date
SELECT DATEADD(day, 2, GETDATE());
PostgreSQL:
--Add 2 day to the current date
SELECT CURRENT_DATE + INTERVAL ‘2 day’;
Concatenação de string
O MS SQL Server usa '+' para concatenação de strings, enquanto o PostgreSQL usa '||' para o mesmo.
Exemplo
Servidor MS SQL:
SELECT FirstName + LastName FROM employee;
PostgreSQL:
SELECT FirstName || LastName FROM employee;
CHARINDEX
Existe a função CHARINDEX no PostgreSQL. Você pode substituir esta função pela função POSITION equivalente do PostgreSQL.
Exemplo
Servidor MS SQL:
SELECT CHARINDEX('our', 'resource');
PostgreSQL:
SELECT POSITION('our' in 'resource');
GETDATA
A função GETDATE retorna a data e hora atuais. Não existe a função GETDATE no PostgreSQL, mas existe a função NOW() para o mesmo propósito. Se houver várias ocorrências da função GETDATE, você poderá automatizá-las usando extensão. Por favor, verifique como criar módulos usando extensão.
Exemplo
Servidor MS SQL:
SELECT GETDATE();
PostgreSQL:
SELECT NOW();
Ferramentas
Você pode usar algumas ferramentas para migrar o banco de dados MS SQL Server para o PostgreSQL. Por favor, teste a ferramenta antes de usá-la.
-
Pgloader
Você pode usar a ferramenta pgloader para migrar o banco de dados MS SQL para o PostgreSQL. Os comandos no pgloader carregam os dados do banco de dados MS SQL. O Pgloader suporta a descoberta automática do esquema, incluindo a construção dos índices, chaves primárias e restrições de chaves estrangeiras.
O Pgloader fornece várias regras de conversão que podem converter o tipo de dados MS SQL em um tipo de dados PostgreSQL.
-
Sqlserver2pgsql
Esta é outra ferramenta de migração de código aberto para converter o banco de dados Microsoft SQL Server em um banco de dados PostgreSQL, da forma mais automática possível. Sqlserver2pgsql é escrito em Perl.
A ferramenta Sqlserver2pgsql faz duas coisas:
- Ele converte um esquema do SQL Server em um esquema do PostgreSQL
- Ele pode produzir um jib do Pentaho Data Integrator (Kettle) para migrar todos os dados do SQL Server para o PostgreSQL. Esta é uma parte opcional.
Teste
Testar o aplicativo e o banco de dados migrado é muito importante porque algumas das funções são as mesmas nos dois bancos de dados, porém, o comportamento é diferente.
Alguns cenários comuns precisam ser verificados:
- Verifique se todos os objetos de banco de dados foram convertidos corretamente ou não.
- Verifique se o comportamento de todas as funções em DML está funcionando corretamente ou não.
- Carregue dados de amostra em ambos os bancos de dados e verifique o resultado de todas as consultas DML em ambos os bancos de dados. O resultado de todos os SQLs deve ser o mesmo.
- Verifique o desempenho do DML e melhore-o, se necessário.