我编写了一个脚本,从msdb.dbo.sysschedules读取作业计划,并运行sp_update_schedule来更改给定作业子集的active_start_time。在每种情况下,sp_update_schedule都会失败,因为消息“指定的@schedule_id('xxx')不存在”。(MessageID 14262,严重程度16)
schedule id in sysschedules不是它想要的吗?我在这里错过了什么?
发布于 2020-10-06 13:21:38
@schedule_id参数在sp_update_schedule上确实引用了msdb.dbo.sysschedules上的schedule_id列
sp_update_schedule包含对sp_verify_schedule_identifiers的调用以验证计划,从这个验证步骤您将得到该错误(消息14262)。
EXECUTE @retval = msdb.dbo.sp_verify_schedule_identifiers
@name_of_name_parameter = '@name',
@name_of_id_parameter = '@schedule_id',
@schedule_name = @name OUTPUT,
@schedule_id = @schedule_id OUTPUT,
@owner_sid = @cur_owner_sid OUTPUT,
@orig_server_id = NULL 如果您同时传递一个计划id和一个计划名称,则您要传递的名称字符串可能会出现问题,因为它用于验证过程中的其他筛选。
我建议直接调用sp_verify_schedule_identifiers进行一些测试,以便简化故障排除,并确保将有效的参数传递给sp_update_schedule:
DECLARE
@name_of_name_parameter VARCHAR(60) ,--= '@schedule_name',
@name_of_id_parameter VARCHAR(60) = '@schedule_id',
@schedule_name sysname ,--= 'syspolicy_purge_history_schedule',
@schedule_id INT = 8,
@owner_sid VARBINARY(85),
@orig_server_id INT,
@job_id_filter UNIQUEIDENTIFIER = NULL,
@RetCode INT;
EXEC @RetCode = sp_verify_schedule_identifiers
@name_of_name_parameter = @name_of_name_parameter,
@name_of_id_parameter = @name_of_id_parameter,
@schedule_name = @schedule_name,
@schedule_id = @schedule_id,
@owner_sid = @owner_sid,
@orig_server_id = @orig_server_id,
@job_id_filter = @job_id_filter;
SELECT
RetCode = @RetCode,
NameOfNameParam = @name_of_name_parameter,
NameOfIdParam = @name_of_id_parameter,
ScheduleName = @schedule_name,
ScheduleID = @schedule_id,
OwnerSid = @owner_sid,
OrigServerID = @orig_server_id,
JobIDFilter = @job_id_filter; 权限也可能会妨碍您的方式。您至少需要GRANT EXEC ON sp_update_schedule TO <your login>才能打您想打的电话。要执行上面列出的故障排除步骤,还需要授予EXEC on sp_verify_schedule_identifiers--尽管只有在直接执行它时才需要这样做。通常,所有权链将允许您只需要顶级权限&您将隐式地拥有执行该过程所需的权限。还可以将您添加到msdb中的SQLAgentUserRole安全角色中,该角色还包括其他权限--如果您正在重新安排作业,您可能还需要/需要一些其他权限来完成您的工作,前提是这是一个可接受的访问级别。
https://dba.stackexchange.com/questions/276609
复制相似问题