Como criar uma tabela de validação de dados em Data Warehouse
Vamos criar uma tabela de validação de dados em Data Warehouse para registar regras violadas durante as cargas ETL/ELT. Isto é útil para rastrear erros, facilitar correções e melhorar a qualidade dos dados ao longo do tempo.
Pré-requisitos
- Ambiente de Data Warehouse (ex.: SQL Server, Azure Synapse, Amazon Redshift) com permissões para criar tabelas.
- Padrão simples de ETL/ELT (ex.: Azure Data Factory, SSIS, dbt) para invocar validações.
- Conhecimentos básicos de SQL e do formato das tabelas de origem e destino.
Passo 1: Definir o propósito e as regras de validação
Antes de criar a tabela, defina que tipos de validações quer registar. Exemplos comuns: valores nulos indevidos, tipos inválidos, intervalos fora do esperado, chaves duplicadas e referências a dimensões inexistentes. Escolha campos importantes para diagnosticar o erro (ex.: source_system, table_name, row_key, column_name, error_code, error_message).
Passo 2: Criar a estrutura da tabela de validação
Crie uma tabela central para armazenar eventos de validação. A tabela deve ser compacta mas informativa: inclua timestamps, identificadores de linha da origem e contexto da carga (batch_id ou run_id).
CREATE TABLE validation_errors (
validation_id BIGINT IDENTITY(1,1) PRIMARY KEY,
run_id VARCHAR(100) NOT NULL,
source_system VARCHAR(100),
table_name VARCHAR(100),
row_key VARCHAR(500),
column_name VARCHAR(100),
error_code VARCHAR(50),
error_message VARCHAR(1000),
detected_at DATETIME2 DEFAULT SYSUTCDATETIME(),
severity VARCHAR(20) DEFAULT 'warning'
);
Adapte tipos e tamanhos conforme o seu Data Warehouse. Em ambientes columnar (ex.: Redshift, Synapse dedicated SQL pool) pode ajustar tipos para compressão.
Passo 3: Implementar validações no pipeline ETL/ELT
Implemente as regras na etapa de transformação. Em ETL tradicional (SSIS) ou em ELT (SQL após load), use queries que identifiquem linhas inválidas e façam um INSERT para a tabela de validação em vez de bloquear a carga inteira.
-- Exemplo SQL para detectar nulos indevidos e inserir na tabela de validação
DECLARE @run_id VARCHAR(100) = 'run_20261104_01';
INSERT INTO validation_errors (run_id, source_system, table_name, row_key, column_name, error_code, error_message, severity)
SELECT
@run_id,
'syst_x',
'stg_clientes',
CAST(id AS VARCHAR(500)),
'email',
'NULL_EMAIL',
'Email não pode ser nulo',
'error'
FROM stg_clientes
WHERE email IS NULL;
Para validações de integridade referencial, faça LEFT JOINs e registe linhas sem correspondência:
-- Exemplo: FK para dimensão de país
INSERT INTO validation_errors (run_id, source_system, table_name, row_key, column_name, error_code, error_message)
SELECT
@run_id, 'syst_x', 'stg_clientes', CAST(c.id AS VARCHAR(500)), 'country_code', 'FK_MISSING_COUNTRY', 'Código de país não existe na dimensão'
FROM stg_clientes c
LEFT JOIN dim_country d ON c.country_code = d.country_code
WHERE c.country_code IS NOT NULL AND d.country_code IS NULL;
Passo 4: Classificar e gerir os erros
Use o campo severity para distinguir 'error' (impede carga de destino) e 'warning' (carrega-se mas regista-se). Pode automatizar alertas quando existirem erros críticos: enviar e-mail, criar ticket ou bloquear a promoção do dataset para produção.
-- Exemplo simples: contar erros críticos antes de proceder à carga final
IF EXISTS (SELECT 1 FROM validation_errors WHERE run_id = @run_id AND severity = 'error')
BEGIN
THROW 50001, 'Existem erros críticos. Parar processo de carga.', 1;
END
Passo 5: Enriquecer a tabela com métricas e histórico
Inclua colunas adicionais se precisar de análise posterior: resolved_by, resolved_at, note. Crie vistas ou relatórios no Power BI para monitorizar tendências de erros por run, por tabela ou por tipo de erro.
ALTER TABLE validation_errors
ADD resolved_by VARCHAR(100), resolved_at DATETIME2, note VARCHAR(2000);
Verificar o resultado
Para confirmar, execute queries de verificação: conte erros por run_id, veja exemplos de linhas reportadas e teste cenários que gerem erros conhecidos. Exemplos:
-- Contagem por severidade
SELECT severity, COUNT(*) as cnt FROM validation_errors WHERE run_id = 'run_20261104_01' GROUP BY severity;
-- Exemplos de erros
SELECT TOP 20 * FROM validation_errors WHERE run_id = 'run_20261104_01' ORDER BY detected_at DESC;
Conclusão
Uma tabela de validação de dados em Data Warehouse permite monitorizar e resolver problemas de qualidade sem interromper todo o pipeline. Próximos passos: automatizar alertas, criar dashboards no Power BI e adicionar rotinas de correção automática para erros recorrentes. Dica: comece com poucas regras essenciais e vá aumentando conforme aprende quais erros impactam mais.