65.9K
CodeProject 正在变化。 阅读更多。
Home

远程管理 SQL Server

starIconstarIconstarIconstarIcon
emptyStarIcon
starIcon

4.50/5 (4投票s)

2001年11月5日

8分钟阅读

viewsIcon

94079

downloadIcon

2247

本文介绍如何远程创建 SQL Server 任务。

Sample Image - sqldmo.jpg

引言

在开始之前,让我们简要介绍一下 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

该类有两个主要函数,名为 AddTaskRemoveTaskAddTask 向计划程序添加新任务。同样,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 任务是多么容易。

© . All rights reserved.