【译】第六篇 SQL Server代理深入作业步骤工作流

本篇文章是SQL Server代理系列的第六篇,详细内容请参考原文


正如这一系列的前几篇所述,SQL Server代理作业是由一系列的作业步骤组成,每个步骤由一个独立的类型去执行。每个作业步骤在技术上是独立的,但是你可以创建工作流贯穿作业中的各个步骤。在这篇文章中,你将学习如何在作业步骤中使用工作流来改变要执行的操作,单一作业有多个条件可以处理。你也会接触作业步骤安全和作业子系统的更多细节。
SQL Server代理步骤
如第二篇所述,SQL Server代理作业包含一个或多个作业步骤。每一个作业步骤是一个完全独立的操作,对于错误控制、日志和工作流有自身的逻辑。当一个作业包括多个步骤,理解作业中的工作流可能会出现新的问题。没有作业步骤的作业不会有任何实际操作(仅有少量的警告)。
SQL Server代理作业步骤工作流
为了检测作业步骤和它们的工作流,在SSMS中创建一个新作业。SQL Server代理下右击作业,选择新建作业。在常规页面,给一个作业名称(本篇中使用"Steps Example")。选择步骤页面,然后点击"新建"按钮创建第一个作业步骤。出现新建作业步骤对话框,如图6.1所示

图6.1 新建作业步骤
给一个步骤名称(本例"Step1"),选择类型,也就是作业子系统(我们保持默认T-SQL)。键入一句简单的命令,如select * from sys.tables。点击"分析"以验证你键入有效的T-SQL,你会看到图6.2的对话框。如果存在错误,将看到图6.3的结果。虽然错误看起来复杂,实际错误是在对话框的底部,有语法错误。你可以点击左起的第三个按钮来获得更多的技术细节,但这只会给SMO.net网络错误诊断,没有额外的帮助。

图6.2 成功分析命令

图6.3 分析命令失败
一旦通过命令分析,点击高级页面,你将看到图6.4的对话框

图6.4 作业步骤高级选项页面
作业步骤中的高级页面是SQL Server代理中工作流最多的地方。你必须选择成功时要执行的操作,还有失败时要执行的操作。作业步骤成功时,你有三个选择:
->转到下一步
这是默认的行为。如果作业步骤一切正常,继续下一步。如果这是作业的最后一步,退出作业报告步骤的累积结果(如果某个步骤失败但工作流继续,还是报告失败)。
->退出报告成功的作业
如果这一步成功,退出作业立即报告它成功完成。例如,如果作业是由SQL Server代理警报执行,修复可能需要多个作业步骤,如果前面的步骤完成,你可以选择这个选项来退出并报告自动修复完成。
->退出报告失败的作业
如果因为某些原因你要退出作业并报告作业失败(例如有一个错误的测试条件),你可以选择这个选项。通常应该有类似的作业警报设置为任何必要的后续。
接下来,你可以选择作业失败后重试作业步骤(不报错误)。例如,如果你知道一些阻塞可能会导致你的作业步骤失败,你可以指定步骤尝试2次,一次一分钟(重试次数:2,重试间隔(分钟):1)。
失败时要执行的操作,和上面所述的成功操作有同样的选择,但默认是退出报告失败作业。
因为这个作业是T-SQL类型,你可以指定一个输出文件存储查询的结果。你可能还会勾选”将输出追加到现有文件”,这样你就不会失去以前的结果,但是你需要创建一个进程定期截断文件,那样它就不会消耗你所有的磁盘空间。或者,你可以将查询结果保存到数据库的一个表中。第三个选项,在历史记录中包含步骤输出,将存储在msdb.dbo.sysjobhistory(原文说保存在msdb.dbo.sysjobstepslogs,但查看数据表中没记录)。忽视“作为以下用户运行”选项,我们将会在后面看到。
单击“确定”,你现在添加一个作业步骤。单击“确定”,你现在有了一个作业。重新打开“Steps Example”作业(即右键点击作业菜单选择属性),浏览到作业步骤,点击新建,添加第二个作业步骤。在这一步中,称之为“Step2”,作业类型选择“PowerShell”,然后输入以下PowerShell脚本来看看服务器操作系统属性(图6.5)。
gwmi Win32_OperatingSystem | Select OSArchitecture,Caption

图6.5 添加一个PowerShell类型的作业步骤
这个作业步骤点击高级页面并选中“在历史记录中包含步骤输出”,因此你可以看到PowerShell脚本运行和查看结果。单击确定,然后再次单击OK,你会看到图6.6。因为作业中Step1在运行后,退出报告作业成功,那么step2永远不会运行。

图6.6 警告作业流逻辑
选择"否",导航到第一个作业步骤的高级页面,更改"成功时要执行的操作"到“转到下一步”。你可能已经注意到一些事情。第一,你没有选择"退出报告成功的作业"选项-这是怎么发生的呢?当你创建了第一个作业步骤,然后创建作业,只有一个单一的作业步骤,所以SSMS帮你退出并更改了成功的操作。当你在添加第二步骤,你需要手动调整业务流。每次增加额外的步骤,都需要返回和编辑作业。
第二件让你注意的事情是,在这个对话框你也可以直接导航到各个步骤(6.7)。你不必转到下一步。你可以想象一个有10步的作业,并根据你的作业步骤的结果,跳到一个不同的步骤。这样你可以在作业中创建更复杂的工作流程。

图6.7 修改步骤1的工作流转到下一步
点击确定,那么在作业运行的时候,第二个步骤就会被执行了。
现在,运行作业(SSMS中右键单击作业并选择“开始作业步骤…”,然后单击“开始”。一旦工作成功完成后,再次右键单击作业选择“查看历史记录”,你可以在历史作业步骤中看到输出结果(如图6.8所示)。

图6.8 SQL Server代理作业历史日志查看步骤记录
SQL Server代理作业步骤的安全
当你创建步骤的类型为PowerShell,你可能已经注意到,作业步骤的常规页面的"运行身份"选项是可用的,“SQL Server代理服务帐户”被选。当T-SQL作业连接到SQL Server,它作为SQL Server代理服务的一部分,并将用服务帐户运行。当其他子系统的运行作业(如PowerShell、操作系统(CmdExec)、ActiveX)他们实际上在Windowsw创建一个单独的进程,然后连接到SQL Server或操作系统。这个过程需要有一个安全上下文运行在Windows,你可以在"运行身份"选项选择安全上下文。在本系列文章的第十篇我们将检查代理帐户,并详述如何为作业步骤选择不同的安全上下文。
你可能会问,T-SQL类型步骤的高级选项页面下的"作为以下用户运行"。如果一个SQL Server代理作业的所有者是sysadmin服务器角色的成员,那么T-SQL作业步骤可以运行在不同的数据库用户的上下文,你可以在这里选择用户。如果作业的所有者不是sysadmin服务器角色的成员,此选项将不可用,作业步骤在作业的所有者的安全上下文运行。此选项仅可用于T-SQL子系统,代理帐户必须用于其他作业子系统。
下一篇
SQL Server代理作业步骤可以在单一的作业提供复杂的工作流。你可以转到前面,或跳过作业步骤,或退出作业在成功/失败时。每个作业步骤相对其他步骤是一种完全不同的作业项目,对作业步骤日志结果有多种选择。
现在,你可以创建有趣的作业然后运行,下一步将监视作业正在运行和已运行的历史记录。因此,我们下一篇将查看作业活动监视器。

posted @ 2015-05-25 21:19  Uest  阅读(955)  评论(0编辑  收藏  举报