1

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

2 回答 2

3

我已经解决了这个问题。原因是用户在 sysjobs 表上没有 SELECT 权限。因此,我们需要为用户授予 SELECT 权限。

USE msdb
GRANT SELECT ON msdb.dbo.sysjobs TO useName
于 2012-05-08T00:35:23.313 回答
0

您已赋予代理操作员角色启用和禁用的权限,但 SQLAgentOperatorRole 成员可以通过使用存储过程 sp_update_job 并指定 @enabled 和 @job_id(或 @job_name)参数的值来启用或禁用他们不拥有的本地作业。如果此角色的成员为此存储过程指定任何其他参数,则该过程的执行将失败..您必须对 sql server agnet 执行权限。

于 2012-05-03T08:39:27.900 回答