Sql server SQL Server自动创建作业脚本

Sql server SQL Server自动创建作业脚本,sql-server,ssms,Sql Server,Ssms,在SQLServerManagementStudio中,我可以右键单击作业,将作业编写为脚本,然后将创建的脚本另存为.SQL文件。 为了支持我的工作,我想自动化上述过程,但找不到任何方法。 这可能吗?如何备份?除了备份存储它们的msdb数据库外,您还可以将它们编写一次脚本,然后每天检查更改。如果没有更改,则没有任何理由再次备份它们。如果你确实发现有人改变了工作或日程安排,我敢肯定你下一个问题是什么实际改变了,什么时候改变了。否则,您将不知道要恢复到哪个版本的作业 不久前我写了一个程序来做这个。你

在SQLServerManagementStudio中,我可以右键单击作业,将作业编写为脚本,然后将创建的脚本另存为.SQL文件。 为了支持我的工作,我想自动化上述过程,但找不到任何方法。
这可能吗?如何备份?

除了备份存储它们的
msdb
数据库外,您还可以将它们编写一次脚本,然后每天检查更改。如果没有更改,则没有任何理由再次备份它们。如果你确实发现有人改变了工作或日程安排,我敢肯定你下一个问题是什么实际改变了,什么时候改变了。否则,您将不知道要恢复到哪个版本的作业

不久前我写了一个程序来做这个。你可以在上面找到它,因为它太长了,不能在这里发布。此脚本的一个依赖项是,它将当前作业、计划等记录到名为
AdminTools
的数据库中的一个表中。这样我们就可以将
msdb
中的内容与我们记录的内容进行比较。您可以将其更改为使用要放置日志表的任何数据库

此外,我还编写了一个脚本,对代理警报执行同样的操作。也可以在上找到它

这里是代理作业过程的核心,它提取所有作业和计划,并以非常类似于SSM的方式显示它(因此
case
语句中的所有逻辑)

通过C#的SMO对象可用于使用SQL代理作业的DDL创建脚本。下面是一个例子。必须同时引用
Microsoft.SqlServer.Management.Smo
System.Collections.Specialized
(如果使用
StringCollection
)命名空间。要使其自动化,请创建一个SSIS包,将其作为脚本任务,并从SQL代理将该包作为作业执行。如果您的任何作业的标题中有
\
,则需要删除该标题以避免无效的文件路径,并且可以将
替换
方法添加到下面作业的Name属性中以执行此操作

            Server srv = new Server(@"YourSQLServer");
            srv.ConnectionContext.LoginSecure = true;
            srv.ConnectionContext.StatementTimeout = 600;
            srv.ConnectionContext.Connect();

            Scripter script = new Scripter(srv);
            ScriptingOptions scriptOpt = new ScriptingOptions();

            foreach (Microsoft.SqlServer.Management.Smo.Agent.Job j in srv.JobServer.Jobs)
            {
                scriptOpt.FileName = @"C:\FolderPathForScripts\" + j.Name + ".sql";
                StringCollection sc = j.Script(scriptOpt);
                foreach (string s in sc)
                    Console.WriteLine(s);
            }

一些体面的回答。本月的一个新链接也提到了dbatools.io。如果您喜欢PowerShell,请检查此链接是否有助于您不要忽略@JacobH注释。DBA工具很漂亮awesome@RahulNeekhra您不必恢复它来恢复工作,但这肯定是最聪明的方法。@JacobH,谢谢!我安装了dbatools,有了3行代码,我现在有了一个每日脚本来重新创建作业!再简单不过了!
            Server srv = new Server(@"YourSQLServer");
            srv.ConnectionContext.LoginSecure = true;
            srv.ConnectionContext.StatementTimeout = 600;
            srv.ConnectionContext.Connect();

            Scripter script = new Scripter(srv);
            ScriptingOptions scriptOpt = new ScriptingOptions();

            foreach (Microsoft.SqlServer.Management.Smo.Agent.Job j in srv.JobServer.Jobs)
            {
                scriptOpt.FileName = @"C:\FolderPathForScripts\" + j.Name + ".sql";
                StringCollection sc = j.Script(scriptOpt);
                foreach (string s in sc)
                    Console.WriteLine(s);
            }