你的位置:首页 > 数据库

[数据库]SQL Server代理(6/12):作业里的工作流——深入作业步骤


SQL Server代理是所有实时数据库的核心。代理有很多不明显的用法,因此系统的知识,对于开发人员还是DBA都是有用的。这系列文章会通俗介绍它的很多用法。


如我们在这里系列的前几篇文章所见,SQL Server代理由一系列的作业步骤组成,每个步骤是将要进行的不同类型的工作。这个作业步骤的每个都是技术独立的,但你可以通过作业步骤作为不同的工作项目,来创建工作流。在这篇文章里,你会学到如何在作业步骤间使用工作流来修改要进行的操作,还有单个作业处理多个条件。你也会进一步检查作业步骤安全的细节和不同作业子系统。

SQL Server代理作业步骤

SQL Server代理作业,如第2篇所描述的,包含一个或多个作业步骤。每个作业步骤是完全独立的操作,对于错误控制,日志和工作流都有独自的逻辑。当作业包含不止一个步骤,通过单个作业的工作流会有新的理解问题。没有包含作业步骤的作业本身不做任何事情(只有几个小警告)。

SQL Server代理作业步骤流

为了检查作业步骤和它们的工作流,在SSMS里创建新的作业。在SQL Server代理下右击【作业】文件夹,选择【新建作业】。在【常规】页面,命名作业名为“作业步骤”。选择【步骤】页,然后点击【新建】按钮来创建第一个作业步骤。新建作业步骤对话框出现,如图1所示。

插图1:新建作业步骤对话框

给作业步骤命名为“步骤1”。 选择类型,所谓的作业子系统(这里我们保持默认,T-SQL )。输入的简单命令会在master数据库,例如SELECT * FROM sys.tables。点击【分析】按钮验证下你输入的语句是否正确,会弹出如插图2所示的对话框。如果你语句有错误,会弹出如插图3所示的对话框。尽管这个错误看起来复杂,真正的错误在对话框的底部,语法错误。你可以点击左下脚的第3个按钮来或获得额外的技术细节,但这个会给你SQL Server管理对象(SMO).net的错误诊断,对你的语法错误没有太多的帮助。

插图2:T-SQL成功分析

插图3:T-SQL语句检测到错误

一旦T-SQL分析成功,点击对话框的【高级】页,如插图4所示。

插图4:作业步骤对话框的【高级】页。

作业步骤对话框的高级页是SQL Server代理工作流发生的地方。当作业步骤成功时,你必须选择应该发生的操作(“成功时要进行的操作”),同样也有如果作业步骤失败时要进行的操作。对于作业成功,你有三个选项:

  • 转到下一步:这是默认的行为。在这个作业步骤里一切正常的话,继续下一步。如果这个作业是最后一步,退出作业报告步骤的累积结果(如果某个步骤失败但工作流继续,还是报告失败)。
  • 退出报告成功的作业:如果这一步成功,退出作业立即报告它成功完成。例如,如果作业是由SQL Server代理警报执行,修复可能需要多个作业步骤,如果前面的步骤完成,你可以选择这个选项来退出并报告自动修复完成。
  • 退出报告失败的作业:如果因为某些原因你要退出作业并报告作业失败(例如有一个错误的测试条件),你可以选择这个选项。通常应该有类似的作业警报设置为任何必要的后续。
    接下来,你可以选择作业失败后重试作业步骤(不报错误)。例如,如果你知道一些阻塞可能会导致你的作业步骤失败,你可以指定步骤尝试2次,一次一分钟(重试次数:2,重试间隔(分钟):1)。

失败时要执行的操作,和上面所述的成功操作有同样的选择,但默认是退出报告失败作业。
因为这个作业是T-SQL类型,你可以指定一个输出文件存储查询的结果。你可能还会勾选”将输出追加到现有文件”,这样你就不会失去以前的结果,但是你需要创建一个进程定期截断文件,那样它就不会消耗你所有的磁盘空间。或者,你可以将查询结果保存到数据库的一个表中。第三个选项,在历史记录中包含步骤输出,将存储在msdb.dbo.sysjobhistory(原文说保存在msdb.dbo.sysjobstepslogs,但查看数据表中没记录)。忽视“作为以下用户运行”选项,我们将会在后面看到。
单击“确定”,你现在添加一个作业步骤。单击“确定”,你现在有了一个作业。重新打开“Steps Example”作业(即右键点击作业菜单选择属性),浏览到作业步骤,点击新建,添加第二个作业步骤。在这一步中,称之为“步骤2”,作业类型选择“PowerShell”,然后输入以下PowerShell脚本来看看服务器操作系统属性(插图5)。

1 Set-Location SQLSERVER:\SQL\localhost\DEFAULT\Databases\msdb2 Get-Item . | Get-Member -Type Properties

插图5:添加一个PowerShell步骤到作业

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

插图6:警告作业流步骤可能有问题

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

插图7:调整作业步骤1的工作流到下一个作业步骤

点击【确定】,那么在作业运行的时候,第二个步骤就会被执行了。
现在,运行作业(SSMS中右键单击作业并选择【开始作业步骤…】,然后单击【开始】。一旦工作成功完成后,再次右键单击作业选择【查看历史记录】,你可以在历史作业步骤中看到输出结果(插图8)。

插图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代理作业步骤可以在单一的作业提供复杂的工作流。你可以转到前面,或跳过作业步骤,或退出作业在成功/失败时。每个作业步骤相对其他步骤是一种完全不同的作业项目,对作业步骤日志结果有多种选择。
现在,你可以创建有趣的作业然后运行,下一步将监视作业正在运行和已运行的历史记录。因此,我们下一篇将查看作业活动监视器。