使用 `aspnet_regsql.exe` 精靈時,選擇伺服器、輸入 SQL 驗證帳號密碼後,點選資料庫下拉清單,出現:
錯誤 1:`未能查詢 SQL Server 中的資料庫名稱清單。無法開啟使用者預設資料庫,登入失敗,使用者 'testdb' 登入失敗。`
錯誤 2 (授予 sysadmin 後):`未能查詢 SQL Server 中的資料庫名稱清單。物件名稱 'sysdatabases' 無效。`
**現象**:下拉清單無法展開,但**輸入框可編輯**。
**操作**:直接在資料庫下拉框輸入目標資料庫名稱 (如 `TESTDB`),按 `Tab` 或點擊 `下一步`。
**結果**:精靈跳過查詢清單步驟,直接嘗試連線指定資料庫執行建立腳本,**多數情況下即可成功**。
⚠ 前提:資料庫 `TESTDB` 必須已存在,且登入帳號擁有該資料庫的 `db_owner` 權限 (或 `db_ddladmin` + `db_datareader` + `db_datawriter`)。
-- SSMS 執行
ALTER LOGIN [testdb] WITH DEFAULT_DATABASE = [master];
GO
-- 或透過 SSMS 介面:安全性 → 登入 → testdb → 屬性 → 常規 → 預設資料庫 → master
將預設資料庫改為 `master` (永遠存在),避免登入階段失敗。
**不需 `sysadmin`**,僅需:
-- 建立登入並授權
CREATE LOGIN [app_reg] WITH PASSWORD = 'StrongP@ssw0rd', DEFAULT_DATABASE = [master];
GRANT VIEW ANY DATABASE TO [app_reg]; -- 允許查詢清單
USE [TESTDB];
CREATE USER [app_reg] FOR LOGIN [app_reg];
ALTER ROLE [db_owner] ADD MEMBER [app_reg];
C:\Windows\Microsoft.NET\Framework\v4.0.30319\aspnet_regsql.exe
-- 或 64 位元版
C:\Windows\Microsoft.NET\Framework64\v4.0.30319\aspnet_regsql.exe
.NET 4.0 版工具修正了對 `sys.databases` 的查詢相容性,支援 SQL 2008/2012/2014/2016/2019。
aspnet_regsql.exe -S . -U app_reg -P 'StrongP@ssw0rd' -A all -d TESTDB -sqlexportonly > Install_AspNet_Services.sql
-- 確認資料庫線上、非單用戶、非緊急模式
SELECT name, state_desc, user_access_desc FROM sys.databases WHERE name = 'TESTDB';
-- state_desc 必須為 ONLINE
-- user_access_desc 必須為 MULTI_USER

ASP.NET 組態工具預設讀取 `machine.config` 中的 `LocalSqlServer` (指向 `.\SQLEXPRESS` 的 `aspnetdb`)。需覆寫:
| 步驟 | 動作 | 預期結果 |
|---|---|---|
| 1 | 確認目標資料庫存在、ONLINE、MULTI_USER | ✅ |
| 2 | 登入帳號預設資料庫 = master | ✅ |
| 3 | 登入帳號擁有 VIEW ANY DATABASE + 目標 DB db_owner | ✅ |
| 4 | 使用 v4.0 目錄下的 aspnet_regsql.exe | ✅ |
| 5 | 精靈中**手動輸入**資料庫名稱 (繞過清單查詢) | ✅ 通常即可成功 |
| 6 | 若仍失敗 → 匯出 SQL 腳本 → DBA 執行 | ✅ 100% 可控 |
| 7 | 驗證資料表建立 + ASP.NET 組態測試通過 | ✅ 完成 |
核心心法:**工具查詢清單易失敗,手動輸入資料庫名稱是通用繞過法;權限給足、預設庫設對、版本用新、腳本落地**。