Das SQL Server-Schema ist intakt, aber jeder Datensatz aus jeder Tabelle ist verschwunden

7

Wir haben kürzlich eine neue virtuelle Maschine unter Windows Server 2008 eingerichtet und eine Kopie von SQL Server 2005 darauf geklatscht. Der Server lief ungefähr zwei Wochen lang ohne Probleme. Die einzige wirkliche Wartung, die wir daran vorgenommen haben, besteht darin, die Partition zu verschieben, in der sich die Datenbankdateien befanden (vor fast einer Woche durchgeführt), und wir haben den Database Engine Tuning Advisor ausgeführt, um gestern gegen 12:00 Uhr einige Vorschläge für neue Indizes zu prüfen.

Kurz nach 17 Uhr, während die Software wie gewohnt verwendet wurde, teilte mir jemand mit, dass das Programm nicht mehr richtig zu funktionieren schien. Ich überprüfte die Datenbank und nicht nur, dass Daten, die für seine Verwendung des Programms spezifisch waren, verschwunden waren, sondern jede Tabelle mit etwa fünfzig Tabellen schien von allen Datensätzen gelöscht zu sein.

Nach ausführlichen Gesprächen mit den Anwendungsentwicklern wurde klar, dass dies keine entfernt mögliche Funktion ihrer Software ist.

In dem Kampf, um wieder auf die Beine zu kommen, haben wir zwischen dem Neustart ein Backup der VM über die laufende Kopie geklont, und seitdem läuft sie seit ungefähr einem Tag fünf Mal. Folglich haben wir keine Protokolle der Ereignisse, die zum Problem selbst geführt haben.

Haben Sie so etwas schon einmal gesehen? (Alle Datensätze in allen Tabellen einer Datenbank sind gerade ... verschwunden.) Hat jemand eine vernünftige Theorie darüber, wie dies geschehen könnte und was wäre, wenn irgendetwas ein vernünftiges Maß an Prävention wäre?

Kaganar
quelle
Haben Sie Fremdschlüssel zwischen Tabellen?
gbn
Die Anwendung verwendet keine Fremdschlüssel, also nein, nicht.
Kaganar
3
Wie können Sie die referenzielle Integrität besser aufrechterhalten, als dies mit dem RDBMS möglich ist?
gbn
Zu Ihrer Information, die Anwendung ist leider nicht direkt unter meiner Kontrolle und es ist unwahrscheinlich, dass sich aufgrund meiner direkten Anfragen innerhalb von Monaten Änderungen ergeben - eine lange Zeit mit solchen potenziellen Datenverlustproblemen.
Kaganar
Angenommen, diese Anwendung wurde nicht für ein solides Datenmodell codiert. Es ist eine Hydra im Umgang mit Daten - einige auf einer gemeinsamen Dateifreigabe, die meisten auf einem MSSQL-Server und einige in einer festplattenbasierten relationalen Datenbank. Leider ist es Nischensoftware und es macht bestimmte Dinge sehr gut.
Kaganar

Antworten:

14

Dies geschah in meiner Firma.

Jemand hat die Schemas zur Schemaerstellung über die Administrationsoberfläche der Anwendung erneut ausgeführt - so etwas wie ein Befehl "Datenbank initialisieren". Diese Skripte enthielten eine Reihe von IF EXISTS()...DROP...CREATEAnweisungen zum Löschen und Neuerstellen jeder Tabelle und Einschränkung. Da sie so konzipiert waren, dass sie eine Datenbank löschen, auch wenn sie bereits gefüllt war, wurden sie sorgfältig strukturiert, um Fremdschlüsselbeziehungen zu berücksichtigen. Somit war das Datenbankschema vorhanden und sah gut aus, aber alle Daten waren weg.

Um dies zu verhindern, widerrufen Sie die entsprechenden DDL-Berechtigungen aus der Datenbankanmeldung der App, nachdem sie ein eigenes Schema erstellt hat, oder stellen Sie sicher, dass alle Funktionen zum "Initialisieren der Datenbank" Ihrer Anwendung mehrere Sicherheitsüberprüfungen enthalten und den Benutzer entsprechend warnen, was passieren wird .

Nick Chammas
quelle
1
Beängstigend, aber eine wahrscheinliche Erklärung.
Mark Storey-Smith
@Mark - Zum Glück war es eine QS-Datenbank, in der keine kritischen Daten gespeichert waren.
Nick Chammas
11

Jeder Tisch? Dies ist absichtlicher Vandalismus oder Dummheit. Es ist kein SQL Server-Problem

Es gibt mindestens drei Möglichkeiten:

  • LÖSCHEN ohne WHERE-Klausel
  • TRUNCATE TABLE
  • DROP TABLE mit CREATE TABLE nach

Wenn Sie Fremdschlüssel haben, ist es unmöglich, TRUNCATE TABLE zu verwenden, und es ist schwieriger, DELETE zu verwenden. Sie müssten mehrere DELETE-Durchgänge haben. Das Gleiche gilt für DROP / CREATE TABLE

Ein LÖSCHEN ohne WHERE ist mit Ihrer App ganz einfach. Es verwendet dynamisches SQL, und einige WHERE-Logik wird mit NULL-Verkettung entfernt.

DROP / CREATE und TRUNCATE TABLE erfordern ebenfalls sehr hohe Berechtigungen.

Zusammenfassung. Eine oder mehrere von:

  • schlechte Sicherheit
  • Keine Fremdschlüssel
  • schlecht informierte Entwickler

Bearbeiten: schlecht gestaltete Trigger oder FKs können mehrere Tabellen ziemlich schnell löschen

gbn
quelle
5
Ein möglicher vierter Weg: Wenn Fremdschlüssel vorhanden sind und diese mit einer 'on delete cascade'-Klausel erstellt wurden, kann das Löschen (ohne Datenbank-Klausel) aus der falschen Tabelle (abhängig vom Datenbankdesign) die gesamte Datenbank bereinigen. Ich würde die Zusammenfassung für diese "Fremdschlüssel mit schlechtem Design" nennen.
Gsiems