scripts/collector/sqlserver/sql/createCollectionUser.sql (161 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 @dbname VARCHAR(50); DECLARE @COLLECTION_USER VARCHAR(256); DECLARE @COLLECTION_PASS VARCHAR(256); DECLARE @PRODUCT_VERSION AS INTEGER; DECLARE @CLOUDTYPE AS VARCHAR(256); DECLARE db_cursor CURSOR LOCAL FOR SELECT name FROM sys.databases WHERE name NOT IN ('model','msdb','tempdb','distribution','reportserver', 'reportservertempdb','resource','rdsadmin') AND state = 0 AND is_read_only = 0; SELECT @PRODUCT_VERSION = CONVERT(INTEGER, PARSENAME(CONVERT(NVARCHAR(255), SERVERPROPERTY('productversion')), 4)); SELECT @COLLECTION_USER = N'$(collectionUser)' SELECT @COLLECTION_PASS = N'$(collectionPass)' SELECT @CLOUDTYPE = 'NONE'; IF UPPER(@@VERSION) LIKE '%AZURE%' SELECT @CLOUDTYPE = 'AZURE' BEGIN IF DB_NAME() = 'master' IF NOT EXISTS (SELECT name FROM sys.sql_logins WHERE name = @COLLECTION_USER) BEGIN TRY IF @CLOUDTYPE = 'AZURE' exec ('CREATE LOGIN [' + @COLLECTION_USER + '] WITH PASSWORD=N''' + @COLLECTION_PASS + ''''); ELSE exec ('CREATE LOGIN [' + @COLLECTION_USER + '] WITH PASSWORD=N''' + @COLLECTION_PASS + ''', DEFAULT_DATABASE=[master], CHECK_EXPIRATION=OFF, CHECK_POLICY=OFF'); END TRY BEGIN CATCH SELECT host_name() as host_name, db_name() as database_name, 'Create Login' as module_name, SUBSTRING(CONVERT(NVARCHAR(255),ERROR_NUMBER()),1,254) as error_number, SUBSTRING(CONVERT(NVARCHAR(255),ERROR_SEVERITY()),1,254) as error_severity, SUBSTRING(CONVERT(NVARCHAR(255),ERROR_STATE()),1,254) as error_state, SUBSTRING(CONVERT(NVARCHAR(255),ERROR_MESSAGE()),1,512) as error_message; END CATCH END; BEGIN IF @CLOUDTYPE = 'AZURE' BEGIN TRY exec ('ALTER SERVER ROLE ##MS_DefinitionReader## ADD MEMBER [' + @COLLECTION_USER + ']'); exec ('ALTER SERVER ROLE ##MS_SecurityDefinitionReader## ADD MEMBER [' + @COLLECTION_USER + ']'); exec ('ALTER SERVER ROLE ##MS_ServerStateReader## ADD MEMBER [' + @COLLECTION_USER + ']'); END TRY BEGIN CATCH SELECT host_name() as host_name, db_name() as database_name, 'Execute SERVER ROLE Grant in ' + DB_NAME() + ' DB' as module_name, SUBSTRING(CONVERT(NVARCHAR(255),ERROR_LINE()),1,254) as error_line, SUBSTRING(CONVERT(NVARCHAR(255),ERROR_NUMBER()),1,254) as error_number, SUBSTRING(CONVERT(NVARCHAR(255),ERROR_SEVERITY()),1,254) as error_severity, SUBSTRING(CONVERT(NVARCHAR(255),ERROR_STATE()),1,254) as error_state, SUBSTRING(CONVERT(NVARCHAR(255),ERROR_MESSAGE()),1,512) as error_message; END CATCH END BEGIN IF @CLOUDTYPE <> 'AZURE' BEGIN BEGIN TRY exec ('GRANT VIEW SERVER STATE TO [' + @COLLECTION_USER + ']'); exec ('GRANT VIEW ANY DATABASE TO [' + @COLLECTION_USER + ']'); exec ('GRANT VIEW ANY DEFINITION TO [' + @COLLECTION_USER + ']'); END TRY BEGIN CATCH SELECT host_name() as host_name, db_name() as database_name, 'Execute Grant in ' + DB_NAME() + ' DB' as module_name, SUBSTRING(CONVERT(NVARCHAR(255),ERROR_LINE()),1,254) as error_line, SUBSTRING(CONVERT(NVARCHAR(255),ERROR_NUMBER()),1,254) as error_number, SUBSTRING(CONVERT(NVARCHAR(255),ERROR_SEVERITY()),1,254) as error_severity, SUBSTRING(CONVERT(NVARCHAR(255),ERROR_STATE()),1,254) as error_state, SUBSTRING(CONVERT(NVARCHAR(255),ERROR_MESSAGE()),1,512) as error_message; END CATCH IF @PRODUCT_VERSION > 11 BEGIN TRY exec ('GRANT SELECT ALL USER SECURABLES TO [' + @COLLECTION_USER + ']'); END TRY BEGIN CATCH SELECT host_name() as host_name, db_name() as database_name, 'Execute USER SECURABLE Grant in ' + DB_NAME() + ' DB' as module_name, SUBSTRING(CONVERT(NVARCHAR(255),ERROR_LINE()),1,254) as error_line, SUBSTRING(CONVERT(NVARCHAR(255),ERROR_NUMBER()),1,254) as error_number, SUBSTRING(CONVERT(NVARCHAR(255),ERROR_SEVERITY()),1,254) as error_severity, SUBSTRING(CONVERT(NVARCHAR(255),ERROR_STATE()),1,254) as error_state, SUBSTRING(CONVERT(NVARCHAR(255),ERROR_MESSAGE()),1,512) as error_message; END CATCH IF @PRODUCT_VERSION > 15 BEGIN TRY exec('GRANT VIEW SERVER PERFORMANCE STATE TO [' + @COLLECTION_USER + ']'); exec('GRANT VIEW SERVER SECURITY STATE TO [' + @COLLECTION_USER + ']'); exec('GRANT VIEW ANY PERFORMANCE DEFINITION TO [' + @COLLECTION_USER + ']'); exec('GRANT VIEW ANY SECURITY DEFINITION TO [' + @COLLECTION_USER + ']'); END TRY BEGIN CATCH SELECT host_name() as host_name, db_name() as database_name, 'Execute VIEW SERVER Grant in ' + DB_NAME() + ' DB' as module_name, SUBSTRING(CONVERT(NVARCHAR(255),ERROR_LINE()),1,254) as error_line, SUBSTRING(CONVERT(NVARCHAR(255),ERROR_NUMBER()),1,254) as error_number, SUBSTRING(CONVERT(NVARCHAR(255),ERROR_SEVERITY()),1,254) as error_severity, SUBSTRING(CONVERT(NVARCHAR(255),ERROR_STATE()),1,254) as error_state, SUBSTRING(CONVERT(NVARCHAR(255),ERROR_MESSAGE()),1,512) as error_message; END CATCH END; END; IF @CLOUDTYPE = 'AZURE' BEGIN IF NOT EXISTS (SELECT name FROM sys.sysusers WHERE name = @COLLECTION_USER) BEGIN TRY exec ('CREATE USER [' + @COLLECTION_USER + '] FROM LOGIN [' + @COLLECTION_USER + '] WITH DEFAULT_SCHEMA=dbo'); END TRY BEGIN CATCH SELECT host_name() as host_name, db_name() as database_name, 'Execute Create User in ' + DB_NAME() + ' DB' as module_name, SUBSTRING(CONVERT(NVARCHAR(255),ERROR_LINE()),1,254) as error_line, SUBSTRING(CONVERT(NVARCHAR(255),ERROR_NUMBER()),1,254) as error_number, SUBSTRING(CONVERT(NVARCHAR(255),ERROR_SEVERITY()),1,254) as error_severity, SUBSTRING(CONVERT(NVARCHAR(255),ERROR_STATE()),1,254) as error_state, SUBSTRING(CONVERT(NVARCHAR(255),ERROR_MESSAGE()),1,512) as error_message; END CATCH END; IF @CLOUDTYPE <> 'AZURE' BEGIN OPEN db_cursor FETCH NEXT FROM db_cursor INTO @dbname WHILE @@FETCH_STATUS = 0 BEGIN TRY exec (' use [' + @dbname + ']; IF NOT EXISTS (SELECT [name] FROM [sys].[database_principals] WHERE [type] = N''S'' AND [name] = N''' + @COLLECTION_USER + ''') BEGIN CREATE USER [' + @COLLECTION_USER + '] FOR LOGIN [' + @COLLECTION_USER + ']; END; GRANT VIEW DATABASE STATE TO [' + @COLLECTION_USER + '];'); END TRY BEGIN CATCH SELECT host_name() as host_name, @dbname as used_db_name, db_name() as current_database_name, 'Execute Grant in ' + DB_NAME() + ' DB' as module_name, SUBSTRING(CONVERT(NVARCHAR(255),ERROR_NUMBER()),1,254) as error_number, SUBSTRING(CONVERT(NVARCHAR(255),ERROR_SEVERITY()),1,254) as error_severity, SUBSTRING(CONVERT(NVARCHAR(255),ERROR_STATE()),1,254) as error_state, SUBSTRING(CONVERT(NVARCHAR(255),ERROR_MESSAGE()),1,512) as error_message; END CATCH FETCH NEXT FROM db_cursor INTO @dbname; CLOSE db_cursor DEALLOCATE db_cursor END;