远程管理 SQL Server






4.50/5 (4投票s)
2001年11月5日
8分钟阅读

94079

2247
本文介绍如何远程创建 SQL Server 任务。
引言
在开始之前,让我们简要介绍一下 SQL Distributed Management Objects (SQL-DMO)。ASP 通过使用服务器组件来获取其功能。在 ASP 中,我们可以将脚本、HTML 和可重用服务器组件组合起来,创建可伸缩的 Web 应用程序。这些服务器端 ActiveX 组件可以用多种语言开发,例如 VC++、Java 和 Visual Basic (VB)。
我选择 VB 来开发一个将在 ASP 脚本中使用的组件,以利用 SQL-DMO 的强大功能。SQL-DMO 是 OLE 自动化兼容的 COM 对象。这些对象以及一组属性和方法用于编写程序来管理网络上分布的多个 SQL Server。此外,SQL-DMO 是 SQL Enterprise Manager 的基础。事实上,SQL-DMO 是 SQL Server 管理的非常强大的对象模型。使用包含 SQL-DMO 功能的组件的明显优势是,您可以从世界任何地方管理您的 SQL Server。
尽管 SQL-DMO 是一套完整的对象和方法来远程管理 SQL Server,但在本文中,我们将只介绍如何在任务计划程序中添加和删除 SQL 任务。我决定写这篇文章是因为我找不到一篇关于在 ASP 中使用 SQL-DMO 的好文章。本文详细介绍了如何利用 VB 创建 ASP 组件,使用了以下技术:
- Visual Basic 6
- SQL Server
真实商业
我创建了一个名为 Task
的类,其中包含实现该功能所需的所有代码。
这是来自 Task.cls 的代码
Public Function AddTask()
...........................
objSQLServer.DisConnect
objSQLServer.Connect Server, UserID, Password
Dim objTask As SQLOLE.Task
Set objTask = CreateObject("SQLOLE.Task")
'Set the schedule name
objTask.Name = TaskName
objSQLServer.Executive.Tasks.Add objTask
.................................
Case "single_run":
Case 2:
If ExecutionDate = "" Then
ErrDesc = "You must provide the task execution date."
Exit Function
Else
If IsDate(ExecutionDate) = False Then
ErrDesc = "Please provide a valid task execution date."
Exit Function
Else
'Set the schedule name
objTask.Name = TaskName
objSQLServer.Executive.Tasks.Add objTask
'Change the task!
objTask.BeginAlter
objTask.Database = DatabaseName
objTask.Command = CommandText
objTask.FrequencyType = SQLOLEFreq_OneTime
objTask.ActiveStartDate = CDate(ExecutionDate)
objTask.DoAlter
End If
End If
If (objTask.CmdExecSuccessCode) Then
ErrDesc = "Failure"
Else
ErrDesc = "Success"
End If
End Function
该类有两个主要函数,名为 AddTask
和 RemoveTask
。AddTask
向计划程序添加新任务。同样,RemoveTask
从计划程序中删除任务。首先,您必须在 Project 菜单中从引用中包含“Microsoft SQL OLE Object library”。完成此操作后,请按照以下步骤操作:
- 创建 SQL Server 对象。
- 连接到 SQL Server 对象。
- 使用 SQL Server 对象和其他包含的对象。
- 释放 SQL Server 对象。
步骤 1
以下代码创建了一个新的 SQL Server 对象
Dim objSQLServer As SQLOLE.SQLServer
Set objSQLServer = New SQLOLE.SQLServer
objSQLServer
对象是 SQLOLE.SQLServer
类的实例。此对象代表将添加或删除任务的 SQL Server。它对于继续创建将用于创建新任务的另一个对象是必需的。请注意,这里使用了 New
关键字来实例化 SQLServer
对象。我们也可以使用 CreateObject
函数,但后期绑定会降低应用程序的性能。通过早期绑定变量进行引用可以提高性能。
第二步
以下代码连接到 SQLServer
对象
objSQLServer.Connect Server, UserID, Password
请注意,我们将三个参数传递给了 Connect
方法。第一个参数是要连接的 SQL Server 的名称,第二个参数是登录 SQL Server 所需的用户 ID,第三个参数是登录 SQL Server 所需的密码。如果您向 Connect
方法提供了正确的参数,您将连接到 SQL Server。
步骤 3
连接到 SQL Server 后,您就可以利用新创建对象的方法和属性来完成任务。我们的任务是在 SQL 计划程序中创建新任务。因此,我们将创建一个新任务,稍后我们将设置此对象的某些属性。
Dim objTask As SQLOLE.Task
Set objTask = CreateObject("SQLOLE.Task")
现在任务对象已创建,我们需要将任务添加到计划程序。通过调用 Task
对象的 Name
属性来定义任务名称,然后将此任务添加到 SQL Server 计划程序。
objTask.Name = TaskName
objSQLServer.Executive.Tasks.Add objTask
任务添加到计划程序后,就该在新创建的任务中添加一些命令了。您可能希望创建一个任务并在特定时间删除表中的特定记录,或者您可能希望在每月的特定日期向站点管理员发送电子邮件。所有这些都可以通过为 Task
对象的某些属性赋值来完成。请看以下语句:
objTask.BeginAlter
objTask.Database = DatabaseName
objTask.Command = CommandText
objTask.FrequencyType = SQLOLEFreq_OneTime
objTask.ActiveStartDate = CDate(ExecutionDate)
objTask.DoAlter
在为属性赋值之前,您必须调用 BeginAlter
方法,该方法告知 SQL Server 将要对任务属性进行更改。实际上,对单个属性的每一次更改都是对 SQL Server 的一次单独更新。我们使用 BeginAlter
方法将多个属性更改分组为一个单元。调用 DoAlter
方法来提交对对象属性所做的更改。您还可以调用 CancelAlter
方法来取消属性更改单元。
为 Database
属性赋值一个有效的数据库名称。这是您希望在该数据库中执行任务。
objTask.Database = DatabaseName
将一个有效的 Transact SQL 语句传递给 Command
属性,以执行您创建的任务。
objTask.Command = CommandText
在原始 Task
代码中,我们为 FrequencyType
属性赋了一个有效值,这是时间的主要频率单位。本文附带的源文件中包含了更多详细信息。请参阅组件的源代码,了解 FrequencyType
属性的不同用法。
objTask.FrequencyType = SQLOLEFreq_OneTime
上面的代码行旨在只运行一次,因此将一个日期赋值给 ActiveStartDate
属性。任务将在此日期自动执行。ActiveStartDate
是此任务在此之前有效的日期。还有一个我认为应该在这里提及的属性,ActiveEndDate
,即任务在此之后有效的日期和时间。
objTask.ActiveStartDate = CDate(ExecutionDate)
使用提供的代码,您可以创建一个每天、每小时运行的任务,或者只在提供的日期运行一次的任务。通过查看 Visual Basic 中附带的源代码,读者可以了解到代码有详尽的注释,因此读者可以理解这些语句,而无需频繁按 F1 来查找语句的含义。以下是 RemoveTask
函数,该函数从计划程序中删除指定名称的任务:
Public Function RemoveTask(ByVal Task As Variant)
..........................
objSQLServer.Connect Server, UserID, Password
objSQLServer.Executive.Tasks(CStr(Task)).Remove
ErrDesc = "The task has been removed."
.........................
End Function
请记住,在调用此方法之前必须设置某些属性。请看以下语句:
Dim objTaskManager
Set objTaskManger = server.createobject("TaskManager.Task")
objTaskManager.Server = cstr(request.form("servername"))
objTaskManager.UserID = cstr(request.form("userid"))
objTaskManager.Password = cstr(request.form("password"))
objTaskManager.RemoveTask cstr(request.form("taskname"))
response.write objTaskManager.ErrDesc
Set objTaskManager = Nothing
这是显示如何实例化组件并调用 RemoveTask
函数的 ASP 代码。请注意,在调用函数之前,将服务器名称、用户 ID 和密码值赋给了属性。使用 ErrDesc
属性查看所调用函数的状态。
以下是将新任务添加到 SQL 计划程序所需的 ASP 代码:
Dim objTaskManager
Set objTaskManager = server.createobject("TaskManager.Task")
objTaskManager.Server = cstr(request.form("servername"))
objTaskManager.UserID = cstr(request.form("userid"))
objTaskManager.Password = cstr(request.form("password"))
objTaskManager.DatabaseName = cstr(request.form("databasename"))
objTaskManager.TaskName = cstr(request.form("taskname"))
objTaskManager.CommandText = cstr(request.form("commandtext"))
objTaskManager.ScheduleType = cint(request.form("scheduletype"))
objTaskManager.ExecutionDate = cstr(request.form("executiondate"))
objTaskManager.AddTask
response.write objTaskManager.ErrDesc
Set objTaskManager = Nothing
上面创建的任务将只运行一次,因为我们将当前日期传递给了 ExecutionDate
属性。
编译项目
在类模块中输入代码后,编译项目以生成 DLL。最好在项目中引用“Microsoft Active Server Pages Object Library”,这样当尝试从任何 ASP 页面调用组件时,ASP 不会向我们显示“Out of Process Component”错误消息。简而言之,这意味着该组件将知道它需要访问 Active Server Pages DLL (asp.dll) 来运行。最后,将项目编译为 DLL。搞定!您已经创建了一个可以添加和删除 SQL 计划程序任务的 ASP 组件。
用法
考虑一个您创建电子商务应用程序的场景。您使用 SQL Server 进行数据存储。用户在您的网站上购物前会注册,他们下订单,但未完成结账就离开了您的网站。
您应该能够删除他们添加到购物篮中的商品。手动检查数据库中的有效记录并删除不需要的记录将非常繁琐。相反,使用您刚刚创建的组件并创建一个任务,该任务将搜索数据库中的无效或不需要的记录,并在一段时间后自动删除它们。
同样,您可以创建一个 VB 应用程序,每月运行一次,以从 SQL Server 中删除已完成的任务。或者,您可以创建一个组件来检查并从 SQL Server 中删除不需要的任务,手动创建一个新任务,并使用 SQL Server 提供的扩展存储过程来调用此组件,以从 SQL Server 中删除不需要的任务。SQL Server 6.5 及更高版本提供了通过一组 OLE 自动化存储过程或通过扩展存储过程加载和执行 COM 对象的能力。
代码详情
本文附带了 VB 组件源代码和用于测试组件的 ASP 文件。还提供了一个已编译的 DLL。直接将 DLL 插入您的 Web 应用程序以测试组件功能。还提供了源代码,以便您可以自己动手修改代码并尝试在组件中添加更多功能。提供了 ASP 文件以在 ASP 中测试组件。通过这些文件创建和删除任务。要运行 ASP 文件,请创建一个新的 Web 应用程序并将所有 ASP 文件包含在新应用程序中,然后在浏览器中打开索引文件 tm_demo1.asp 来测试功能。
摘要
创建 ASP 组件以远程管理 SQL Server 非常简单。它只需要对 ASP、VB 和 SQL Server 的基本知识。本文展示了创建组件以利用 SQL-DMO 的强大功能并远程管理 SQL 任务是多么容易。