别人写的程序在数据库中生成了一些表,并且会不停更新表中数据。
现在有个需求,定期根据表中的数据做一些运算,然后重新生成一张表。我将新表的表名、字段给第三方使用。
关键是,我无法修改别人的代码,好在我可以登录该系统所运行电脑的数据库。
经过一番搜索后,我发现了触发器和SQL Server代理这两种工具。进一步分析后,觉得SQL Server代理可能更符合我的需求。
❗注意
本文不讨论多SQL Server实例的情况。
由于使用场景较简单,本文只简述SQL Server代理及其组件,有关SQL Server代理安全性等拓展内容不做介绍。
SQL Server代理是一种微软Windows服务,用于执行一些预先安排好的任务,这些任务在SQL Server中称为jobs(作业)。
SQL Server代理使用了SQL Server来存储作业信息。作业包含一个或多个job steps(作业步骤)。每个步骤都包含了自己的任务,例如,备份数据库。
SQL Server代理可以执行计划(就是指定执行时间点)上或用于响应特定事件的作业。例如,若你想在每个工作日的下班后备份公司服务器,你就可以使该任务自动化执行。比如,将该备份任务安排在周一到周五的22:00之后运行。若备份过程遇到问题,SQL Server代理还能记录事件并通知你。
至此,SQL Server Agent(代理)的功能很清晰了。
它可以代替数据库操作员来处理一些和SQL Server相关的事情。
❗注意
默认情况下,安装SQL Server时,SQL Server代理服务是禁用的,除非用户选择自动启动该服务。所以你要手动启动它。
SQL Server代理使用以下组件来定义要执行的任务、何时执行任务以及如何报告任务是否成功执行。
作业是SQL Server代理执行的一系列指定操作(这个一系列很重要,作业有点类似操作的容器,里面放了许多操作,所以是管理单元,而不是真正的执行单元。而这一个个操作,就是下文的作业步骤)。使用作业可以定义各种任务,并配置它们的执行次数以及监视它们的执行状态与执行结果。作业可以在本地服务器上运行,也可以在远程服务器上运行。
可以用以下几种方式来执行作业:
作业中的每个操作都称为 job step(作业步骤)。
作业步骤是作业在数据库或服务器上执行的操作。每个作业必须至少有一个作业步骤(不然,空有一个容器,啥也做不了)。
作业步骤可以是:
每个作业步骤都运行在专门的安全上下文(环境)中。对于使用T-SQL的作业步骤,使用EXECUTE AS语句为作业步骤设置安全上下文。其他类型的作业步骤,使用代理账户为作业步骤设置安全上下文。
计划(表)(schedule,其实在计算机中,我更喜欢叫它调度)指定了作业何时运行。在一个计划上可以运行多个作业,一个作业也可以被多个计划应用。计划可以定义作业运行的时间条件,如:
警报(alert) 是对特定事件的自动响应。事件可以是启动的作业或达到阈值的系统资源。你可以定义警报发生的条件。
警报可以响应以下条件:
警报可以执行以下操作:
操作员(operator) 为负责维护SQL Server实例的个人定义了联系方式。在一些企业中,操作员职责被分配到了个人(责任到人)。尤其在有多个服务器的企业中,许多人可以分担操作员的责任。操作员不包含安全信息,也不定义安全主体。
SQL Server能通过以下方式通知操作员:
❗注意
如要使用网络发送通知,必须在SQL Server代理所在的计算机上启动Windows Messenger服务。
如果发现寻呼机和网络发送的功能无法使用,请不要惊讶。因为微软早就计划从SQL Server代理中删除这两个功能了。
若要使用电子邮件或传呼机向操作员发送通知,必须将SQL Server代理配置为使用数据库邮件。可以将操作员定义成一组个人的别名。这样,该别名的所有成员就不会同时被验证。
要使SQL Server管理更加自动化,通常要做以下工作:
❗注意
对于SQL Server默认实例,SQL Server服务的名称为SQLSERVERAGENT。
对于命名了的实例,SQL Server代理服务名为SQLAgent$instancename。
在对代理有了一定了解后,再介绍一个例子,在代理中创建一个作业,并添加一些脚本代码。
本节讲解如何在SQL Server Management Studio(SSMS)中创建一个SQL Server代理作业,并在计划中运行它。(创建作业(包括其他组件,计划、警报等等)的方式有很多,可以用SSMS图形化操作,可以用Transact-SQL脚本操作,也可以用SQL Server Management Objects操作,这边介绍SSMS图形化操作,该方式比较通用直观)
在SSMS中创建一个作业,通常经过以下几步:
在对象资源管理器中,单击加号展开要在其中创建SQL Server代理作业的服务器。
点击加号展开SQL Server代理。
在新建作业对话框中的常规页面,修改作业的常规属性。(一般改个名称即可)
在步骤页面,组织作业步骤。
这边着重介绍下T-SQL类型的作业步骤。创建T-SQL作业步骤时,你必须:
你也可以选一个现有的T-SQL文件作为作业步骤的命令。
T-SQL作业步骤不使用SQL Server代理作为代理人。取而代之,作业步骤作为作业步骤的所有者运行(?)。
在计划页面,组织作业计划。
你可以选取一个已有的计划或新建一个计划。当与计划绑定后,该作业就会按计划的时间执行。可见,作业和计划是独立的,作业定义了任务内容,计划定义了执行时间。
在警报页面,组织作业警报。
在通知页面,设置代理在作业完成时执行的操作。
在目标页面,管理作业目标服务器。
配置完成, 点击确定。
在作业的常规页面中,有个启用选项:
勾选启用后,给作业绑定计划或警报,达到条件后(达到计划指定时间或触发警报),作业就会执行。
SQL Server代理在实际开发中作用很大,许多操作都可以放到SQL Server代理中执行,很多时候能事半功倍。
本文对SQL Server代理的基本组件和创建作业绑定计划的简单使用场景进行介绍。实际使用中的重头戏应该是脚本的编写。