從 SQLCMD 部署後腳本執行 aspnet_regsql.exe
我正在嘗試在 SSDT 中創建一個部署後腳本,其中包括創建 ASP.NET 會話狀態數據庫,以確保在部署我的數據庫項目後每個人都擁有這個東西。
如果數據庫還沒有到位,以下命令會為我創建數據庫:
C:\Windows\Microsoft.NET\Framework\v2.0.50727\aspnet_regsql.exe -ssadd -sstype c -S localhost -d ASPSTATE -E
起初,我通常嘗試將其作為 SQLCMD 腳本的一部分執行。SQLCMD模式下的方法如下:
:!!C:\Windows\Microsoft.NET\Framework\v2.0.50727\aspnet_regsql.exe -ssadd -sstype c -S localhost -d myStateDb -E
然後我嘗試以基本相同的方式將其包含在 Post Deployment 腳本中:
:!!C:\Windows\Microsoft.NET\Framework\v2.0.50727\aspnet_regsql.exe -ssadd -sstype c -S localhost -d TESTdb -E
這最終導致 Visual Studio 編譯器在這一行中抱怨反斜杠。
“SQL72007:你的語法檢查失敗。語法錯誤接近 ‘' 在批處理附近:
$$ The command above again $$"
由於它在 SSMS 中工作,我不明白為什麼我的部署後腳本一直在抱怨?
SQL Server Management Studio (SSMS) 僅支持 SQLCMD 命令的子集,而 SQL Server Data Tools (SSDT) 僅支持 SSMS 中允許的 SQLCMD 命令的子集。
[:]!!
SQLCMD 命令雖然受 SSMS支持,但在 SSDT 部署前或部署後 SQL 腳本中不受支持*。*這很可能是由於人們沒有意識到由[:]!!
SQLCMD 命令執行的命令實際上是在執行 SQLCMD 的機器上執行而引起的大量混淆,這不能保證在執行之間保持一致,並且不一定是執行 SQL Server 的同一台電腦。例如,在本地工作站或筆記型電腦上使用 Visual Studio 進行開發並執行此部署時,該命令將在本地工作站或筆記型電腦上執行。然後,當部署到測試 / QA 時,它將在執行該部署的任何機器上執行,這通常不是您的本地工作站。然後在部署到生產環境時,它會再次在建構伺服器上執行,該伺服器可能是也可能不是處理部署到 QA 伺服器的同一台伺服器。
如果您將 Post-Deployment 更改為僅執行以下操作,然後進行建構:
:!! dir
那麼你會看到這個錯誤:
72006:致命腳本錯誤:不支持命令執行。
你有三個選擇(至少我能想到):
- 執行
aspnet_regsql.exe
方式xp_cmdshell
(它將在與 SQLSERVER 服務關聯的登錄帳戶的安全上下文中執行)。此選項允許您管理對aspnet_regsql.exe
部署 SQL 腳本中的呼叫,並在您進行建構時執行。- 編輯“建構後事件”以呼叫相同的命令行。這將允許
aspnet_regsql.exe
在任何 Windows / Active Directory 登錄執行部署的安全上下文中執行。但是,執行aspnet_regsql.exe
不在 SQL 腳本中,因此發布過程需要使用SqlPackage.exe以便它知道執行“建構後事件”中的任何命令。但是,這至少仍然是 SSDT 發布過程的一部分,並且會在您進行建構時執行。- 通過創建將在執行 SQL Server 的伺服器上執行的 CMD 腳本,並呼叫 SQLCMD 來執行您的部署 SQL 腳本,然後在
aspnet_regsql.exe
. 但是,此選項在 SSDT 發布過程之外,並且在 Visual Studio 中進行建構時不會執行。