本篇文章是SQL Server代理系列的第二篇,详细内容请参考原文。
SQL Server代理作业由一系列的一个或多个作业步骤组成。一个作业步骤分配给一个特定的作业子系统(确定作业步骤去完成的工作)。每个作业步骤运行于一个单独的安全上下文,尽管每个作业有一个所有者来决定谁可以修改作业。本篇主要关注组成SQL Server代理的作业步骤和子系统。
快速回顾作业
理解SQL Server代理作业的最佳方式是把相关联的 需要完成给定任务 的组件放在一个容器中。作业最主要的组件有作业步骤、计划、警告和通知。
当创建作业时,一个所有者会被分配给这个作业。第一篇中提到,创建作业的用户默认是作业的所有者(无论是通过sp_add_job系统存储过程创建,还是通过SSMS创建)。大部分情况下SQL Server代理,假设你是一个sysadmin服务器角色的成员。如果你是,那么你或任何其他sysadmin角色成员可以修改作业。如果你想要一个非sysadmin角色的成员能够修改作业,那么你应该更改作业的所有者成对应用户。注意系统管理员成员可以更改任何作业,无论作业所有者。
作业步骤
如第一篇所述,一个SQL Server代理作业至少包含一个步骤。当大多数人说作业能完成一些工作时,实际意味是一个作业步骤。作业步骤是根据需求操作定义的,每个作业步骤将由下列子系统执行:
->ActiveX 脚本
->操作系统(CMDExec)
->PowerShell
->复制系列任务
->SQL Server Analysis Services (SSAS) 命令
->SQL Server Analysis Services (SSAS) 查询
->SQL Server Integration Services (SSIS) 包
->Transact-SQL 脚本 (T-SQL)
让我们创建一个作业,新建作业步骤用来备份master数据库。创建一个新作业-Backup Master,如图2.1所示。
图2.1 创建一个新作业
点击步骤->新建,看到新建作业步骤对话框(图2.2)
图2.2 创建一个作业步骤
我已经填写了这个作业的步骤,在我们备份master数据库前先执行完整性检查。我原本可以在一个步骤中完成所做的一切,但要告诉你的步骤之间的作业流程。我给这个步骤取名“检查Master数据库完整性”,并设置类型为T-SQL,数据库是mater,命令文本框DBCC CHECKDB
这个对话框的一些解释:在类型的下拉列表可以选择SQL Server代理子系统。子系统将在下面描述。对于选择Transact-SQL类型的作业步骤是没有安全代理帐户的,因此作业步骤将在作业所有者的上下文运行。安全代理帐户使作业步骤可以运行一个不同的用户的安全上下文,通常用于作业所有者是非sysadmin角色成员。
你所选择的作业子系统,将改变其余的对话内容。对于Transact-SQL作业步骤,一个简单的文本框提供键入你所需的SQL语句。每一个作业步骤可能会有一个不同的子系统与之关联。
接着,在作业步骤属性,点击高级选项卡。你会看到图2.3所示的对话框。成功时要执行的操作(定义作业步骤成功完成时会做的操作)。默认选项是转到下一步,意味着如果在作业中有多个步骤,这个步骤完成,执行下一步。如果你点击下拉菜单,你会看到其他选项–包括退出作业(无论成功或失败通知),或跳到另一个步骤。请注意最后一个选项,跳到另一个步骤,不会出现直到你作业中至少有两个步骤。
图2.3 作业步骤高级选项
如果一个步骤因为某种原因而失败,你可以设置作业步骤重试次数。你也可以指定每次重试间隔(分钟)。下面是失败时要执行的操作(例如作业步骤无法完成或出现错误代码)。下拉选项和成功时是一样的,但是默认选项不一样(如你所期望的)。
因为这是一个Transact-SQL类型的作业步骤,你可以用SQL命令输出一个输出文件(就像在sqlcmd -O选项)。你也可以记录结果到一张表里(msdb中sysjobstepslogs表)。
单击确定,然后单击添加第二个步骤。如果步骤1中没有产生错误,下一个作业步骤备份master数据库。这是我的备份命令(如图2.4所示):
BACKUP DATABASE [master] TO DISK = N'C:Program FilesMicrosoft SQL ServerMSSQL10_50.MSSQLSERVERMSSQLBackupmaster.bak' WITH INIT
图2.4 第二个作业步骤
因为这是作业的结尾,单击“高级”选项卡并选择成功的操作“退出报告成功的作业”。你可以点击确定,看完成的作业步骤如图2.5所示
图2.5 完成作业
现在单击确定完成作业的创建,运行作业。当你点击运行作业,因为这个作业有多个步骤,因此会弹出一个对话框让你选择从哪个步骤启动作业。从第一步启动作业(如图2.6所示),注意观察作业流程在第一步成功后,移动到作业的第二步/最后一步。
图2.6 启动作业(选择步骤1)
一旦成功完成,作业标记为成功然后退出。
作业子系统
有七个主要的作业子系统是我们会使用到的。这个数字不包括复制子系统作为他们的一个特例,通常这些作业是由复制组件而不是由DBA创建。我们将推迟下一章节讨论三个分析服务子系统,因为他们有一些独特的事项。
Transact-SQL 脚本 (T-SQL)
Transact-SQL子系统是非常直接的,同时可能是作业步骤中最常见的类型。它允许你运行Transact-SQL(但不是sqlcmd扩展SQL SQL服务器处理)处理对这个SQL Server代理实例关联的本地实例。需要注意的是不同于分析服务子系统,你只能连接到本地SQL Server实例。同时注意T-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 Server远程实例受限制的方式。
下一篇
正如你可以看到,SQL Server代理作业步骤是作业的核心。许多不同的子系统是可用的,每个给你不同的功能。在下一篇,我会检查作业步骤上代理能力以提高安全,以及剩余的分析服务子系统。