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.