Software für (logische) Datenintegritätsprüfungen in Datenbanken

Ich suche nach einem Tool zur Überprüfung der Datenintegrität, mit dem ich Regeln festlegen kann, mit denen eine Datenbank auf logische Inkonsistenzen gescannt wird.

Hintergrund:

Wir haben eine große Anwendung, bei der die Datenintegrität im Code aufrechterhalten wird: Es gibt zB keine Trigger in der Datenbank für kaskadierende Löschungen.
Durch Dinge wie Programmabbrüche, fehlgeschlagene Updates, Fehler im Code usw. können Daten beschädigt werden.

Ich hätte gerne ein separates Tool, um nach logischen Fehlern/Inkonsistenzen in den Daten zu suchen und Regeln anzugeben wie:

  • Werte im Feld müssen ausgefüllt werden

  • Feldwerte sind erforderlich

  • Feldwerte müssen im konstanten Bereich [X..Y] liegen

  • Feldwerte müssen mit einem regulären Ausdruck übereinstimmen

  • Alle Werte für Feld X müssen eindeutig sein

Oder tabellenübergreifende Beziehungen:

  • Feldwerte müssen im Bereich liegen, der durch Feld X aus Tabelle T bis Feld Y aus Tabelle T angegeben ist

  • Die Werte im Feld X der Tabelle T sollten aus dem Feld Y der Tabelle S stammen

  • Feld X in Tabelle T muss größer sein als Feld Y in Tabelle T

Ich spreche nicht von den Programmen, die die meisten DBMS bereits haben und die interne Dateistrukturen, Indexbeschädigungen usw. prüfen (z. B. die Aufgabe „Datenbankintegrität prüfen“ , die Sie in einem Wartungsplan für SQL Server verwenden können), ich möchte auf logische Fehler prüfen .

Anforderungen:

  • Mehrere DBMSs, ich müsste nur einen Datenbanktyp/Speicherort/Login angeben. Firebird, MSSQL, Oracle sind ein Muss.

  • Läuft unter Windows

  • Kostenlos wäre schön

Sie suchen nach einem Tool zum Extrahieren, Transformieren und Laden. Ich könnte Talend ( talend.com/resource/free-etl.html ) vorschlagen, da ich Gutes darüber gehört habe, aber keine Erfahrung damit habe. Microsoft hat SSIS; definitiv nicht kostenlos, aber sehr mächtig. Es unterstützt viele Datenbanktypen. Es gibt viele andere. Jedes Tool kann Einschränkungen für die Daten festlegen, da diese für das ordnungsgemäße Extrahieren und Transformieren von Daten unerlässlich sind.
Was ist mit der Verwendung von Einschränkungen in den DBs, um zu verhindern, dass die Fehler überhaupt in die Datenbank gelangen? Die meisten Ihrer Liste können an der Quelle verhindert werden. Die Verwendung von Transaktionen (die wiederum von vielen DBs unterstützt werden) kann beispielsweise sehr gegen Programmabbrüche helfen. Mein wichtigster Vorschlag wäre, wenn möglich, zu versuchen, die Fehler zu beheben und die Fehlerbehandlung in der App zu verbessern

Antworten (2)

Ich würde wie oben gesagt Einschränkungen zu Ihrem dba hinzufügen. Wenn Ihre Daten der Einschränkung nicht entsprechen, müssen Sie die Datensätze natürlich aktualisieren, um die Daten in der richtigen Form zu erhalten. Es reicht nicht aus, die Daten zu identifizieren, die nicht mit den Geschäftsanforderungen übereinstimmen. Sie müssen das Datenwörterbuch mit Einschränkungen korrigieren und dann Trigger hinzufügen. Bauen Sie die komplizierten Geschäftsanforderungen in den Code ein.

Theoretisch hast du Recht, aber das Problem hier ist, dass diese immer noch unzureichend sein könnten. Dies ist eine langlebige Software, bei der die Wahl getroffen wurde, die Integrität im Code zu schützen. Ich spreche hauptsächlich von den Entwicklungsdatenbanken, wo ständig Code kaputt geht oder der Entwickler Tests abbricht. Wir haben selten Kunden mit beschädigten Daten, es ist nur so, dass wir während der Entwicklung manchmal auf ungültige Testdaten stoßen (mit einer sich ständig ändernden Datenbank).
Und um hinzuzufügen: Vorsicht mit Triggern; Bei falscher Verwendung könnten sie nach hinten losgehen (ich hatte einen Kunden mit genau diesem Fall, der sich fast mit einem Auslösemechanismus festgefahren hat, der schließlich "den Kreis schließt", der zu sich selbst zurückkehrt).

Ich würde vorschlagen, Python und ein einfaches Skript mit der entsprechenden Datenbankschnittstelle zu verwenden:

#!/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()
  • Frei
  • Kann mit einer Reihe von Datenbank-Backends verbunden werden
  • Plattformübergreifend
  • Ihre Kontrollen können so einfach oder so kompliziert sein, wie Sie es brauchen.
  • Viele Web-Hilfen, Bücher und Beispiele
  • Sobald Sie zufrieden sind, dass es von Ihrem lokalen Computer aus funktioniert, kann es einfach auf den Server portiert und jede Nacht von einem Chron-Job ausgeführt werden.
Danke, aber "gewesen, getan". Ich bin von Beruf Programmierer und hatte vor ein paar Jahren schon mal eine rudimentäre App gebaut - das ist einfach zu viel Arbeit ;-)