修正操作資料庫中代理程式與伺服器間的重複關聯性

Microsoft.SystemCenter.2007.OpsMgrDB.FixDuplicateAgntToSrvRel (WriteActionModuleType)

此工作將執行指令碼,以修正操作資料庫中的重複記錄。

Element properties:

TypeWriteActionModuleType
IsolationAny
AccessibilityInternal
RunAsMicrosoft.SystemCenter.DatabaseWriteActionAccount
InputTypeSystem.TriggerData

Member Modules:

ID Module Type TypeId RunAs 
RunScript WriteAction System.CommandExecuter Default

Overrideable Parameters:

IDParameterTypeSelectorDisplay NameDescription
TimeoutSecondsint$Config/TimeoutSeconds$逾時 (秒)

Source Code:

<WriteActionModuleType ID="Microsoft.SystemCenter.2007.OpsMgrDB.FixDuplicateAgntToSrvRel" Accessibility="Internal" RunAs="SCLibrary!Microsoft.SystemCenter.DatabaseWriteActionAccount" Batching="false">
<Configuration>
<xsd:element minOccurs="1" name="TimeoutSeconds" type="xsd:integer"/>
<xsd:element minOccurs="1" name="DatabaseServerName" type="xsd:string"/>
<xsd:element minOccurs="1" name="DatabaseName" type="xsd:string"/>
</Configuration>
<OverrideableParameters>
<OverrideableParameter ID="TimeoutSeconds" Selector="$Config/TimeoutSeconds$" ParameterType="int"/>
</OverrideableParameters>
<ModuleImplementation Isolation="Any">
<Composite>
<MemberModules>
<WriteAction ID="RunScript" TypeID="System!System.CommandExecuter">
<ApplicationName>%windir%\system32\cscript.exe</ApplicationName>
<WorkingDirectory/>
<CommandLine>//NoLogo "FixDupRelAgsToSrvrsTask.vbs" "$Config/DatabaseServerName$" "$Config/DatabaseName$"</CommandLine>
<TimeoutSeconds>$Config/TimeoutSeconds$</TimeoutSeconds>
<RequireOutput>true</RequireOutput>
<Files>
<File>
<Name>FixDupRelAgsToSrvrsTask.vbs</Name>
<Contents><Script>'Copyright (c) Microsoft Corporation. All rights reserved.

'*************************************************************************
' $ScriptName: "FixDupRelAgsToSrvrsTask" $
'
' Purpose: This script fix duplicates relationship between agents and servers.
'
' $File: FixDupRelAgsToSrvrsTask.vbs $
'*************************************************************************


Option Explicit
'Declarations
Dim objCN,objRS,objRS2, strQuery, intRecordsCount
Dim oArgs,oAPI,oBag
Dim strDBServer,strDatabase
Dim strRelationshipId, strDiscoverySourceId

'Define local event constants
Const EVENT_TYPE_ERROR = 1
Const EVENT_TYPE_WARNING = 2
Const EVENT_TYPE_INFORMATION = 4

SetLocale("en-us")

'Create objects
Set oAPI = CreateObject("MOM.ScriptAPI")
Set oArgs = WScript.Arguments

'Define parameters
strDBServer = oArgs(0)
strDatabase = oArgs(1)

Dim ObjError
Set ObjError = New Error

On Error Resume Next

'Set DB connection
Set objCN = CreateObject("ADODB.Connection")
objCN.Open "Provider=SQLOLEDB.1;Integrated Security=SSPI;Persist Security Info=False;Initial Catalog=" &amp; _
strDatabase &amp; ";Data Source=" &amp; strDBServer &amp; ""

ObjError.Save
On Error Goto 0

If ObjError.Number &lt;&gt; 0 Then
WScript.Echo "Task Fail - Error Number: " &amp; ObjError.number &amp; " Error Details: " &amp; ObjError.Description
oAPI.LogScriptEvent "FixDupRelAgsToSrvrsTask.vbs",100,EVENT_TYPE_ERROR,"Script executed with Error Number: " &amp; ObjError.number &amp; " Error Details: " &amp; ObjError.Description
WScript.Quit
End If

intRecordsCount = 0


strQuery = "SELECT R.RelationshipId, DS.DiscoverySourceId " &amp; _
"FROM Relationship R (NoLock) " &amp; _
"JOIN RelationshipType RT (NoLock) ON RT.RelationshipTypeId = R.RelationshipTypeId " &amp; _
"JOIN DiscoverySourceToRelationship DSR (NoLock) ON DSR.RelationshipId = R.RelationshipId " &amp; _
"Left Outer Join DiscoverySource DS (NoLock) ON DS.DiscoverySourceId = DSR.DiscoverySourceId " &amp; _
"Left Outer Join Discovery D (NoLock) ON D.Discoveryid = DS.DiscoveryRuleId " &amp; _
"where R.IsDeleted = 0 " &amp; _
"And RT.RelationshipTypeName in ('Microsoft.SystemCenter.HealthServiceCommunication','Microsoft.SystemCenter.HealthServiceSecondaryCommunication') " &amp; _
"And R.RelationshipId NOT IN " &amp; _
"( " &amp; _
" SELECT RO.RelationshipId " &amp; _
" FROM " &amp; _
" ( " &amp; _
" SELECT RANK() OVER(PARTITION BY R1.SourceEntityId, R1.TargetEntityId ORDER BY R1.TimeAdded asc) as RowNumber, " &amp; _
" R1.RelationshipId " &amp; _
" FROM Relationship R1 (NoLock) " &amp; _
" JOIN RelationshipType RT1 (NoLock) " &amp; _
" ON RT1.RelationshipTypeId = R1.RelationshipTypeId " &amp; _
" WHERE RT1.RelationshipTypeName In ('Microsoft.SystemCenter.HealthServiceCommunication','Microsoft.SystemCenter.HealthServiceSecondaryCommunication') " &amp; _
" AND R1.IsDeleted = 0 " &amp; _
" Group By R1.RelationshipId,R1.SourceEntityId, R1.TargetEntityId, R1.TimeAdded " &amp; _
" ) As RO " &amp; _
" Where RO.RowNumber = 1 " &amp; _
") " &amp; _
"Order By R.LastModified Desc"



