Monalisa
Migrations e seeds

SQL congelado

Todo SQL escrito à mão que uma migration carrega é imutável depois do merge, e o CI confere por sha256.

Algumas migrations não trazem o SQL inline: elas leem um arquivo .sql no momento em que são aplicadas. Se esse arquivo fosse editado depois do merge, um banco novo receberia a versão nova e todo banco que já rodou a migration ficaria com a antiga, sem aviso. Por isso a regra:

SQL escrito à mão que uma migration carrega fica congelado depois do merge. Uma mudança posterior vai num arquivo novo, carregado por uma migration nova.

Todo arquivo congelado começa com a linha:

-- FROZEN once merged: later changes go in a new file loaded by a new migration.

Os arquivos fixados

apps/migrator/migrations/frozen-sql.json fixa o sha256 de cada arquivo carregado por uma migration. Hoje são 16:

ArquivoCarregado por
packages/<domínio>/src/schema/constraints.sql (11 arquivos, um por domínio)0001 a 0011, a primeira migration de cada domínio
packages/authorization/src/schema/scope-ceiling.sql0012_authorization-scope-ceiling
packages/authorization/src/schema/permission-scope-guard.sql0013_authorization-permission-scope-guard
apps/migrator/migrations/0015_idempotency.sql0015_idempotency
apps/migrator/migrations/0016_work.sql0016_work
packages/authorization/src/schema/scope-ceiling-locks.sql0017_authorization-scope-ceiling-locks

Alguns constraints.sql são intencionalmente vazios (só comentários), quando tudo do domínio é expresso pelas entities; eles continuam fixados.

O que o migrations:check recusa

  • um arquivo carregado cujo sha256 difere do fixado (editado);
  • um arquivo carregado sem entrada no frozen-sql.json (não fixado);
  • uma entrada que não corresponde a nenhum arquivo carregado (obsoleta).

Fixe o arquivo novo no mesmo commit que adiciona a migration que o carrega.

Exemplo: a correção de concorrência do teto de escopo

A checagem do teto de escopo, criada em 0012, lia as linhas sem lock e podia ser furada por duas transações concorrentes (NOVA-112). A correção não tocou em scope-ceiling.sql: ela é o arquivo novo scope-ceiling-locks.sql, carregado pela migration nova 0017_authorization-scope-ceiling-locks, que faz CREATE OR REPLACE das funções com as mesmas assinaturas. Detalhes em Teto de escopo.

Nesta página