Mi jefe recibió ayer una consulta de un cliente preguntando cómo podrían averiguar quién eliminó algunos datos en su base de datos de SQL Server (si es importante, es la edición express).
Pensé que esto podría encontrarse en el registro de transacciones (siempre que no se haya truncado). ¿Es esto correcto? Y si es así, ¿cómo haces para encontrar esta información?
sql-server
transaction
delete
audit
Matt Wilko
fuente
fuente
fn_dblog
. Una desventaja es que devuelve la base de datos enUSERNAME()
lugar del nombre de inicio de sesión mucho más útil.Si la base de datos está en modo de recuperación completa o si tiene copias de seguridad del registro de transacciones, puede intentar leerlas utilizando lectores de registro de terceros.
Puede probar ApexSQL Log (premium pero tiene una prueba gratuita) o SQL Log Rescue (gratis pero solo SQL 2000).
fuente
Aunque esto se responde, quería agregar que SQL Server tiene habilitado un rastreo predeterminado y se puede utilizar para averiguar quién dejó / modificó los objetos.
Eventos de objeto
Los eventos de objeto incluyen: Objeto alterado, Objeto creado y Objeto eliminado
nota: SQL Server por defecto tiene 5 archivos de rastreo, 20 MB cada uno y no se conoce ningún método compatible para cambiar esto. Si tiene un sistema ocupado, los archivos de rastreo pueden pasar demasiado rápido (incluso en cuestión de horas) y es posible que no pueda detectar algunos de los cambios.
Se puede encontrar un excelente ejemplo: el rastreo predeterminado en SQL Server: el poder del rendimiento y la auditoría de seguridad
fuente
Puede intentar este procedimiento para consultar los archivos de respaldo de registro y encontrar en qué archivo (s) de respaldo de registro todavía estaba / último presente un valor específico de una columna de una tabla.
Para encontrar al usuario, después de encontrar en qué respaldo de registro existía el último valor, puede restaurar una base de datos hasta ese respaldo de respaldo y luego seguir la respuesta de Mark Storey-Smith .
Algunos requisitos previos
Renuncia
Esta solución está lejos de ser resistente al agua, y se necesita mucho más trabajo.
No se ha probado en entornos a gran escala, o incluso en cualquier entorno aparte de unas pocas pruebas pequeñas. La ejecución actual fue en SQL Server 2017.
Puede usar el siguiente procedimiento de Muhammad Imran que modifiqué para trabajar con el contenido de las copias de seguridad de registros en lugar de los contenidos del registro de una base de datos en vivo.
De esta manera, técnicamente no está haciendo restauraciones, sino que está volcando el contenido del registro en una tabla temporal. Probablemente seguirá siendo lento y está muy abierto a errores y problemas. Pero podría funcionar, en teoría ™.
El procedimiento almacenado utiliza la
fn_dump_dblog
función no documentada para leer los archivos de registro.Entorno de prueba
Considere esta base de datos, donde insertamos algunas filas, tomamos 2 copias de seguridad de registro, y en la tercera copia de seguridad de registro eliminamos todas las filas.
El procedimiento
Puede encontrar y descargar el procedimiento almacenado aquí .
No podría agregarlo aquí, ya que es más grande que el límite de caracteres, y haría que esta respuesta sea aún menos clara de lo que es.
Aparte de esto, debería poder ejecutar el procedimiento.
Ejecutando el procedimiento
Un ejemplo de esto, cuando agrego todos mis archivos de registro (
4
) al procedimiento almacenado y ejecuto el procedimiento buscando valor1Esto me atrapa:
Donde podemos encontrar cuándo fue la última vez que
value1
ocurrió una operación , la eliminación enlog3.trn
.Algunos datos de prueba más, agregando una tabla con diferentes columnas
Cambiar los nombres de los archivos de registro y volver a ejecutar el procedimiento
Resultado
Una nueva ejecución, buscando el entero (
2
) en laval3
columna dedbo.WrongDeletes2
Resultado
Aplicando la respuesta de Mark Storey-Smith
Ahora sabemos que sucedió en el tercer archivo de registro, restauremos hasta ese punto:
Ejecutando la última consulta en su respuesta
Resultado para mí (administrador de sistemas)
fuente