¿Hay alguna forma de determinar quién dejó caer una mesa?

8

Una tabla en la base de datos de producción ha desaparecido "misteriosamente".

¿Alguien sabe de alguna manera de diagnosticar qué diablos le pasó? ¿Y quien lo hizo?

Edición 1: Esta es una aplicación interna, con poca seguridad. Todas las aplicaciones (excepto la mía, por supuesto ;-) son vulnerables a la inyección de SQL, pero nuestros usuarios son muy poco sofisticados y el nombre de la tabla no era uno que pudiera ser inmediatamente obvio, así que no creo que fuera una inyección de SQL (no que importa ... más allá del alcance de la pregunta).

Edición 2: Además, solo un FYI; esta tabla ha existido durante mucho tiempo, por lo que no se 'deshizo' con una restauración.

John MacIntyre
fuente
¿Quieres decir que el fantasma "No soy yo" también te atrapó?
Nick DeVore
¿tiene cuentas de base de datos separadas para todos o todos inician sesión como 'dba' o algo equivalente?
@ Zerofiz: estamos utilizando Windows Integrated Security, por lo que sí, todos los usuarios pueden ser identificados.
John MacIntyre
Encontré este blog que explica el proceso paso a paso para determinar quién dejó caer la tabla dbarepublic.com/2015/01/who-dropped-table.html .

Respuestas:

14

Es posible que pueda obtener la información del registro utilizando la función indocumentada :: fn_dblog que interpreta los registros de registro. Estoy en medio de una clase de recuperación ante desastres en este momento, pero si puedes esperar 2-3 horas, publicaré cómo hacerlo por ti: también debería poder obtener el nombre de usuario sin tener que comprar ninguna herramienta ( Solía ​​dar vueltas alrededor del registro una tonelada en 2000, ya que escribí un montón del código de análisis de registro interno que DBCC CHECKDB usa en 2000).

[Editado para incluir instrucciones] Ok, terminé de enseñar y llamé a una publicación de blog para mostrarle cómo analizar el registro en 2000, 2005, 2008 para averiguar cuándo se cayó la tabla y quién lo hizo. Consulte mi publicación de blog en Averiguar quién dejó caer una tabla utilizando el registro de transacciones . [/editar]

¿Todavía tiene el registro de transacciones? ¿En qué modelo de recuperación está la base de datos? Si es SIMPLE, no haga nada que pueda causar un punto de control. Si es FULL o BULK_LOGGED, no haga una copia de seguridad del registro. Cualquiera de estos hará que el registro se trunca y luego puede perder la capacidad de mirar hacia atrás en el registro, aunque incluí un indicador de seguimiento en la publicación del blog que también puede ayudarlo con eso.

Gracias

PD Una forma de evitar que la tabla se caiga en 2000 sin agregar seguridad es crear una vista simple de esquema en ella: DROP TABLE fallará si la vista existe.

Paul Randal
fuente
Gracias Paul, ese es un gran consejo. Puedo esperar. Me voy ahora e iré a otro cliente mañana, así que intentaré averiguar qué pasó el jueves. Le diré al administrador sobre la copia de seguridad del registro.
John MacIntyre
8

Tal vez fue Little Bobby Tables ...

Michael Borgwardt
fuente
1
Agradable :) Lo haría +1 por humor, pero eso sería una tontería ya que la única otra respuesta tiene 1 voto también.
2
No, eso es lo suficientemente divertido para un voto positivo.
Electrons_Ahoy
2

Es posible que pueda recuperar esta información de los registros de SQL.

RSolberg
fuente
Sé que esta información está en los registros de SQLServer, pero pensé que no podías leer nada de ellos. Me encantaría descubrir que puedes. Alguien sabe?
John MacIntyre
Solo estoy familiarizado con Sybase SQL Anywhere, pero tienen una utilidad para traducir archivos de registro en sentencias SQL ...
1
Esta herramienta podría ayudarlo a leer los registros. red-gate.com/products/SQL_Log_Rescue/index.htm
RSolberg
+1 para el enlace de la herramienta de registro. ¿Por qué no lo pones en la respuesta?
John MacIntyre
2

Si se ejecuta el registro de seguimiento predeterminado, toda la información se almacena en la carpeta de registro. Debería poder ver cuándo se cayó el objeto (tabla) y por qué conexión lo hizo. Pero este tipo de permiso solo debe otorgarse a los DBA de todos modos

TStamper
fuente
2

Estoy tratando de arreglar un MSDB corrupto. Lo siento, no puedo dar más detalles.

Ejecute estos y debería dar una idea general de dónde buscar, suponiendo que su rastreo predeterminado esté activado.

SELECCIONAR * DESDE :: fn_trace_getinfo (predeterminado)

SELECCIONE t.EventID, t.ColumnID, e.name como Event_Description, c.name como Column_Description FROM :: fn_trace_geteventinfo (1) t JOIN sys.trace_events e ON t.eventID = e.trace_event_id JOIN sys.trace_columns c ON t.columnid = c.trace_column_id


fuente
Gracias, creo que las tablas sys. * Son 2005, ¿no? ¿Hay un equivalente de 2000?
John MacIntyre
2

La única forma de averiguar esta información es leyendo el registro de transacciones (suponiendo que esté en modo de recuperación completa).

Dos formas de hacer esto:

  • Herramientas de terceros como ApexSQL Log o SQL Log Rescue (gratis pero solo SQL 2000)
  • Uso de comandos como DBCC LOG o fn_dblog, ninguno de los cuales está bien documentado desafortunadamente
Anthony Horovitz
fuente
2

En SSMS puede intentar hacer clic derecho en el dB y navegar a través de Informes -> Informes estándar -> Historial de cambios de esquema.

Haga clic derecho en el informe y 'Guardar como' Excel y encuentre su objeto namne.

No podrá obtener nada si el servidor se ha reiniciado más de cinco veces después de que se haya caído el objeto.

usuario204862
fuente
Mirar los registros falló para mí. La mayoría fueron desbordados debido a la gran cantidad de transacciones en nuestro sistema. Tu método funcionó perfectamente. ¡Gracias por compartir!
tylerjgarland