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

6/5/2025 1:39 AM

Last published date

8/5/2025 2:25 PM

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. 

 

Image_2025-06-03_13-28-27.png

Product section

Network Performance Monitor

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.