Network Management
"Error executing script - Cannot insert the value NULL into column 'Extension', table 'SolarWindsOrion.dbo.VoipCMItemsChangeHistory'; column does not allow nulls. INSERT fails." when upgrading to SolarWinds Platform 2025.1 or 2025.1.1
This article provides the step-by-step information in resolving the error in the Configuration Wizard for SolarWinds Platform Database FAILED. Database configuration failed: Error executing script - Cannot insert the value NULL into column 'Extension', table 'SolarWindsOrion.dbo.VoipCMItemsChangeHistory'; column does not allow nulls. INSERT fails. The statement has been terminated" while upgrading SolarWinds Platform to 2025.1 or 2025.1.1.
First published date
Last published date
Overview
When upgrading the SolarWinds Platform to 2025.1.1 or 2025.2, the following error message:
Database configuration failed: Error executing script - Cannot insert the value NULL into column 'Extension', table 'SolarWindsOrion.dbo.VoipCMItemsChangeHistory'; column does not allow nulls. INSERT fails. The statement has been terminated.
Product section
Cause
This error occurs because the VoipCMItemsChangeHistory table in the SolarWindsOrion database does not allow "NULL" entries in the column.
Resolution
| Note: Before making any changes kindly make sure that you have any of the applicable following a recent backup of the database, a snapshot of the VM, or a restore point of the physical server. Kindly work with your DBA for any database-related concerns. |
To resolve this issue, please upgrade to SolarWinds Platform 2025.2 and above. As a workaround, please perform the following steps below:
Resolution 1
If there is data or the table, VoipCCMPhones exist, run the following queries in this order:
80_VoipCCMPhones.sql:
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
IF NOT EXISTS (SELECT * FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_NAME = 'VoipCCMPhones')
BEGIN
DECLARE @sql NVARCHAR(2048)
SET @sql = N'CREATE TABLE [dbo].[VoipCCMPhones](
[ID] [int] IDENTITY(1,1),
[VoipCCMMonitoringID] [int] NOT NULL,
[MAC_Address] [varchar](50) NULL,
[Name] [varchar](255) NULL,
[IP_Address] [varchar](50) NULL,
[Location] [nvarchar](255) NULL,
[IpAddressRaw] [int] NULL,
[RegionID] [int] NULL,
[Extension] [nvarchar](50) NULL,
[Description] [ntext],
[Status] [int] NULL,
[Licensed] [bit] NOT NULL DEFAULT 0,
[LastUpdateTimeUTC] [datetime2](7) NOT NULL DEFAULT GETUTCDATE(),
CONSTRAINT [PK_VoipCCMPhones] PRIMARY KEY CLUSTERED
(
[ID]
)
) ON [PRIMARY]'
EXEC sp_executesql @sql
SET @sql = N'CREATE INDEX NI_VoipCCMPhones_MonitoringID ON VoipCCMPhones (VoipCCMMonitoringID)'
EXEC sp_executesql @sql
END
ELSE
BEGIN
IF NOT EXISTS (select * from INFORMATION_SCHEMA.COLUMNS where TABLE_NAME = 'VoipCCMPhones' and COLUMN_NAME = 'Licensed')
BEGIN
ALTER TABLE [dbo].[VoipCCMPhones] ADD [Licensed] [bit] NOT NULL DEFAULT 0;
END
IF EXISTS (select * from INFORMATION_SCHEMA.COLUMNS where TABLE_NAME = 'VoipCCMPhones' and COLUMN_NAME = 'ExistenceConfirmationIndex')
BEGIN
DECLARE @constraint_name nvarchar(255)
DECLARE @sqlConstr nvarchar(255)
SELECT @constraint_name=default_constraints.name
FROM sys.all_columns
INNER JOIN sys.tables ON all_columns.object_id = tables.object_id
INNER JOIN sys.default_constraints ON all_columns.default_object_id = default_constraints.object_id
WHERE tables.name = 'VoipCcmPhones' AND all_columns.name = 'ExistenceConfirmationIndex'
SELECT @sqlConstr = 'ALTER TABLE dbo.VoipCcmPhones DROP CONSTRAINT ' + @constraint_name
EXECUTE sp_executesql @sqlConstr
ALTER TABLE [dbo].[VoipCCMPhones] DROP COLUMN [ExistenceConfirmationIndex];
END
IF NOT EXISTS (select * from INFORMATION_SCHEMA.COLUMNS where TABLE_NAME = 'VoipCCMPhones' and COLUMN_NAME = 'LastUpdateTimeUTC')
BEGIN
ALTER TABLE [dbo].[VoipCCMPhones] ADD [LastUpdateTimeUTC] [datetime2](7) NOT NULL DEFAULT GETUTCDATE();
END
IF EXISTS (SELECT 1 FROM sys.columns WHERE object_id = OBJECT_ID(N'[dbo].[VoipCCMPhones]')
AND name = 'LastUpdateTimeUTC' AND system_type_id = TYPE_ID(N'datetime'))
BEGIN
DECLARE @ConstraintName NVARCHAR(255);
SELECT @ConstraintName = name
FROM sys.default_constraints
WHERE parent_object_id = OBJECT_ID('dbo.VoipCCMPhones')
AND parent_column_id = (
SELECT column_id
FROM sys.columns
WHERE object_id = OBJECT_ID('dbo.VoipCCMPhones')
AND name = 'LastUpdateTimeUTC'
);
IF @ConstraintName IS NOT NULL
BEGIN
EXEC('ALTER TABLE [dbo].[VoipCCMPhones] DROP CONSTRAINT ' + @ConstraintName);
END
ALTER TABLE [dbo].[VoipCCMPhones] ALTER COLUMN [LastUpdateTimeUTC] [datetime2](7) NOT NULL;
ALTER TABLE [dbo].[VoipCCMPhones] ADD CONSTRAINT DF_VoipCCMPhones_LastUpdateTimeUTC DEFAULT GETUTCDATE() FOR [LastUpdateTimeUTC];
END
DECLARE @sqlPhonesVnqm NVARCHAR(MAX) = ''
IF NOT EXISTS (SELECT * FROM sys.columns WHERE NAME = N'IpAddressRaw' AND OBJECT_ID = OBJECT_ID(N'VoipCCMPhones'))
BEGIN
IF EXISTS (SELECT 1 FROM sys.columns WHERE name=N'IpAddressV4' AND object_id=OBJECT_ID(N'VoipCCMPhones'))
BEGIN
EXEC sp_rename 'VoipCCMPhones.IpAddressV4', 'IpAddressRaw', 'COLUMN'
END
ELSE
BEGIN
ALTER TABLE [dbo].[VoipCCMPhones] ADD [IpAddressRaw] INT NULL
END
IF EXISTS (SELECT * FROM sys.columns WHERE NAME = N'IpAddressV4' AND OBJECT_ID = OBJECT_ID(N'VoipCCMPhonesCiscoData'))
BEGIN
SET @sqlPhonesVnqm = @sqlPhonesVnqm + '
UPDATE VoipCCMPhones
SET IpAddressRaw = cp.IpAddressV4
FROM VoipCCMPhones p
INNER JOIN VoipCCMPhonesCiscoData cp on cp.VoipCCMPhonesID=p.ID
'
END
IF EXISTS (SELECT * FROM sys.columns WHERE NAME = N'IpAddressV4' AND OBJECT_ID = OBJECT_ID(N'VoipCCMPhonesAvayaData'))
BEGIN
SET @sqlPhonesVnqm = @sqlPhonesVnqm + '
UPDATE VoipCCMPhones
SET IpAddressRaw = ap.IpAddressV4
FROM VoipCCMPhones p
INNER JOIN VoipCCMPhonesAvayaData ap on ap.VoipCCMPhonesID=p.ID
'
END
END
IF NOT EXISTS (SELECT * FROM sys.columns WHERE NAME = N'RegionID' AND OBJECT_ID = OBJECT_ID(N'VoipCCMPhones'))
BEGIN
ALTER TABLE [dbo].[VoipCCMPhones] ADD [RegionID] INT NULL
IF EXISTS (SELECT * FROM sys.columns WHERE NAME = N'RegionID' AND OBJECT_ID = OBJECT_ID(N'VoipCCMPhonesCiscoData'))
BEGIN
SET @sqlPhonesVnqm = @sqlPhonesVnqm + '
UPDATE VoipCCMPhones
SET RegionID = cp.RegionID
FROM VoipCCMPhones p
INNER JOIN VoipCCMPhonesCiscoData cp on cp.VoipCCMPhonesID=p.ID
'
END
IF EXISTS (SELECT * FROM sys.columns WHERE NAME = N'RegionID' AND OBJECT_ID = OBJECT_ID(N'VoipCCMPhonesAvayaData'))
BEGIN
SET @sqlPhonesVnqm = @sqlPhonesVnqm + '
UPDATE VoipCCMPhones
SET RegionID = ap.RegionID
FROM VoipCCMPhones p
INNER JOIN VoipCCMPhonesAvayaData ap on ap.VoipCCMPhonesID=p.ID
'
END
END
IF NOT EXISTS (SELECT * FROM sys.columns WHERE NAME = N'Extension' AND OBJECT_ID = OBJECT_ID(N'VoipCCMPhones'))
BEGIN
ALTER TABLE [dbo].[VoipCCMPhones] ADD [Extension] [nvarchar](50) NULL
IF EXISTS (SELECT * FROM sys.columns WHERE NAME = N'Extension' AND OBJECT_ID = OBJECT_ID(N'VoipCCMPhonesCiscoData'))
BEGIN
SET @sqlPhonesVnqm = @sqlPhonesVnqm + '
UPDATE VoipCCMPhones
SET Extension = cp.Extension
FROM VoipCCMPhones p
INNER JOIN VoipCCMPhonesCiscoData cp on cp.VoipCCMPhonesID=p.ID
'
END
IF EXISTS (SELECT * FROM sys.columns WHERE NAME = N'Extension' AND OBJECT_ID = OBJECT_ID(N'VoipCCMPhonesAvayaData'))
BEGIN
SET @sqlPhonesVnqm = @sqlPhonesVnqm + '
UPDATE VoipCCMPhones
SET Extension = ap.Extension
FROM VoipCCMPhones p
INNER JOIN VoipCCMPhonesAvayaData ap on ap.VoipCCMPhonesID=p.ID
'
END
END
IF NOT EXISTS (SELECT * FROM sys.columns WHERE NAME = N'Location' AND OBJECT_ID = OBJECT_ID(N'VoipCCMPhones'))
BEGIN
ALTER TABLE [dbo].[VoipCCMPhones] ADD [Location] [nvarchar](255) NULL
IF EXISTS (SELECT * FROM sys.columns WHERE NAME = N'Location' AND OBJECT_ID = OBJECT_ID(N'VoipCCMPhonesCiscoData'))
BEGIN
SET @sqlPhonesVnqm = @sqlPhonesVnqm + '
UPDATE VoipCCMPhones
SET Location = cp.Location
FROM VoipCCMPhones p
INNER JOIN VoipCCMPhonesCiscoData cp on cp.VoipCCMPhonesID=p.ID
'
END
IF EXISTS (SELECT * FROM sys.columns WHERE NAME = N'Location' AND OBJECT_ID = OBJECT_ID(N'VoipCCMPhonesAvayaData'))
BEGIN
SET @sqlPhonesVnqm = @sqlPhonesVnqm + '
UPDATE VoipCCMPhones
SET Location = ap.Location
FROM VoipCCMPhones p
INNER JOIN VoipCCMPhonesAvayaData ap on ap.VoipCCMPhonesID=p.ID
'
END
END
EXEC sp_executesql @sqlPhonesVnqm;
END
80_VoipCMItemsChangeHistory.sql:
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
DECLARE @createKeyScript NVARCHAR(2048) = '
ALTER TABLE [dbo].VoipCMItemsChangeHistory ADD CONSTRAINT [PK_VoipCMItemsChangeHistory] PRIMARY KEY CLUSTERED
(
[ValidSinceUTC] DESC,
[Name] ASC,
[Extension] ASC,
[VoipCCMMonitoringID] ASC,
[Type] ASC
) WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ONLINE = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY];
';
IF NOT EXISTS (SELECT * FROM sys.objects WHERE object_id = OBJECT_ID(N'[dbo].[VoipCMItemsChangeHistory]') AND type in (N'U'))
BEGIN
CREATE TABLE [dbo].[VoipCMItemsChangeHistory](
[VoipCCMMonitoringID] int NOT NULL,
[ValidSinceUTC] datetime2(7) NOT NULL,
[Type] tinyint NOT NULL, -- 1 Phone, 2 Gateway
[Name] NVARCHAR(150) NOT NULL,
[Vendor] NVARCHAR(100) NULL,
[RegionName] NVARCHAR(150) NULL,
[IpAddress] NVARCHAR(50) NULL,
[Extension] NVARCHAR(100) NOT NULL DEFAULT '',
[MacAddress] NVARCHAR(100) NULL,
[Status] tinyint NULL
) ON [PRIMARY]
EXEC sp_executesql @createKeyScript
END
ELSE
BEGIN
-- Delete obsolete indexes
DECLARE @sql NVARCHAR(max) = ''
DECLARE @ixName NVARCHAR(255) = ''
DECLARE IxCursor CURSOR FOR
SELECT DISTINCT i.[name] FROM sys.indexes i
INNER JOIN sys.index_columns ic ON ic.object_id=i.object_id AND i.index_id=ic.index_id
INNER JOIN sys.columns c ON c.object_id=i.object_id AND ic.column_id=c.column_id
WHERE i.object_id=object_id('VoipCMItemsChangeHistory') AND is_primary_key=0
OPEN IxCursor
FETCH NEXT FROM IxCursor
INTO @ixName;
WHILE @@FETCH_STATUS = 0
BEGIN
SET @sql = @sql + 'DROP INDEX ' + @ixName + ' ON dbo.VoipCMItemsChangeHistory;'
FETCH NEXT FROM IxCursor
INTO @ixName;
END
CLOSE IxCursor
DEALLOCATE IxCursor
EXEC sp_executesql @sql
-- End Delete obsolete indexes
DECLARE @ValidSinceUTCIsDateTime BIT = 0;
DECLARE @ExtensionIsNullable BIT = 0;
SELECT @ValidSinceUTCIsDateTime = IIF(EXISTS (SELECT 1 FROM sys.columns WHERE object_id = OBJECT_ID(N'[dbo].[VoipCMItemsChangeHistory]') AND [name] = 'ValidSinceUTC' AND system_type_id = TYPE_ID(N'datetime')), 1, 0)
SELECT @ExtensionIsNullable = IIF(EXISTS(SELECT 1 FROM INFORMATION_SCHEMA.COLUMNS COL WHERE TABLE_NAME = 'VoipCMItemsChangeHistory' AND COLUMN_NAME='Extension' AND IS_NULLABLE='YES'), 1, 0)
IF (@ValidSinceUTCIsDateTime = 1 OR @ExtensionIsNullable = 1)
BEGIN
IF EXISTS (SELECT 1 FROM sys.key_constraints WHERE [type] = 'PK' AND [parent_object_id] = OBJECT_ID(N'[dbo].[VoipCMItemsChangeHistory]'))
ALTER TABLE [dbo].[VoipCMItemsChangeHistory] DROP CONSTRAINT [PK_VoipCMItemsChangeHistory];
IF (@ValidSinceUTCIsDateTime = 1)
ALTER TABLE [dbo].[VoipCMItemsChangeHistory] ALTER COLUMN [ValidSinceUTC] datetime2(7) NOT NULL;
IF (@ExtensionIsNullable = 1)
BEGIN
UPDATE VoipCMItemsChangeHistory SET Extension='' WHERE Extension IS NULL
ALTER TABLE VoipCMItemsChangeHistory ALTER COLUMN Extension NVARCHAR(100) NOT NULL
END
-- Remove duplicates before creating primary key in VoipCMItemsChangeHistory
;WITH DuplicatesCTE AS (
SELECT *,
ROW_NUMBER() OVER (
PARTITION BY [ValidSinceUTC], [Name], [Extension], [VoipCCMMonitoringID], [Type]
ORDER BY [ValidSinceUTC] DESC
) AS rn
FROM [dbo].[VoipCMItemsChangeHistory]
)
DELETE FROM DuplicatesCTE WHERE rn > 1;
EXEC sp_executesql @createKeyScript
END
END
IF NOT EXISTS (SELECT TOP 1 * FROM [dbo].[VoipCMItemsChangeHistory])
BEGIN
-- Initial data
INSERT INTO VoipCMItemsChangeHistory
(VoipCCMMonitoringID, ValidSinceUTC, Type, Name, Vendor, RegionName, IpAddress, Extension, MacAddress, Status)
SELECT VoipCCMMonitoringID, ValidSinceUTC, [Type], [Name], Vendor, RegionName, IpAddress, Extension, MacAddress, [Status] FROM
(
SELECT
p.VoipCCMMonitoringID, '1980-12-08 22:50:00' AS ValidSinceUTC, 1 AS [Type], p.[Name],
CASE
WHEN cm.VoipCCMMonitoringTypeID IN (1,2) THEN 'Cisco'
WHEN cm.VoipCCMMonitoringTypeID=3 THEN 'Avaya'
ELSE 'Undefined'
END AS Vendor,
RegionName, IP_Address AS IpAddress, ISNULL(Extension, '') AS Extension, p.MAC_Address AS MacAddress, [Status],
ROW_NUMBER() OVER (PARTITION BY [Name], p.VoipCCMMonitoringID ORDER BY LastUpdateTimeUTC DESC) AS Rn
FROM VoipCCMPhones p
INNER JOIN VoipCCMMonitoring cm ON cm.ID=VoipCCMMonitoringID
LEFT OUTER JOIN VoipCCMRegions r ON r.RegionID=p.RegionID
UNION
SELECT
g.VoipCCMMonitoringID, '1980-12-08 22:50:00' AS ValidSinceUTC, 2 AS [Type], [Name],
CASE
WHEN cm.VoipCCMMonitoringTypeID IN (1,2) THEN 'Cisco'
WHEN cm.VoipCCMMonitoringTypeID=3 THEN 'Avaya'
ELSE 'Undefined'
END AS Vendor,
RegionName, IPAddress AS IpAddress, '' AS Extension, null AS MacAddress, [Status],
ROW_NUMBER() OVER (PARTITION BY [Name], g.VoipCCMMonitoringID ORDER BY LastUpdateTimeUTC DESC) AS Rn
FROM VoipCCMGateways g
INNER JOIN VoipCCMMonitoring cm ON cm.ID=g.VoipCCMMonitoringID
LEFT OUTER JOIN VoipCCMRegions r ON r.RegionID=g.RegionID
WHERE cm.Deleted<>1
) v
WHERE v.Rn = 1
END
GO
Resolution 2
Run the following query:
TRUNCATE TABLE VoipCMItemsChangeHistory
INSERT INTO VoipCMItemsChangeHistory
(VoipCCMMonitoringID, ValidSinceUTC, Type, Name, Vendor, RegionName, IpAddress, Extension, MacAddress, Status)
SELECT VoipCCMMonitoringID, ValidSinceUTC, [Type], [Name], Vendor, RegionName, IpAddress, Extension, MacAddress, [Status] FROM
(
SELECT
p.VoipCCMMonitoringID, '1980-12-08 22:50:00' AS ValidSinceUTC, 1 AS [Type], p.[Name],
CASE
WHEN cm.VoipCCMMonitoringTypeID IN (1,2) THEN 'Cisco'
WHEN cm.VoipCCMMonitoringTypeID=3 THEN 'Avaya'
ELSE 'Undefined'
END AS Vendor,
RegionName, IP_Address AS IpAddress, ISNULL(Extension, '') as Extension, p.MAC_Address AS MacAddress, [Status],
ROW_NUMBER() OVER (PARTITION BY [Name], p.VoipCCMMonitoringID ORDER BY LastUpdateTimeUTC DESC) AS Rn
FROM VoipCCMPhones p
INNER JOIN VoipCCMMonitoring cm ON cm.ID=VoipCCMMonitoringID
LEFT OUTER JOIN VoipCCMRegions r ON r.RegionID=p.RegionID
UNION
SELECT
g.VoipCCMMonitoringID, '1980-12-08 22:50:00' AS ValidSinceUTC, 2 AS [Type], [Name],
CASE
WHEN cm.VoipCCMMonitoringTypeID IN (1,2) THEN 'Cisco'
WHEN cm.VoipCCMMonitoringTypeID=3 THEN 'Avaya'
ELSE 'Undefined'
END AS Vendor,
RegionName, IPAddress AS IpAddress, '' AS Extension, null AS MacAddress, [Status],
ROW_NUMBER() OVER (PARTITION BY [Name], g.VoipCCMMonitoringID ORDER BY LastUpdateTimeUTC DESC) AS Rn
FROM VoipCCMGateways g
INNER JOIN VoipCCMMonitoring cm ON cm.ID=g.VoipCCMMonitoringID
LEFT OUTER JOIN VoipCCMRegions r ON r.RegionID=g.RegionID
WHERE cm.Deleted<>1
) v
WHERE v.Rn = 1
Run the Configuration Wizard
Resolution 3
- If the customer does not have VNQM licensing, then the tables can be dropped, and the Configuration Wizard will recreate them. You can simply drop the [dbo].[VoipCMItemsChangeHistory] table.