Nettoyage des rapports de plans de maintenance

Problème rencontré à plusieurs reprises : la tâche de nettoyage de maintenance ne supprime pas les anciens fichiers de rapport de plans de maintenance (extension txt). C'était pourtant un vieux bug de SQL Server 2005 avant le SP2... Comment contourner ce problème avec un script Powershell ?

2012-01-06_171227.png

La tâche SSIS du plan de maintenance utilise la procédure xp_delete_file, non documentée et un peu particulière, en cela qu'elle inspecte le contenu du fichier pour vérifier s'il s'agit bien d'un rapport de maintenance. C'est peut-être de là que vient le problème...

EXECUTE master.dbo.xp_delete_file 1,N'C:\Program Files\Microsoft SQL
Server\MSSQL10_50.SQL2008R2\MSSQL\Log',N'txt',N'2011-11-06T17:14:46' 

Mais nous avons PowerShell pour écrire cela en une seule ligne de commande et la planifier via l'agent SQL Server :

Get-ChildItem "C:\Program Files\Microsoft SQL Server\MSSQL10_50.SQL2008R2\MSSQL\Log" 
-include *.txt -exclude sqldump*.txt -recurse | 
Where {($_.CreationTime -lt $(Get-Date).AddDays(-60))} |
Remove-Item

Curieusement, cette commande échoue lorsqu'elle est utilisée dans une tâche powershell de l'agent SQL Server : l'agent interprète à tort cette syntaxe comme contenant un jeton (token, voir http://msdn.microsoft.com/fr-fr/library/ms175575.aspx), d'où le message : Impossible de démarrer l'exécution de l'étape 1 (raison : L'étape du travail contient des jetons. Pour SQL Server 2005 Service Pack 1 ou ultérieur, vous devez utiliser la macro ESCAPE_xxx appropriée pour mettre à jour les étapes d'un travail contenant des jetons avant que le travail puisse s'exécuter.). L'étape a échoué.

La solution : 

remplacer la chaîne $(Get-Date) par une variable (mais ce sont maintenant 2 lignes...) !

$dt=Get-Date

Get-ChildItem "C:\Program Files\Microsoft SQL Server\MSSQL10_50.SQL2008R2\MSSQL\Log" 
-include *.txt -exclude sqldump*.txt -recurse | 
Where {($_.CreationTime -lt $dt.AddDays(-60))} | 
Remove-Item