Network Management
How to query Planned Maintenance Schedule data in custom reports in SolarWinds Platform 2026.1 and newer
This article explains how to query planned maintenance schedule data in custom reports after upgrading to SolarWinds Observability Self-Hosted (HCO) 2026.1 or later.
First published date
Last published date
Overview
After upgrading to HCO 2026.1, custom reports that previously displayed scheduled maintenance data for nodes are no longer returning results. Reports that relied on NodeMuted or NodeUnmanaged audit events show no scheduled maintenance data, even when maintenance schedules are correctly assigned and running.
Product section
Cause
In HCO 2026.1, recurring maintenance schedules replaced the legacy mute/unmanage model. As a result, the behavior of audit events changed:
-
Prior to 2026.1: When a scheduled maintenance window was configured, audit events such as
NodeMutedorNodeUnmanagedwere written immediately upon configuration. This allowed custom reports to query audit data to see upcoming or scheduled maintenance. -
In 2026.1 and later: Those same audit events (
NodeMuted,NodeUnmanaged) now fire only when a maintenance window actually executes, not when it is configured or assigned. This means any custom report logic that relied on these events to show upcoming scheduled maintenance will no longer work as expected.
In 2026.1, the platform introduces new audit event types for schedule assignment:
-
Orion.ScheduleAssignmentAdded— recorded immediately when a schedule is assigned to a node -
Orion.ScheduleAssignmentRemoved— recorded when a schedule assignment is removed
The source of truth for planned (upcoming) maintenance schedule data is now the ScheduleTaskDefinitions and ScheduleEntityAssignments tables in the SolarWindsOrion database.
Note: The audit log (
AuditingEvents) remains the only source for the schedule assignment timestamp. IfAssigned On (UTC)returnsNULL, it means the audit record was purged or the assignment predates the 2026.1 upgrade.
Resolution
Use the following T-SQL reference query against the SolarWindsOrion database to return planned maintenance schedule data per node. This query is intended as a starting point — customize it to meet your reporting needs.
-- Scripts are not supported under any SolarWinds support program or service.
-- Scripts are provided AS IS without warranty of any kind. SolarWinds further
-- disclaims all warranties including, without limitation, any implied warranties
-- of merchantability or of fitness for a particular purpose. The risk arising
-- out of the use or performance of the scripts and documentation stays with you.
-- In no event shall SolarWinds or anyone else involved in the creation,
-- production, or delivery of the scripts be liable for any damages whatsoever
-- (including, without limitation, damages for loss of business profits, business
-- interruption, loss of business information, or other pecuniary loss) arising
-- out of the use of or inability to use the scripts or documentation.
-- Planned Maintenance Schedules per Node
-- Shows active recurring schedules assigned to nodes,
-- including who assigned them and when.
SELECT
n.Caption AS [Node],
std.Name AS [Schedule Name],
std.ScheduleType AS [Maintenance Type],
std.NextRun AS [Next Run (UTC)],
std.Reason AS [Reason],
sea.AssignedBy AS [Assigned By],
ae.AssignedOnUtc AS [Assigned On (UTC)]
FROM dbo.ScheduleEntityAssignments sea
JOIN dbo.Nodes n
ON sea.EntityUri LIKE '%/Orion.Nodes/NodeID=' + CAST(n.NodeID AS nvarchar(10))
JOIN dbo.ScheduleTaskDefinitions std
ON std.ScheduleTaskID = sea.ScheduleTaskID
AND std.Enabled = 1
AND std.ToRemove = 0
LEFT JOIN (
-- Audit log is the only source of the assignment timestamp.
-- NULL means the record was purged or predates 2026.1.
SELECT
ae.NetObjectID AS NodeID,
MAX(ae.TimeLoggedUtc) AS AssignedOnUtc
FROM dbo.AuditingEvents ae
JOIN dbo.AuditingActionTypes aat
ON aat.ActionTypeID = ae.ActionTypeID
WHERE aat.ActionType = 'ScheduleAssignmentAdded'
AND ae.NetObjectType = 'N'
GROUP BY ae.NetObjectID
) ae ON ae.NodeID = n.NodeID
WHERE sea.EntityType = 'Orion.Nodes'
ORDER BY n.Caption, std.NextRun;
Output Columns
|
Column |
Description |
|---|---|
|
Node |
Display name (Caption) of the monitored node |
|
Schedule Name |
Name of the recurring maintenance schedule |
|
Maintenance Type |
Type of maintenance — Mute Alert or Unmanage |
|
Next Run (UTC) |
Next scheduled execution time, in UTC |
|
Reason |
Reason entered when the schedule was configured |
|
Assigned By |
Username that assigned the schedule to the node |
|
Assigned On (UTC) |
Timestamp (UTC) when the schedule was assigned; NULL if purged or pre-2026.1 |
Key Tables
|
Table |
Purpose |
|---|---|
|
|
Links schedules to specific nodes or other entities |
|
|
Stores the schedule definition, type, recurrence, and next run time |
|
|
Stores audit log entries; used here to retrieve the assignment timestamp |
Additional Notes
-
Assigned On (UTC)may be NULL for schedules created or assigned before the 2026.1 upgrade, or if audit records have been purged based on your audit log retention settings. -
NextRunreflects the next scheduled window, not any currently active window. For the currently active maintenance state of a node, refer to theNodestable or theUpcoming Maintenance Schedules for this Entitywidget in the Node Details view. -
This query filters for active schedules only (
Enabled = 1,ToRemove = 0). To include disabled or pending-removal schedules, remove those filter conditions. -
All timestamps in this query are in UTC. Convert using your preferred method (e.g.,
AT TIME ZONE) if local time is required.