(+351) 21 24 10006  ·  info@bconcepts.pt
Carnaxide, Lisboa

Como validar e sincronizar esquemas em SQL Server: passo a passo

João Barros 08 de September de 2026 6 min de leitura

Validação e sincronização de esquemas em SQL Server ajuda a garantir que duas bases de dados (por exemplo desenvolvimento e produção) têm tabelas, colunas e tipos coerentes. Isto evita erros de deploy e falhas em aplicações que esperem um esquema específico.

Pré-requisitos

  • SQL Server (versão compatível com sys.columns e INFORMATION_SCHEMA)
  • Permissões de leitura nas duas bases de dados a comparar
  • SQL Server Management Studio (SSMS) ou outra ferramenta SQL

Passo 1: Porque comparar esquemas e que diferenças procurar

Antes de sincronizar é importante perceber o que pode diferir: tabelas em falta, colunas em falta, tipos de dados diferentes, nulabilidade diferente, ou colunas extra. Validar evita alterações destrutivas e ajuda a planear scripts de migração.

Passo 2: Criar uma vista de comparação básica entre duas bases

Vamos construir uma consulta que liste tabelas e colunas de cada base usando INFORMATION_SCHEMA. Substitua db_origem e db_destino pelos nomes reais.

-- Ajuste db_origem e db_destino para os nomes reais das bases
DECLARE @db_origem SYSNAME = 'db_origem';
DECLARE @db_destino SYSNAME = 'db_destino';

SELECT
  o.TABLE_SCHEMA AS schema_origem,
  o.TABLE_NAME AS table_origem,
  o.COLUMN_NAME AS column_origem,
  o.DATA_TYPE AS type_origem,
  o.IS_NULLABLE AS nullable_origem,
  d.TABLE_SCHEMA AS schema_destino,
  d.TABLE_NAME AS table_destino,
  d.COLUMN_NAME AS column_destino,
  d.DATA_TYPE AS type_destino,
  d.IS_NULLABLE AS nullable_destino
FROM
  (SELECT * FROM [db_origem].INFORMATION_SCHEMA.COLUMNS) o
FULL OUTER JOIN
  (SELECT * FROM [db_destino].INFORMATION_SCHEMA.COLUMNS) d
ON
  o.TABLE_SCHEMA = d.TABLE_SCHEMA
  AND o.TABLE_NAME = d.TABLE_NAME
  AND o.COLUMN_NAME = d.COLUMN_NAME
ORDER BY COALESCE(o.TABLE_SCHEMA,d.TABLE_SCHEMA), COALESCE(o.TABLE_NAME,d.TABLE_NAME), COALESCE(o.ORDINAL_POSITION, d.ORDINAL_POSITION);

Passo 3: Identificar diferenças importantes

Com a consulta anterior, procure:

  • Registos onde column_origem IS NULL → tabela/coluna só na base destino.
  • Registos onde column_destino IS NULL → só na base origem.
  • Registos onde type_origem <> type_destino ou nulabilidade difere → incompatibilidades.

Passo 4: Gerar script de sincronização para tabelas/colunas em falta

Exemplo de geração automática de ADD COLUMN na base destino para colunas que existem na origem e faltam na destino. Rever manualmente antes de executar.

DECLARE @db_origem SYSNAME = 'db_origem';
DECLARE @db_destino SYSNAME = 'db_destino';

SELECT
  'ALTER TABLE [' + c.TABLE_SCHEMA + '].[' + c.TABLE_NAME + '] ADD [' + c.COLUMN_NAME + '] ' +
    UPPER(c.DATA_TYPE) +
    CASE WHEN c.CHARACTER_MAXIMUM_LENGTH IS NOT NULL AND c.DATA_TYPE LIKE '%char%' THEN '(' +
      CASE WHEN c.CHARACTER_MAXIMUM_LENGTH = -1 THEN 'MAX' ELSE CAST(c.CHARACTER_MAXIMUM_LENGTH AS VARCHAR(10)) END +
    ')' ELSE '' END +
    CASE WHEN c.COLUMN_DEFAULT IS NOT NULL THEN ' DEFAULT ' + c.COLUMN_DEFAULT ELSE '' END +
    CASE WHEN c.IS_NULLABLE = 'NO' THEN ' NOT NULL' ELSE ' NULL' END AS add_column_sql
