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?
Wow, tout à fait l'oubli. Bonne prise! Merci pour vos yeux. :) – Jaxidian