assumer SQL Server 2005/2008 avec un grand nombre de bases de données. Y a-t-il un moyen de dire rapidement quelle base de données, le cas échéant, est jointe à un fichier .MDF particulier? p>
Nous avons laissé tomber quelques bases de données au fil du temps et nous souhaitons nettoyer certains DANINGING .MDF's pour effacer l'espace sur le serveur. Actuellement, le seul moyen que je connaisse consiste à examiner les propriétés de chaque base de données, une par une, dans le studio de gestion et faire une liste des fichiers qu'ils sont attachés à. À la recherche d'un peu plus efficace que cela, si quelque chose existe. P>
6 Réponses :
Solution basse Tech ... Déplacez le fichier MDF à un autre endroit. Si elle est attachée, SQL Server ne vous laisserait pas le déplacer :)
de l'invite de commande p> Tous les fichiers inutilisés seraient déplacés vers InsanglesDBFiles. P> p>
Que se passe-t-il si votre serveur SQL a été arrêté? Je suppose que tous les fichiers sont déplacés puis votre serveur ne parviendra pas à redémarrer ...
Pourquoi fonctionnerait-il quelque chose comme celui-ci lorsque SQL est en panne comme tout le but de ceci est de trouver nos fichiers pas b> utilisés par SQL Server. De plus, si quelqu'un fait l'erreur, les fichiers sont uniquement "déplacés" non supprimés. Retournez-les!
Cela peut aider.
declare @files table ( db_name sysname, physical_name nvarchar(260) ) insert into @files exec sp_MSforeachdb 'select "?", physical_name from ?.sys.database_files' select db_name, physical_name from @files
Vous pouvez également utiliser orcamdf pour ceci: ceci "LL vous permet d'interroger le MDF pour leur nom de base de données sans les attacher au serveur de base de données. Notez que cela devrait être effectué sur le fichier de données primaire, au cas où il y a plusieurs fichiers. Disclaimer - Je suis l'auteur de Orcamdf. P> boucle via tous les fichiers du répertoire de données, il serait facile de joindre cela avec des sys.databases et de voir lesquels ne correspondent pas, et sont Ainsi, des fichiers MDF non joints. P> EDIT: Posté un exemple de plus complet sur mon blog: http://improvrove.dk/archive/2011/05/19/checking-qui-hattabase-si-stored- In-Duattached-MDF-File.aspx P> P>
sys.master_files contient une ligne par base de données pour le premier fichier (ID = 1) pour cette base de données. C'est-à-dire que les tables système seront toujours dans FileID = 1 pour chaque base de données
Tout ce dont vous avez besoin: P>
SELECT DB_NAME(database_id), physical_name FROM sys.master_files
select db_name(database_id), * from sys.master_files Will list all the files of all the databases known on the system.
private bool IsDbAttached() { const string isAttachedSqL = @"SELECT count(*) FROM sys.master_files WHERE DB_NAME(database_id) = @DbName"; bool isAttached = false; try { using (var connection = new SqlConnection(this.connectionString)) using (var command = new SqlCommand(isAttachedSqL, connection)) { command.Parameters.Add("@DbName", SqlDbType.VarChar).Value = "dbName"; connection.Open(); var count = command.ExecuteScalar(); isAttached = (int)count > 0; } } catch { throw; } return isAttached; }