T-SQL Server 代理作业失败“用户无权执行此操作”

Posted

技术标签:

【中文标题】T-SQL Server 代理作业失败“用户无权执行此操作”【英文标题】:T-SQL Server Agent Job fails "User does not have permission to perform this action" 【发布时间】:2014-01-14 17:16:58 【问题描述】:

我在 SQL Server 代理中设置了一个 T-SQL 作业,每周运行一次。在 SQL Server Management Studio 中,我可以将脚本作为查询成功运行,但是当作业运行时会出错:

“以用户身份执行:DOMAIN\user。用户没有权限 执行此操作。 [SQLSTATE 42000](错误 15247)。步骤 失败了。”

该脚本正在从一台 SQL 服务器导出表数据并将其转储到另一台链接服务器。从我收集的信息来看,T-SQL 不使用代理和凭据,它在执行脚本时使用所有者登录我是两个数据库上的 db_owner 和两个服务器上的 sysadmin 和 serveradmin,我错过了什么?

【问题讨论】:

作业设置运行的用户是什么?要找到你需要去general->Owner。它将在作业的属性中。 所有者设置为我的网络登录。 所以在上述错误中,出于安全原因,我将网络登录替换为 DOMAIN\user。 尝试将工作所有者更改为sa。您的登录名可能没有(也可能不应该)运行作业等。 Job Step Properties -> Advanced -> Run as user,这应该是左岸吗?如果将其留空并且我使用“sa”作为所有者,则会收到以下错误“作为用户执行:NT AUTHORITY\NETWORK SERVICE。用户 'DOMAIN\server$' 登录失败。[SQLSTATE 28000](错误 18456)。步骤失败。” 【参考方案1】:

请参阅this page 关于 SQL Server 代理用户上下文的服务器端安全要求(不是数据库安全)。 SQL 代理是一个外部进程,它被分配了一个 Windows 帐户以在其下运行,并且该帐户必须在数据库实例的 sysadmin 组中。

【讨论】:

我按照这些步骤将我的域用户名添加到 SQL 服务器本地安全策略 - 作为服务登录 (SeServiceLogonRight) - 替换进程级令牌 (SeAssignPrimaryTokenPrivilege) - 绕过遍历检查 (SeChangeNotifyPrivilege) - 调整进程的内存配额(SeIncreaseQuotaPrivilege)但还是有同样的错误... 尝试将 SQL 代理进程运行的用户上下文更改为内置 NT AUTHORITY\System 帐户。 SQL 代理进程不应在您的帐户下运行(尽管您的 SQL 代理 job 可以根据需要执行此操作)。【参考方案2】:

感谢大家的帮助,您的建议引导我找到解决方案。为了让它工作,我的域登录是工作的所有者。在高级下的步骤属性中,我将“以用户身份运行”留空,然后将“EXEC AS LOGIN = 'DOMAIN\user'”添加到 T-SQL 脚本中,它就起作用了!

【讨论】:

【参考方案3】:

这是一个老问题,但我花了很长时间才找到答案,所以只是为了帮助加强它,以防其他人遇到这个问题......

Chad 的解决方案也是唯一对我有用的解决方案。将作业步骤属性高级选项卡中的“以用户身份运行”框留空,并将“EXEC AS LOGIN = 'DOMAIN\user'”添加到 T-SQL 脚本。我还必须确保 'DOMAIN\user' 帐户已作为具有有效/必要角色的登录名添加到 SQL Server 实例。

【讨论】:

以上是关于T-SQL Server 代理作业失败“用户无权执行此操作”的主要内容,如果未能解决你的问题,请参考以下文章

Sql Server代理作业

SQL Server 代理作业在失败时通知多个操作员

sql server 2008,SP_OACreate手动执行成功,代理作业定时执行失败?

SQL Server Job

复制数据库 SQL Server 2012 中的“作业失败”

SQL Server作业失败 - 帐户被锁定