Ich habe fn_dblog nicht auf Express ausprobiert, aber wenn es verfügbar ist, erhalten Sie folgende Löschvorgänge:
SELECT
*
FROM
fn_dblog(NULL, NULL)
WHERE
Operation = 'LOP_DELETE_ROWS'
Nehmen Sie die Transaktions-ID für Transaktionen, an denen Sie interessiert sind, und identifizieren Sie die SID, die die Transaktion initiiert hat, mit:
SELECT
[Transaction SID]
FROM
fn_dblog(NULL, NULL)
WHERE
[Transaction ID] = @TranID
AND
[Operation] = 'LOP_BEGIN_XACT'
Dann identifizieren Sie den Benutzer anhand der SID:
SELECT
*
FROM
sysusers
WHERE
[sid] = @SID
Bearbeiten: Bringen Sie das alles zusammen, um Löschungen in einer angegebenen Tabelle zu finden:
DECLARE @TableName sysname
SET @TableName = 'dbo.Table_1'
SELECT
u.[name] AS UserName
, l.[Begin Time] AS TransactionStartTime
FROM
fn_dblog(NULL, NULL) l
INNER JOIN
(
SELECT
[Transaction ID]
FROM
fn_dblog(NULL, NULL)
WHERE
AllocUnitName LIKE @TableName + '%'
AND
Operation = 'LOP_DELETE_ROWS'
) deletes
ON deletes.[Transaction ID] = l.[Transaction ID]
INNER JOIN
sysusers u
ON u.[sid] = l.[Transaction SID]
fn_dblog
. Ein Nachteil ist, dass die Datenbank zurückgegeben wirdUSERNAME()
und nicht der viel nützlichere Anmeldename.Befindet sich die Datenbank im vollständigen Wiederherstellungsmodus oder verfügen Sie über Transaktionsprotokollsicherungen, können Sie versuchen, diese mit Protokolllesegeräten von Drittanbietern zu lesen.
Sie können ApexSQL Log (Premium, aber kostenlose Testversion) oder SQL Log Rescue (kostenlos, aber nur SQL 2000) ausprobieren.
quelle
Obwohl dies beantwortet wurde, möchte ich hinzufügen, dass für SQL Server eine Standardablaufverfolgung aktiviert ist und dass damit ermittelt werden kann, wer die Objekte gelöscht / geändert hat.
Objektereignisse
Objektereignisse umfassen: Objekt geändert, Objekt erstellt und Objekt gelöscht
Hinweis: SQL Server verfügt standardmäßig über 5 Ablaufverfolgungsdateien mit jeweils 20 MB, und es gibt keine bekannte unterstützte Methode, um dies zu ändern. Wenn Sie ein ausgelastetes System haben, werden die Ablaufverfolgungsdateien möglicherweise viel zu schnell übertragen (sogar innerhalb von Stunden) und Sie können möglicherweise einige der Änderungen nicht erfassen.
Es gibt ein hervorragendes Beispiel: Die Standardablaufverfolgung in SQL Server - die Leistungsfähigkeit und Sicherheitsprüfung
quelle
Mit dieser Prozedur können Sie die Protokollsicherungsdateien abfragen und feststellen, in welchen Protokollsicherungsdateien ein bestimmter Wert einer Tabellenspalte noch bzw. zuletzt vorhanden war.
Um den Benutzer zu finden, nachdem Sie in welcher Protokollsicherung den zuletzt vorhandenen Wert gefunden haben, können Sie eine Datenbank bis zu dieser Protokollsicherung wiederherstellen und dann Mark Storey-Smiths Antwort folgen .
Einige Voraussetzungen
Haftungsausschluss
Diese Lösung ist weit davon entfernt, wasserdicht zu sein, und es muss noch viel mehr Arbeit aufgewendet werden.
Es wurde nicht in großen Umgebungen oder sogar in anderen Umgebungen getestet, mit Ausnahme einiger kleinerer Tests. Die aktuelle Ausführung erfolgte auf SQL Server 2017.
Sie können das folgende Verfahren von Muhammad Imran verwenden , das ich geändert habe, um mit dem Inhalt von Protokollsicherungen anstelle des Inhalts des Protokolls einer Live-Datenbank zu arbeiten.
Auf diese Weise führen Sie technisch gesehen keine Wiederherstellungen durch, sondern sichern den Protokollinhalt in einer temporären Tabelle. Es wird wahrscheinlich immer noch langsam sein und ist sehr offen für Fehler und Probleme. Aber theoretisch könnte es funktionieren.
Die gespeicherte Prozedur verwendet die undokumentierte
fn_dump_dblog
Funktion, um die Protokolldateien auszulesen.Testumgebung
Betrachten Sie diese Datenbank, in der wir einige Zeilen einfügen, zwei Protokollsicherungen durchführen und bei der dritten Protokollsicherung alle Zeilen löschen.
Der Ablauf
Sie können die gespeicherte Prozedur hier finden und herunterladen .
Ich konnte es hier nicht hinzufügen, da es größer als die Zeichenbegrenzung ist, und würde diese Antwort noch unklarer machen, als es ist.
Abgesehen davon sollten Sie in der Lage sein, die Prozedur auszuführen.
Prozedur ausführen
Ein Beispiel dafür, wenn ich alle meine Protokolldateien (
4
) zur gespeicherten Prozedur hinzufüge und die Prozedur auf der Suche nach value1 ausführeDas bringt mich auf:
Wo wir finden können, wann das letzte Mal eine Operation
value1
stattgefunden hat, ist das Löschen inlog3.trn
.Weitere Testdaten, Hinzufügen einer Tabelle mit verschiedenen Spalten
Ändern der Protokolldateinamen und erneutes Ausführen des Vorgangs
Ergebnis
Ein neuer Lauf, der nach der Ganzzahl (
2
) in derval3
Spalte von suchtdbo.WrongDeletes2
Ergebnis
Anwenden der Antwort von Mark Storey-Smith
Wir wissen jetzt, dass es in der dritten Protokolldatei passiert ist, lassen Sie uns bis zu diesem Punkt wiederherstellen:
Ausführen der letzten Abfrage in seiner Antwort
Ergebnis für mich (Sysadmin)
quelle