Sql-Server-2008-R2

從 SQLCMD 部署後腳本執行 aspnet_regsql.exe

  • December 25, 2015

我正在嘗試在 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:致命腳本錯誤:不支持命令執行。

你有三個選擇(至少我能想到):

  1. 執行aspnet_regsql.exe方式xp_cmdshell(它將在與 SQLSERVER 服務關聯的登錄帳戶的安全上下文中執行)。此選項允許您管理對aspnet_regsql.exe部署 SQL 腳本中的呼叫,並在您進行建構時執行。
  2. 編輯“建構後事件”以呼叫相同的命令行。這將允許aspnet_regsql.exe在任何 Windows / Active Directory 登錄執行部署的安全上下文中執行。但是,執行aspnet_regsql.exe不在 SQL 腳本中,因此發布過程需要使用SqlPackage.exe以便它知道執行“建構後事件”中的任何命令。但是,這至少仍然是 SSDT 發布過程的一部分,並且會在您進行建構時執行。
  3. 通過創建將在執行 SQL Server 的伺服器上執行的 CMD 腳本,並呼叫 SQLCMD 來執行您的部署 SQL 腳本,然後在aspnet_regsql.exe. 但是,此選項在 SSDT 發布過程之外,並且在 Visual Studio 中進行建構時不會執行。

引用自:https://dba.stackexchange.com/questions/123933