在SQL Server中设置作业启用/禁用的权限

时间:2012-05-03 08:04:22

标签: sql-server sql-agent-job

数据库用户已被授予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

2 个答案:

答案 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上执行权限。