Gibt es überhaupt eine Möglichkeit festzustellen, wer einen Tisch fallen gelassen hat?

8

Eine Tabelle in der Produktionsdatenbank ist "auf mysteriöse Weise" verschwunden.

Kennt jemand eine Möglichkeit zu diagnostizieren, was zum Teufel damit passiert ist? Und wer hat es getan?

Bearbeiten 1: Dies ist eine interne App mit schwacher Sicherheit. Alle Apps (außer meinen natürlich ;-) sind anfällig für SQL Injection, aber unsere Benutzer sind sehr unkompliziert und der Tabellenname war nicht sofort offensichtlich, daher glaube ich nicht, dass es sich um eine SQL Injection handelte (nicht) dass es darauf ankommt ... irgendwie über den Rahmen der Frage hinaus).

Edit 2: Auch nur ein FYI; Diese Tabelle gibt es schon seit langer Zeit, daher wurde sie bei einer Wiederherstellung nicht "rückgängig gemacht".

John MacIntyre
quelle
Du meinst, der "Not Me" -Geist hat dich auch erwischt?
Nick DeVore
Haben Sie separate Datenbankkonten für alle oder melden sich alle als "dba" oder gleichwertig an?
@ Zerofiz-Wir verwenden Windows Integrated Security, sodass ja jeder Benutzer identifiziert werden kann.
John MacIntyre
Ich bin auf diesen Blog gestoßen , der Schritt für Schritt erklärt, wer die Tabelle gelöscht hat . Dbarepublic.com/2015/01/who-dropped-table.html .

Antworten:

14

Möglicherweise können Sie die Informationen mithilfe der Funktion undokumentiert :: fn_dblog, die Protokolldatensätze interpretiert, aus dem Protokoll abrufen. Ich bin gerade dabei, eine Disaster Recovery-Klasse zu unterrichten, aber wenn Sie 2-3 Stunden warten können, werde ich veröffentlichen, wie es für Sie geht - sollte auch in der Lage sein, den Benutzernamen zu erhalten, ohne Tools kaufen zu müssen ( Ich habe im Jahr 2000 eine Tonne im Protokoll herumgespielt, als ich eine Reihe des internen Protokollanalysecodes geschrieben habe, den DBCC CHECKDB im Jahr 2000 verwendet hat.

[Bearbeitet, um Anweisungen einzuschließen] Ok - Unterricht beendet und ich habe einen Blog-Beitrag erstellt, um Ihnen zu zeigen, wie Sie das Protokoll in den Jahren 2000, 2005 und 2008 analysieren können, um herauszufinden, wann die Tabelle gelöscht wurde und wer es getan hat. Überprüfen Sie meinen Blog-Beitrag unter Herausfinden, wer eine Tabelle mithilfe des Transaktionsprotokolls gelöscht hat . [/bearbeiten]

Haben Sie noch das Transaktionsprotokoll? In welchem ​​Wiederherstellungsmodell befindet sich die Datenbank? Wenn es EINFACH ist, tun Sie nichts, was einen Kontrollpunkt verursachen würde. Wenn es FULL oder BULK_LOGGED ist, führen Sie keine Protokollsicherung durch. Beides führt dazu, dass das Protokoll abgeschnitten wird und Sie möglicherweise nicht mehr in das Protokoll zurückblicken können, obwohl ich dem Blog-Beitrag ein Trace-Flag hinzugefügt habe, das Ihnen auch dabei helfen kann.

Vielen Dank

PS Eine Möglichkeit, das Löschen von Tabellen im Jahr 2000 zu verhindern, ohne die Sicherheit zu erhöhen, besteht darin, eine einfache schemaboundierte Ansicht darauf zu erstellen. DROP TABLE schlägt fehl, wenn die Ansicht vorhanden ist.

Paul Randal
quelle
Danke Paul, das ist ein toller Rat. Ich kann warten. Ich gehe jetzt und gehe morgen zu einem anderen Kunden, also werde ich versuchen herauszufinden, was am Donnerstag passiert ist. Ich werde den Administrator über die Protokollsicherung informieren.
John MacIntyre
8

Vielleicht war es Little Bobby Tables ...

Michael Borgwardt
quelle
1
Schön :) Würde +1 für Humor, aber das wäre dumm, da die einzige andere Antwort ebenfalls 1 Stimme hat.
2
Nein, das ist lustig genug für eine Gegenstimme.
Electrons_Ahoy
2

Möglicherweise können Sie diese Informationen aus den SQL-Protokollen wiederherstellen.

RSolberg
quelle
Ich weiß, dass diese Informationen in den SQLServer-Protokollen enthalten sind, aber ich dachte, Sie könnten nichts davon lesen. Ich würde gerne herausfinden, dass Sie können. Weiß jemand Bescheid?
John MacIntyre
1
Dieses Tool kann Ihnen möglicherweise beim Lesen der Protokolle helfen. red-gate.com/products/SQL_Log_Rescue/index.htm
RSolberg
+1 für den Log Tool Link. Warum steckst du es nicht in die Antwort?
John MacIntyre
2

Wenn das Standard-Ablaufverfolgungsprotokoll ausgeführt wird, werden alle Informationen im Protokollordner gespeichert. Sie sollten sehen können, wann das Objekt (Tabelle) gelöscht wurde und über welche Verbindung dies geschehen ist. Diese Art von Erlaubnis sollte jedoch ohnehin nur DBAs erteilt werden

TStamper
quelle
2

Ich versuche, eine beschädigte MSDB zu reparieren. Entschuldigung, ich kann nicht näher darauf eingehen.

Führen Sie diese aus, und es sollte eine allgemeine Vorstellung davon geben, wo Sie suchen müssen, vorausgesetzt, Ihre Standardablaufverfolgung ist aktiviert.

SELECT * FROM :: fn_trace_getinfo (Standard)

SELECT t.EventID, t.ColumnID, e.name als Event_Description, c.name als Column_Description FROM :: fn_trace_geteventinfo (1) t JOIN sys.trace_events e ON t.eventID = e.trace_event_id JOIN sys.trace_columnid c ON = c.trace_column_id


quelle
Danke, ich denke die sys. * -Tabellen sind 2005, nicht wahr? Gibt es ein Äquivalent von 2000?
John MacIntyre
2

Die einzige Möglichkeit, diese Informationen herauszufinden, besteht darin, das Transaktionsprotokoll zu lesen (vorausgesetzt, es befindet sich im vollständigen Wiederherstellungsmodus).

Zwei Möglichkeiten, dies zu tun:

  • Tools von Drittanbietern wie ApexSQL Log oder SQL Log Rescue (kostenlos, aber nur SQL 2000)
  • Verwenden von Befehlen wie DBCC LOG oder fn_dblog - von denen leider keiner gut dokumentiert ist
Anthony Horovitz
quelle
2

In SSMS können Sie versuchen, mit der rechten Maustaste auf das dB zu klicken und durch Berichte -> Standardberichte -> Verlauf der Schemaänderungen zu navigieren.

Klicken Sie mit der rechten Maustaste auf den Bericht und "SaveAs" Excel und suchen Sie Ihren Objektnamen.

Sie können nichts erhalten, wenn der Server mehr als fünf Mal nach dem Löschen des Objekts neu gestartet wurde.

user204862
quelle
Das Betrachten der Protokolle ist für mich fehlgeschlagen. Die meisten wurden aufgrund der hohen Anzahl von Transaktionen in unserem System überlaufen. Ihre Methode hat perfekt funktioniert. Danke für das Teilen!
Tylerjgarland