远程管理 SQL Server - 第二部分






2.50/5 (2投票s)
2001年11月5日
5分钟阅读

70258

734
创建用于远程管理 SQL Server 的组件,创建在完成分配的任务后会自动从计划程序中删除的任务。
引言
我建议您在阅读本文之前先阅读本文的第一部分。SQLDMO 的主要细节已在本文的第一部分进行了讨论。我们已将组件升级为与 SQL Server 7.0 一起使用。上一篇文章中的代码仅适用于 SQL Server 6.5 版本。新组件中进行了更多增强,新组件能够一旦任务完成就自动删除任务。在以前的版本中,一旦创建了任务,就必须通过执行名为“RemoveTask”的方法手动删除该任务,但在新组件中不再需要这样的方法,因为它将在成功完成后删除任务。此外,以前任务在每次到达特定日期时都会执行,但现在任务仅在用户提供给组件的特定日期执行一次。此外,我们还演示了如何在同一作业中添加两个步骤。在上一篇文章中,作业只包含一个步骤,但使用新组件创建的新任务应包含多个作业步骤,即用户可以在同一任务中完成多个作业。现在,让我们逐步分析代码。
Private Sub Class_Initialize()
On Error Resume Next
NL = Chr$(13) & Chr$(10)
Set oSQLServer = New SQLDMO.SQLServer
oSQLServer.LoginTimeout = 10
End Sub
当类初始化时创建主对象,同样,当类终止时,此对象将从内存中删除。
我们的主方法称为 AddTask
,此方法将向任务计划程序添加一个新任务。请注意,我们没有直接将参数传递给函数,而是使用了属性从用户那里获取输入。
Public Function AddTask()
On Error GoTo errhandler
oSQLServer.DisConnect
Disconnect the server if its already connected.
If Server = "" Then
ErrDesc = "You must enter server name."
Exit Function
ElseIf UserID = "" Then
ErrDesc = "You must enter a valid User ID"
Exit Function
ElseIf Password = "" Then
Password = ""
End If
从用户那里获取重要参数的值,这些值是连接到 SQL Server 所必需的。
'Connect to the server!
oSQLServer.Connect CStr(Server), CStr(UserID), CStr(Password)
Dim oJob As New SQLDMO.Job
Dim idStep As Integer
Idstep
将用于定义要包含在任务中的步骤总数。
'Set the schedule name
oJob.Name = JobID
为作业分配名称。
'objSQLServer.Executive.Tasks.Add oJob
oSQLServer.JobServer.Jobs.Add oJob
将新创建的作业添加到作业服务器。JobServer
对象公开与 SQL Server Agent 相关的属性。SQL Server Agent 负责执行计划的作业,并在 SQL Server 出现错误条件或其他 SQL Server 执行或作业状态时通知操作员。
'Use the code below to change the task!!!
oJob.BeginAlter
'idStep = 0
最初,我们将步骤 ID 设置为零。因为我们打算在任务中添加两个步骤,所以我们循环两次。
For idStep = 0 To 2
Dim oJobStep As SQLDMO.JobStep
Set oJobStep = New SQLDMO.JobStep
我们在上面的语句中创建了一个新的 JobStep
对象。JobStep
对象公开单个 SQL Server Agent 可执行作业步骤的属性。SQL Server Agent 作业包含一个或多个称为步骤的执行单元。每个作业步骤都包含一个文本命令、指定命令解释的执行类型以及确定步骤成功或失败时作业行为的逻辑。
idStep = idStep + 1
oJobStep.Name = JobID & idStep
oJobStep.StepID = idStep
'Set the job step executable subsystem.
oJobStep.SubSystem = "TSQL"
子系统属性指定用于解释作业步骤任务定义文本的 SQL Server Agent 执行子系统。
If DatabaseName <> "" Then
oJobStep.DatabaseName = DatabaseName
Else
oJobStep.DatabaseName = "yourdatabase"
End If
如果用户未能从前端传递数据库名称,则该组件将拾取硬编码的数据库名称,前提是您已在代码中硬编码了数据库名称。
If idStep = "1" Then
If CommandText <> "" Then
oJobStep.Command = CommandText
Else
oJobStep.Command = "select * from table1"
oJobStep.OnSuccessAction = SQLDMOJobStepAction_GotoNextStep
End If
Else
oJobStep.StepID = 2
If Commandtext2 <> "" Then
oJobStep.Command = Commandtext2
Else
oJobStep.Command = "delete from table2"
oJobStep.OnSuccessAction = SQLDMOJobStepAction_QuitWithSuccess
End If
End If
我们将两个命令添加到作业中,一个将从表中返回所有记录,第二个将删除表中所有记录。这只是为了给您一个示例,您可以通过从前端传递命令文本或如上所示在代码中硬编码命令文本来对数据库表执行任何操作。
oJob.JobSteps.Add oJobStep
Next
将单个作业步骤添加到 JobSteps
集合中。
'Set the Target Server
oJob.ApplyToTargetServer (CStr(Server))
applytotargetserver
方法将执行目标添加到引用的 SQL Server Agent 作业维护的目标列表中。
现在,这是重要部分,即作业的计划,作业已创建,但现在我们必须计划该作业,以便它在特定的日期和时间运行。
JobSchedule
对象公开单个 SQL Server Agent 可执行作业计划的属性。
Dim oJobSchedule As SQLDMO.JobSchedule
Set oJobSchedule = New SQLDMO.JobSchedule
'xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
'Schedule the task!
'xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
您可以计算任务开始执行的任何时间和日期,这完全取决于您的选择或要求。我们分别计算了年、月和日。
Dim startyear, startmonth, startday
'Indicate execution scheduled for everyday by using
'the FrequencyType and FrequencyInterval properties.
oJobSchedule.Name = JobID
oJobSchedule.Schedule.FrequencyType = SQLDMOFreq_OneTime
我们只想执行一次任务,因此我们将频率类型设置为一次。
'Set the ActiveStartDate to indicating the date on
'which the schedule becomes active. Start date is
'today's date
Dim mydate
mydate = DateAdd("h", CInt(Num_Of_Hours), Now())
Dim hr, min, sec
hr = Hour(mydate)
min = Minute(mydate)
sec = Second(mydate)
Dim mytime
mytime = hr & min & sec
startyear = DatePart("yyyy", mydate)
startmonth = DatePart("m", mydate)
startday = DatePart("d", mydate)
If Len(startmonth) < 2 Then startmonth = "0" & startmonth
If Len(startday) < 2 Then startday = "0" & startday
oJobSchedule.Schedule.ActiveStartDate = _
startyear & startmonth & startday
Activestartdate
属性表示计划的第一个生效日期。
'Set the ActiveStartTimeOfDay property to indicate the
'scheduled execution time on each day
oJobSchedule.Schedule.ActiveStartTimeOfDay = mytime
Activestarttimeofday
属性表示计划的开始时间。
'Indicate that the schedule never expires oJobSchedule.Schedule.ActiveEndDate = SQLDMO_NOENDDATE oJobSchedule.Schedule.ActiveEndTimeOfDay = SQLDMO_NOENDTIME
同样,我们必须为作业提供有效的结束日期和时间。我们将这些属性设置为 SQLDMO_NOENDDATE
和 SQLDMO_NOENDTIME
,这意味着在执行之前,作业永远不会过期。
'xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
'Add task to scheduler
'xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
oJob.JobSchedules.Add oJobSchedule
现在,这是巧妙的部分,即如何自动从计划程序中删除任务,有一个名为 DeleteLevel
的属性,该属性控制 SQL Server Agent 作业的执行后处理。
'Automatically delete job after successful completion
oJob.DeleteLevel = SQLDMOComp_Success
如果作业成功,我们则从计划程序中删除该作业。
oJobStep.OnFailAction = SQLDMOJobStepAction_QuitWithFailure
If SQLDMOJobStepAction_QuitWithFailure = True Then
ErrDesc = "Failure"
Else
ErrDesc = "Success"
End If
oJob.StartStepID = 1
'Alter the job
oJob.DoAlter
'Clear references to the created objects
Set oJob = Nothing
Set oJobStep = Nothing
Set oJobSchedule = Nothing
Exit Function
errhandler:
'Clear references to the created objects
Set oJob = Nothing
Set oJobStep = Nothing
Set oJobSchedule = Nothing
ErrDesc = "Failure: " & "'" & Err.Source _
& "'" & " " & Err.Number & " " & Err.Description
End Function
其余代码与我们在第一部分看到的类似,在类终止时销毁对象。编译 DLL 并从您的 VB 项目或 ASP 代码中访问该组件。它运行良好且高效。您可以自定义该组件以添加更多功能或根据自己的需求更改功能。
摘要
SQLOLE 和 SQLDMO 之间存在差异,SQLOLE.DLL 库随 SQL Server 6.5 一起提供,而 SQLDMO.DLL 库随 SQL Server 7.0 一起提供。您必须包含正确的库引用。就本文而言,请添加对 SQLDMO.DLL 的引用。