数据库用户已被授予SQLAgentOperatorRole
,但在设置作业启用/禁用时仍然存在错误。错误消息是:
对象'sysjobs',数据库'msdb',架构'dbo'
上的SELECT权限被拒绝
我们通过sp_update_job
设置作业启用/禁用。
评论:
执行以下语句时,将收到错误。
bool result = ObjectInstance.ExecuteStoreQuery<bool>("EXEC usp_prod_SetJobStatus @jobName={0}, @isEnable={1}", jobName, isEnable).FirstOrDefault();
但是,使用以下语句时,它将执行成功。
ObjectInstance.ExecuteStoreCommand("EXEC msdb.dbo.sp_update_job @job_name={0}, @enabled={1}", jobName, isEnable);
usp_prod_SetJobStatus SP:
CREATE PROCEDURE [dbo].[usp_prod_SetJobStatus]
@jobName VARCHAR(200),
@isEnable BIT
AS
BEGIN
DECLARE @jobId uniqueidentifier
DECLARE @result BIT
SELECT @jobId = job_id FROM msdb.dbo.sysjobs WHERE name = @jobName
IF(@jobId IS NOT NULL)
BEGIN
EXEC @result = msdb.dbo.sp_update_job @job_name=@jobName, @enabled=@isEnable
END
ELSE
BEGIN
SET @result = 1
END
SELECT @result
END
答案 0 :(得分:3)
我已经解决了这个问题。原因是sysjobs表上没有用户的SELECT权限。因此,我们需要为用户授予SELECT perssion。
USE msdb
GRANT SELECT ON msdb.dbo.sysjobs TO useName
答案 1 :(得分:0)
您已为代理操作员角色指定了启用和禁用,但SQLAgentOperatorRole成员可以通过使用存储过程sp_update_job并指定@enabled和@job_id(或@job_name)参数的值来启用或禁用它们不拥有的本地作业。如果此角色的成员为此存储过程指定了任何其他参数,则该过程的执行将失败。您必须在sql server agnet上执行权限。