我正在尝试从 SqlAgentOperator 角色成员(但不是系统管理员)的帐户中禁用 SQL 代理作业
doco说这应该是可能的
3 SQLAgentOperatorRole 成员可以启用或禁用他们不拥有的本地作业,方法是使用存储过程 sp_update_job 并指定 @enabled 和 @job_id(或 @job_name)参数的值。如果此角色的成员为此存储过程指定任何其他参数,则该过程的执行将失败。
...实际上 msdb.dbo.sp_update_job 的代码似乎支持这一点——它对这种情况有明确的处理。但是,如果我运行:
use [MSDB]
go
select suser_sname()
if(is_member('SqlAgentOperatorRole')<>1)
raiserror('Not in required role',16,1)
go
exec dbo.sp_update_job @job_name='a job', @enabled=0
...我收到以下错误:
消息 229,级别 14,状态 5,过程 sp_update_job,第 1 行 对对象“sp_update_job”、数据库“msdb”、架构“dbo”的 EXECUTE 权限被拒绝。
该错误消息似乎表明该过程甚至没有运行,但即使授予该用户对该存储过程的显式 EXECUTE 似乎也无法修复它。
有谁知道如何授予用户禁用/启用他们不拥有或已成功使用此功能的 SQL 代理作业的能力。也许它只是在 SQL 2012 SP1 CU4(我正在使用的)中被破坏
请检查 sp_update_job 过程是否存在 DENY。这可能是对您的登录的直接拒绝,也可能是对以您的登录为成员的某个组的拒绝。DENY 总是胜过 grant。
如果是这样,那么从组中删除您的登录名或让管理员 REVOKE DENY 应该可以解决问题。
通过阅读 Piers7 请求提示响应。当然,时间已经过去了。
RLF 是正确的 - 相关用户也在 msdb“TargetServersRole”中,并且该角色被明确拒绝对该存储过程的权限。呸!
不幸的是,fn_my_permissions 不显示拒绝(它显示结果 - 无权限),并且 SSMS 属性菜单(和权限选项卡)不会显示系统存储过程,否则我几天前就会选择它。
[@RLF:如果您想将您的评论提升为答案,我会将其标记为正确,并删除这个(假设我可以)]
编辑:我应该用它来诊断 - 下次会知道: