scripts/collector/sqlserver/sql/componentsInstalled.sql (545 lines of code) (raw):
/*
Copyright 2023 Google LLC
Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
You may obtain a copy of the License at
https://www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.
*/
SET nocount ON;
SET language us_english;
DECLARE @PKEY AS VARCHAR(256)
DECLARE @DMA_SOURCE_ID AS VARCHAR(256)
DECLARE @TABLE_PERMISSION_COUNT AS INTEGER
DECLARE @DMA_MANUAL_ID AS VARCHAR(256)
SELECT @PKEY = N'$(pkey)';
SELECT @DMA_SOURCE_ID = N'$(dmaSourceId)';
SELECT @DMA_MANUAL_ID = N'$(dmaManualId)';
/* need to record table permissions in order to determine if we can run certain server level queryies
as some tables are not available in managed instances
*/
IF Object_id('tempdb..#myPerms') IS NOT NULL
DROP TABLE #myperms;
CREATE TABLE #myperms
(
entity_name NVARCHAR(255),
subentity_name NVARCHAR(255),
permission_name NVARCHAR(255)
);
INSERT INTO #myperms
SELECT *
FROM fn_my_permissions('sys.xp_regread', 'OBJECT')
WHERE Upper(permission_name) = 'EXECUTE'
AND subentity_name = '';
INSERT INTO #myperms
SELECT *
FROM fn_my_permissions('sys.xp_servicecontrol', 'OBJECT')
WHERE Upper(permission_name) = 'EXECUTE'
AND subentity_name = '';
SELECT @TABLE_PERMISSION_COUNT = Count(*)
FROM #myperms
WHERE Lower(entity_name) IN ( 'sys.xp_regread', 'sys.xp_servicecontrol' )
AND Upper(permission_name) = 'EXECUTE';
/* ------------------------------------------ Inital Setup -----------------------------------------------------*/
IF Object_id('tempdb..#RegResult') IS NOT NULL
DROP TABLE #regresult;
IF Object_id('tempdb..#ServicesServiceStatus') IS NOT NULL
DROP TABLE #servicesservicestatus;
IF Object_id('tempdb..#tempLanguageServices') IS NOT NULL
DROP TABLE #tempLanguageServices;
CREATE TABLE #regresult
(
resultvalue NVARCHAR(4)
)
CREATE TABLE #servicesservicestatus /*Create temp tables*/
(
rowid INT IDENTITY(1, 1),
servername NVARCHAR(128),
servicename NVARCHAR(128),
servicestatus VARCHAR(128),
statusdatetime DATETIME DEFAULT (Getdate()),
physicalsrvername NVARCHAR(128)
)
CREATE TABLE #tempLanguageServices
(
servicestatus NVARCHAR(256)
);
DECLARE @ChkInstanceName NVARCHAR(128) /*Stores SQL Instance Name*/
,
@ChkSrvName NVARCHAR(128) /*Stores Server Name*/
,
@TrueSrvName NVARCHAR(128) /*Stores where code name needed */
,
@SQLSrv NVARCHAR(128) /*Stores server name*/
,
@PhysicalSrvName NVARCHAR(128) /*Stores physical name*/
,
@FTS NVARCHAR(128) /*Stores Full Text Search Service name*/
,
@RS NVARCHAR(128) /*Stores Reporting Service name*/
,
@SQLAgent NVARCHAR(128) /*Stores SQL Agent Service name*/
,
@OLAP NVARCHAR(128) /*Stores Analysis Service name*/
,
@REGKEY NVARCHAR(128) /*Stores Registry Key information*/
,
@R_INFO_SERVICES NVARCHAR(256) /*Stores Info on R Language Installation information*/
SET @PhysicalSrvName = Cast(Serverproperty('MachineName') AS VARCHAR(128))
SET @ChkSrvName = Cast(Serverproperty('INSTANCENAME') AS VARCHAR(128))
SET @ChkInstanceName = @@serverName
IF @ChkSrvName IS NULL /*Detect default or named instance*/
BEGIN
SET @TrueSrvName = 'MSQLSERVER'
SELECT @OLAP = 'MSSQLServerOLAPService' /*Setting up proper service name*/
SELECT @FTS = 'MSFTESQL'
SELECT @RS = 'ReportServer'
SELECT @SQLAgent = 'SQLSERVERAGENT'
SELECT @SQLSrv = 'MSSQLSERVER'
END
ELSE
BEGIN
SET @TrueSrvName = Cast(Serverproperty('INSTANCENAME') AS VARCHAR(128))
SET @SQLSrv = '$' + @ChkSrvName
SELECT @OLAP = 'MSOLAP' + @SQLSrv /*Setting up proper service name*/
SELECT @FTS = 'MSFTESQL' + @SQLSrv
SELECT @RS = 'ReportServer' + @SQLSrv
SELECT @SQLAgent = 'SQLAgent' + @SQLSrv
SELECT @SQLSrv = 'MSSQL' + @SQLSrv
END
/* ---------------------------------- SQL Server Service Section ----------------------------------------------*/
BEGIN TRY
SET @REGKEY = 'System\CurrentControlSet\Services\'
+ @SQLSrv
INSERT #regresult
(resultvalue)
EXEC master.sys.Xp_regread
@rootkey='HKEY_LOCAL_MACHINE',
@key=@REGKEY
IF (SELECT resultvalue
FROM #regresult) = 1
AND @TABLE_PERMISSION_COUNT >= 2
BEGIN
INSERT #servicesservicestatus
(servicestatus) /*Detecting staus of SQL Sever service*/
EXEC Xp_servicecontrol
N'QUERYSTATE',
@SQLSrv
UPDATE #servicesservicestatus
SET servicename = 'MS SQL Server Service'
WHERE rowid = @@identity
UPDATE #servicesservicestatus
SET servername = @TrueSrvName
WHERE rowid = @@identity
UPDATE #servicesservicestatus
SET physicalsrvername = @PhysicalSrvName
WHERE rowid = @@identity
TRUNCATE TABLE #regresult
END
ELSE
BEGIN
INSERT INTO #servicesservicestatus
(servicestatus)
VALUES ('NOT INSTALLED')
UPDATE #servicesservicestatus
SET servicename = 'MS SQL Server Service'
WHERE rowid = @@identity
UPDATE #servicesservicestatus
SET servername = @TrueSrvName
WHERE rowid = @@identity
UPDATE #servicesservicestatus
SET physicalsrvername = @PhysicalSrvName
WHERE rowid = @@identity
TRUNCATE TABLE #regresult
END
END TRY
BEGIN CATCH
INSERT INTO #servicesservicestatus
(servicestatus)
VALUES ('N/A')
UPDATE #servicesservicestatus
SET servicename = 'MS SQL Server Service'
WHERE rowid = @@identity
UPDATE #servicesservicestatus
SET servername = @TrueSrvName
WHERE rowid = @@identity
UPDATE #servicesservicestatus
SET physicalsrvername = @PhysicalSrvName
WHERE rowid = @@identity
TRUNCATE TABLE #regresult
END CATCH
/* ---------------------------------- SQL Server Agent Service Section -----------------------------------------*/
BEGIN TRY
SET @REGKEY = 'System\CurrentControlSet\Services\'
+ @SQLAgent
INSERT #regresult
(resultvalue)
EXEC master.sys.Xp_regread
@rootkey='HKEY_LOCAL_MACHINE',
@key=@REGKEY
IF (SELECT resultvalue
FROM #regresult) = 1
AND @TABLE_PERMISSION_COUNT >= 2
BEGIN
INSERT #servicesservicestatus
(servicestatus) /*Detecting staus of SQL Agent service*/
EXEC Xp_servicecontrol
N'QUERYSTATE',
@SQLAgent
UPDATE #servicesservicestatus
SET servicename = 'SQL Server Agent Service'
WHERE rowid = @@identity
UPDATE #servicesservicestatus
SET servername = @TrueSrvName
WHERE rowid = @@identity
UPDATE #servicesservicestatus
SET physicalsrvername = @PhysicalSrvName
WHERE rowid = @@identity
TRUNCATE TABLE #regresult
END
ELSE
BEGIN
INSERT INTO #servicesservicestatus
(servicestatus)
VALUES ('NOT INSTALLED')
UPDATE #servicesservicestatus
SET servicename = 'SQL Server Agent Service'
WHERE rowid = @@identity
UPDATE #servicesservicestatus
SET servername = @TrueSrvName
WHERE rowid = @@identity
UPDATE #servicesservicestatus
SET physicalsrvername = @PhysicalSrvName
WHERE rowid = @@identity
TRUNCATE TABLE #regresult
END
END TRY
BEGIN CATCH
INSERT INTO #servicesservicestatus
(servicestatus)
VALUES ('NOT INSTALLED')
UPDATE #servicesservicestatus
SET servicename = 'SQL Server Agent Service'
WHERE rowid = @@identity
UPDATE #servicesservicestatus
SET servername = @TrueSrvName
WHERE rowid = @@identity
UPDATE #servicesservicestatus
SET physicalsrvername = @PhysicalSrvName
WHERE rowid = @@identity
TRUNCATE TABLE #regresult
END CATCH
/* ---------------------------------- SQL Browser Service Section ----------------------------------------------*/
BEGIN TRY
IF @TABLE_PERMISSION_COUNT >= 2
BEGIN
SET @REGKEY = 'System\CurrentControlSet\Services\SQLBrowser'
INSERT #regresult
(resultvalue)
EXEC master.sys.Xp_regread
@rootkey='HKEY_LOCAL_MACHINE',
@key=@REGKEY
IF (SELECT resultvalue
FROM #regresult) = 1
BEGIN
INSERT #servicesservicestatus
(servicestatus) /*Detecting staus of SQL Browser Service*/
EXEC master.dbo.Xp_servicecontrol
N'QUERYSTATE',
N'sqlbrowser'
UPDATE #servicesservicestatus
SET servicename = 'SQL Browser Service - Instance Independent'
WHERE rowid = @@identity
UPDATE #servicesservicestatus
SET servername = @TrueSrvName
WHERE rowid = @@identity
UPDATE #servicesservicestatus
SET physicalsrvername = @PhysicalSrvName
WHERE rowid = @@identity
TRUNCATE TABLE #regresult
END
IF (SELECT resultvalue
FROM #regresult) <> 1
BEGIN
INSERT INTO #servicesservicestatus
(servicestatus)
VALUES ('NOT INSTALLED')
UPDATE #servicesservicestatus
SET servicename = 'SQL Browser Service - Instance Independent'
WHERE rowid = @@identity
UPDATE #servicesservicestatus
SET servername = @TrueSrvName
WHERE rowid = @@identity
UPDATE #servicesservicestatus
SET physicalsrvername = @PhysicalSrvName
WHERE rowid = @@identity
TRUNCATE TABLE #regresult
END
END
ELSE
BEGIN
INSERT INTO #servicesservicestatus
(physicalsrvername,servername,servicename,servicestatus)
VALUES (@PhysicalSrvName,@TrueSrvName,'SQL Browser Service - Instance Independent','N/A')
END
END TRY
BEGIN CATCH
INSERT INTO #servicesservicestatus
(physicalsrvername,servername,servicename,servicestatus)
VALUES (@PhysicalSrvName,@TrueSrvName,'SQL Browser Service - Instance Independent','N/A')
END CATCH
/* ---------------------------------- Integration Service Section ----------------------------------------------*/
BEGIN TRY
IF @TABLE_PERMISSION_COUNT >= 2
BEGIN
SET @REGKEY = 'System\CurrentControlSet\Services\MsDtsServer'
INSERT #regresult
(resultvalue)
EXEC master.sys.Xp_regread
@rootkey='HKEY_LOCAL_MACHINE',
@key=@REGKEY
IF (SELECT resultvalue
FROM #regresult) = 1
BEGIN
INSERT #servicesservicestatus
(servicestatus) /*Detecting staus of Intergration Service*/
EXEC master.dbo.Xp_servicecontrol
N'QUERYSTATE',
N'sqlbrowser'
UPDATE #servicesservicestatus
SET servicename = 'Integration Service - Instance Independent'
WHERE rowid = @@identity
UPDATE #servicesservicestatus
SET servername = @TrueSrvName
WHERE rowid = @@identity
UPDATE #servicesservicestatus
SET physicalsrvername = @PhysicalSrvName
WHERE rowid = @@identity
TRUNCATE TABLE #regresult
END
IF (SELECT resultvalue
FROM #regresult) <> 1
BEGIN
INSERT INTO #servicesservicestatus
(servicestatus)
VALUES ('NOT INSTALLED')
UPDATE #servicesservicestatus
SET servicename = 'Integration Service - Instance Independent'
WHERE rowid = @@identity
UPDATE #servicesservicestatus
SET servername = @TrueSrvName
WHERE rowid = @@identity
UPDATE #servicesservicestatus
SET physicalsrvername = @PhysicalSrvName
WHERE rowid = @@identity
TRUNCATE TABLE #regresult
END
END
ELSE
BEGIN
INSERT INTO #servicesservicestatus
(physicalsrvername,servername,servicename,servicestatus)
VALUES (@PhysicalSrvName,@TrueSrvName,'Integration Service - Instance Independent','N/A')
END
END TRY
BEGIN CATCH
INSERT INTO #servicesservicestatus
(physicalsrvername,servername,servicename,servicestatus)
VALUES (@PhysicalSrvName,@TrueSrvName,'Integration Service - Instance Independent','N/A')
END CATCH
/* ---------------------------------- Reporting Service Section ------------------------------------------------*/
BEGIN TRY
IF @TABLE_PERMISSION_COUNT >= 2
BEGIN
SET @REGKEY = 'System\CurrentControlSet\Services\' + @RS
INSERT #regresult
(resultvalue)
EXEC master.sys.Xp_regread
@rootkey='HKEY_LOCAL_MACHINE',
@key=@REGKEY
IF (SELECT resultvalue
FROM #regresult) = 1
BEGIN
INSERT #servicesservicestatus
(servicestatus) /*Detecting staus of Reporting service*/
EXEC master.dbo.Xp_servicecontrol
N'QUERYSTATE',
N'sqlbrowser'
UPDATE #servicesservicestatus
SET servicename = 'Reporting Service'
WHERE rowid = @@identity
UPDATE #servicesservicestatus
SET servername = @TrueSrvName
WHERE rowid = @@identity
UPDATE #servicesservicestatus
SET physicalsrvername = @PhysicalSrvName
WHERE rowid = @@identity
TRUNCATE TABLE #regresult
END
IF (SELECT resultvalue
FROM #regresult) <> 1
BEGIN
INSERT INTO #servicesservicestatus
(servicestatus)
VALUES ('NOT INSTALLED')
UPDATE #servicesservicestatus
SET servicename = 'Reporting Service'
WHERE rowid = @@identity
UPDATE #servicesservicestatus
SET servername = @TrueSrvName
WHERE rowid = @@identity
UPDATE #servicesservicestatus
SET physicalsrvername = @PhysicalSrvName
WHERE rowid = @@identity
TRUNCATE TABLE #regresult
END
END
ELSE
BEGIN
INSERT INTO #servicesservicestatus
(physicalsrvername,servername,servicename,servicestatus)
VALUES (@PhysicalSrvName,@TrueSrvName,'Reporting Service','N/A')
END
END TRY
BEGIN CATCH
INSERT INTO #servicesservicestatus
(physicalsrvername,servername,servicename,servicestatus)
VALUES (@PhysicalSrvName,@TrueSrvName,'Reporting Service','N/A')
END CATCH
/* ---------------------------------- Analysis Service Section -------------------------------------------------*/
BEGIN TRY
IF @ChkSrvName IS NULL /*Detect default or named instance*/
BEGIN
SET @OLAP = 'MSSQLServerOLAPService'
END
ELSE
BEGIN
SET @OLAP = 'MSOLAP' + '$' + @ChkSrvName
SET @REGKEY = 'System\CurrentControlSet\Services\'
+ @OLAP
END
IF @TABLE_PERMISSION_COUNT >= 2
BEGIN
INSERT #regresult
(resultvalue)
EXEC master.sys.Xp_regread
@rootkey='HKEY_LOCAL_MACHINE',
@key=@REGKEY
IF (SELECT resultvalue
FROM #regresult) = 1
BEGIN
INSERT #servicesservicestatus
(servicestatus) /*Detecting staus of Analysis service*/
EXEC master.dbo.Xp_servicecontrol
N'QUERYSTATE',
@OLAP
UPDATE #servicesservicestatus
SET servicename = 'Analysis Services'
WHERE rowid = @@identity
UPDATE #servicesservicestatus
SET servername = @TrueSrvName
WHERE rowid = @@identity
UPDATE #servicesservicestatus
SET physicalsrvername = @PhysicalSrvName
WHERE rowid = @@identity
TRUNCATE TABLE #regresult
END
IF (SELECT resultvalue
FROM #regresult) <> 1
BEGIN
INSERT INTO #servicesservicestatus
(servicestatus)
VALUES ('NOT INSTALLED')
UPDATE #servicesservicestatus
SET servicename = 'Analysis Services'
WHERE rowid = @@identity
UPDATE #servicesservicestatus
SET servername = @TrueSrvName
WHERE rowid = @@identity
UPDATE #servicesservicestatus
SET physicalsrvername = @PhysicalSrvName
WHERE rowid = @@identity
TRUNCATE TABLE #regresult
END
END
ELSE
BEGIN
INSERT INTO #servicesservicestatus
(physicalsrvername,servername,servicename,servicestatus)
VALUES (@PhysicalSrvName,@TrueSrvName,'Analysis Services','N/A')
END
END TRY
BEGIN CATCH
INSERT INTO #servicesservicestatus
(physicalsrvername,servername,servicename,servicestatus)
VALUES (@PhysicalSrvName,@TrueSrvName,'Analysis Services','N/A')
END CATCH
/* ---------------------------------- Full Text Search Service Section -----------------------------------------*/
BEGIN TRY
SET @REGKEY = 'System\CurrentControlSet\Services\' + @FTS
IF @TABLE_PERMISSION_COUNT >= 2
BEGIN
INSERT #regresult
(resultvalue)
EXEC master.sys.Xp_regread
@rootkey='HKEY_LOCAL_MACHINE',
@key=@REGKEY
IF (SELECT resultvalue
FROM #regresult) = 1
BEGIN
INSERT #servicesservicestatus
(servicestatus) /*Detecting staus of Full Text Search service*/
EXEC master.dbo.Xp_servicecontrol
N'QUERYSTATE',
@FTS
UPDATE #servicesservicestatus
SET servicename = 'Full Text Search Service'
WHERE rowid = @@identity
UPDATE #servicesservicestatus
SET servername = @TrueSrvName
WHERE rowid = @@identity
UPDATE #servicesservicestatus
SET physicalsrvername = @PhysicalSrvName
WHERE rowid = @@identity
TRUNCATE TABLE #regresult
END
IF (SELECT resultvalue
FROM #regresult) <> 1
BEGIN
INSERT INTO #servicesservicestatus
(servicestatus)
VALUES ('NOT INSTALLED')
UPDATE #servicesservicestatus
SET servicename = 'Full Text Search Service'
WHERE rowid = @@identity
UPDATE #servicesservicestatus
SET servername = @TrueSrvName
WHERE rowid = @@identity
UPDATE #servicesservicestatus
SET physicalsrvername = @PhysicalSrvName
WHERE rowid = @@identity
TRUNCATE TABLE #regresult
END
END
ELSE
BEGIN
INSERT INTO #servicesservicestatus
(physicalsrvername,servername,servicename,servicestatus)
VALUES (@PhysicalSrvName,@TrueSrvName,'Full Text Search Service','N/A')
END
END TRY
BEGIN CATCH
INSERT INTO #servicesservicestatus
(physicalsrvername,servername,servicename,servicestatus)
VALUES (@PhysicalSrvName,@TrueSrvName,'Full Text Search Service','N/A')
END CATCH
/* ---------------------------------- Machine Learning and R Language Service Section -----------------------------------------*/
BEGIN TRY
INSERT INTO #tempLanguageServices exec('sp_execute_external_script @language = N''R'', @script = N''OutputDataSet <- data.frame(.libPaths());''');
SELECT @R_INFO_SERVICES = servicestatus from #tempLanguageServices;
INSERT INTO #servicesservicestatus (physicalsrvername,servername,servicename,servicestatus)
VALUES (@PhysicalSrvName,@TrueSrvName,'IsMachineLearningAndREnabled',CASE WHEN @R_INFO_SERVICES IS NOT NULL THEN 'INSTALLED' ELSE 'NOT INSTALLED' END)
END TRY
BEGIN CATCH
IF ERROR_NUMBER() = 39020 AND ERROR_SEVERITY() = 16 AND ERROR_STATE() = 1
INSERT INTO #servicesservicestatus (physicalsrvername,servername,servicename,servicestatus)
VALUES (@PhysicalSrvName,@TrueSrvName,'IsMachineLearningAndREnabled','NOT INSTALLED');
IF ERROR_NUMBER() = 39020 AND ERROR_SEVERITY() = 16 AND ERROR_STATE() = 2
INSERT INTO #servicesservicestatus (physicalsrvername,servername,servicename,servicestatus)
VALUES (@PhysicalSrvName,@TrueSrvName,'IsMachineLearningAndREnabled','NOT INSTALLED');
END CATCH;
/* -------------------------------------------------------------------------------------------------------------*/
SELECT '"' + @PKEY + '"' AS PKEY,
'"' + physicalsrvername + '"' AS 'physical_server_name',
'"' + servername + '"' AS 'sql_instance_name',
'"' + servicename + '"' AS 'sql_server_services',
'"' + servicestatus + '"' AS 'current_service_status',
'"' + convert(varchar, statusdatetime, 121) + '"' AS 'status_date_time',
'"' + @DMA_SOURCE_ID + '"' AS 'dma_source_id',
'"' + @DMA_MANUAL_ID + '"' AS 'dma_manual_id'
FROM #servicesservicestatus
/* -------------------------------------------------------------------------------------------------------------*/
/*Perform cleanup*/
IF Object_id('tempdb..#RegResult') IS NOT NULL
DROP TABLE #regresult
IF Object_id('tempdb..#ServicesServiceStatus') IS NOT NULL
DROP TABLE #servicesservicestatus
IF Object_id('tempdb..#tempLanguageServices') IS NOT NULL
DROP TABLE #tempLanguageServices