各 .mdf のプロパティに移動して接続されているかどうかを確認する以外に、多くのサブフォルダーを含むディレクトリから SQL Server データベースが接続されているかどうかを確認する方法はありますか?
これを達成するためにフォルダー/サブフォルダーをファイルへの書き込みをチェックできるスクリプトはありますか?
皆さんありがとう。
各 .mdf のプロパティに移動して接続されているかどうかを確認する以外に、多くのサブフォルダーを含むディレクトリから SQL Server データベースが接続されているかどうかを確認する方法はありますか?
これを達成するためにフォルダー/サブフォルダーをファイルへの書き込みをチェックできるスクリプトはありますか?
皆さんありがとう。
これはかなり簡単に実行できるはずです。
まず、データベースサーバーのsysdatabaseテーブルにクエリを実行して、アタッチしたすべてのデータベースとそれに対応するファイル名を見つけ、一時テーブルに保存します。
xp_cmdshell関数execを使用してdosDIRコマンドを実行し、適切なスイッチを使用してすべてのMDF / LDFファイルを一覧表示し、フォルダーをナビゲートして結果を別の一時テーブルに保存します。
これらの表を比較すると、添付されていないファイルを見つけることができます。
以前に同様のタスクを実行し、SSISとDirectTransact-SQLの両方を使用しました
T
T-SQLからファイルシステムを読み取る必要がある場合、CLRが最も柔軟性があることがわかります。これらは、system.io名前空間へのフルアクセスと、テーブル値関数のサポートを提供します。
SQL ServerCLRIOユーティリティをご覧ください。xp_cmdshellに眉をひそめていると簡単に利用できないファイルシステム機能を有効にする完全なソリューションがここにあります。
テーブル値関数SQLIO_fnGetFilesを使用して、sys.master_filesテーブルに結合し、データベースに接続されなくなったファイルを返すことができます。この例では、CLRはCLRSという名前のデータベースにデプロイされています。
USE master
SELECT fs.PATH FileSystemPath
, FileIsAttached = CASE WHEN d.name IS NULL THEN 'YES' ELSE 'NO' END
, d.name DatabaseName
, mf.name FileLogicalName
, mf.physical_name DatabaseFilePath
, FileType = CASE mf.type_desc WHEN 'ROWS' THEN 'DATA' ELSE mf.type_desc END
FROM CLRS.dbo.SQLIO_fnGetFiles('L:\MSSQL\','*df',1) fs
LEFT OUTER JOIN sys.master_files mf ON fs.PATH = mf.physical_name
LEFT OUTER JOIN sys.databases d ON d.database_id = mf.database_id
これを実現する他の方法(powershell、.net、ssis、...)もあります。私の経験では、IOユーティリティソリューションを導入すると、他にも多くの時間を節約できる用途が見つかります。