Caso de estudo: a base de dados Northwind da Microsoft, do Access 97 para SQL e para o browser
A Northwind é a base de dados de exemplo que a Microsoft distribuía com o Access. Usámos uma cópia pública (formato Access 97) para mostrar, num ficheiro que qualquer pessoa pode verificar, como levamos um programa Access para uma base de dados moderna sem perder uma linha nem alterar um valor. Não há nenhum cliente por trás desta página: as empresas e as pessoas da Northwind são fictícias.

Ponto de partida
- Um ficheiro Access 97 de 2932 KB: 9 tabelas com 4032 linhas, 22 consultas guardadas (três com parâmetros e uma de tabela de referência cruzada), 13 relatórios e 21 formulários.
- Imagens guardadas como objetos OLE, que só o Access consegue mostrar.
- Regras de negócio repartidas entre propriedades dos campos, relações e as consultas por trás dos relatórios.
O que fizemos
- Dados. Todas as tabelas e todas as linhas passaram para um novo esquema relacional, entregue como base de dados SQLite e como scripts PostgreSQL, com chaves primárias e estrangeiras, índices, e as regras de validação do Access transformadas em restrições da base de dados. As 17 imagens passaram a ficheiros PNG, píxel a píxel.
- Consultas. As 22 consultas guardadas passaram a vistas SQL com os mesmos nomes, nas duas bases de dados, juntamente com os cálculos usados pelos relatórios: totais das encomendas após desconto, valores das faturas, vendas por categoria e por ano.
- Prova. Testes automáticos comparam o ficheiro original com as novas bases de dados: número de linhas e uma soma de verificação de cada linha em cada tabela, e o resultado completo de cada consulta, 855 execuções ao todo, verificadas de quatro formas (SQL do Access sobre o ficheiro original, um modelo independente, PostgreSQL e o browser).
- Aplicação. Uma aplicação web sobre a base de dados migrada, que corre inteiramente no browser: encomendas com totais em tempo real, clientes, artigos, fornecedores, funcionários, um painel e os relatórios originais, prontos a imprimir.
Resultados da execução
- 9/9
- tabelas idênticas, linha a linha
- 22/22
- consultas com resultados idênticos (855 execuções)
- 17/17
- tentativas de violar uma regra recusadas pela base de dados
- 1 265 793,02 $
- valor das 2155 linhas de encomenda, igual em SQLite, PostgreSQL e no browser
Duas diferenças, ambas intencionais
O Access calcula as linhas de encomenda em vírgula flutuante binária e guarda os descontos como números aproximados (15% fica guardado como 0,15000000596). Em 18 das 2155 linhas de encomenda, cujo valor exato cai em meio cêntimo, isto altera o resultado em um cêntimo. As novas bases de dados guardam percentagens exatas e arredondam da mesma forma em todo o lado; o total geral muda 0,16 $. Todas as linhas afetadas estão listadas no relatório.
148 valores de texto perderam um espaço a mais no fim ou uma quebra de linha à moda antiga. Um deles era o país Suécia, guardado uma vez com um espaço no fim, que de outro modo contaria como um país diferente.
O que os testes encontraram pelo caminho
O UCanAccess, uma ferramenta muito usada para ler ficheiros Access a partir de Java, lê a coluna de desconto deste ficheiro Access 97 como número inteiro: os 838 descontos passam todos a zero. As verificações das tabelas detetaram-no, e o relatório explica como comparámos dados equivalentes. O texto SQL que o Jackcess reconstrói também omite o TOP 10 de uma consulta; lemo-lo nas tabelas de sistema do ficheiro.
A aplicação carrega a base de dados de 1116 KB no seu browser, com SQLite compilado para WebAssembly. As suas alterações ficam no separador e um botão repõe os dados originais.