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:
| Arquivo | Carregado 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.sql | 0012_authorization-scope-ceiling |
packages/authorization/src/schema/permission-scope-guard.sql | 0013_authorization-permission-scope-guard |
apps/migrator/migrations/0015_idempotency.sql | 0015_idempotency |
apps/migrator/migrations/0016_work.sql | 0016_work |
packages/authorization/src/schema/scope-ceiling-locks.sql | 0017_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.