'Query DB
Set objRS = objCN.Execute(strQuery)
ObjError.Save
On Error Goto 0

If ObjError.Number &lt;&gt; 0 Then
WScript.Echo "Task Fail - Error Number: " &amp; ObjError.number &amp; " Error Details: " &amp; ObjError.Description
oAPI.LogScriptEvent "FixDupRelAgsToSrvrsTask.vbs",100,EVENT_TYPE_ERROR,"Script executed with Error Number: " &amp; ObjError.number &amp; " Error Details: " &amp; ObjError.Description
WScript.Quit
End If


Do While objRS.EOF = false
intRecordsCount = intRecordsCount + 1
strRelationshipId = objRS.Fields(0).Value
strDiscoverySourceId = objRS.Fields(1).Value

strQuery = "declare @RelationshipId uniqueidentifier;" &amp; _
"declare @DiscoverySourceId uniqueidentifier;" &amp; _
"declare @TimeGenerated datetime;" &amp; _
"set @RelationshipId = '" &amp; strRelationshipId &amp; "'; " &amp; _
"set @DiscoverySourceId = '" &amp; strDiscoverySourceId &amp; "';" &amp; _
"set @TimeGenerated = getutcdate();" &amp; _
"begin transaction " &amp; _
"exec p_RemoveRelationshipFromDiscoverySourceScope @RelationshipId, @DiscoverySourceId, @TimeGenerated " &amp;_
"commit transaction"

On Error Resume Next

Set objRS2 = objCN.Execute(strQuery)
ObjError.Save
On Error Goto 0

If ObjError.Number &lt;&gt; 0 Then
WScript.Echo "Task Fail - Error Number: " &amp; ObjError.number &amp; " Error Details: " &amp; ObjError.Description
oAPI.LogScriptEvent "FixDupRelAgsToSrvrsTask.vbs",100,EVENT_TYPE_ERROR,"Script executed with Error Number: " &amp; ObjError.number &amp; " Error Details: " &amp; ObjError.Description
WScript.Quit
End If

objRS.MoveNext()
Loop

'Check for error condition before continuing.
If ObjError.Number &lt;&gt; 0 Then
WScript.Echo "Task Fail - Error Number: " &amp; ObjError.number &amp; " Error Details: " &amp; ObjError.Description
oAPI.LogScriptEvent "FixDupRelAgsToSrvrsTask.vbs",100,EVENT_TYPE_ERROR,"Script executed with Error Number: " &amp; ObjError.number &amp; " Error Details: " &amp; ObjError.Description
WScript.Quit
End If

Set objRS = Nothing
Set objRS2 = Nothing
Set objCN = Nothing

oAPI.LogScriptEvent "FixDupRelAgsToSrvrsTask.vbs",100,EVENT_TYPE_INFORMATION,"Script executed to fix Duplicate Records"

WScript.Echo "Task completed successfully."

Class Error
Private m_lNumber
Private m_sSource
Private m_sDescription
Private m_sHelpContext
Private m_sHelpFile

Public Sub Save()
m_lNumber = Err.number
m_sSource = Err.Source
m_sDescription = Err.Description
m_sHelpContext = Err.HelpContext
m_sHelpFile = Err.helpfile
End Sub

Public Sub Raise()
Err.Raise m_lNumber, m_sSource, m_sDescription, m_sHelpFile, m_sHelpContext
End Sub

Public Sub Clear()
m_lNumber = 0
m_sSource = ""
m_sDescription = ""
m_sHelpContext = ""
m_sHelpFile = ""
End Sub

Public Default Property Get Number()
Number = m_lNumber
End Property

Public Property Get Source()
Source = m_sSource
End Property

Public Property Get Description()
Description = m_sDescription
End Property

Public Property Get HelpContext()
HelpContext = m_sHelpContext
End Property

Public Property Get HelpFile()
HelpFile = m_sHelpFile
End Property
End Class</Script></Contents>
<Unicode>true</Unicode>
</File>
</Files>
</WriteAction>
</MemberModules>
<Composition>
<Node ID="RunScript"/>
</Composition>
</Composite>
</ModuleImplementation>
<InputType>System!System.TriggerData</InputType>
</WriteActionModuleType>