为何SQL Agent作业的PowerShell命令无法触发Azure VM上的SQL作业?
问题描述
我尝试通过SQL Agent作业触发另一台SQL Server上的作业。环境包含本地服务器和Azure中的SQL Server虚拟机。PowerShell命令在本地服务器之间执行正常,但从本地服务器触发Azure虚拟机上的SQL Agent作业时,作业并未被触发,却显示“成功退出”,输出信息如下:
Executed as user: DOMAIN\sysadminuser. The step did not generate any output. Process Exit Code 0. The step succeeded.
使用的PowerShell命令:
$ServerName="SQL_On_AzureVM_ServerName" $JobName="Test" [System.Reflection.Assembly]::LoadWithPartialName('Microsoft.SqlServer.SMO') | out-null $srv = New-Object Microsoft.SqlServer.Management.SMO.Server("$ServerName") $job = $srv.jobserver.jobs["$JobName"] if ($job) { $job.Start() $i = 0 }
排查与解决步骤
- 检查网络连通性:确认本地服务器到Azure SQL VM的SQL端口(默认1433,自定义端口需对应)在Azure网络安全组(NSG)和本地防火墙中均已放行,可通过
Test-NetConnection $ServerName -Port 1433验证连通性。 - 验证身份与权限:
- 执行SQL Agent作业的
DOMAIN\sysadminuser账号,需在Azure SQL VM的SQL Server中拥有SQLAgentOperatorRole(或更高权限如SQLAgentAdminRole),同时具备目标作业的启动权限。 - 若Azure VM未加入域,改用SQL身份认证,修改代码添加凭据:
$ServerName="SQL_On_AzureVM_ServerName" $JobName="Test" $sqlLogin = "sql_admin_account" $sqlPwd = ConvertTo-SecureString "your_password" -AsPlainText -Force $cred = New-Object System.Management.Automation.PSCredential($sqlLogin, $sqlPwd) try { [System.Reflection.Assembly]::LoadWithPartialName('Microsoft.SqlServer.SMO') | out-null $srv = New-Object Microsoft.SqlServer.Management.SMO.Server("$ServerName") $srv.ConnectionContext.LoginSecure = $false $srv.ConnectionContext.Login = $cred.UserName $srv.ConnectionContext.SecurePassword = $cred.Password $job = $srv.jobserver.jobs["$JobName"] if ($job) { $startResult = $job.Start() Write-Output "作业启动状态: $($startResult.Status)" } else { Write-Error "未找到目标作业: $JobName" } } catch { Write-Error "执行异常: $_" }
- 执行SQL Agent作业的
- 添加错误捕获与日志:原代码无错误处理,即使连接失败或作业启动异常也会返回退出码0。修改代码增加日志输出和异常捕获,便于定位问题(如上例)。
- 确认Azure VM上的SQL Agent状态:远程登录Azure VM,检查SQL Server Agent服务是否正常运行,且服务账号拥有足够权限启动作业。
- 改用T-SQL远程触发:如果SMO方式仍有问题,直接使用
sqlcmd执行T-SQL命令启动作业,更易排查权限或连接问题:$ServerName="SQL_On_AzureVM_ServerName" $JobName="Test" # Windows身份认证 sqlcmd -S $ServerName -E -Q "EXEC msdb.dbo.sp_start_job @job_name=N'$JobName'" # SQL身份认证 sqlcmd -S $ServerName -U sql_login -P sql_password -Q "EXEC msdb.dbo.sp_start_job @job_name=N'$JobName'"
内容的提问来源于stack exchange,提问作者graham
相关产品推荐
相关产品推荐

