Questo script serve per restituire tutte le info rigardante ai servizi di SQL Server in un Server.
IMPORTANTE: C’è un bug che non ho ancora trovato una soluzione, dunque è meglio non fidarsi dalla informazione Current_Status dalla istanza default in un Cluster.
Questo è stato il unico bug che ho trovato fino a questo momento.
/* **************************************************************************************************************************************** Script Name: info_tutti_servizi_mssql.sql Client's Name: Service Desk Create Date: 23/10/2018 - 16:00 Created By: Bruno Bragatto - Senior DBA Objective: Script per verificare tutti i servizi di MSSQL in un Server (MSSQL, MSAS, Browser, Agent ecc...). ---------------------------------------------------------------------------------------------------------------------------------------- Modification Log Date: 02/11/2018 Modified By: Bruno Bragatto Modification Details: Sistemato le informazioni nel script. Initial Created by: Bruno Bragatto **************************************************************************************************************************************** IMPORTANTE: C'è un bug che non ho ancora trovato una soluzione, dunque è meglio non fidarsi dalla informazione Current_Status dalla istanza default in un Cluster. Questo è stato il unico bug che ho trovato fino a questo momento. */ SET NOCOUNT ON DECLARE @Keyexist Table (Keyexist int) DECLARE @ServiceName AS VARCHAR(50), @SQL VARCHAR(MAX), @ExistValue INT, @VERSION NVARCHAR(4), @SSIS_DIR NVARCHAR(MAX) IF OBJECT_ID('tempdb..#tempServicesInfo') IS NOT NULL DROP TABLE #tempServicesInfo CREATE TABLE #tempServicesInfo ( InstanceName NVARCHAR(100), ServiceReg NVARCHAR(100), ServiceDesc NVARCHAR(100), Instance_ID NVARCHAR(100), LoginName NVARCHAR(100), StartupMode NVARCHAR(100), Current_Status NVARCHAR(100) ) IF OBJECT_ID('tempdb..##tempServiceStatus') IS NOT NULL DROP TABLE ##tempServiceStatus CREATE TABLE ##tempServiceStatus ( RowID INT IDENTITY(1,1) ,ServerName NVARCHAR(128) ,ServiceName NVARCHAR(128) ,ServiceStatus VARCHAR(128) ,StatusDateTime DATETIME DEFAULT (GETDATE()) ,PhysicalSrverName NVARCHAR(128) ) IF OBJECT_ID('tempdb..#tempServicesNames') IS NOT NULL DROP TABLE #tempServicesNames CREATE TABLE #tempServicesNames ( Service NVARCHAR(100), Name NVARCHAR(100), LName NVARCHAR(100), ) --Populate Support Table Insert into @Keyexist EXEC master.dbo.xp_regread @rootkey = N'HKEY_LOCAL_MACHINE', @key = N'SOFTWARE\Microsoft\Microsoft SQL Server\Services'; select @ExistValue= Keyexist from @Keyexist If @ExistValue=1 INSERT INTO #tempServicesNames (Service) EXEC master..xp_regenumkeys @rootkey = N'HKEY_LOCAL_MACHINE', @key = N'SOFTWARE\\Microsoft\\Microsoft SQL Server\\Services' --Update Name SET @SQL = 'DECLARE @returnValue NVARCHAR(100)' SELECT @SQL = @SQL + CHAR(13) + 'EXEC master.dbo.xp_regread @rootkey = N''HKEY_LOCAL_MACHINE'', @key = N''SOFTWARE\\Microsoft\\Microsoft SQL Server\\Services\\'+ Service + ''', @value_name = N''Name'', @value = @returnValue OUTPUT; UPDATE #tempServicesNames SET Name = @returnValue WHERE Service = ''' + Service + '''' + CHAR(13) FROM #tempServicesNames WHERE NAME IS NULL EXEC (@SQL) --UPDATE LNAME SET @SQL = 'DECLARE @returnValue NVARCHAR(100)' SELECT @SQL = @SQL + CHAR(13) + 'EXEC master.dbo.xp_regread @rootkey = N''HKEY_LOCAL_MACHINE'', @key = N''SOFTWARE\\Microsoft\\Microsoft SQL Server\\Services\\'+ Service + ''', @value_name = N''LNAME'', @value = @returnValue OUTPUT; UPDATE #tempServicesNames SET LName = @returnValue WHERE Service = ''' + Service + '''' + CHAR(13) FROM #tempServicesNames WHERE LName IS NULL EXEC (@SQL) --select * from #tempServicesNames --IF --32Bits Instance on 64bits OS (Wow6432Node) Insert into @Keyexist EXEC master.dbo.xp_regread @rootkey = N'HKEY_LOCAL_MACHINE', @key = N'SOFTWARE\Wow6432Node\Microsoft\Microsoft SQL Server\Instance Names\SQL'; select @ExistValue= Keyexist from @Keyexist If @ExistValue=1 -- Get instance names from Windows registry Wow6432 INSERT INTO #tempServicesInfo (ServiceDesc, Instance_ID) EXEC master..xp_regenumvalues @rootkey = N'HKEY_LOCAL_MACHINE', @key = N'SOFTWARE\\Wow6432Node\\Microsoft\\Microsoft SQL Server\\Instance Names\\SQL' --UPDATE ServiceDesc with Description and Instance Name for SQL Server Service UPDATE #tempServicesInfo SET ServiceDesc = 'SQL Server (' + InstanceName + ')' where Instance_ID LIKE 'MSSQL%' --Update ServiceReg with SQL Server Instance info UPDATE #tempServicesInfo SET ServiceReg = CASE WHEN InstanceName = 'MSSQLSERVER' THEN (Select Name from #tempServicesNames where Service='SQL Server') ELSE CASE WHEN InstanceName <> 'MSSQLSERVER' THEN (Select LName from #tempServicesNames where Service='SQL Server')+InstanceName ELSE NULL END END WHERE Instance_ID LIKE 'MSSQL%' --SQL Server 64Bits Instance -- Get instance names from Windows registry INSERT INTO #tempServicesInfo (InstanceName,Instance_ID) EXEC master..xp_regenumvalues @rootkey = N'HKEY_LOCAL_MACHINE', @key = N'SOFTWARE\\Microsoft\\Microsoft SQL Server\\Instance Names\\SQL' --UPDATE ServiceDesc with Description and Instance Name for SQL Server Service UPDATE #tempServicesInfo SET ServiceDesc = 'SQL Server (' + InstanceName + ')' where Instance_ID LIKE 'MSSQL%' --Update ServiceReg with SQL Server Instance info UPDATE #tempServicesInfo SET ServiceReg = CASE WHEN InstanceName = 'MSSQLSERVER' THEN (Select Name from #tempServicesNames where Service='SQL Server') ELSE CASE WHEN InstanceName <> 'MSSQLSERVER' THEN (Select LName from #tempServicesNames where Service='SQL Server')+InstanceName ELSE NULL END END WHERE Instance_ID LIKE 'MSSQL%' --IF Reporting Service Insert into @Keyexist EXEC master.dbo.xp_regread @rootkey = N'HKEY_LOCAL_MACHINE', @key = N'SOFTWARE\\Microsoft\\Microsoft SQL Server\\Instance Names\\RS'; select @ExistValue= Keyexist from @Keyexist If @ExistValue=1 -- Get instance names from Windows registry Reporting INSERT INTO #tempServicesInfo (InstanceName,Instance_ID) EXEC master..xp_regenumvalues @rootkey = N'HKEY_LOCAL_MACHINE', @key = N'SOFTWARE\\Microsoft\\Microsoft SQL Server\\Instance Names\\RS' --Update ServiceDesc Reporting Services UPDATE #tempServicesInfo SET ServiceDesc = 'SQL Server Reporting Services (' + InstanceName + ')' where Instance_ID LIKE 'MSRS%'; --Update ServiceReg Reporting Services UPDATE #tempServicesInfo SET ServiceReg = CASE WHEN InstanceName = 'MSSQLSERVER' THEN (Select Name from #tempServicesNames where Service='ReportServer') ELSE CASE WHEN InstanceName <> 'MSSQLSERVER' THEN (Select LName from #tempServicesNames where Service='ReportServer')+InstanceName ELSE NULL END END WHERE ServiceDesc LIKE 'SQL Server Reporting Services%' --IF Analysis Services Insert into @Keyexist EXEC master.dbo.xp_regread @rootkey = N'HKEY_LOCAL_MACHINE', @key = N'SOFTWARE\\Microsoft\\Microsoft SQL Server\\Instance Names\\OLAP'; select @ExistValue= Keyexist from @Keyexist If @ExistValue=1 -- Get instance names from Windows registry Analysis INSERT INTO #tempServicesInfo (InstanceName,Instance_ID) EXEC master..xp_regenumvalues @rootkey = N'HKEY_LOCAL_MACHINE', @key = N'SOFTWARE\\Microsoft\\Microsoft SQL Server\\Instance Names\\OLAP' UPDATE #tempServicesInfo SET ServiceDesc = 'SQL Server Analysis Services (' + InstanceName + ')' where Instance_ID LIKE 'MSAS%' UPDATE #tempServicesInfo SET ServiceReg = CASE WHEN InstanceName = 'MSSQLSERVER' THEN (Select Name from #tempServicesNames where Service='Analysis Server') ELSE CASE WHEN InstanceName <> 'MSSQLSERVER' THEN (Select LName from #tempServicesNames where Service='Analysis Server')+InstanceName ELSE NULL END END WHERE ServiceDesc LIKE 'SQL Server Analysis Services%' --Update ServiceReg Reporting Services UPDATE #tempServicesInfo SET ServiceReg = CASE WHEN InstanceName = 'MSSQLSERVER' THEN (Select Name from #tempServicesNames where Service='ReportServer') ELSE CASE WHEN InstanceName <> 'MSSQLSERVER' THEN (Select LName from #tempServicesNames where Service='ReportServer')+InstanceName ELSE NULL END END WHERE ServiceDesc LIKE 'SQL Server Reporting Services%' --INTEGRATION SERVICES --SET @teste = N'SOFTWARE\\Microsoft\\Microsoft SQL Server\\Instance Names\\RS'; SET @VERSION = convert(NVarchar(max),SERVERPROPERTY('productmajorversion'))*10 SET @SSIS_DIR = N'SYSTEM\\CurrentControlSet\\Services\\MsDtsServer'+ @VERSION +'' --EXEC master.dbo.xp_regread --@rootkey = N'HKEY_LOCAL_MACHINE', --@key = @SSIS_DIR; --IF Integration Services (SSIS) Insert into @Keyexist EXEC master.dbo.xp_regread @rootkey = N'HKEY_LOCAL_MACHINE', @key = @SSIS_DIR; select @ExistValue= Keyexist from @Keyexist If @ExistValue=1 Insert INTO #tempServicesInfo (InstanceName, ServiceDesc) VALUES (CONVERT(NVarchar(max),serverproperty('ComputerNamePhysicalNetBIOS')),'SQL Server Integration Services '+convert(NVarchar(max),cast(SERVERPROPERTY('productmajorversion') as decimal(3,1)))) Update #tempServicesInfo SET ServiceReg = 'MsDtsServer'+@VERSION, Instance_ID = 'MsDtsServer'+@VERSION WHERE ServiceDesc LIKE '%Integration%' --IF SQL Browser Insert into @Keyexist EXEC master.dbo.xp_regread @rootkey = N'HKEY_LOCAL_MACHINE', @key = N'SYSTEM\\CurrentControlSet\\Services\\SQLBrowser'; select @ExistValue= Keyexist from @Keyexist If @ExistValue=1 Insert INTO #tempServicesInfo (InstanceName, ServiceReg, ServiceDesc, Instance_ID) VALUES (CONVERT(NVarchar(max),serverproperty('ComputerNamePhysicalNetBIOS')), 'SQLBrowser','SQL Server Browser', 'SQL Browser') -- get SQL Server Agent Path INSERT INTO #tempServicesInfo (InstanceName,ServiceDesc, Instance_ID) SELECT InstanceName, 'SQL Server Agent ('+ InstanceName + ')', Instance_ID FROM #tempServicesInfo WHERE Instance_ID LIKE 'MSSQL%' --Update ServiceReg with SQL Server Instance info UPDATE #tempServicesInfo SET ServiceReg = CASE WHEN InstanceName = 'MSSQLSERVER' THEN (Select Name from #tempServicesNames where Service='SQL Agent') ELSE CASE WHEN InstanceName <> 'MSSQLSERVER' THEN (Select LName from #tempServicesNames where Service='SQL Agent')+InstanceName ELSE NULL END END WHERE ServiceDesc LIKE 'SQL Server Agent%' -- get account information SET @SQL = 'DECLARE @returnValue NVARCHAR(100)' SELECT @SQL = @SQL + CHAR(13) + 'EXEC master.dbo.xp_regread @rootkey = N''HKEY_LOCAL_MACHINE'', @key = N''SYSTEM\\CurrentControlSet\\Services\\' + ServiceReg + ''', @value_name = N''ObjectName'', @value = @returnValue OUTPUT; UPDATE #tempServicesInfo SET LoginName = @returnValue WHERE ServiceReg = ''' + ServiceReg + '''' + CHAR(13) FROM #tempServicesInfo WHERE ServiceReg IS NOT NULL EXEC (@SQL) --get Service Status information DECLARE EMP_CURSOR CURSOR FOR SELECT ServiceReg FROM #tempServicesInfo OPEN EMP_CURSOR FETCH NEXT FROM EMP_CURSOR INTO @ServiceName WHILE (@@FETCH_STATUS = 0) BEGIN SET @SQL = 'DECLARE @returnValue NVARCHAR(100)' SET @SQL = + CHAR(13) + 'Insert Into ##tempServiceStatus (ServiceStatus) EXEC xp_servicecontrol @Action = N''QUERYSTATE'', @ServiceName = N'''+ @ServiceName +''' UPDATE ##tempServiceStatus SET ServiceName = N'''+ @ServiceName +''' WHERE ServiceName IS NULL ' + CHAR(13) EXEC (@SQL) FETCH NEXT FROM EMP_CURSOR INTO @ServiceName END CLOSE EMP_CURSOR DEALLOCATE EMP_CURSOR update #tempServicesInfo set #tempServicesInfo.Current_Status = ServiceStatus from ##tempServiceStatus sstatus INNER JOIN #tempServicesInfo sinfo ON sinfo.ServiceReg = sstatus.ServiceName --get startupmode information SET @SQL = 'DECLARE @returnValue int' SELECT @SQL = @SQL + CHAR(13) + 'EXEC master.dbo.xp_regread @rootkey = N''HKEY_LOCAL_MACHINE'', @key = N''SYSTEM\\CurrentControlSet\\Services\\' + ServiceReg + ''', @value_name = N''Start'', @value = @returnValue OUTPUT; UPDATE #tempServicesInfo SET StartupMode = CONVERT(int,@returnValue) WHERE ServiceReg = ''' + ServiceReg + '''' + CHAR(13) FROM #tempServicesInfo WHERE ServiceReg IS NOT NULL EXEC (@SQL) UPDATE #tempServicesInfo SET StartupMode = CASE WHEN StartupMode = '2' THEN ('Automatic') ELSE CASE WHEN #tempServicesInfo.StartupMode ='3' THEN ('Manual') ELSE CASE WHEN #tempServicesInfo.StartupMode ='4' THEN ('Disabled') ELSE 'Other (Boot, System, Disabled or Unkown)' END END END select * from #tempServicesInfo