我已经多年使用此查询来监控作业的执行情况:
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上为一个凡人用户检索一个表/变量上的作业状态(即它是否正在运行)?
答案 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才可以查看作业的历史记录