Executar automaticamente o procedimento armazenado após qualquer evento RESTORE DATABASE

9

É possível que o SQL Server 2008 R2 Standard execute automaticamente um procedimento armazenado em qualquer banco de dados especificado restaurado ou anexado à instância?

Aproximei-me de uma solução criando um gatilho no nível do servidor que executa um procedimento armazenado em um determinado banco de dados após o evento DDL CREATE_DATABASEou ALTER_DATABASEé acionado. Infelizmente, isso não funciona para restaurações de backup de banco de dados.

Para elaborar, temos um procedimento armazenado de 'limpeza' que existe em todos os bancos de dados que restauramos e estou procurando uma maneira de executá-lo automaticamente sempre que um backup for restaurado para a instância.

A pesquisa no Google me indicou a configuração de auditorias ou políticas no SQL Server para obter essa funcionalidade, mas esses recursos são bastante impressionantes à primeira vista, então não sei dizer se as auditorias ou políticas são o caminho para começar a investigar.

Matthew Ruston
fonte

Respostas:

10

Ele precisa ser executado imediatamente após a conclusão da restauração ou pode ser adiado brevemente? Uma ideia que tive foi ter um trabalho que fosse executado a cada minuto e verificar Audit Backup/Restore Evento rastreio padrão.

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

Você pode armazenar as limpezas que já fez com base no StartTime e até limitar a consulta de rastreamento que é executada a cada minuto (ou qualquer que seja o seu limite de atraso aceitável) para examinar apenas os valores de StartTime maiores que a última linha que você puxou ou a última tempo de execução do trabalho, o que for menor.

Aaron Bertrand
fonte
11
Muito esperto, bom pensamento. 1
Thomas Stringer
Um pequeno atraso seria aceitável. Eu vou tentar isso.
Matthew Ruston
11
Observe que não confirmei que, em todos os casos, o evento foi realmente concluído antes da gravação da linha de rastreamento. Suspeito que seja uma gravação pós-evento, mas só suspeito porque EndTimenunca parece ser preenchida. Pode ser que você tente se conectar ao banco de dados e, se não puder, pule-o e não documente esse evento de restauração, mas tente novamente na próxima vez que o trabalho for executado. Eu tentaria validar, mas nas minhas VMs locais eu só tenho SSDs, mas elas não têm espaço em disco para fazer um backup demorar o suficiente para observar o comportamento com precisão. :-)
Aaron Bertrand
6

O database_started evento estendido é acionado após a restauração de um banco de dados.

Crie uma sessão de evento que capture o database_idcampo com um predicado que procure %RESTORE%no sql_textcampo (nota: acredito que isso é suficiente - você desejará testar por si mesmo).

Não estou familiarizado o suficiente com os Eventos estendidos para mostrar a melhor maneira de como responder ao evento. Seria bom se você pudesse disparar um procedimento armazenado diretamente; Mas não sei se isso é possível. No entanto, é possível pesquisar o buffer de eventos, e isso é preferível à varredura do rastreamento padrão - não apenas por motivos de desempenho, mas se o servidor estiver muito ocupado e o intervalo de pesquisa for muito longo, você poderá acabar perdendo os eventos imediatamente. Com o método Extended Events, a falta de um evento seria muito improvável.

Jon Seigel
fonte
4

Como você pode ver na lista de eventos DDL , um gatilho DDL não pode ser explícito o suficiente para seus requisitos.

Eu recomendo escrever um script do PowerShell para restaurar ou anexar e executar o procedimento armazenado imediatamente a seguir. Lembre-se de que sua loja precisará ser instruída a usá-lo em vez de uma restauração ou anexação típica.

Infelizmente, não acredito que exista uma maneira integrada de fazer isso.

Thomas Stringer
fonte
4

Como você está executando seus backups? Se você deseja executar o SP após o backup, pode configurá-lo como outra tarefa no trabalho, se você estiver usando-os ou como plano de manutenção.

Portanto, você pode configurar a Auditoria para gravar no log de eventos e criar um alerta que executará um trabalho. Parece complicado, mas fará o que você está pedindo.

Dê uma olhada no seguinte 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
fonte
Uma tarefa de restauração que captura essa é uma boa ideia. No entanto, gostaria de saber se essa é uma solução completa, pois o OP deseja capturar "qualquer" evento de restauração.
31412 Nick Chammas
Ser capaz de executar um procedimento armazenado arbitrariamente após a conclusão de qualquer evento de restauração é realmente o que buscamos. Uma sugestão válida, no entanto.
Matthew Ruston
Tirei minha segunda resposta e editei a descrição acima para incluir as informações. Obrigado @Shark pela dica sobre esse. Totalmente não pensei em fazer isso.
Jgardner04
0

Como você está executando seus backups? Com o Commvault, você pode configurar uma tarefa de restauração automatizada e executá-la antes e depois dos scripts de restauração, que podem ser SQL ou PowerShell. Faço isso o tempo todo para executar o DDL para diferenças de versão e para fazer backup e restaurar permissões ao restaurar entre ambientes.

Eu acredito que o Netbackup pode outros produtos ter funcionalidade semelhante

Se você usa SQL, basta adicioná-lo como uma etapa ao trabalho que restaura o banco de dados

Alen
fonte