转载自:http://www.sqlservercentral.com/articles/SQL+Agent/Job+Steps+and+Subsystems/72268/
通往SQL Server代理的阶梯-二级:作业步骤和子系统
Richard Waymire,2017/10/11(首次出版:2011/02/17)
该系列
本文是楼梯系列的一部分:SQL Server代理的阶梯
SQL Server代理是任何实时数据库系统的核心。代理有许多不太明显的用途,因此对于开发人员和dba来说,系统的知识总是有用的。Richard Waymire提供了一个简单的解释。
SQL Server代理作业是由一系列的一个或多个作业步骤组成的。一个作业步骤被分配到一个特定的工作子系统,它确定了工作步骤将要执行的工作类型。每个作业步骤都在一个单独的安全上下文中运行,尽管每个作业也有一个所有者决定谁可以修改该作业。本文将重点讨论组成sqlserver代理作业的作业步骤和子系统。
快速回顾一下工作
认为SQL Server代理作业的最佳方式是将执行给定任务所需的其他组件的集合相关联的容器。工作的主要组成部分是工作步骤、进度、警报和通知。
当一个任务被创建时,一个所有者被分配到该任务中。正如第1级所提到的,默认情况下,所有者将是创建工作的用户(通过transact - SQL、通过sp_add_job系统存储过程或使用SQL Server Management Studio)。SQL Server代理的大多数功能都假定您是一个sysadmin服务器角色成员。如果您是,那么您或任何其他sysadmin角色成员可以在创建工作后修改该工作。如果您希望一个非sysadmin角色成员能够修改该作业,那么您应该更改该用户的登录名。请注意,sysadmin成员可以更改任何工作,而不考虑工作所有权。
工作的步骤
如第1级所述,SQL Server代理作业由至少一个作业步骤组成。当大多数人想到一份工作的时候,他们对SQL Server的真正含义是工作步骤。作业步骤由您希望执行的操作类型定义,每个作业步骤将由下列工作子系统中的一个执行:
ActiveX
操作系统(CMDExec)
Powershell
各种复制任务
SQL Server Analysis Services(SSAS)命令(即XML /A)
SQL Server Analysis Services(SSAS)查询(MDX)
SQL Server Integration Services(SSIS)包(SQL Server 2000中的DTS包)
transact - sql脚本(t - sql)
让我们创建一个作业和必要的作业步骤,以备份主数据库。创建一个新工作,我将其称为“备份主”,如图1所示。
图1 -创建新工作
现在单击步骤选项卡来查看工作步骤,并单击New…弹出新的作业步对话框(图2)。
图2 -创建新的工作步骤
在开始备份之前,我已经填写了这个任务的步骤,以执行主数据库的完整性检查。我本可以一步一步地完成所有工作,但是我想让您知道步骤之间的工作流程。我已经给出了我的步骤名称,“检查主数据库的完整性”,并将类型设置为transact - sql。数据库上下文是master。我在文本框中添加了一个简单的命令:
DBCC CHECKDB
为了这个对话,有几个解释。类型下拉是选择SQL Server代理子系统的地方。下面将描述可能的子系统。没有用于transact - sql作业步骤的安全代理帐户,因此作业步骤将在作业所有者的上下文中运行。安全代理帐户允许使用不同用户的安全上下文运行作业步骤,并且通常用于不属于sysadmin角色成员的作业。
您选择的作业子系统将会更改对话框其余部分的内容。对于transact - sql作业步骤,提供了一个简单的文本框,供您输入transact - sql,就像我在这里所做的那样。每个作业步骤可能有一个与之相关的不同子系统。
接下来,单击new job步骤的Advanced选项卡。您将看到如图3所示的屏幕。On success动作定义了成功完成工作步骤后所发生的事情。默认选项是进入下一个步骤,意思是如果在一个作业中有多个步骤,而这个工作,执行下一个步骤。如果您单击下拉菜单,您将看到其他选项——包括退出工作(获得成功或失败通知),或跳转到另一个步骤。注意最后一个选项,跳到另一个步骤,直到你至少在工作的第二步才出现。
图3 -新工作步骤高级选项
如果一个步骤因某种原因而失败,您可以选择可以重新尝试工作步骤的尝试次数。您还可以在每次尝试成功完成作业步骤之间指定一个延迟(分钟)。下面是失败操作(即工作步骤无法完成或以错误代码结束)。选项与成功的选项是一样的,有不同的缺省值(正如您所期望的那样)。
因为这是transact - sql作业步骤类型,您可以将transact - sql命令的任何输出记录到输出文件(就像sqlcmd中的- o选项)。您还可以将结果记录到一个表中(MSDB中的sysjobstepslogs表)。
单击OK,然后单击New以添加到该作业的第2步。假设第1步没有产生错误,接下来的作业将返回主数据库。下面是来自我的系统的命令(如图4所示):
BACKUP DATABASE [master] TO DISK = N‘C:\\Program Files\\Microsoft SQL Server\\MSSQL10_50.MSSQLSERVER\\MSSQL\\Backup\\master.bak‘ WITH INIT
图4 -备份主数据库的第二个工作步骤
因为这是工作的结束,点击高级选项卡,选择“成功行动”作为“放弃工作报告成功”。这就是它——您应该能够单击OK,并看到完整的作业步骤,如图5所示。
图5 -完成的工作
现在单击OK完成定义作业并运行该作业。当您单击以运行该作业时,请注意,因为有多个步骤,您现在可以询问您想要开始工作的哪个步骤。从第一步开始运行(如图6所示),并观察工作的流程,因为第一步成功运行,然后移动到作业的第二步和最后一步。
图6 -开始工作(选择步骤1)
成功完成后,作业将标记成功并退出(如图7所示)。
图7 -作业已成功运行
工作子系统
您将使用7个主要的工作子系统。这个数字不包括复制子系统,因为它们是一个特殊的情况,通常这些工作步骤和作业是由复制组件创建的,而不是由DBA创建的。我们将把对三个分析服务子系统的讨论推迟到下一个级别,因为它们有几个独特的考虑。
transact - sql脚本(t - sql)
transact - sql子系统非常简单,很可能是您将创建的最常见的工作步骤。它允许您针对SQL Server代理的本地实例运行transact - SQL(但不是sqlcmd扩展到transact - SQL)。注意,与分析服务子系统不同,您只能连接到本地SQL服务器实例。还要注意,transact - sql没有代理能力,因此t - sql的作业步骤总是在作业所有者的安全上下文中运行。
ActiveX脚本
ActiveX子系统允许您运行VBScript、Jscript或其他自定义脚本语言(在理论上)。默认情况下,脚本将在SQL Server代理服务帐户的安全上下文中运行。如果您精通VBScript,这可能是一个方便的子系统,但是子系统已被弃用为SQL Server 2008,您应该使用PowerShell子系统。
操作系统(CmdExec)
CmdExec子系统允许您运行操作系统命令(就像您有一个命令提示符打开一样)。命令将在SQL Server代理服务帐户的安全上下文中运行。这里要记住的关键是(在ActiveX子系统中),没有用户能够单击或接受任何提示,所以请确保您的脚本在没有用户干预的情况下运行。
PowerShell
PowerShell子系统允许您运行Windows PowerShell 1.0或2.0兼容脚本。与其他脚本子系统一样,默认情况下脚本将在SQL Server代理服务帐户的安全上下文中运行。PowerShell非常强大,您应该认真研究一下您对PowerShell的了解。PowerShell将允许您连接到远程系统,因此这是一个绕过transact - SQL子系统连接到远程SQL服务器实例的方法。
下次
如您所见,SQL Server代理作业步骤是工作内容的核心。有许多不同的子系统可供使用,每个子系统提供不同的功能。在此楼梯的下一步中,我将检查代理功能,以增强对作业步骤的安全性,以及用于分析服务的其他SQL代理子系统。
本文是通往SQL Server Agent楼梯的楼梯的一部分。