¿Determinar cómo ocurrió un cambio de esquema?


21

Algo malo sucedió ayer.

Una vista que se creó hace algún tiempo fue modificada por alguien que finalmente rompió los informes. Desafortunadamente. alguien (a sabiendas o sin saberlo) realizó esta modificación en la base de datos PRODUCTION.

Mi pregunta: ¿Hay alguna forma (script / software / freeware, etc.) mediante la cual podamos llegar a saber quién (nombre de usuario) realizó esta modificación, para que pueda revocar el acceso a la base de datos de producción para ese usuario.

Si mi pregunta no está clara, por favor comente.

Respuestas:


36

Esto se registra en la traza predeterminada, por lo tanto, siempre que esté habilitado y no se haya transferido mientras tanto, debería aparecer en el informe "Historial de cambios de esquema".

Para acceder a esto en Management Studio, haga clic derecho en la base de datos y luego en el menú contextual elija Reports -> Standard Reports -> Schema Changes History

Para recuperar la misma información a través de TSQL puede usar

SELECT StartTime
       ,LoginName
       --,f.*
FROM   sys.traces t
       CROSS APPLY fn_trace_gettable(REVERSE(SUBSTRING(REVERSE(t.path),
                                                       CHARINDEX('\', REVERSE(t.path)), 
                                                       260)
                                             ) + N'log.trc', DEFAULT) f
WHERE  t.is_default = 1
       AND ObjectName = 'FOO'
       AND EventClass IN (46, /*Object:Created*/
                          47, /*Object:Dropped*/
                          164 /*Object:Altered*/ )

Gracias Martin, ejecuté la consulta reemplazando 'FOO' con mi vista, pero eso no devolvió nada. ¿Alguna idea de por qué sucede eso? Sin embargo
ejecuté

1
@Xorpower: también lo edité para controlar el Object:Createdevento en caso de que la vista se elimine y se cree en lugar de modificarse. ¿No estás seguro de lo que quieres decir con no ejecutar en el servidor? Por supuesto, debe estar conectado a la instancia correcta, pero no importa de dónde provenga la conexión siempre que tenga permisos.
Martin Smith

Gracias Martin, pero el resultado sigue siendo el mismo
xorpower


3
@Xorpower: parece que el rastro se ha volcado y has perdido detalles de algo más antiguo que aproximadamente 11 horas. La traza predeterminada solo mantiene 5 archivos y luego elimina los más antiguos. Es posible que desee verificar en el sistema de archivos en el servidor la carpeta solo para verificar que este sea definitivamente el caso. Puede obtener la ruta de la carpeta desdeSELECT path FROM sys.traces where is_default=1
Martin Smith

19

Martin ya señaló hacia la mejor vía, la traza de auditoría administrativa que generalmente está activada (a menos que se haya desactivado explícitamente). Si no puede encontrar la información en el seguimiento del administrador (se deshabilitó o se recicló), puede recuperar la información de las copias de seguridad del registro. Como es una base de datos de producción, supongo que tiene un ciclo de copia de seguridad regular, con copias de seguridad completas periódicas y copias de seguridad de registro. Deberá restaurar, en un servidor separado, la base de datos a la hora del incidente para que el DDL esté en el registro restaurado actual. Entonces es una simple cuestión de usar fn_dblog()e inspeccionar el registro.

Una forma es ir por operaciones de inicio de transacción:

select [Begin Time], [Transaction Name], [Transaction SID], * 
from fn_dblog(null, null)
where Operation = 'LOP_BEGIN_XACT';

Si ALTER VIEWse emitió en una transacción independiente (es decir, no está rodeada por BEGIN TRANSACTION/ COMMIT), se iniciará una transacción denominada CreatProc transaction. Búscalo y [Transaction SID]es el SID de inicio de sesión que deseas.

Otra posibilidad es buscar la transacción que adquirió un SCH_M en la vista que desea:

select [Lock Information], * 
from fn_dblog(null, null)
where [Lock Information] like '%' + cast(object_id('...') as varchar(10))+'%'
and [Lock Information] like '%LOCK_SCH_M%'
go

Tenga en cuenta que si DROP cambió la vista seguida de CREATE, es probable que la identificación del objeto haya cambiado, pero al menos obtendrá la transacción que realizó CREATE por última vez (la identificación del objeto actual de la vista en la base de datos restaurada). Con la identificación de la transacción, regresa y recupera la información de inicio de la transacción:

select [Begin Time], [Transaction Name], [Transaction SID], *
from fn_dblog(null, null)
where [Transaction ID] = '...'
and Operation = 'LOP_BEGIN_XACT';

El [SID de la transacción] es, de nuevo, tu chico. Use SUSER_SNAMEpara recuperar el nombre de inicio de sesión del SID de inicio de sesión. Si el SID es 0x01 significa que el inicio de sesión fue sa, lo que significa que cualquier persona que conozca la sacontraseña podría haberlo hecho.


2
Un buen consejo para leer los archivos de registro. Esto es útil si alguien deshabilitó los rastreos predeterminados.
StanleyJohns

¿Qué pasa si el SID de la transacción es nulo?
evictednoise

@evictednoise, por favor publique los registros de registro relevantes (en una pregunta separada). Puede ser más que una razón y los registros de registro ayudarían a determinar la causa real.
Remus Rusanu

6

No, a menos que haya iniciado sesión a través de un desencadenador DDL o tal

Desea ver quién tiene los derechos ALTER en esa base de datos o la pertenencia a la función sysadmin / db_owner / ddl_admin. Esto sería mejor como una revisión general en lugar de una cacería de brujas. Probablemente haya otras personas con derechos para hacer cambios no autorizados y no autorizados también.


0

Si aún no lo ha hecho, puede consultar el informe Historial de cambios de esquema disponible en SQL Server Management Studio. Parece que SQL Server registra los cambios de forma predeterminada ( rastreo predeterminado ) y debería poder ver esos datos a través de este informe. Lo único desafortunado es que estos archivos de rastreo se eliminan / vuelven automáticamente a medida que pasa el tiempo, por lo que los datos ya pueden haberse ido. ¡Buena suerte!


Vaya, no importa. Veo que Martin Smith ya hizo referencia a este informe en su respuesta. Sin embargo, dejaré esto aquí en caso de que alguno de los enlaces sea útil.
Mark Madej
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.