/************************************************************************/ /* DME 3.5 Database upgrade script */ /************************************************************************/ /* This script update the database structure from DME 3.0 SP4 to DME 3.5 Please replace script variable @db (just below) to the name of the DME database. Notice: ALLWAYS have a recent backup of the database before running this script. ************************************************************************/ /* PLEASE replace the @db value with the name of the DME database */ DECLARE @db varchar(30); SET @db = 'dme'; DECLARE @stop int; SET @stop = 0; /* Validate that the script it being executed on the correct DME db This check was added to avoid accident where the script is executed on the wrong DB */ --DECLARE @checkdb int --SELECT @checkdb = COUNT(*) FROM sys.databases WHERE name=@db; IF @db != db_name() BEGIN PRINT '===========================================================================' PRINT '% Invalid script state' PRINT 'This script is NOT executed on the @db specified database : ' + @db PRINT 'Please run the script on the correct database or change the name of the DME' PRINT 'database in the @db variable in the top of the script and try again' PRINT '===========================================================================' SET @stop = 1; END /* Validate that field applicationBlock.name is of type nvarchar */ DECLARE @tablefound int SELECT @tablefound = count(*) FROM INFORMATION_SCHEMA.COLUMNS WITH (NOLOCK) WHERE table_name = 'DME_ServerConfiguration' IF @stop = 0 AND @tablefound = '0' BEGIN PRINT '===========================================================================' PRINT '% Fatale DB state' PRINT 'Wrong database [' + db_name() + '] selected - A vitale table is missing' PRINT 'from the selected database. Please change the name of the DME database in' PRINT 'the @db in the top of the script and try again' PRINT '===========================================================================' SET @stop = 1; END /* Validate that this is a "real" DME 3 database */ SELECT @tablefound = count(*) FROM INFORMATION_SCHEMA.COLUMNS WITH (NOLOCK) WHERE table_name = 'dm_action_plan' IF @stop = 0 AND @tablefound = '0' BEGIN PRINT '===========================================================================' PRINT '% Fatale DB version' PRINT 'This script is only ment for running on a DME 3.0 or newer database ' PRINT '===========================================================================' SET @stop = 1; END /* Validate the current database structure version - Is it up-to-date already? */ DECLARE @structureVersion varchar(3); SET @structureVersion = '0' SELECT @structureVersion = value FROM DME_System WITH (NOLOCK) WHERE name = 'DATABASE_STRUCTURE_VERSION' IF @stop = 0 AND @structureVersion = '5' BEGIN PRINT '===========================================================================' PRINT '% Database is already up-to-date' PRINT 'The database [' + db_name() + '] selected for update is already updated' PRINT 'The DB version is : DME 3.0 SP' + @structureVersion PRINT '===========================================================================' SET @stop = 1; END /* Validate the database structure version - If the database has not been patched to DME3 SP4 the DATABASE_STRUCTURE_VERSION number is lower than 4 and the script will stop with a warning */ SELECT @structureVersion = value FROM DME_System WITH (NOLOCK) WHERE name = 'DATABASE_STRUCTURE_VERSION' IF @stop = 0 AND @structureVersion != '4' BEGIN PRINT '============================================================================' PRINT '% Wrong DME database version' PRINT 'The current database [' + db_name() + '] selected for update does NOT' PRINT 'have the structure of a DME 3.0 SP4 database' IF @structureVersion = '0' PRINT 'The current DME database version is : DME 3.0 GA' ELSE PRINT 'The current DME database version is : DME 3.0 SP' + @structureVersion PRINT 'Please upgrade the database version to DME 3.0 SP4 before doing this upgrade' PRINT '============================================================================' SET @stop = 1; END /* Makes certain that there are no active connections to the database before updating Notice : The DME server "SHOULD NOT BE RUNNING" when updating the database */ DECLARE @connectionsFound int SELECT @connectionsFound = count(*) FROM master..sysprocesses WHERE dbid=db_id(db_name()) AND spid<>@@spid IF @stop = 0 AND @connectionsFound > 1 BEGIN PRINT '===========================================================================' PRINT '% Open connections to the database' PRINT 'There are open connections to the database.' PRINT 'The DME server "SHOULD NOT BE RUNNING" when updating the database' PRINT 'Please close all connections and run this script again' PRINT '===========================================================================' SET @stop = 1; END /* Validate that READ_COMMITTED_SNAPSHOT_ON is set */ DECLARE @env_state int, @sql varchar(255) SELECT @env_state = IS_READ_COMMITTED_SNAPSHOT_ON FROM sys.databases WHERE name=@db; IF @stop = 0 AND @env_state != '1' BEGIN PRINT '===========================================================================' PRINT 'Adjust the DB setting for "READ_COMMITTED_SNAPSHOT" to ON' PRINT '===========================================================================' Select @sql = 'ALTER DATABASE '+@db+' SET READ_COMMITTED_SNAPSHOT ON' exec(@sql) END IF @stop = 0 BEGIN PRINT '===========================================================================' PRINT '* Start updating the DME database structure' /************************************************************************/ /* Adding tables */ /************************************************************************/ PRINT '* Adding new tables' IF NOT EXISTS (SELECT * FROM sys.objects WHERE object_id = OBJECT_ID(N'[dbo].[Server]') AND type in (N'U')) BEGIN CREATE TABLE [dbo].[Server]( [serverId] [nvarchar](128) NOT NULL, [name] [nvarchar](128) NULL, CONSTRAINT [PK__Server] PRIMARY KEY CLUSTERED ( [serverId] ASC )WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = OFF) ) END IF NOT EXISTS (SELECT * FROM sys.objects WHERE object_id = OBJECT_ID(N'[dbo].[RrdEntry]') AND type in (N'U')) BEGIN CREATE TABLE [dbo].[RrdEntry]( [rrdEntryId] [int] IDENTITY(1,1) NOT NULL, [data] [image] NOT NULL, [statisticKey] [nvarchar](45) NOT NULL, [connectorId] [nvarchar](50) NULL, [serverId] [nvarchar](128) NULL, CONSTRAINT [PK__RrdEntry] PRIMARY KEY CLUSTERED ( [rrdEntryId] ASC )WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = OFF) ) END IF NOT EXISTS (SELECT * FROM sys.objects WHERE object_id = OBJECT_ID(N'[dbo].[dm_path_exclusions]') AND type in (N'U')) BEGIN CREATE TABLE [dbo].[dm_path_exclusions]( [pathExclusionID] [int] IDENTITY(1,1) NOT NULL, [path] [nvarchar](255) NOT NULL, CONSTRAINT [PK__dm_path_exclusions] PRIMARY KEY CLUSTERED ( [pathExclusionID] ASC )WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = OFF) ) END IF NOT EXISTS (SELECT * FROM sys.objects WHERE object_id = OBJECT_ID(N'[dbo].[dm_ddf]') AND type in (N'U')) BEGIN CREATE TABLE [dbo].[dm_ddf]( [ddfID] [int] IDENTITY(1,1) NOT NULL, [name] [nvarchar](100) NOT NULL, [fileName] [nvarchar] (255) NULL, [description] [nvarchar] (max) NULL, [xml] [nvarchar] (max) NULL, [groupName] [nvarchar] (100) NULL, [changeDate] [datetime] NOT NULL, CONSTRAINT [PK__df_dff__ddfID] PRIMARY KEY CLUSTERED ( [ddfID] ASC )WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = OFF) ) END IF NOT EXISTS (SELECT * FROM sys.objects WHERE object_id = OBJECT_ID(N'[dbo].[dm_ddf_conf]') AND type in (N'U')) BEGIN CREATE TABLE [dbo].[dm_ddf_conf]( [ddfConfID] [int] IDENTITY(1,1) NOT NULL, [name] [nvarchar](100) NOT NULL, [description] [nvarchar] (max) NULL, [groupName] [nvarchar] (100) NULL, [changeDate] [datetime] NOT NULL, [ddfID] [int] CONSTRAINT [PK__df_dff_conf__ddfConfID] PRIMARY KEY CLUSTERED ( [ddfConfID] ASC )WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = OFF) ) END IF NOT EXISTS (SELECT * FROM sys.objects WHERE object_id = OBJECT_ID(N'[dbo].[dm_ddf_values]') AND type in (N'U')) BEGIN CREATE TABLE [dbo].[dm_ddf_values]( [ddfValueID] [int] IDENTITY(1,1) NOT NULL, [value] [image] NULL, [priority] [int] NOT NULL, [type] [nvarchar] (255) NULL, /* Max. MIME Type */ [path] [nvarchar] (1024) NOT NULL, /* Path into XML */ [format] [nvarchar] (50) NULL, [operation] [nvarchar] (50) NULL, [ddfConfID] [int] NOT NULL, CONSTRAINT [PK__df_dff_values__ddfValueID] PRIMARY KEY CLUSTERED ( [ddfValueID] ASC )WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = OFF) ) END IF NOT EXISTS (SELECT * FROM sys.objects WHERE object_id = OBJECT_ID(N'[dbo].[dm_device_tree]') AND type in (N'U')) BEGIN CREATE TABLE [dbo].[dm_device_tree]( [deviceID] [nvarchar](50) NOT NULL, [nodeTree] [image] NULL, [createdDate] [datetime] NULL, CONSTRAINT [PK__dm_device_tree] PRIMARY KEY CLUSTERED ( [deviceID] ASC )WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = OFF) ) END IF NOT EXISTS (SELECT * FROM sys.objects WHERE object_id = OBJECT_ID(N'[dbo].[dm_persisted_tree_structure]') AND type in (N'U')) BEGIN CREATE TABLE [dbo].[dm_persisted_tree_structure]( [jobID] [nvarchar](255) NOT NULL, [updatedDate] [datetime] NOT NULL, [treeStructure] [image] NOT NULL, CONSTRAINT [PK__dm_persisted_tree_structure] PRIMARY KEY CLUSTERED ( [jobID] ASC )WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = OFF) ) END IF NOT EXISTS (SELECT * FROM sys.objects WHERE object_id = OBJECT_ID(N'[dbo].[notificationSubscription]') AND type in (N'U')) BEGIN CREATE TABLE [dbo].[notificationSubscription]( [subscriptionID] [nvarchar](100) NOT NULL, [terminalID] [nvarchar](50) NOT NULL, [userID] [nvarchar](50) NOT NULL, [resourceID] [int] NOT NULL, [connectorID] [nvarchar](50) NOT NULL, [keepaliveTimestamp] [datetime] NOT NULL, [daySchemeID] [int] NOT NULL, CONSTRAINT [PK__notificationSubscription] PRIMARY KEY CLUSTERED ( [subscriptionID] ASC )WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = OFF) ) END IF NOT EXISTS (SELECT * FROM sys.indexes WHERE object_id = OBJECT_ID(N'[dbo].[notificationSubscription]') AND name = N'IX_notificationSubscription__terminalID__resourceID') CREATE NONCLUSTERED INDEX [IX_notificationSubscription__terminalID__resourceID] ON [dbo].[notificationSubscription] ( [terminalID] ASC, [resourceID] ASC )WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, SORT_IN_TEMPDB = OFF, IGNORE_DUP_KEY = OFF, DROP_EXISTING = OFF, ONLINE = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = OFF); IF NOT EXISTS (SELECT * FROM sys.indexes WHERE object_id = OBJECT_ID(N'[dbo].[notificationSubscription]') AND name = N'IX_notificationSubscription__keepaliveTimestamp') CREATE NONCLUSTERED INDEX [IX_notificationSubscription__keepaliveTimestamp] ON [dbo].[notificationSubscription] ( [keepaliveTimestamp] ASC )WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, SORT_IN_TEMPDB = OFF, IGNORE_DUP_KEY = OFF, DROP_EXISTING = OFF, ONLINE = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = OFF); /************************************************************************/ /* Updating tables */ /************************************************************************/ PRINT '* Updating existing tables' ALTER TABLE [dbo].[terminalRessourceNotification] ADD [lastSync] [datetime] NULL; ALTER TABLE [dbo].[terminalRessourceNotification] ADD [lastNotification] [datetime] NULL; ALTER TABLE [dbo].[terminalRessourceNotification] ADD [lastSubscriptionWatermark] [nvarchar](60) NULL; ALTER TABLE [dbo].[terminalRessourceNotification] ADD [retries] [int] DEFAULT 0 NOT NULL; ALTER TABLE [dbo].[terminalRessourceNotification] ADD [outstanding] [int] DEFAULT 0 NOT NULL; ALTER TABLE [dbo].[terminalRessourceNotification] ADD [nextScanServer] [nvarchar](200) NULL; ALTER TABLE [dbo].[terminalRessourceNotification] ADD [errorMessage] [nvarchar](255) NULL ; ALTER TABLE [dbo].[terminalRessourceNotification] ADD [checkSubscriptionEvent] [tinyint] DEFAULT 0 NOT NULL; ALTER TABLE [dbo].[dayScheme] ADD [subscribed] [tinyint] DEFAULT 0 NOT NULL; ALTER TABLE [dbo].[dm_dme_jobs] ADD [groupID] [nvarchar](255) NULL; ALTER TABLE [dbo].[DME_UpdateFile] ADD [listed] [tinyint] DEFAULT 1 NOT NULL; ALTER TABLE [dbo].[Connector] ADD [revision] [int] NULL; ALTER TABLE [dbo].[settingsType] ALTER COLUMN [options] [nvarchar](1024) NULL; ALTER TABLE [dbo].[dme_keystore_emails] DROP CONSTRAINT [PK__dme_keystore_ema__5EBF139D]; ALTER TABLE [dbo].[dme_keystore_emails] ALTER COLUMN [alias] [nvarchar](255) NOT NULL; ALTER TABLE [dbo].[dme_keystore_emails] ALTER COLUMN [email] [nvarchar](190) NOT NULL; ALTER TABLE [dbo].[dme_keystore_emails] WITH CHECK ADD CONSTRAINT [PK__dme_keystore_ema__5EBF139D] PRIMARY KEY CLUSTERED ([alias] ASC, [email] ASC) WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = OFF); ALTER TABLE [dbo].[dme_keystore_keys] DROP CONSTRAINT [PK__dme_keystore_key__60A75C0F]; ALTER TABLE [dbo].[dme_keystore_keys] ALTER COLUMN [alias] [nvarchar](255) NOT NULL; ALTER TABLE [dbo].[dme_keystore_keys] WITH CHECK ADD CONSTRAINT [PK__dme_keystore_key__60A75C0F] PRIMARY KEY CLUSTERED ([alias] ASC) WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = OFF); /************************************************************************/ /* Update Foreign Key Constraints */ /************************************************************************/ ALTER TABLE [dbo].[dm_ddf_conf] WITH CHECK ADD CONSTRAINT [FK235C92D32CDC2353] FOREIGN KEY([ddfID]) REFERENCES [dbo].[dm_ddf] ([ddfID]); ALTER TABLE [dbo].[dm_ddf_conf] CHECK CONSTRAINT [FK235C92D32CDC2353]; ALTER TABLE [dbo].[dm_ddf_values] WITH CHECK ADD CONSTRAINT [FKDE2951114755E0BB] FOREIGN KEY([ddfConfID]) REFERENCES [dbo].[dm_ddf_conf] ([ddfConfID]); ALTER TABLE [dbo].[dm_ddf_values] CHECK CONSTRAINT [FKDE2951114755E0BB]; IF EXISTS (SELECT * FROM sys.foreign_keys WHERE object_id = OBJECT_ID(N'[dbo].[FKCBD3217FB65CC936]') AND parent_object_id = OBJECT_ID(N'[dbo].[dm_operation_dm_operation]')) ALTER TABLE [dbo].[dm_operation_dm_operation] DROP CONSTRAINT [FKCBD3217FB65CC936]; IF EXISTS (SELECT * FROM sys.foreign_keys WHERE object_id = OBJECT_ID(N'[dbo].[FKCBD3217F2F41D38D]') AND parent_object_id = OBJECT_ID(N'[dbo].[dm_operation_dm_operation]')) ALTER TABLE [dbo].[dm_operation_dm_operation] DROP CONSTRAINT [FKCBD3217F2F41D38D]; ALTER TABLE [dbo].[dm_operation] WITH CHECK ADD CONSTRAINT [FK71208531D328DF2F] FOREIGN KEY([parent_operationID]) REFERENCES [dbo].[dm_operation] ([operationID]); ALTER TABLE [dbo].[dm_operation] CHECK CONSTRAINT [FK71208531D328DF2F]; ALTER TABLE [dbo].[RrdEntry] WITH CHECK ADD CONSTRAINT [FK834B78CE581215FA] FOREIGN KEY([serverId]) REFERENCES [dbo].[Server] ([serverId]); ALTER TABLE [dbo].[RrdEntry] CHECK CONSTRAINT [FK834B78CE581215FA]; ALTER TABLE [dbo].[RrdEntry] WITH CHECK ADD CONSTRAINT [FK834B78CE5D6CA4BC] FOREIGN KEY([connectorId]) REFERENCES [dbo].[Connector] ([connectorId]); ALTER TABLE [dbo].[RrdEntry] CHECK CONSTRAINT [FK834B78CE5D6CA4BC]; /************************************************************************/ /* Drop obsolete tables */ /************************************************************************/ IF EXISTS (SELECT * FROM sys.objects WHERE object_id = OBJECT_ID(N'[dbo].[dm_operation_dm_operation]') AND type in (N'U')) DROP TABLE [dbo].[dm_operation_dm_operation]; /************************************************************************/ /* Fixing GA DB script issues */ /************************************************************************/ ALTER TABLE [dbo].[applicationBlock] DROP CONSTRAINT [UQ__applicationBlock__20C1E124]; IF EXISTS (SELECT * FROM sys.indexes WHERE object_id = OBJECT_ID(N'[dbo].[applicationBlock]') AND name = N'IX_applicationblock_localGroupID_uid') DROP INDEX [IX_applicationblock_localGroupID_uid] ON [dbo].[applicationBlock] ALTER TABLE [dbo].[applicationBlock] ALTER COLUMN [name] [nvarchar](100) NOT NULL; ALTER TABLE [dbo].[applicationBlock] ALTER COLUMN [uid] [nvarchar](100) NOT NULL; ALTER TABLE [dbo].[applicationBlock] WITH CHECK ADD CONSTRAINT [UQ__applicationBlock__20C1E124] UNIQUE NONCLUSTERED ( [terminalID] ASC, [localGroupID] ASC, [uid] ASC )WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = OFF); IF NOT EXISTS (SELECT * FROM sys.indexes WHERE object_id = OBJECT_ID(N'[dbo].[applicationBlock]') AND name = N'IX_applicationblock_localGroupID_uid') CREATE NONCLUSTERED INDEX [IX_applicationblock_localGroupID_uid] ON [dbo].[applicationBlock] ( [localGroupID] ASC, [uid] ASC )WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, SORT_IN_TEMPDB = OFF, IGNORE_DUP_KEY = OFF, DROP_EXISTING = OFF, ONLINE = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = OFF); ALTER TABLE [dbo].[defaultApplicationBlock] ALTER COLUMN [name] [nvarchar](100) NOT NULL; ALTER TABLE [dbo].[defaultApplicationBlock] ALTER COLUMN [uid] [nvarchar](100) NOT NULL; /************************************************************************/ /* Tuning the DB by rebuiding all indices */ /************************************************************************/ PRINT '' PRINT '**************************************** ' PRINT '* Tuning database by rebuild all indices ' PRINT '**************************************** ' PRINT '' DECLARE @ShowMsg varchar(200); DECLARE @t_progress_total int; SET @t_progress_total = 1; SELECT @t_progress_total = count(*) FROM sys.all_objects where type = 'U'; DECLARE @t_progress int; SET @t_progress = 0; DECLARE @t_progress_show varchar(5); DECLARE t_cursor CURSOR FOR SELECT name FROM sys.all_objects where type = 'U' order by 1 OPEN t_cursor DECLARE @tablename sysname FETCH NEXT FROM t_cursor INTO @tablename WHILE ( @@FETCH_STATUS = 0 ) BEGIN SET @t_progress_show = (@t_progress * 100 / @t_progress_total); SET @ShowMsg = '+ Rebuilding indices for table '+@tablename+' [ %%' + @t_progress_show + ' done]'; RAISERROR(@ShowMsg, 0, 1) WITH NOWAIT EXEC('ALTER INDEX ALL ON '+@tablename+' REBUILD WITH (allow_page_locks = off)') FETCH NEXT FROM t_cursor INTO @tablename SET @t_progress = @t_progress + 1; END DEALLOCATE t_cursor PRINT '* Done tuning database' /************************************************************************/ /* Update DME database version */ /************************************************************************/ PRINT '* Updating the database version ' /** Set Database version **/ UPDATE DME_System SET value = '5' WHERE name = 'DATABASE_STRUCTURE_VERSION'; IF @@ROWCOUNT = 0 INSERT INTO DME_System (name,value) VALUES ('DATABASE_STRUCTURE_VERSION','5'); PRINT '* End updating database' PRINT '===========================================================================' END