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


在这个系列的上篇文章里,你学习如何使用SQL Server代理作业活动监视器监视作业活动和查看作业历史。对于你的SQL Server代理作业进行实时监视和管理,作业活动管理器是个强大的工具。在这个系列的第8篇文章里,你会回顾SQL Server代理的另一个功能——运行操作系统命令行,在SQL Server外围环境运行程序。一些程序是命令行(传统的cmd应用程序/脚本或PowerShell脚本),或者甚至ActiveX脚本,但实际上你可以运行系统命令行,几乎可以运行任何程序,只要程序不需要用户的直接输入。你会学到如何运行cmdexec和PowerShell脚本,我们会简单讨论下什么时候用这些子系统会更合适。你学到如何从SQL Server代理调用其它程序。

内建作业子系统

如你在以前的文章所见,有很多内建的子系统。在这篇文章里,你会检查可以在操作系统里运行脚本或程序的3个内建子系统,而不是在SQL Server环境本身的上下文。这3个包括:

  • 操作系统(CmdExec)
  • PowerShell
  • ActiveX脚本

但一个程序或脚本从这个3个系统启动时,在操作系统里会创建新的进程(例如不是SQL Server代理的一部分),脚本或程序运行,信息传回启动进程或脚本的SQL Server代理作业。

操作系统(CmdExec)子系统

第一个我们要谈的是操作系统(CmdExec)子系统。CmdExec子系统打开一个命令行,犹如已经登录到运行SQL Server的操作系统。从那点来说,你可以运行一切,在命令行里输入。这包括任何的批处理文件,脚本,甚至你服务器上存在的程序,当然你可以在输入UNC路径来访问文件,这是CmdExec子系统可以做的。

但是安全呢?

当然,所有关于这个的重要提醒是权限——会正常工作么,在什么安全上下文下?默认情况下,当你在CmdExec子系统里创建一个作业(或其他的,一会就会看到),作业会在SQL Server代理服务账号的安全上下文运行(如插图1所示)。你也会留意到这是个下拉的值,因此也有其它选项。在这个系列的第10篇,你会用到代理账号。另一个要注意的重点:你必须是SQL Server的sysadmin组成员,才可以运行SQL Server代理服务账号运行的作业。

插图1:在CmdExec作业步骤里的作业安全

创建一个CmdExec作业步骤

为了创建CmdExec作业步骤,创建新的作业(我们命名为Shellout),然后添加新的作业步骤。如插图1所示,我们命名步骤为S1,修改作业步骤类型为“操作系统(CmdExec)”,保持运行身份为默认(”SQL Server 代理服务账号“)。对于我们的第一个作业,简单的输入”dir c:\",如插图1所示命令文本。点击【确定】,然后点击【确定】保存作业。运行作业(右击作业“Shellout”,选择【作业开始步骤】),一旦作业完成运行,右击选择【查看历史记录】。点击作业步骤的输出,如插图2所示,已经对应C盘执行了dir命令。

插图2:日志文件查看起显示的CmdExec作业执行结果

如你所想象的,这个是一个简单的命令,你很容易想到运行复杂的批处理脚本,或者如刚才描述的,甚至启动一个程序(例如,启动“记事本”)。 提醒一句,如果你启动例如记事本的程序,它会运行在虚拟隐藏的桌面,等待用户输入。因为桌面是隐藏的,没有用户可以输入,甚至退出程序的命令也不行。换句话说,你的作业步骤永远不会结束。你需要在例如任务管理器里找到记事本的进程,杀掉进行来让作业步骤返回。从CmdExec子系统运行程序会有很多有趣的场景,只要程序会正常返回控制给SQL Server代理,才会结束。

PowerShell子系统

PowerShell自SQL Server 2008发布的时候加入。它支持PowerShell 1.0 或 PowerSher 2.0,取决与你服务器上安装的版本。当你创建了一个作业步骤,选择了PowerShell子系统作为你的作业步骤类型,你会有和CmdExec子系统类似的选项。你可以输入PowerShell脚本的文本,或调用现存的PowerShell脚本。当你从SQL Serverdialing里启动PowerShell会话,SQL Server的PowerShell会提前为你加载。

