none
为什么T-SQL脚本能在SQL Server Management Studio里运行却用代理作业(Agent Job)执行失败? RRS feed

  • 常规讨论

  • 这个问题通常情况下是因为作业执行的安全上下文与直接在SSMS里执行的安全上下文不一致。在SSMS里运行的T-SQL命令是运行在当前的用户下(login)。然而,在默认情况下每个作业是运行在SQL Server Agent服务账号的安全上下文下。如果SQL Server Agent服务账号与用户账号不一致,并且它没有足够的权限来执行作业,那么作业将运行失败。

    虽然你可以简单的给SQL Server Agent服务账号权限来执行T-SQL脚本,但从安全的角度来看这不是一个推荐的做法。对于SQL Server Agent服务账号,推荐仅仅给它恰当好的权限,不给任何多余的权限。然后你也不可以创建一个SQL Server Agent代理来执行作业,这是因为T-SQL作业不支持使用SQL Server Agent代理。对了一个T-SQL作业步骤(job step),默认情况下它是运行在作业所有者(job owner)安全上下文下,但如果作业的所有者是sysadmin固定服务器角色的成员,作业会运行下SQL Server Agent服务账号下。

    你可以使用以后任何一种方法解决这个问题:

    1.       第一种方法是改变作业的所有者到一个具有足够权限执行该T-SQL脚本的用户,但是新的作业所有的不具有sysadmin权限。

    2.       第二种方法是如果这个作业有多个作业步骤同时你也不想改变作业所有者以免影响其它的作业步骤,你可以在T-SQL作业步骤中指定“作为以下用户运行”选项。要指定T-SQL脚本步骤“作为以下用户运行”选项,在作业步骤对话框中,点击左边面板的“高级”选项,在“作为以下用户运行”选项中输入正确的用户。注意,确保你是一个sysadmin成员来编辑这个选项。

    参考:

    如何定义 Transact-SQL 作业步骤选项 (SQL Server Management Studio)
    http://msdn.microsoft.com/zh-cn/library/ms190223.aspx

    SQL Server 代理子系统
    http://msdn.microsoft.com/zh-cn/library/ms187100.aspx

    EXECUTE AS (Transact-SQL)
    http://msdn.microsoft.com/zh-cn/library/ms181362.aspx

    2011年9月6日 5:48
    版主