2012-05-22 5 views
1

J'ai eu la malchance d'hériter d'un système, ce qui me cause de gros problèmes. Il s'exécute sur SQL Server 2005 et le problème que j'ai est dans le plan de maintenance de la base de données. Une routine de nettoyage utilise la commande XP_DELETE_FILE non documentée et reste bloquée plus ou moins tous les soirs.Microsoft SQL Server 2005 XP_DELETE_FILE

Il semblerait que notre programme de sauvegarde nocturne (dont je n'ai aucun contrôle) sauvegarde un fichier que la commande XP_DELETE_FILE essaie de supprimer. Par opposition à l'un ou l'autre échec, ou simplement en contournant le fichier, il semble se bloquer. Cela signifie qu'aucune autre étape du plan de maintenance n'est exécutée.

J'ai cherché une solution à ce long des lignes de:

  1. Ne pas utiliser la commande xp_delete_file ou
  2. Vérification des autorisations d'accès aux fichiers avant que mon xp_delete_file.

Mais je n'ai pas eu une telle chance. N'importe qui a des idées ou des solutions, je les apprécierais volontiers.

Cordialement

Exemple de code:

 -- Delete old backup files 
    IF (@CurrentCommandOutput02 = 0 AND @Verify = 'N' AND @CurrentCleanupDate IS NOT NULL) 
    OR (@CurrentCommandOutput02 = 0 AND @Verify = 'Y' AND @CurrentCommandOutput03 = 0 AND @CurrentCleanupDate IS NOT NULL) 
    BEGIN 
    IF @BackupSoftware IS NULL 
    BEGIN 
     SET @CurrentCommand04 = 'DECLARE @ReturnCode int EXECUTE @ReturnCode = master.dbo.xp_delete_file 0, N''' + REPLACE(@CurrentDirectory,'''','''''') + ''', ''' + @CurrentFileExtension + ''', ''' + CONVERT(nvarchar(19),@CurrentCleanupDate,126) + ''' IF @ReturnCode <> 0 RAISERROR(''Error deleting files.'', 16, 1)' 
    END 

    IF @BackupSoftware = 'LITESPEED' 
    BEGIN 
     SET @CurrentCommand04 = 'DECLARE @ReturnCode int EXECUTE @ReturnCode = master.dbo.xp_slssqlmaint N''-MAINTDEL -DELFOLDER "' + REPLACE(@CurrentDirectory,'''','''''') + '" -DELEXTENSION "' + @CurrentFileExtension + '" -DELUNIT "' + CAST(DATEDIFF(mi,@CurrentCleanupDate,GETDATE()) + 1 AS nvarchar) + '" -DELUNITTYPE "minutes" -DELUSEAGE'' IF @ReturnCode <> 0 RAISERROR(''Error deleting LiteSpeed backup files.'', 16, 1)' 
    END 

    EXECUTE @CurrentCommandOutput04 = [dbo].[CommandExecute] @CurrentCommand04, '', 1, @Execute 
    SET @Error = @@ERROR 
    IF @Error <> 0 SET @CurrentCommandOutput04 = @Error 
    END 

Répondre

0

Quels types de fichiers que vous essayez de supprimer? Xp_delete_file est un SP de SQL 2000. Il vérifie la première ligne du fichier à supprimer pour vérifier qu'il s'agit d'un fichier de sauvegarde SQL ou d'un fichier de rapport SQL. Il ne vérifie pas en fonction de l'extension de fichier.

peut-être si vous postez une partie de votre code de suppression, il serait plus facile d'aider

+0

Il tente de supprimer un fichier .BAK généré par SQL –

+0

ok, pouvez-vous poster le résultat de la ligne qui appelle la procédure xp_delete_file Il semble qu'il vous manque un paramètre à la fin – Diego

+0

C'est l'un des problèmes, soit il complète la commande et donc il Ce n'est pas une erreur, ou il reste sur cette commande aussi longtemps que je le permets.Je l'ai tué pendant le week-end après avoir passé 38 heures sur ce commandement, ça marche, environ tous les 4 jours environ. pour travailler tous les soirs, ou du moins plus souvent que pas! –

0

Je vous recommande d'utiliser une fonction CLR pour faire les opérations de fichiers. Créer un ensemble qui manipule le fichier (par exemple. Utilisant File.Delete, charger cet ensemble dans le système et marquer avec des EXTERNAL_ACCESS et utiliser les fonctions CLR ajoutés au lieu des dépréciées XPs en situation irrégulière. Voir How to: Create and Run a CLR SQL Server Stored Procedure.