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?
quelle
Antworten:
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...CREATE
Anweisungen 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 .
quelle
Jeder Tisch? Dies ist absichtlicher Vandalismus oder Dummheit. Es ist kein SQL Server-Problem
Es gibt mindestens drei Möglichkeiten:
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:
Bearbeiten: schlecht gestaltete Trigger oder FKs können mehrere Tabellen ziemlich schnell löschen
quelle