3

Je travaille pour améliorer ma compréhension de certains sprocs système et je suis très confus par ce script sur lequel je travaillais. Pour exercer ma compréhension de sp_MSForEachDB j'ai décidé d'écrire un script qui tronquerait les journaux de toutes les bases de données sur un serveur. En tant que tel, je suis venu avec le script suivant:Comportement de sp_MSForEachDB inattendu

sp_MSForEachDb 'IF LOWER(rtrim(''?'')) NOT IN ('''', ''master'', ''tempdb'', ''tempdev'', ''model'', ''msdb'') 
       BEGIN 
        declare @LogFile nvarchar(max) 
        USE [?] 
        SELECT @LogFile = sys.sysaltfiles.name FROM sys.sysdatabases 
        INNER JOIN sys.sysaltfiles ON sys.sysdatabases.dbid = sys.sysaltfiles.dbid 
        WHERE (sys.sysaltfiles.fileid = 1) AND (sys.sysdatabases.name = ''?'') 
        print ''DB: [?], Log: '' + @LogFile 
        CHECKPOINT 
        DBCC SHRINKFILE (@LogFile, 1) 
       END' 

Il se avère que seulement parfois ce tronquer avec succès le journal d'une base de données. Sur les bases de données il échoue (pas de message d'erreur, me laisse juste avec un fichier journal non tronqué), il échoue de façon cohérente/reproductible.

Dans la déclaration d'impression, cependant, il imprime exactement ce que je m'attendais à imprimer. Cependant, si je tape manuellement juste la partie fonctionnelle de ce script pour chaque base de données:

USE [Seed] 
CHECKPOINT 
DBCC SHRINKFILE('Seedlog', 1) 

il fonctionne à 100% du temps.

Pourquoi la "boucle" sp_MSForEachDB ne fonctionne-t-elle pas comme prévu? Qu'est-ce que je rate?

Répondre

2

Il semble que votre requête renvoie le nom logique du fichier de données et non le fichier journal? (fileID = 1)

+0

Wow, tout à fait l'oubli. Bonne prise! Merci pour vos yeux. :) – Jaxidian