Software para comprobaciones de integridad de datos (lógicos) en la base de datos

Estoy buscando una herramienta de verificación de integridad de datos que me permita especificar reglas con las que escanea una base de datos en busca de inconsistencias lógicas.

Fondo:

Tenemos una gran aplicación donde la integridad de los datos se mantiene en el código: por ejemplo, no hay activadores en la base de datos para eliminaciones en cascada.
Debido a cosas como abortos de programas, fallas en las actualizaciones, errores en el código, etc., los datos pueden corromperse.

Me gustaría tener una herramienta separada para verificar errores lógicos/inconsistencias en los datos, especificando reglas como:

  • Los valores en el campo deben ser completados

  • Los valores de los campos son obligatorios

  • Los valores de campo deben estar en un rango constante [X..Y]

  • Los valores de campo deben coincidir con una expresión regular

  • Todos los valores para el campo X deben ser únicos

O relaciones 'a través de la mesa':

  • Los valores de campo deben estar dentro del rango especificado por el campo X de la tabla T al campo Y de la tabla T

  • Los valores en el campo X de la tabla T deben provenir del campo Y de la tabla S

  • El campo X en la tabla T debe ser más grande que el campo Y en la tabla T

No estoy hablando de los programas que la mayoría de los DBMS ya tienen y que verifican las estructuras internas de los archivos, la corrupción del índice, etc. (por ejemplo, la Tarea de verificación de integridad de la base de datos que puede usar en un plan de mantenimiento para SQL Server), quiero verificar si hay errores lógicos .

Requisitos:

  • Múltiples DBMS, solo tendría que especificar un tipo de base de datos/ubicación/inicio de sesión. Firebird, MSSQL, Oracle son imprescindibles.

  • Ejecutando bajo Windows

  • Gratis estaría bien

Está buscando una herramienta de extracción, transformación y carga. Podría sugerir Talend ( talend.com/resource/free-etl.html ) ya que he escuchado cosas buenas sobre él pero no tengo experiencia con él. Microsoft tiene SSIS; Definitivamente no es gratis pero es muy poderoso. Es compatible con muchos tipos de bases de datos. Hay muchos otros. Cada herramienta tiene la capacidad de especificar restricciones en los datos, ya que son esenciales para extraer y transformar datos correctamente.
¿Qué pasa con el uso de restricciones en las bases de datos para evitar que los errores ingresen a la base de datos en primer lugar? La mayor parte de su lista se puede prevenir en la fuente. El uso de transacciones (que, de nuevo, son ampliamente compatibles con las bases de datos) puede ser de gran ayuda contra los abortos de programas, por ejemplo. Mi sugerencia principal sería tratar de corregir los errores y mejorar el manejo de errores en la aplicación, si es posible.

Respuestas (2)

Agregaría restricciones a su dba como se dijo anteriormente. Por supuesto, si sus datos no se ajustan a la restricción, tendrá que actualizar los registros para obtener los datos en la forma correcta. Identificar los datos que son inconsistentes con los requisitos del negocio no es suficiente. Debe arreglar el diccionario de datos con restricciones y luego agregar disparadores. Integre los complicados requisitos comerciales en el código.

Teóricamente tienes razón, pero el problema aquí es que aún podrían ser insuficientes. Este es un software de larga duración en el que se tomó la decisión de salvaguardar la integridad del código. Me refiero principalmente a las bases de datos de desarrollo donde el código se rompe todo el tiempo o el desarrollador aborta las pruebas. Rara vez tenemos clientes con datos corruptos, es solo que a veces nos topamos con datos de prueba no válidos durante el desarrollo (con una base de datos en constante cambio).
Y para añadir: cuidado con los gatillos; utilizados incorrectamente, podrían resultar contraproducentes (tuve un cliente con ese mismo caso, casi bloqueándose a sí mismo con un mecanismo de activación que finalmente "cerraba el círculo" volviendo a sí mismo).

Sugeriría usar Python y un script simple usando la interfaz de base de datos adecuada:

#!/usr/bin/python

import MySQLdb

# Open database connection
db = MySQLdb.connect("localhost","testuser","test123","TESTDB" # You will need your real DB details here
                    )

# prepare a cursor object using cursor() method
cursor = db.cursor()

# Prepare SQL query to get records from the database.
sql = "SELECT * FROM EMPLOYEE"  # for example
try:
   # Execute the SQL command
   cursor.execute(sql)
   # Fetch a row in a list.
   for row in cursor.fetchone():
      # Put your checks here with Failure set to the results!
      if Failure:
          # Now print fetched result
          print "some details that identify the record that failed e.g.: %s, %s" % \
             (row[0], row[1])
except:
   print "Error: unable to fetch data"

# disconnect from server
db.close()
  • Gratis
  • Puede interactuar con varios backends de bases de datos
  • Plataforma cruzada
  • Sus cheques pueden ser tan simples o tan complicados como necesite.
  • Mucha ayuda web, libros y ejemplos
  • Una vez que esté satisfecho de que esté funcionando desde su máquina local, podría transferirse al servidor y ejecutarse todas las noches desde un trabajo cron.
Gracias, pero "he estado allí, he hecho eso". Soy programador de profesión y ya había creado una aplicación rudimentaria hace unos años; es demasiado trabajo de esa manera ;-)