有谁知道是否有可能(并且建议)更新服务器上作业中的所有 cmdexec 字符串?
我们想更改我们的日志记录位置,原则上我认为这可以通过更改/O "\\LOCATION\file.log"
字符串来非常简单地完成。
事实上我知道你会怎么做
USE MSDB
GO
update dbo.sysjobsteps
set [command] = replace([command], '\\OLDLOCATION\... ', '\\NEWLOCATION\... ')
WHERE...
但是我已经被告知你永远不应该手动更新 sys 表,所以这样做的想法让我非常紧张。对于其他任何事情,我会使用 dbo.sp_update_job proc (http://msdn.microsoft.com/en-gb/library/ms188745.aspx对于那些迷路在这里寻找其他工作相关的人),但那个过程似乎无法处理这个。
我有一种预感,这可能是“从不更新系统表”规则的一个例外?我无法想象 cmdexec 字符串隐含在任何进一步的关系中,例如,启用/禁用状态显然是。妄想?
所以我不确定,而且我似乎无法找出答案。有人知道或有这方面的经验吗?
谢谢丹
在我看来,这是肯定会受益于 PowerShell 的操作之一。您需要做的就是收集包含旧字符串(在本例中为您的旧位置)的作业步骤列表,并将其替换为新字符串(读作:新位置)。
注意:这是示例代码,应在非生产环境中进行彻底测试。确保备份您以前的数据,并且您确信更改是理想的结果。
所有这些代码都会循环遍历特定实例上的所有作业。如果作业步骤命令包含某个字符串,那么它会显示它属于哪个作业、步骤的名称以及包含该字符串的命令。我特意注释掉了命令修改行,以便代码仅实际识别哪些步骤包含您的字符串。
您还可以通过向
if
块中添加其他条件子句来缩小搜索范围。例如,如果您只想检查CmdExec
作业,请添加-and
条件检查:这只是执行此操作的一种方法。我将再次强调我的观点:确保您在远离生产环境的地方测试该理论和执行,并确保您可以通过必要的备份恢复更改。
我认为
UPDATE
你计划做的很好,假设你的WHERE
子句准确地定义了那些包含的行\\OLDLOCATION\
,并且你已经测试过你REPLACE
没有删除任何误报(例如,也许你\\OLDLOCATION\
在评论中有一个应该保持完整的参考).请注意,这些
msdb
表是随 SQL Server 一起提供的,但它们不像系统表那样是“禁止使用的”(无论如何您都无法在现代版本的 SQL Server 中更新)。这些表由 SSMS 直接更新,就像您自己使用自己的表UPDATE
一样(就像它们将由 Thomas 建议的 PowerShell 脚本更新一样 - 除了一次执行更新一行之外,它没有任何不同).