Ejecutar automáticamente el procedimiento almacenado después de cualquier evento RESTORE DATABASE

9

¿Es posible que SQL Server 2008 R2 Standard ejecute automáticamente un procedimiento almacenado en cualquier base de datos que se restaure o se adjunte a la instancia?

Me acerqué a una solución creando un disparador a nivel de servidor que ejecuta un procedimiento almacenado en una base de datos dada después del evento DDL CREATE_DATABASEo ALTER_DATABASEse dispara. Desafortunadamente, esto no funciona para las restauraciones de respaldo de datos.

Para elaborar, tenemos un procedimiento almacenado de 'limpieza' que existe en cada base de datos que restauramos y estoy buscando una manera de que esto se ejecute automáticamente cada vez que se restaura una copia de seguridad en la instancia.

Google me ha indicado que configure Auditorías o Políticas en SQL Server para obtener esta funcionalidad, pero estas características son bastante abrumadoras a primera vista, por lo que no puedo decir si las Auditorías o las Políticas son la vía para comenzar a investigar.

Matthew Ruston
fuente

Respuestas:

10

¿Tiene que ejecutarse inmediatamente después de que finalice la restauración, o puede retrasarse brevemente? Una idea que tuve es tener un trabajo que se ejecuta cada minuto y verifica Audit Backup/Restore Eventel seguimiento predeterminado.

DECLARE @fn VARCHAR(MAX);

SELECT @fn = SUBSTRING([path], 0, LEN([path])-CHARINDEX(CHAR(92), REVERSE([path]))+1) 
  + CHAR(92) + 'Log.trc'  
FROM sys.traces   
WHERE is_default = 1;  

SELECT 
    DatabaseName,
    StartTime, 
    TextData
FROM sys.fn_trace_gettable(@fn, DEFAULT)  
WHERE EventClass = 115
AND TextData LIKE '%RESTORE%'; -- since can't differentiate between backup/restore

Puede almacenar las limpiezas que ya ha realizado en función de StartTime e incluso limitar la consulta de rastreo que se ejecuta cada minuto (o lo que sea su umbral de retraso aceptable) para ver solo los valores de StartTime mayores que la última fila que extrajo, o la última momento en que se ejecutó el trabajo, lo que sea menor.

Aaron Bertrand
fuente
1
Muy hábil, buen pensamiento. +1
Thomas Stringer
Un ligero retraso sería aceptable. Voy a probar esto
Matthew Ruston el
1
Tenga en cuenta que no he confirmado que en todos los casos el evento se haya completado antes de que se escriba la fila de rastreo. Sospecho que es una escritura posterior al evento, pero sospecho solo porque EndTimenunca parece estar poblada. Puede suceder que intente conectarse a la base de datos y, si no puede, omítala y no documente este evento de restauración, sino intente nuevamente la próxima vez que se ejecute el trabajo. Intentaría validar, pero en mis máquinas virtuales locales solo tengo SSD, pero no tienen el espacio en disco para hacer que una copia de seguridad tarde lo suficiente como para observar el comportamiento con precisión. :-)
Aaron Bertrand
6

El database_started evento extendido se activa después de restaurar una base de datos.

Cree una sesión de evento que capture el database_idcampo con un predicado que busque %RESTORE%en el sql_textcampo (nota: creo que esto es suficiente, querrá probarlo usted mismo).

No estoy lo suficientemente familiarizado con los eventos extendidos para decirle la mejor manera de responder al evento. Sería bueno si pudiera disparar un procedimiento almacenado directamente; Sin embargo, no sé si eso sea posible. Sin embargo, ciertamente puede sondear el búfer de eventos, y eso es preferible a escanear el rastreo predeterminado, no solo por razones de rendimiento, sino que si el servidor está muy ocupado y el intervalo de sondeo es demasiado largo, podría terminar perdiendo eventos por completo. Con el método de eventos extendidos, perder un evento sería muy poco probable.

Jon Seigel
fuente
4

Como puede ver en la lista de eventos DDL , un desencadenador DDL no puede ser lo suficientemente explícito para sus requisitos.

Recomiendo escribir un script de PowerShell para hacer la restauración o adjuntar y luego ejecutar el procedimiento almacenado inmediatamente siguiente. Eso sí, tu tienda tendrá que recibir instrucciones para usar esto en lugar de una restauración o un archivo adjunto típico.

Desafortunadamente, no creo que haya una forma integrada de lograr esto.

Thomas Stringer
fuente
4

¿Cómo estás ejecutando tus copias de seguridad? Si solo está buscando ejecutar el SP después de su copia de seguridad, puede configurarlo como otra tarea en el trabajo, si los está utilizando, o plan de mantenimiento.

Por lo tanto, puede configurar Auditoría para escribir en el registro de eventos y luego crear una alerta que ejecutará un trabajo. Parece complicado pero hará lo que está pidiendo.

Echa un vistazo al siguiente código:

--Create the Server Audit
USE master
GO
CREATE SERVER AUDIT BackupTrap
TO APPLICATION_LOG
WITH (QUEUE_DELAY = 0, ON_FAILURE = CONTINUE)
GO

--Turn the Audit On
ALTER SERVER AUDIT BackupTrap
WITH (STATE = ON)
GO

--Create the Database Audit Specification
USE AdventureWorks2012
GO
CREATE DATABASE AUDIT SPECIFICATION BackupTrapAdventureWorks
FOR SERVER AUDIT BackupTrap
    ADD (BACKUP_RESTORE_GROUP)
WITH (STATE = ON)
GO

--Create the job to run
USE msdb
GO
EXECUTE dbo.sp_add_job
    @job_name = N'BackupAlertJob'
GO

EXECUTE dbo.sp_add_jobserver
    @job_name = N'BackupAlertJob'
GO

EXECUTE dbo.sp_add_jobstep
    @job_name = N'BackupAlertJob',
    @step_name = N'RunSP',
    @subsystem = N'TSQL',
    @command = N'EXECUTE dbo.MyStoredProcedure',
    @database_name = N'AdventureWorks2012'
GO
jgardner04
fuente
Un trabajo de restauración que captura esto es una buena idea. Sin embargo, me pregunto si esa es una solución completa dado que el OP quiere capturar "cualquier" evento de restauración.
Nick Chammas
Ser capaz de ejecutar un procedimiento almacenado arbitrario después de que se complete cualquier evento de restauración es realmente lo que buscamos. Una sugerencia válida, no obstante.
Matthew Ruston el
Eliminé mi segunda respuesta y edité lo anterior para incluir la información. Gracias @Shark por el consejo sobre eso. Totalmente no pensé en hacer eso.
jgardner04
0

¿Cómo estás ejecutando tus copias de seguridad? Con Commvault puede configurar un trabajo de restauración automatizado y hacer que ejecute scripts de restauración previos y posteriores que pueden ser SQL o powershell. Hago esto todo el tiempo para ejecutar DDL por diferencias de versión y para hacer copias de seguridad y restaurar permisos al restaurar entre entornos.

Creo que Netbackup puede otros productos tener una funcionalidad similar

Si usa SQL, simplemente agréguelo como un paso al trabajo que restaura la base de datos

Alen
fuente