Service Broker 在加密模式下部署一組 Server-Client 需 8 大步驟、耗時 40 分鐘:
開發階段每週重新部署 3-4 次,多實例擴展更是噩夢。
REM 測試本機
sqlcmd -U sa -P P@ssw0rd -S localhost -Q "SELECT @@VERSION"
REM 測試遠端(含具名實例)
sqlcmd -U sa -P P@ssw0rd -S 10.32.0.1\SQLEXPRESS -Q "SELECT DB_NAME()"
常見阻礙:SQL Express 預設關閉 TCP/IP、防火牆阻擋 1433、Browser 服務未啟動。需在 Configuration Manager 啟用協定、開放埠、啟動 Browser。
REM 單機執行
sqlcmd -U sa -P P@ssw0rd -S 10.32.0.1\SQLEXPRESS -i C:\Deploy\Clear.sql
REM 多機迴圈部署
SET IP_LIST=10.32.0.1 10.32.0.2 10.32.0.3
FOR %%A IN (%IP_LIST%) DO (
sqlcmd -U sa -P P@ssw0rd -S %%A\SQLEXPRESS -i C:\Deploy\Clear.sql
)
REM 建立共享並設定 Everyone 完整控制
net share DeployShare=C:\Deploy /GRANT:Everyone,FULL
REM 遠端複製憑證檔
FOR %%A IN (%IP_LIST%) DO (
copy C:\Deploy\*.cer \\%%A\DeployShare\
)
REM 遠端清理舊檔
FOR %%A IN (%IP_LIST%) DO (
del /s /q \\%%A\DeployShare\*.cer
)
關鍵:sqlcmd 執行 BACKUP CERTIFICATE 生成檔案需寫入共享路徑,故 SQL 服務帳號需有共享寫入權限。
SET IP_LIST=10.32.0.1 10.32.0.2
SET SERIAL_LIST=PC1001 PC1002
SETLOCAL ENABLEDELAYEDEXPANSION
SET IDX=0
FOR %%A IN (%IP_LIST%) DO (
SET /A IDX2=0
FOR %%B IN (%SERIAL_LIST%) DO (
IF "!IDX!"=="!IDX2!" (
SET TARGET_IP=%%A
REM 取 IP 後 6 碼作為憑證檔名後綴
sqlcmd -U sa -P P@ssw0rd -S %%A -i C:\Deploy\Setup.sql -v IP=!TARGET_IP:~-6! -v SerialNumber=%%B
)
SET /A IDX2+=1
)
SET /A IDX+=1
)
:setvar IP ""
:setvar SerialNumber ""
DECLARE @cmd NVARCHAR(MAX), @IP NVARCHAR(20) = '$(IP)';
SET @cmd = 'BACKUP CERTIFICATE [BrokerCert] TO FILE = ''\\Fileserver\Certs\BrokerCert_' + @IP + '.cer''';
EXEC (@cmd);
GO
| 指標 | 手動部署 | 自動化部署 | 提升 |
|---|---|---|---|
| 單組部署時間 | 40 分鐘 | 5 分鐘 | 87.5% ↓ |
| 操作步驟 | 14 步 | 4 步 | 71% ↓ |
| 人員門檻 | 資深 DBA | 測試人員 | 技能下沉 |
| 多 Client 部署 | 線性增長 | 近乎常數 | 平行化 |
-v var=value 中值含空格需雙引號,腳本內用 $(var) 引用。SETLOCAL ENABLEDELAYEDEXPANSION 並用 !var! 讀取。-b 遇錯返回 ERRORLEVEL,批次檔檢查 IF %ERRORLEVEL% NEQ 0 中斷。IF EXISTS DROP、MERGE 模式)。若需產品級部署工具,建議採用 PowerShell + dbatools 或 InstallShield 封裝,提供 GUI、回滾、日誌審計、跨平台支援。但對內部專案,sqlcmd + 批次腳本 已是 ROI 最高的輕量方案。