我正在尝试创建一个相当简单的脚本来处理SQL Server代理作业。它执行2个任务:
1)如果存在给定作业,请将其删除 2)创建工作
(由于业务要求我无法修改现有作业,脚本必须删除并重新创建它。)
第一次运行脚本正常工作(创建作业)。之后的任何时间运行都会产生错误14274“无法添加,更新或删除源自MSX服务器的作业。”
我已经对此进行了大量搜索,大多数解决方案都围绕着正在更改的服务器名称。我的服务器名称没有改变,也没有改变过。
这就是我所拥有的:
USE [msdb];
SET NOCOUNT ON;
DECLARE @JobName NVARCHAR(128);
DECLARE @ReturnCode INT;
declare @errCode INT;
SET @JobName = 'AJob';
BEGIN TRANSACTION;
DECLARE @jobId uniqueidentifier;
SET @jobId = (SELECT job_id from msdb.dbo.sysjobs where name = @JobName);
IF(@jobId IS NOT NULL) -- delete if it already exists
begin
EXEC @ReturnCode = msdb.dbo.sp_delete_job @job_id=@jobId
IF(@@ERROR <> 0 OR @ReturnCode <> 0)
begin
set @errCode = @@ERROR;
GOTO QuitWithRollback;
end
print 'deleted job';
end
-- create the job
EXEC @ReturnCode = msdb.dbo.sp_add_job @job_name=@JobName,
@enabled=1,
@notify_level_eventlog=0, -- on failure
@notify_level_email=0,
@notify_level_netsend=0, -- never
@notify_level_page=0,
@delete_level=0,
@description=NULL,
@owner_login_name=N'sa',
@notify_email_operator_name=NULL,
@job_id = @jobId OUTPUT
IF(@@ERROR <> 0 OR @ReturnCode <> 0)
begin
set @errCode = @@ERROR;
GOTO QuitWithRollback;
end
print 'added job';
-- Server
EXEC @ReturnCode = msdb.dbo.sp_add_jobserver
@job_id = @jobId
IF(@@ERROR <> 0 OR @ReturnCode <> 0)
GOTO QuitWithRollback;
COMMIT TRANSACTION;
RETURN;
QuitWithRollback:
IF(@@TRANCOUNT > 0)
ROLLBACK TRANSACTION;
print 'Err: ' + CAST(@errCode AS varchar(10)) + ' ret: ' + cast(@ReturnCode as varchar(10));
我在SQL 2008 SP1上运行它。非常感谢任何帮助!
答案 0 :(得分:6)
实际上,在一些鬼混之后,我想出了这个。
似乎有必要在删除和创建作业的语句之间将@JobId
变量设置为NULL
。一旦你这样做,错误就会消失并且有效。
我希望这有助于某人!