
Porque la mejor forma de detectar basura en tus datos… es preguntárselo directamente a la base de datos.
1. Detectar campos obligatorios vacíos:
SELECT COUNT(*)
FROM beneficiarios
WHERE nombre IS NULL OR apellido IS NULL;
Campos obligatorios… que mágicamente se vuelven opcionales en la carga.
2. Fechas imposibles:
SELECT *
FROM registros
WHERE fecha_registro < TO_DATE(‘2000-01-01′,’YYYY-MM-DD’)
OR fecha_registro > SYSDATE;
¿Clientes registrados antes de que existiera el sistema? Revisión urgente.
3. Edades inconsistentes con la fecha de nacimiento:
SELECT id, fecha_nacimiento, edad_calculada
FROM personas
WHERE edad_calculada <> FLOOR(MONTHS_BETWEEN(SYSDATE, fecha_nacimiento)/12);
Si tu edad calculada no cuadra con la fecha de nacimiento… sospecha.
4. Detectar valores “basura” :
SELECT COUNT(*)
FROM encuestas
WHERE respuesta IN (‘999’, ‘NS/NC’, ‘NO SABE’, ‘NA’);
Porque el ‘999’ no debería sumarse al promedio de satisfacción.
5. Duplicados sospechosos:
SELECT dni, COUNT(*)
FROM beneficiarios
GROUP BY dni
HAVING COUNT(*) > 1;
Especialmente útil cuando no tienes una PK real.
Variación por fila exacta duplicada:
SELECT *
FROM (
SELECT *, COUNT(*) OVER (PARTITION BY *) AS duplicados
FROM tabla
)
WHERE duplicados > 1;
6. Auditar accesos a datos sensibles:
BEGIN
DBMS_FGA.ADD_POLICY(
object_schema => ‘DATOS’,
object_name => ‘PERSONAS’,
policy_name => ‘audita_dni’,
audit_condition => ‘dni IS NOT NULL’,
audit_column => ‘dni’,
handler_schema => NULL,
handler_module => NULL,
enable => TRUE
);
END;
Ideal para entornos donde necesitas saber quién consultó qué y cuándo.
7. Códigos inválidos o no normalizados:
SELECT DISTINCT genero
FROM personas
WHERE genero NOT IN (‘M’,’F’,’NB’);
¿Cuántas formas tienes de escribir “femenino”? Demasiadas.
8. Tiempos negativos en procesos:
SELECT *
FROM citas
WHERE fecha_fin < fecha_inicio;
El tiempo negativo es un clásico del Excel sin validaciones.
9. Anomalías por volumen:
SELECT COUNT(*)
FROM transacciones
WHERE fecha >= SYSDATE – 1;
¿Un millón de registros en un solo día? Revisa si alguien duplicó la carga.
10. Auditar cambios en parámetros sensibles:
— Revisión de privilegios
SELECT *
FROM UNIFIED_AUDIT_TRAIL
WHERE action_name IN (‘GRANT’, ‘REVOKE’)
AND object_name = ‘USUARIOS_SENSIBLES’;
¿Alguien le dio CREATE PROCEDURE a un usuario de pruebas? Enterarte después no sirve.
Estas sentencias no son complicadas. Lo complicado es decidir ejecutarlas antes del desastre y ójala alguien me lo hubiera planteado antes de empezar algunos proyectos.
Comentarios recientes