附加資料庫時常遇到「附加失敗」或「附加成功但資料庫進入唯讀狀態」,導致自動化部署腳本失效。經驗證,此問題僅發生於 NTFS 檔案系統,根因是資料庫檔案 (.mdf/.ldf) 的 NTFS 安全性權限設定不當,SQL Server 服務帳號缺乏完整控制權限。
完成後重新附加即可正常讀寫。
部署程式不可要求使用者手動操作,需以程式碼自動調整權限。
using Microsoft.Win32;
public void DisableSimpleFileSharing() {
using (var key = Registry.LocalMachine.OpenSubKey(
@"SYSTEM\CurrentControlSet\Control\Lsa", true)) {
key.SetValue("forceguest", 0, RegistryValueKind.DWord); // 0=關閉, 1=開啟
}
}
等效批次指令:reg add HKLM\SYSTEM\CurrentControlSet\Control\Lsa /v forceguest /t REG_DWORD /d 0 /f
using System.IO;
using System.Security.AccessControl;
public void GrantFullControl(string folderPath, string account) {
var dirInfo = new DirectoryInfo(folderPath);
var dirSec = dirInfo.GetAccessControl();
var rule = new FileSystemAccessRule(account,
FileSystemRights.FullControl,
InheritanceFlags.ContainerInherit | InheritanceFlags.ObjectInherit,
PropagationFlags.None,
AccessControlType.Allow);
dirSec.AddAccessRule(rule);
dirInfo.SetAccessControl(dirSec);
}
呼叫範例:GrantFullControl(targetDir, Environment.UserDomainName + "\\" + Environment.UserName);
NT SERVICE\MSSQLSERVER 或網域服務帳號),而非當前互動使用者。FILE_SNAPSHOT 備份等新特性,附加邏輯可能不同,需實測驗證。資料庫附加唯讀/失敗本質是 NTFS ACL 配置問題。透過登錄關閉簡單共享、程式化授予服務帳號完整控制權,可徹底解決自動化部署中的附加障礙。建議將此邏輯封裝為部署套件的標準前置步驟,確保環境一致性。