我有多个作业在AM的不同时间启动,以加载DW。但是,如果其中一项工作失败,我想禁用所有其他早间工作,因为它们彼此依赖。但是,我要禁用的作业在链接服务器上。
我有多个作业在AM的不同时间启动,以加载DW。但是,如果其中一项工作失败,我想禁用所有其他早间工作,因为它们彼此依赖。但是,我要禁用的作业在链接服务器上。
我已经修改了作业,并创建了一个步骤以在上一步失败时禁用特定作业。在此步骤中,我将禁用跨越2台服务器的多个作业。该作业仅在当前服务器上禁用该作业,并引发错误消息
留言
以用户身份执行:NT AUTHORITY \ SYSTEM。对对象'sp_update_job_for_non_admins',数据库'msdb',模式'dbo'的EXECUTE权限被拒绝。 [SQLSTATE 42000](错误229)。步骤失败。
我已经厌倦了手动运行作业以及按计划运行它,但仍然得到相同的结果。 每个服务器上的所有作业均由SQLServerAgent拥有,并且在两个服务器之间具有相同的权限。
EXEC CYP_ABC.msdb.dbo.sp_update_job_for_non_admins
@job_name='Earned_Premium',@enabled = 0
EXEC CYP_X.msdb.dbo.sp_update_job_for_non_admins
@job_name='CYP_DB2_Load_BLAH',@enabled = 0
EXEC CYP_X.msdb.dbo.sp_update_job_for_non_admins
@job_name='CYP_DB2_Update_BLAH',@enabled = 0
我的作业在CYP_ABC服务器上运行,它将仅在CYP_ABC服务器上禁用该作业。我还需要该脚本来禁用链接服务器上的作业,但该脚本会不断抛出上面列出的错误消息。
答案 0 :(得分:0)
这是一个权限问题。 “ NT AUTHORITY \ SYSTEM”是一个本地帐户。对于跨服务器/实例操作,通常将域服务帐户分配给sql代理服务帐户。
一种可能的解决方法是在CYP_X服务器作业中添加一个作业步骤,以查询CYP_ABC服务器上的作业状态。
答案 1 :(得分:0)
作业将需要由登录用户执行,该登录用户在msdb
数据库中具有执行该存储过程的权限。您可以为NT AUTHORITY \ SYSTEM登录名创建一个用户,但是我建议为该帐户以外的登录名创建一个用户。然后,您可以使用创建该用户的登录名来运行此作业。如果执行此操作,请确保登录名具有正确的权限以执行作业中的所有其他操作。下面是创建用户并向该用户授予sp_update_job_for_non_admins
存储过程权限的示例。还应确保用户对该存储过程所使用的对象具有权限,尽管从SP的标题来看,我猜想它应由权限较小的用户使用并以创建它的人身份执行。
USE [msdb]
GO
Create USER [UserInMSDB] FOR LOGIN [YourLoginName]
GO
GRANT EXECUTE ON OBJECT::dbo.sp_update_job_for_non_admins TO [UserInMSDB]