使用RDS检索代理SQL作业的当前执行状态

时间:2018-01-02 18:18:01

标签: sql-server amazon-rds jobs

我已经多年使用此查询来监控作业的执行情况:

    SELECT j.name , ja.start_execution_date ,
   Datediff(ss, ja.start_execution_date, Getdate()) AS 'HasRun(seconds)'    
    FROM   msdb.dbo.sysjobactivity ja   
    INNER JOIN msdb.dbo.sysjobs J   
    ON j.job_id = ja.job_id 
    WHERE  ja.session_id = (select MAX(sac.session_id) 
                              from msdb.dbo.sysjobactivity sac 
                             where sac.job_id = j.job_id)
    AND ja.start_execution_date IS not NULL
    and ja.stop_execution_date is null

此解决方案在普通的MSSQL服务器上运行良好。但现在我正在使用亚马逊的RDS,而且安全性太有限了。我甚至无法执行

select * FROM msdb.dbo.sysjobactivity 

使用“最完整的安全配置文件”登录。

我尝试过在不同博客上发布的其他解决方案(比如....

SELECT name, current_execution_status, job_id
INTO #Jobs
FROM OPENROWSET(‘SQLNCLI’, ‘server=(local);trusted_connection=yes’,

'设置fmtonly off exec msdb.dbo.sp_help_job')

...)

但由于缺少权限,无论是在msdb表,sps还是其他元素上,这些都不适用于RDS。

你是否有办法在RDS上为一个凡人用户检索一个表/变量上的作业状态(即它是否正在运行)?

1 个答案:

答案 0 :(得分:0)

假设在SQL Server RDS实例中只有一个具有公共服务器角色的登录名。

1)您需要将该登录名作为用户添加到msdb数据库中 使用[msdb] 走 创建用户[您的用户名]以便登录[您的用户名]

2)将用户添加到角色SQLAgentUserRole

之后

EXEC sp_addrolemember [SQLAgentUserRole],[您的用户名];

3)最后,您应该可以运行exec msdb.dbo.sp_help_jobhistory

有关过程的详细信息,请参见here

编辑:您需要运行查询,而不要使用GUI 编辑2:仅当运行sp的用户是作业的所有者时,RDS才可以查看作业的历史记录