当使用PowerShell脚本签名和安全时,有很多要考虑的事情,这个话题太大,在这里就不讨论了。但你可以参阅下它的用户手册:https://technet.microsoft.com/en-us/library/ee176949.aspx

顺便提下,PowerShell会很容易成为你的脚本工具。对于SQL Server里常规操作,例如运行T-SQL会更简单。

不管怎样,重复的工作,或者在CmdExec情况下的操作,从PowerShell子系统离开SQL Server环境的任何操作都更简单。

为了展示一个例子,重新打开你的ShellOut作业,增加一个作业步骤S2。选择PowerShell作为作业类型,例如下列脚本:

 $server = new-object( 'Microsoft.SqlServer.Management.Smo.Server' ) “(local)”

 foreach ($database in $server.databases)
{
$dbName = $database.Name
Write-Output "Database: $dbName"
}

插图3:PowerShell子系统的作业步骤

这个脚本会直接登录到你的本地SQL Server(如果要指定服务器就修改实例名称),然后在服务器上循环获得每个数据库的名称。你很容易会想到数据库备份,例如检查它们的属性等。另外要注意的是你已经登录并连接到数据库——因此在你的组织里你可以登录到任意的SQL Server。为了试验这个,点击确定,再次点击确定。如果出现提示,修正作业步骤1这样它会正确走向下一步。运行作业,和查看CmdExec子系统步骤的输出一样的方法。你会看到输出有服务器上的数据库名称列表。

PowerShell子系统真正有趣的是,你可以从操作系统、活动目录查询信息,然后可以运行你想要对你服务器操作的任何脚本。你想查询SQL Server监听的端口号么?你用通过PowerShell查询WMI。你想从注册表获取信息?也是可以的。在网络上有很多PowerShell脚本,你可以自己依据需要搜索下。

ActiveX脚本子系统

ActiveX脚本子系统允许你运行运行ActiveX脚本,在操作系统里可以使用VBScript或Jscript。这里包括这个子系统是作为补充,但你不应该从SQL Server代理使用ActiveX脚本。这个子系统已经剥离,就是说以后的SQL Server将会移除这个功能。

我应该使用哪个子系统?

如果现存的作业使用其中一个子系统,你应该继续使用它,除非你有足够的理由来修改它。不管怎样,如果你启动一个新的作业或作业步骤,PowerShell子系统提供你足够强大的功能。另外,微软已经将PowerShell脚本作为微软所有产品的标准脚本。花时间学习下PowerShell会让你的SQL Server代理非常强大!

下篇预告

SQL Server代理的CmdExec,PowerShell和ActiveX子系统允许你与SQL Server代理进行很多任务,包括运行批处理文件或外部程序。另外,使用PowerShell你可以访问和控制任何微软产品。对于新的任务,推荐使用PowerShell子系统。

在下篇文章里,我们会谈论下SQL Server代理安全。到目前为止,这系列文章都假定你是sysadmin服务组成员,下一步会从SQL Server代理的非sysadmin组成员角度谈论下SQL Server代理,还有深入谈下作业的安全上下文。

原文链接:http://www.sqlservercentral.com/articles/Stairway+Series/72459/

