diff --git a/provisioning/Inspect-Indexes.ps1 b/provisioning/Inspect-Indexes.ps1 new file mode 100644 index 0000000..f3e009e --- /dev/null +++ b/provisioning/Inspect-Indexes.ps1 @@ -0,0 +1,54 @@ +<# +.SYNOPSIS + Диагностика: для каждого списка «… — согласование» на сайте печатает число + строк и проиндексированы ли колонки, по которым портал фильтрует маршрут. + Только чтение, ничего не меняет. + +.DESCRIPTION + Портал ищет шаги маршрута фильтрами по Ticket (TicketId eq …), ApprovalStatus + и TansuSiteApprover. В списке больше 5000 строк такой фильтр работает только + по проиндексированной колонке — иначе SharePoint отвечает ошибкой порога + представления. Скрипт показывает, где индекса нет и как близко список к 5000. + +.EXAMPLE + ./Inspect-Indexes.ps1 -SiteUrl "https://tnsukz.sharepoint.com/sites/requests" ` + -ClientId "7459c965-5ed4-4673-8140-0ab8faf9db64" -Tenant "tnsukz.onmicrosoft.com" ` + -Thumbprint "224B64C8E0CAB1E09AF373E92B3AF4AC33C1233C" +#> +param( + [Parameter(Mandatory = $true)][string]$SiteUrl, + [Parameter(Mandatory = $true)][string]$ClientId, + [Parameter(Mandatory = $true)][string]$Tenant, + [Parameter(Mandatory = $true)][string]$Thumbprint +) + +$ErrorActionPreference = 'Stop' + +# Колонки списков согласования, по которым портал фильтрует (см. +# shared/approval/approvalList.service.ts и features/myRequests/myRequests.service.ts). +$filteredColumns = @('Ticket', 'ApprovalStatus', 'TansuSiteApprover') + +# Порог представления SharePoint: выше него фильтр по неиндексированной колонке падает. +$listViewThreshold = 5000 + +Connect-PnPOnline -Url $SiteUrl -ClientId $ClientId -Tenant $Tenant -Thumbprint $Thumbprint + +$approvalLists = Get-PnPList | Where-Object { $_.Title -like '*— согласование' } | Sort-Object Title + +$report = foreach ($list in $approvalLists) { + $row = [ordered]@{ + 'Список' = $list.Title + 'Строк' = $list.ItemCount + 'До 5000' = $listViewThreshold - $list.ItemCount + } + foreach ($name in $filteredColumns) { + $field = Get-PnPField -List $list -Identity $name -ErrorAction SilentlyContinue + $row[$name] = if (-not $field) { 'нет колонки' } elseif ($field.Indexed) { 'индекс' } else { 'НЕТ индекса' } + } + [pscustomobject]$row +} + +Write-Host "`nИндексы в списках согласования ($SiteUrl):`n" -ForegroundColor Cyan +$report | Format-Table -AutoSize + +Disconnect-PnPOnline