Exécuter automatiquement la procédure stockée après tout événement RESTORE DATABASE

9

Est-il possible que SQL Server 2008 R2 Standard exécute automatiquement une procédure stockée dans une base de données donnée qui est restaurée ou attachée à l'instance?

J'ai trouvé une solution proche en créant un déclencheur de niveau serveur qui exécute une procédure stockée dans une base de données donnée après l'événement DDL CREATE_DATABASEou ALTER_DATABASEest déclenché. Malheureusement, cela ne fonctionne pas pour les restaurations de sauvegarde de databack.

Pour élaborer, nous avons une procédure stockée de «nettoyage» qui existe dans chaque base de données que nous restaurons et je cherche un moyen de l'exécuter automatiquement chaque fois qu'une sauvegarde est restaurée sur l'instance.

La recherche sur Google m'a indiqué de configurer des audits ou des stratégies dans SQL Server pour obtenir cette fonctionnalité, mais ces fonctionnalités sont assez écrasantes à première vue, donc je ne peux pas dire si les audits ou les politiques sont la voie pour commencer à enquêter.

Matthew Ruston
la source

Réponses:

10

Doit-elle être exécutée immédiatement après la fin de la restauration, ou peut-elle être brièvement retardée? Une idée que j'avais était d'avoir un travail qui s'exécute toutes les minutes et vérifie Audit Backup/Restore Eventla trace par défaut.

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

Vous pouvez stocker les nettoyages que vous avez déjà effectués en fonction de StartTime et même limiter la requête de trace qui s'exécute toutes les minutes (ou quel que soit votre seuil de délai acceptable) pour ne regarder que les valeurs StartTime supérieures à la dernière ligne que vous avez tirée ou à la dernière le moment où le travail a été exécuté, selon le moindre des deux.

Aaron Bertrand
la source
1
Très lisse, bonne pensée. +1
Thomas Stringer
Un léger retard serait acceptable. Je vais essayer ça.
Matthew Ruston
1
Notez que je n'ai pas confirmé que dans tous les cas l'événement est réellement terminé avant l'écriture de la ligne de trace. Je soupçonne qu'il s'agit d'une écriture post-événement, mais je ne me méfie que parce qu'elle EndTimene semble jamais être peuplée. Il se peut que vous deviez essayer de vous connecter à la base de données et, si vous ne le pouvez pas, l'ignorer et ne pas documenter cet événement de restauration, mais réessayer la prochaine fois que le travail s'exécute. J'essaierais et validerais mais sur mes VM locales je n'ai que des SSD mais ils n'ont pas l'espace disque pour faire une sauvegarde assez longtemps pour observer le comportement avec précision. :-)
Aaron Bertrand
6

L' database_started événement étendu est déclenché après la restauration d'une base de données.

Créez une session d'événement qui capture le database_idchamp avec un prédicat qui recherche %RESTORE%sur le sql_textterrain (note: je crois que cela suffit - vous voudrez tester par vous-même).

Je ne connais pas suffisamment les événements étendus pour vous indiquer la meilleure façon de répondre à l'événement. Ce serait bien si vous pouviez lancer une procédure stockée directement; Je ne sais pas si c'est possible, cependant. Cependant, vous pouvez certainement interroger le tampon d'événements, ce qui est préférable à l'analyse de la trace par défaut - non seulement pour des raisons de performances, mais si le serveur est très occupé et que l'intervalle d'interrogation est trop long, vous pourriez finir par manquer des événements. Avec la méthode Extended Events, il serait très improbable de manquer un événement.

Jon Seigel
la source
4

Comme vous pouvez le voir dans la liste des événements DDL , un déclencheur DDL ne peut pas être suffisamment explicite pour vos besoins.

Je recommanderais d'écrire un script PowerShell pour effectuer la restauration ou l'attachement, puis exécuter la procédure stockée immédiatement suivante. Attention, votre boutique devra être chargée de l'utiliser au lieu d'une restauration ou d'une attache classique.

Malheureusement, je ne pense pas qu'il existe un moyen intégré pour y parvenir.

Thomas Stringer
la source
4

Comment exécutez-vous vos sauvegardes? Si vous cherchez simplement à exécuter le SP après votre sauvegarde, vous pouvez le configurer comme une autre tâche du travail, si vous les utilisez, ou un plan de maintenance.

Vous pouvez donc configurer l'audit pour écrire dans le journal des événements, puis créer une alerte qui exécutera une tâche. Il semble compliqué, mais il fera ce que vous demandez.

Jetez un œil au code suivant:

--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
la source
Un travail de restauration qui capture cela est une bonne idée. Cependant, je me demande si c'est une solution complète étant donné que l'OP souhaite capturer "tout" événement de restauration.
Nick Chammas
Pouvoir exécuter une procédure stockée arbitraire après la fin de tout événement de restauration est vraiment ce que nous recherchons. Une suggestion valable néanmoins.
Matthew Ruston
J'ai supprimé ma deuxième réponse et modifié ce qui précède pour inclure les informations. Merci @Shark pour le conseil à ce sujet. Je n'ai absolument pas pensé à faire ça.
jgardner04
0

Comment exécutez-vous vos sauvegardes? Avec Commvault, vous pouvez configurer un travail de restauration automatisé et le faire exécuter des scripts avant et après restauration qui peuvent être SQL ou PowerShell. Je le fais tout le temps pour exécuter DDL pour les différences de version et pour sauvegarder et restaurer les autorisations lors de la restauration entre les environnements.

Je crois que Netbackup peut-il avoir d'autres fonctionnalités similaires

Si vous utilisez SQL, ajoutez-le simplement en tant qu'étape au travail de restauration de la base de données

Alen
la source