我有许多SQLServer代理预定作业,其中一个执行完整数据库备份。我希望在备份开始时禁用其他一些作业,并在备份完成后重新启用它们。这样做的正确方法是什么?我正在考虑将以下tsql命令之一添加到备份任务的第一步(以及相应的启用命令到最后一步),但我找不到哪一个更好(或者可能有另一种方式)。
UPDATE MSDB.dbo.sysjobs
SET Enabled = 0
WHERE [Name] IN (....)
或多个EXEC dbo.sp_update_job
?
感谢。
答案 0 :(得分:6)
绝对使用sp_update_job。如果作业已经安排,则直接操作sysjobs表不一定会导致重新计算缓存的计划。
它可能适用于ENABLED标志(尚未尝试过),但我知道不对于start_step_id这样的列有效。
答案 1 :(得分:4)
你必须运行EXEC dbo.sp_update_job
,因为你不能直接更新系统表(虽然我不确定sysjobs是否仍然算作系统表 Mitch说它可以是更新)
我会考虑使用sp_getapplock and sp_releaseapplock来“锁定”其他工作,而不会实际更新工作。
答案 2 :(得分:2)
我会使用sp_update_job,因为它封装了可支持的可重用逻辑。为什么重新发明轮子。
答案 3 :(得分:1)
我认为您建议的方法没有任何问题。您还可以通过职位类别进行操作:
UPDATE j
SET j.Enabled = 0
FROM MSDB.dbo.sysjobs j
INNER JOIN MSDB.dbo.syscategories c ON j.category_id = c.category_id
WHERE c.[Name] = 'Database Maintenance';
我没有说过,但我怀疑
USE msdb ;
GO
EXEC dbo.sp_update_job
@job_name = N'SomeJob',
@enabled = 0;
GO
将生成相同的代码,但内置触发通常是要走的路。
答案 4 :(得分:1)
SQL Agent缓存作业的启用状态。因此,如果您只是更新sysjobs表,它实际上不会阻止计划触发作业。 sp_update_job
存储过程会触发缓存更新,因此我建议您使用它。
如果您仍想在sysjobs中手动设置值,则必须运行sp_sqlagent_notify
才能实际获得sql代理刷新已启用状态的缓存。只需查看sp_update_job
的代码即可获得所需的确切参数。
答案 5 :(得分:0)
另一种方法是在其他作业开始时添加一个步骤来检查备份作业的状态,然后在备份运行时中止或休眠当前作业。
我们有时会两种方式完成,取决于不同工作的可靠性/关键性,哪种工作效果更好。