SQL Server代理(8/12):使用SQL Server代理外部程序的更多相关文章

  1. Chapter 1 Securing Your Server and Network(12):保护链接server

    原文出处:http://blog.csdn.net/dba_huangzj/article/details/38438363.专题文件夹:http://blog.csdn.net/dba_huangz ...

  2. 动态代理的两种方式,以及区别(静态代理、JDK与CGLIB动态代理、AOP+IoC)

    Spring学习总结(二)——静态代理.JDK与CGLIB动态代理.AOP+IoC   目录 一.为什么需要代理模式 二.静态代理 三.动态代理,使用JDK内置的Proxy实现 四.动态代理,使用cg ...

  3. SQL Server代理(10/12):使用代理账号运行作业

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

  4. SQL Server代理(5/12):理解SQL代理错误日志

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

  5. SQL Server代理(11/12):维护计划作业

    SQL Server代理是所有实时数据库的核心.代理有很多不明显的用法,因此系统的知识,对于开发人员还是DBA都是有用的.这系列文章会通俗介绍它的很多用法. 在这一系列的上一篇,我们看了使用代理帐户模 ...

  6. SQL Server代理(9/12):理解作业和安全

    SQL Server代理是所有实时数据库的核心.代理有很多不明显的用法,因此系统的知识,对于开发人员还是DBA都是有用的.这系列文章会通俗介绍它的很多用法. 在这个系列的前一篇文章里,你学习了如何在S ...

  7. SQL Server代理(7/12):作业活动监视器

    SQL Server代理是所有实时数据库的核心.代理有很多不明显的用法,因此系统的知识,对于开发人员还是DBA都是有用的.这系列文章会通俗介绍它的很多用法. 在这个系列的前几篇文章里,你创建配置了SQ ...

  8. SQL Server代理(2/12):作业步骤和子系统

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

  9. SQL Server代理(1/12):配置和概况

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

随机推荐

  1. nodejs安装/运行脚本

    本文主要介绍nodejs在windows下安装及运行脚本. 安装nodejs 先从nodejs官网:http://nodejs.org/下载对应的系统的安装包,比如用于64位系统的最新0.10.21的 ...

  2. 分享我的“艺术品”:公共建筑能耗监测平台的GPRS通讯服务器的开发方法分享

    在这个文章里面我将用一个实际的案例来分享如何来构建一个能够接受3000+个连接的GPRS通讯服务器软件,这个软件被我认为是一个艺术品,实现周期为1.5个月,文章很长,有兴趣的同志慢慢看.在这里,我将分 ...

  3. [后端人员耍前端系列]KnockoutJs篇:使用KnockoutJs+Bootstrap实现分页

    一.引言 由于最近公司的系统需要改版,改版的新系统我打算使用KnockoutJs来制作Web前端.在做的过程中,遇到一个问题——如何使用KnockoutJs来完成分页的功能.在前一篇文章中并没有介绍使 ...

  4. 《众妙之门——精通CSS3》一书知识点剖析

    不得不佩服京东的速度,昨天刚下单的两本书今天上午就到了.其中一本是全彩页的<众妙之门 - 精通CSS3>,细看了前几十页,书上的叙述方式给我的印象其实不如“彩页”来的讨喜——接连说上几个例 ...

  5. 开发者必知的几款App快速开发工具

    “我有一个好创意,就差一个CTO……” ,这是今年炒的比较火的一句话. “原生APP开发难度大,周期长,成本高,还没上线市场已经被占领了.这个有没有解决方案?” “APP版本迭代更新,都是企业的一道难 ...

  6. 第二次作业:Github的使用

    Github的使用 一·注册:     要想使用github第一步当然是注册github账号了.之后就可以创建仓库了(免费用户只能建公共仓库),Create a New Repository,填好名称 ...

  7. 来看看Windows9到底是什么

    今天有新闻一直在说windows 8.2 windows9,还给出了一张很有趣的图 我们就假设这张图是真的. 这张图透漏出两个信息 其一:开始菜单真的回来了. 不过还是不死心,绝不放弃开始屏,确实,开 ...

  8. 说说设计模式~策略模式(Strategy)

    返回目录 策略模式定义了一系列的算法,并将每一个算法封装起来,而且使它们还可以相互替换.而对于客户端(UI)来说,可以通过IOC再配合工厂模块,实现动态策略的切换,策略模块通常于一个抽象策略对象(in ...

  9. [Java类加载器]Java中classLoader浅析.

    本文为在公司内部TD上写的一篇小文, 主要讲解java中classLoader基础知识, 现在拿来这里分享一下. 一.问题 请在Eclipse中新建如下类,并运行它: 1 package java.l ...

  10. cordova 版本

    cordova 版本 npm install cordova@xxxx https://travis-ci.org/apache/cordova-cli https://www.npmjs.com/p ...