Du kan inte visa borttagna objekt i System Center Service Manager-konsolen

Den här artikeln hjälper dig att åtgärda ett problem där du inte kan visa borttagna objekt i Service Manager-konsolen och få SQL Server fel 8623 i händelseloggen.

Ursprunglig produktversion: System Center Service Manager, version 1807, System Center Service Manager, version 1801, System Center 2016 Service Manager
Ursprungligt KB-nummer: 4480420

Symptom

När du väljer Administration>Borttagna objekt i System Center Service Manager-konsolen visas följande felmeddelande:

Meddelande: Ett fel uppstod när objekten lästes in.
Microsoft.EnterpriseManagement.UI.ViewFramework.AdvancedListSupportException: Det fullständiga kortet utlöste ett undantag. Se egenskapen FullUpdate för att se undantaget.
på Microsoft.EnterpriseManagement.UI.ViewFramework.AdvancedListSupportAdapter.DoAction(DataQueryBase query, IList'1 dataSources, IDictionary'2 parameters, IList'1 inputs, String outputCollectionName)
på Microsoft.EnterpriseManagement.UI.DataModel.QueryQueue.StartExecuteQuery(Object sender, ConsoleJobEventArgs e)
på Microsoft.EnterpriseManagement.ServiceManager.UI.Console.ConsoleJobExceptionHandler.ExecuteJob(IComponent component, EventHandler'1 job, Object sender, ConsoleJobEventArgs args)

Dessutom registreras följande SQL Server fel i händelseloggen:

- Msg 8623, nivå 16, delstat 1, rad 3
Frågeprocessorn fick slut på interna resurser och kunde inte skapa en frågeplan. Detta är en sällsynt händelse och förväntas bara för extremt komplexa frågor eller frågor som refererar till ett mycket stort antal tabeller eller partitioner. Förenkla frågan. Om du tror att du har fått det här meddelandet av misstag kontaktar du kundtjänsten för mer information.

Orsak

När du öppnar vyn Borttaget körs en SQL-fråga som innehåller många UNION ALL-instruktioner . Det här problemet uppstår om det finns fler än 600 klasstyper som härleds från konfigurationsobjekt.

Kontrollera den här situationen genom att köra följande SQL-fråga och kontrollera antalet rader som returneras i resultatet:

ViewsDerivedFromConfigurationItem.sql

--Views derived from Configuration Item
 use ServiceManager
 go
 select v.name
 from sys.all_columns c
 inner join sys.all_views v on c.object_id=v.object_id
 where c.name like 'ObjectStatus_4AE3E5FE_BC03_1336_0A45_80BF58DEE57B'
 order by 1

Lösning 1

Säkerhetskopiera databaserna och kör sedan följande PowerShell-skript på en hanteringsserver för att simulera vyn Borttaget .

Obs!

RemoveDeletedItem.ps1 tar bara bort ett borttaget objekt. RestoreDeletedItems.ps1 återställer flera objekt samtidigt.

RemoveDeletedItem.ps1

#Import-Module SMlets
$sqlInstance=(Get-ItemProperty -Path "HKLM:\SOFTWARE\Microsoft\System Center\2010\Common\Database").DatabaseServerName
$smDbName=(Get-ItemProperty -Path "HKLM:\SOFTWARE\Microsoft\System Center\2010\Common\Database").DatabaseName
#-------------------------------------------------
$SqlQuery="--Objects in DeletedItems view 
create table #ResultTable_DeletedItems (Name nvarchar(max) null, Class nvarchar(max) null, Path  nvarchar(max) null, TypeName nvarchar(256) null, FullName nvarchar(max) null, BaseManagedEntityId uniqueidentifier not null)
declare @viewName sysname, @sql nvarchar(max),@ParmDefinition nvarchar(max),@retval bigint
declare c cursor read_only forward_only for
select v.name
from sys.all_columns c
inner join sys.all_views v on c.object_id=v.object_id
where c.name like 'ObjectStatus_4AE3E5FE_BC03_1336_0A45_80BF58DEE57B'
order by 1
open c
while 1=1
begin
fetch c into @viewName
if @@FETCH_STATUS<>0 break
set @sql='
insert #ResultTable_DeletedItems
select mtv.DisplayName as Name, LTValue as Class, Path, mt.TypeName, bme.FullName, bme.BaseManagedEntityId
from ' + @viewName + ' mtv inner join BaseManagedEntity bme on mtv.BaseManagedEntityId=bme.BaseManagedEntityId inner join ManagedType mt on bme.BaseManagedTypeId=mt.ManagedTypeId 
inner join LocalizedText lt on mt.ManagedTypeId=lt.LTStringId and LanguageCode=''ENU'' and LTStringType=1
where mtv.ObjectStatus_4AE3E5FE_BC03_1336_0A45_80BF58DEE57B = ''47101E64-237F-12C8-E3F5-EC5A665412FB''
'
exec sp_executesql @sql
end
close c
deallocate c
select * from  #ResultTable_DeletedItems
drop table #ResultTable_DeletedItems"
$cnt=0
Write-Host "Please wait while Deleted Items are listed. $(Get-Date)"
"************************************************"
$ConnectionString="Server=$sqlInstance;Database=$smDbName;Integrated Security=True"
$SqlConnection = new-object System.Data.SqlClient.SqlConnection
$SqlConnection.ConnectionString = $ConnectionString
$SqlCommand = $SqlConnection.CreateCommand()
$SqlCommand.CommandText = $SqlQuery
$dt = New-Object System.Data.DataTable
$da = New-Object System.Data.SqlClient.SqlDataAdapter  -ArgumentList $SqlCommand
[void]$da.fill($dt)
$rows=$dt.Rows
#-------------------------------------------------

$selectedDeletedItem= ($rows | Out-GridView  -Title 'Select a single Deleted Item to REMOVE' -OutputMode Single)

if ($selectedDeletedItem)
{
    $Confirm = Read-Host "Deleted configuration items that are removed lose all history and relationships. Do you want to remove the selected configuration item? Type YES to confirm."
    if ($Confirm -ne "YES") {Write-Host "Exiting..."; exit}

    $itemRestored= Get-SCSMObject -Id $selectedDeletedItem.BaseManagedEntityId
    $itemRestored | Remove-SCSMObject -Force

    Write-Host "Selected item below has been REMOVED:"
    $selectedDeletedItem
}
else
{
    Write-Host "No item selected to remove."
}

RestoreDeletedItems.ps1

#Import-Module SMlets
$sqlInstance=(Get-ItemProperty -Path "HKLM:\SOFTWARE\Microsoft\System Center\2010\Common\Database").DatabaseServerName 
$smDbName=(Get-ItemProperty -Path "HKLM:\SOFTWARE\Microsoft\System Center\2010\Common\Database").DatabaseName
#-------------------------------------------------
$SqlQuery="--Objects in DeletedItems view 
create table #ResultTable_DeletedItems (Name nvarchar(max) null, Class nvarchar(max) null, Path  nvarchar(max) null, TypeName nvarchar(256) null, FullName nvarchar(max) null, BaseManagedEntityId uniqueidentifier not null)
declare @viewName sysname, @sql nvarchar(max),@ParmDefinition nvarchar(max),@retval bigint
declare c cursor read_only forward_only for
select v.name
from sys.all_columns c
inner join sys.all_views v on c.object_id=v.object_id
where c.name like 'ObjectStatus_4AE3E5FE_BC03_1336_0A45_80BF58DEE57B'
order by 1
open c
while 1=1
begin
fetch c into @viewName
if @@FETCH_STATUS<>0 break
set @sql='
insert #ResultTable_DeletedItems
select mtv.DisplayName as Name, LTValue as Class, Path, mt.TypeName, bme.FullName, bme.BaseManagedEntityId
from ' + @viewName + ' mtv inner join BaseManagedEntity bme on mtv.BaseManagedEntityId=bme.BaseManagedEntityId inner join ManagedType mt on bme.BaseManagedTypeId=mt.ManagedTypeId 
inner join LocalizedText lt on mt.ManagedTypeId=lt.LTStringId and LanguageCode=''ENU'' and LTStringType=1
where mtv.ObjectStatus_4AE3E5FE_BC03_1336_0A45_80BF58DEE57B = ''47101E64-237F-12C8-E3F5-EC5A665412FB''
'
exec sp_executesql @sql
end
close c
deallocate c
select * from  #ResultTable_DeletedItems
drop table #ResultTable_DeletedItems"
$cnt=0
Write-Host "Please wait while Deleted Items are listed. $(Get-Date)"
"************************************************"
$ConnectionString="Server=$sqlInstance;Database=$smDbName;Integrated Security=True"
$SqlConnection = new-object System.Data.SqlClient.SqlConnection
$SqlConnection.ConnectionString = $ConnectionString
$SqlCommand = $SqlConnection.CreateCommand()
$SqlCommand.CommandText = $SqlQuery
$dt = New-Object System.Data.DataTable
$da = New-Object System.Data.SqlClient.SqlDataAdapter  -ArgumentList $SqlCommand
[void]$da.fill($dt)
$rows=$dt.Rows
#-------------------------------------------------

$selectedDeletedItems= ($rows | Out-GridView  -Title 'Select Deleted Item(s) to RESTORE' -passthru )

if ($selectedDeletedItems)
{

    $Confirm = Read-Host "This will restore the selected configuration items. Do you want to continue? Type Y to confirm." 
    if ($Confirm -ne "Y") {Write-Host "Exiting..."; exit}

    $Active = Get-SCSMEnumeration System.ConfigItem.ObjectStatusEnum.Active$

    foreach($selectedDeletedItem in $selectedDeletedItems)
    {
        $itemRestored= Get-SCSMObject -Id $selectedDeletedItem.BaseManagedEntityId
        $itemRestored | set-scsmobject -property ObjectStatus -value $Active  
    }
    Write-Host "Selected item(s) below has been restored:"
    $selectedDeletedItems
}
else
{
    Write-Host "No item selected to restore."
}

Lösning 2

Skapa särskilda konsolvyer genom att följa dessa steg:

  1. Skapa en ny konsolvy i konfigurationsobjektens wunderbar.
  2. Leta efter en annan klasstyp än Konfigurationsobjekt, till exempel Windows-dator. Du kan referera till kolumnen Klass som returneras av RestoreDeletedItems.ps1 för tillgängliga klasstyper.
  3. Ändra villkor till [Konfigurationsobjekt]. Objektstatus är lika med Väntande borttagning.
  4. I avsnittet Visa väljer du minst kolumnerna Namn och Sökväg . Du kan också välja andra kolumner som är specifika för klasstypen.
  5. Ta bort eller återställ de borttagna objekten i listan.

Lösning 3

Ta bort oanvända hanteringspaket för att minska det totala antalet härledda klasstyper.

Viktigt

Var försiktig när du tar bort hanteringspaket. Vi rekommenderar att du skapar en säkerhetskopia och att du testar i en testmiljö innan du gör det i produktionsmiljön.

Kör följande SQL-fråga för att hitta antalet härledda klasstyper som varje hanteringspaket innehåller:

-- Order the management packs by the number of derived configuration items class types
select MP.MPName, count(1) as TotalConfigurationItemClassTypes from ManagedType MT
inner join ManagementPack as MP on MT.ManagementPackId = MP.ManagementPackId
where ManagedTypeTableName in (select TABLE_NAME from INFORMATION_SCHEMA.columns where column_name like '%AssetStatus_B6E7674B_684A_040D_30B8_D1B42CCB3BC6%'
) and ManagedTypeTableName is not null
group by MP.MPName
order by count(1) desc

Mer information

När du tar bort datorobjekt ska du inte ta bort datorobjekt för hanteringsservrarna. Annars slutar Service Manager arbetsflöden att fungera och du måste återställa Service Manager-databasen till en tidigare säkerhetskopia.