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

第六篇 SQL Server代理深入作业步骤工作流的更多相关文章

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

    本篇文章是SQL Server代理系列的第六篇,详细内容请参考原文. 正如这一系列的前几篇所述,SQL Server代理作业是由一系列的作业步骤组成,每个步骤由一个独立的类型去执行.每个作业步骤在技术 ...

  2. 第九篇 SQL Server代理了解作业和安全

    本篇文章是SQL Server代理系列的第九篇,详细内容请参考原文 在这一系列的上一篇,学习了如何在SQL Server代理作业步骤启动外部程序.你可以使用过时的ActiveX系统,运行批处理命令脚本 ...

  3. 【译】第九篇 SQL Server代理了解作业和安全

    本篇文章是SQL Server代理系列的第九篇,详细内容请参考原文 在这一系列的上一篇,学习了如何在SQL Server代理作业步骤启动外部程序.你可以使用过时的ActiveX系统,运行批处理命令脚本 ...

  4. 第二篇 SQL Server代理作业步骤和子系统

    本篇文章是SQL Server代理系列的第二篇,详细内容请参考原文. SQL Server代理作业由一系列的一个或多个作业步骤组成.一个作业步骤分配给一个特定的作业子系统(确定作业步骤去完成的工作). ...

  5. 【译】第二篇 SQL Server代理作业步骤和子系统

    本篇文章是SQL Server代理系列的第二篇,详细内容请参考原文. SQL Server代理作业由一系列的一个或多个作业步骤组成.一个作业步骤分配给一个特定的作业子系统(确定作业步骤去完成的工作). ...

  6. 第五篇 SQL Server代理理解代理错误日志

    本篇文章是SQL Server代理系列的第五篇,详细内容请参考原文. 正如这一系列的前几篇所述,SQL Server代理作业是由一系列的作业步骤组成,每个步骤由一个独立的类型去执行.在第四篇中我们看到 ...

  7. 【译】第五篇 SQL Server代理理解代理错误日志

    本篇文章是SQL Server代理系列的第五篇,详细内容请参考原文. 正如这一系列的前几篇所述,SQL Server代理作业是由一系列的作业步骤组成,每个步骤由一个独立的类型去执行.在第四篇中我们看到 ...

  8. 第十篇 SQL Server代理使用代理帐户

    本篇文章是SQL Server代理系列的第十篇,详细内容请参考原文 在这一系列的上一篇,你查看了msdb库下用于授权访问SQL Server代理的安全角色.这些角色包括SQLAgentUserRole ...

  9. 第八篇 SQL Server代理使用外部程序

    本篇文章是SQL Server代理系列的第八篇,详细内容请参考原文 在这一系列的上一篇,学习了如何用SQL Server代理作业活动监视器监控作业活动和查看作业历史记录.在实时监控和管理SQL Ser ...

随机推荐

  1. NBU7.0 Image Cleanup作业在没有配置hot catalog backup的情况下失败,Status=1

    Issue NBU7.0 Image Cleanup作业在没有配置hot catalog backup的情况下失败,Status=1 Error NBU7.0 Image Cleanup作业失败, D ...

  2. HDU 1671 Phone List(Trie的应用与内存释放)

    Phone List Time Limit: 3000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total ...

  3. metasploit--exploit模块信息

    Name                                             Disclosure Date  Rank    Description ----           ...

  4. node系列:琐碎备忘

    cmd 全局与本地路径 查看:默认 查看本地路径:npm config get cache,默认和nodejs安装目录同一目录 查看全局路径:npm config get prefix,默认c盘app ...

  5. linux redis迁移

    在原服务器上的redis执行save命令后,生成了dump文件,拷贝到新服务器的安装目录,可能是版本问题,数据无法还原. 针对这个问题, 1.在配置文件中加入: slave of 原服务器的ip和端口 ...

  6. java 时间戳和PHP时间戳 的转换

    java 时间戳和PHP时间戳 的转换 PHPJava  总结一下java 时间戳和PHP时间戳 的转换问题: 由于精度不同,导致长度不一致,直接转换错误. JAVA时间戳长度是13位,如:12948 ...

  7. 数据库MySql阶段总结

    S1数据库中最重要的是查询,对于查询要有一个好的理解模型是很关键的: 1. 每一个查询都会返回一个结果集,这个结果集可能是一个值,一个字段或者一个记录,甚至可能是一个表 返回一个值 SELECT * ...

  8. P1032 字串变换

    最近在练习bfs,看到了02年提高组的这个题,顿时来了兴致,联想到前一阵子的八数码问题,具体就是使用一个字符串来存储状态,把他存储到一个图中,然后开始bfs,如果10步之内无法完成就剪枝,同时使用哈希 ...

  9. nginx php解析过慢

    nginx 报错 upstream timed out (110: Connection timed out)解决方案 error.log报错如下: 2013/05/18 21:21:36 [erro ...

  10. MFC函数之BitBlt

    MFC函数之BitBlt // Cgame123View 绘制 void Cgame123View::OnDraw(CDC* pDC) { Cgame123Doc* pDoc = GetDocumen ...