SQL Server Agent 的调度器 GUI






4.95/5 (21投票s)
SQL Server Management Studio 的替代品,
引言
设想一下,您有一些预定义的 SQL Server 作业,并希望让用户能够按照自己的意愿安排它们。您希望利用 SQL Server 代理的强大调度功能(一次性/周期性调度、每日/每周/每月周期频率、多个调度组合用于单个作业等),但您不希望用户访问 SQL Server Management Studio,不想给予他们过高的权限级别,不想让他们访问作业但只允许访问调度,并且您希望直接在您的桌面或 Web 应用程序中提供这些调度功能。
难道您不觉得在您的应用程序中拥有类似 SQL Server Management Studio (SSMS) 中著名的“作业调度属性”对话框会很棒吗?
好吧,本文介绍的代码片段正是做到了这一点:它提供了一种方法,可以在您的应用程序中包含一个图形用户界面 (GUI),用于创建和编辑现有 SQL Server 代理作业的自定义调度。在您需要为应用程序添加用户友好的调度功能来控制 T-SQL 作业的任何情况下,这都会很有用。
基本思路
基本思想相当简单:我们希望提供一个替代的 GUI,用于创建、编辑和删除与现有、预定义的 SQL Server 代理作业相关联的调度。
正如任何 SQL Server 开发人员都知道的那样,通过 SQL Server Management Studio (SSMS) 进行的任何配置都可以脚本化,因为 SSMS 本身只是一个与服务器端服务交互的客户端。在我们的特定场景中,SQL Server 代理作业的调度存储在 msdb
系统数据库中,并通过文档齐全的系统存储过程进行管理。因此,实现一个与作业调度交互的 GUI 的任务仅仅是理解它们的模型并创建一个易于用户调用适当存储过程的界面。
需要考虑的最少程序集如下:
sp_help_jobschedule
,用于检索与给定作业关联的调度;sp_add_schedule
,用于创建新调度;sp_attach_schedule
,用于将新创建的调度附加到给定作业;sp_update_schedule
,用于修改现有调度;sp_detach_schedule
,用于从作业中删除调度。更准确地说:它将调度与给定作业分离,然后如果该调度不再被任何其他作业引用,则删除该分离的调度。事实上,通常情况下,单个 SQL 代理调度可以被多个作业使用。就本文而言,我们考虑的作业与不被其他作业使用的调度相关联。
所有提到的存储过程都在 MSDN 上有文档记录,链接如下:
http://msdn.microsoft.co m/en-us/library/ms176046(v=sql.100).aspx
http://msdn.microsoft.co m/en-us/library/ms187320(v=sql.100).aspx
http://msdn.microsoft.co m/en-us/library/ms186766(v=sql.100).aspx
http://msdn.microsoft.co m/en-us/library/ms187354(v=sql.100).aspx
http://msdn.microsoft.co m/en-us/library/ms186766(v=sql.100).aspx
sysjobs_view
系统视图来检索我们将要操作的作业的初始列表。解决方案
可下载的代码包(用 C# 编写)包含一个 Visual Studio 2008 解决方案(易于转换为 VS2010),由以下项目组成:
SQLjobScheduler
:一个库 DLL 程序集,公开基本功能和 API 来调用上面描述的系统存储过程;SQLjobSchedulerGUI
:一个 Windows 窗体应用程序,为桌面应用程序实现了一个演示调度器 GUI;SQLjobSchedulerWebGUI
:一个 Silverlight 组件,为 Web 应用程序实现了一个演示调度器 GUI;SQLjobSchedulerWebGUI.Web
:一个 ASP.NET 项目,仅包含一个用于托管上述 Silverlight 组件的页面和一个 ASMX Web 服务,以向其提供数据服务。
SQLjobSchedulerGUI
项目中的窗体。如果您需要在 Web 应用程序中使用这些功能,您可以集成 SQLjobSchedulerWebGUI
项目中包含的 Silverlight 组件。如果您想创建自己的用户界面,您可以重用至少 SQLjobScheduler
DLL 程序集公开的 API。SQLjobScheduler API
以下是 SQLjobScheduler
DLL 库程序集公开的公共函数的快速列表:
LoadSQLjobs:检索 GUI 将显示给用户的作业列表,以便用户可以选择他想创建、编辑或删除调度的作业。因为在一般情况下,您不希望用户操作 msdb
中定义的所有作业,所以您可以提供您的“目标类别”列表:这样,检索到的作业列表将只包含属于指定类别的作业。
为了将作业与特定类别关联,请在 SSMS 的“作业属性”对话框中操作“类别”属性。
为了管理您自己的自定义作业类别,您可以通过激活 SQL Server Agent 作业的上下文菜单中的“管理作业类别”命令来访问 SSMS 中的“管理作业类别”窗口。
LoadSQLschedules:检索给定作业的调度。当用户选择了要操作的作业,并且应用程序需要向用户显示与所选作业相关联的所有调度时,通常会调用此方法。
CreateSQLschedule:使用给定的信息在 msdb
上创建调度。该方法基本上会调用 sp_add_schedule
系统存储过程(以创建调度),然后调用 sp_attach_schedule
系统存储过程(以将新创建的调度附加到给定作业)。
UpdateSQLschedule:使用给定的信息修改 msdb
上的现有调度。该方法调用 sp_update_schedule
系统存储过程。
DeleteSQLschedule:根据其标识符从 msdb
中删除现有调度。该方法调用 sp_detach_schedule
系统存储过程将调度与给定作业分离,然后如果该调度不再被任何其他作业引用,则删除该分离的调度(请记住,通常情况下,单个 SQL 代理调度可能被多个作业使用)。
以上所有方法都接收 msdb
数据库的连接字符串作为参数,您的应用程序必须提供该连接字符串,并在从某些配置中正确检索它之后(就像在演示应用程序中一样:请参阅 SQLjobSchedulerGUI
的 app.config
和 SQLjobSchedulerWebGUI.Web
的 web.config
)。当然,连接字符串中指定的用户必须具有操作 SQL Server 代理调度的足够权限。
上述方法还使用 `SQLjob` 和 `SQLschedule` 类实例作为输入参数或返回值,这两个类都在 `SQLjobScheduler` 库中定义,如下所示,以模仿 msdb
中作业和调度实体的 the data structure。
public class SQLjob
{
public string job_id { get; set; }
public string originating_server { get; set; }
public string name { get; set; }
public int enabled { get; set; }
public string description { get; set; }
public int category_id { get; set; }
public DateTime date_created { get; set; }
public DateTime date_modified { get; set; }
public int version_number { get; set; }
}
public class SQLschedule
{
public int schedule_id { get; set; }
public string schedule_uid { get; set; }
public int originating_server_id { get; set; }
public string name { get; set; }
public string owner_sid { get; set; }
public int enabled { get; set; }
public int freq_type { get; set; }
public int freq_interval { get; set; }
public int freq_subday_type { get; set; }
public int freq_subday_interval { get; set; }
public int freq_relative_interval { get; set; }
public int freq_recurrence_factor { get; set; }
public DateTime active_start_date { get; set; }
public DateTime active_end_date { get; set; }
public DateTime active_start_time { get; set; }
public DateTime active_end_time { get; set; }
public DateTime date_created { get; set; }
public DateTime date_modified { get; set; }
public int version_number { get; set; }
}
Windows 窗体应用程序的演示 GUI
Windows 窗体应用程序的演示 GUI 包含在 SQLjobSchedulerGUI
项目中。它由一个第一个窗体组成,用户在此窗体上被要求选择要操作的作业,以及第二个窗体,该窗体被设计为模仿 SSMS“作业调度”对话框并提供相同的功能(例如,注意每日/每周/每月周期选项)。
窗体的代码直接使用上面描述的 SQLjobScheduler API。
Web 应用程序的演示 GUI
Web 应用程序的演示 GUI 在 SQLjobSchedulerWebGUI
项目中实现为一个 Silverlight 组件(它使用 VS2008 的 Silverlight 版本 3,但可以轻松转换为更高版本)。同样,它由一个用于选择要操作的作业的第一个页面和一个被设计为模仿 SSMS“作业调度”对话框并提供相同功能(例如,注意每日/每周/每月周期选项)的第二个页面组成。
Silverlight 组件与 SQLjobSchedulerWS.ASMX
Web 服务交互,该服务作为上面描述的 SQLjobScheduler API 的包装器。
结论
这个解决方案不是一个特别聪明的代码片段,但我相信它对于任何需要将 SQL Server 代理调度器功能集成到他们自己的 Windows 窗体或 Web 应用程序中的人都会很有用。
我想感谢我的同事 Marco Lauriola,他间接且无意地启发了我来实现这个解决方案。
历史
2012/05/01 - 第一个版本(包括 WinForms GUI 和 Web Silverlight GUI)。
2012/05/02 - 文章文本中的小更正。
2012/05/10 - 修复了调度保存中的一个小错误。在代码解决方案中添加了一些注释。