You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

为何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 "执行异常: $_"
      }
      
  • 添加错误捕获与日志:原代码无错误处理,即使连接失败或作业启动异常也会返回退出码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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.14 07:04:52