当我尝试运行Sql代理程序作业时,我正在检查是否有同时运行的先前实例。查询如下:
IF NOT EXISTS(SELECT
1
FROM msdb.dbo.sysjobactivity ja
LEFT JOIN msdb.dbo.sysjobhistory jh
ON ja.job_history_id = jh.instance_id
JOIN msdb.dbo.sysjobs j
ON ja.job_id = j.job_id
JOIN msdb.dbo.sysjobsteps js
ON ja.job_id = js.job_id
AND ISNULL(ja.last_executed_step_id,0)+1 = js.step_id
WHERE ja.session_id = (SELECT TOP 1 session_id FROM msdb.dbo.syssessions ORDER BY agent_start_date DESC)
AND j.name = N'JobName'
AND start_execution_date is not null
AND stop_execution_date is null
)
BEGIN
-- code to run the job
END
但是,我收到错误
对象' syssessions',数据库' msdb',架构' dbo'拒绝了SELECT权限。 [SQLSTATE 42000](错误229)。
步骤失败。作业步骤由具有sysadmin
权限的帐户运行。
我也尝试在db_owner
数据库中为该帐户授予msdb
权限。仍然,面临同样的问题。
有关如何解决此许可问题,请指导我吗?
答案 0 :(得分:1)
我认为您不需要手动检查是否有其他实例正在运行。
示例作业的步骤:
SELECT 1;
WAITFOR DELAY '00:00:45';
尝试运行两次:
EXEC msdb.dbo.sp_start_job 'job'
-- Job 'job' started successfully.
EXEC msdb.dbo.sp_start_job 'job'
Msg 22022,Level 16,State 1,Line 3
SQLServerAgent错误: 请求运行作业Job()被拒绝,因为该作业已经从<>的请求中运行。