FROM
  [db_origem].INFORMATION_SCHEMA.COLUMNS c
LEFT JOIN
  [db_destino].INFORMATION_SCHEMA.COLUMNS d
  ON c.TABLE_SCHEMA = d.TABLE_SCHEMA AND c.TABLE_NAME = d.TABLE_NAME AND c.COLUMN_NAME = d.COLUMN_NAME
WHERE d.COLUMN_NAME IS NULL
ORDER BY c.TABLE_SCHEMA, c.TABLE_NAME, c.ORDINAL_POSITION;

Passo 5: Tratar tipos incompatíveis e NULL/NOT NULL

Para diferenças de tipo ou nulabilidade, não automatize cegamente. Gere um relatório e depois planeie alterações seguras: criar uma coluna nova com o tipo correcto, copiar dados com CAST/CONVERT, testar, depois eliminar a antiga e renomear.

-- Exemplo de abordagem para mudar tipo: criar nova coluna, copiar e substituir
ALTER TABLE [schema].[tabela] ADD [col_nova] VARCHAR(100) NULL;
UPDATE [schema].[tabela] SET [col_nova] = CAST([col_antiga] AS VARCHAR(100));
-- Verificar integridade
ALTER TABLE [schema].[tabela] DROP COLUMN [col_antiga];
EXEC sp_rename '[schema].[tabela].[col_nova]', 'col_antiga', 'COLUMN';

Passo 6: Automatizar verificação regular com job

Crie um SQL Server Agent Job que execute a consulta de comparação e envie resultados por e‑mail ou grave numa tabela de auditoria. Assim deteta divergências antes que se tornem problemas em produção.

-- Exemplo simplificado: inserir diferenças numa tabela de auditoria
IF OBJECT_ID('dbo.SchemaDiffAudit') IS NULL
CREATE TABLE dbo.SchemaDiffAudit (
  AuditDate DATETIME2, TableSchema SYSNAME, TableName SYSNAME, ColumnName SYSNAME, Issue NVARCHAR(200)
);

INSERT INTO dbo.SchemaDiffAudit (AuditDate, TableSchema, TableName, ColumnName, Issue)
SELECT GETDATE(), COALESCE(o.TABLE_SCHEMA,d.TABLE_SCHEMA), COALESCE(o.TABLE_NAME,d.TABLE_NAME),
  COALESCE(o.COLUMN_NAME,d.COLUMN_NAME),
  CASE
    WHEN o.COLUMN_NAME IS NULL THEN 'Only in dest'
    WHEN d.COLUMN_NAME IS NULL THEN 'Only in origin'
    WHEN o.DATA_TYPE <> d.DATA_TYPE THEN 'Type mismatch: ' + o.DATA_TYPE + ' vs ' + d.DATA_TYPE
    WHEN o.IS_NULLABLE <> d.IS_NULLABLE THEN 'Nullability mismatch'
    ELSE 'Other'
  END
FROM [db_origem].INFORMATION_SCHEMA.COLUMNS o
FULL OUTER JOIN [db_destino].INFORMATION_SCHEMA.COLUMNS d
ON o.TABLE_SCHEMA = d.TABLE_SCHEMA AND o.TABLE_NAME = d.TABLE_NAME AND o.COLUMN_NAME = d.COLUMN_NAME
WHERE o.COLUMN_NAME IS NULL OR d.COLUMN_NAME IS NULL OR o.DATA_TYPE <> d.DATA_TYPE OR o.IS_NULLABLE <> d.IS_NULLABLE;

Verificar o resultado

Reveja a saída das consultas: a lista deve mostrar apenas diferenças reais. Após executar scripts de sincronização, volte a correr a comparação — o número de discrepâncias deverá cair para zero. Teste as aplicações dependentes para garantir que não há regressões.

Conclusão

Comparar e sincronizar esquemas em SQL Server reduz riscos em deploys e mantém coesão entre ambientes. Próximos passos: criar backups antes de alterações, testar em ambiente de staging e integrar a verificação no processo CI/CD. Dica: validar sempre manualmente os scripts gerados automaticamente antes de os executar em produção.