diff --git a/DBG - compute arizona backup size with compression.sql b/DBG - compute arizona backup size with compression.sql new file mode 100644 index 0000000..97bfc04 --- /dev/null +++ b/DBG - compute arizona backup size with compression.sql @@ -0,0 +1,49 @@ +IF OBJECT_ID('tempdb..#state')IS NOT NULL BEGIN; + DROP TABLE #state; +END; + +SELECT + database_name = DB_NAME(database_id) + , log_size_mb = CAST(SUM(CASE WHEN f.type_desc = 'LOG' THEN size END) * 8. / 1024 AS DECIMAL(18,2)) + , row_size_mb = CAST(SUM(CASE WHEN type_desc = 'ROWS' THEN size END) * 8. / 1024 AS DECIMAL(18,2)) + , total_size_mb = CAST(SUM(size) * 8. / 1024 AS DECIMAL(18,2)) + , CAST(NULL AS DECIMAL(18,2)) AS compression_backup_percent + , CAST(NULL AS DECIMAL(18,2)) AS compressed_backup_size_MB +INTO #state +FROM sys.master_files F WITH(NOWAIT) +WHERE LOWER(DB_NAME(database_id)) = 'arizona' +GROUP BY F.database_id + +--#region start dummy backup +BACKUP DATABASE [Arizona] TO DISK = N'nul' WITH COPY_ONLY, NOFORMAT, INIT, NAME = N'Arizona-Full Database Backup', SKIP, NOREWIND, NOUNLOAD, COMPRESSION, STATS = 10 +--#endregion start dummy backup + +--#region compute last backup compressed size +UPDATE s SET [s].[compression_backup_percent] = x.[compressPct] + , s.[compressed_backup_size_MB] = x.[compressed_bkp_MB] +FROM [#state] s + CROSS APPLY ( + SELECT TOP (1) + [a].[backup_start_date] + ,[a].[backup_finish_date] + ,[a].[type] + ,[a].[backup_size] + ,[a].[backup_size] / 1024 / 1024 / 1024 AS bkp_size_GB + ,[a].[backup_size] / 1024 / 1024 AS bkp_size_MB + ,[a].[compressed_backup_size] + ,[a].[compressed_backup_size] / 1024 / 1024 / 1024 AS compressed_bkp_GB + ,[a].[compressed_backup_size] / 1024 / 1024 AS compressed_bkp_MB + ,[a].[is_copy_only] + ,compressPct = CAST(100.0 * [a].[compressed_backup_size] / [a].[backup_size] AS DECIMAL(5, 1)) + FROM msdb.dbo.backupset a + WHERE LOWER([a].[database_name]) = 'arizona' --LOWER(s.[database_name]) + AND [a].[type]='D' --full bkp only + AND [a].[is_copy_only] = 1 + AND [a].[backup_start_date] > DATEADD(HOUR, -1, CURRENT_TIMESTAMP) + ORDER BY [a].[backup_start_date] DESC + ) x +--#endregion compute last backup compressed size + + +SELECT * +FROM [#state] \ No newline at end of file diff --git a/DBG - new max memory algo chatgpt version.sql b/DBG - new max memory algo chatgpt version.sql new file mode 100644 index 0000000..2ba2683 --- /dev/null +++ b/DBG - new max memory algo chatgpt version.sql @@ -0,0 +1,35 @@ +DECLARE @oneGb INT = 1024; -- MB + +-- "hard coded" options +DECLARE @architecture NVARCHAR(10) = 'x64'; +DECLARE @totalram INT = 16 * @oneGb; +DECLARE @corenumber INT = 2; +DECLARE @otherApps INT = 0; --reserved ram for other apps in Mo + +-- Thread stack sizes in MB +DECLARE @threadStackSizes TABLE (Architecture NVARCHAR(10), Size INT); +INSERT INTO @threadStackSizes VALUES ('x86', 1), ('x64', 2), ('IA64', 4); + +DECLARE @threadStackSize INT; +SELECT @threadStackSize = Size FROM @threadStackSizes WHERE Architecture = @architecture; + +DECLARE @osReservedPart FLOAT; +SET @osReservedPart = CASE WHEN @totalram < (20 * @oneGb) THEN 0.2 ELSE 0.125 END; + +DECLARE @forOS INT; +SET @forOS = CAST(@totalram * @osReservedPart AS INT); + +DECLARE @coretemp INT; +SET @coretemp = CASE WHEN @corenumber > 4 THEN 0 ELSE @corenumber END; + +DECLARE @sqlThreads INT; +SET @sqlThreads = 256 + (@coretemp - 4) * 8; + +DECLARE @temp FLOAT; +SET @temp = @corenumber / 4.0; + +DECLARE @maxMemory INT; +SET @maxMemory = @totalram - @forOS - @otherApps - (@sqlThreads * @threadStackSize) - (1024 * CEILING(@temp)); + +-- Display the result +SELECT @maxMemory AS 'Max Memory (MB)'; diff --git a/DBG - new max memory algo.sql b/DBG - new max memory algo.sql new file mode 100644 index 0000000..602db8a --- /dev/null +++ b/DBG - new max memory algo.sql @@ -0,0 +1,53 @@ +/* +derived from http://sqlmax.chuvash.eu/ + +SQL Max Memory = TotalPhyMem - (NumOfSQLThreads * ThreadStackSize) - (1GB * CEILING(NumOfCores/4)) - OS Reserved +NumOfSQLThreads = 256 + (NumOfProcessors*- 4) * 8 (* If NumOfProcessors > 4, else 0) +ThreadStackSize = 2MB on x64 or 4 MB on 64-bit (IA64) +OS Reserved = 20% of total ram for under if system has 15GB. 12.5% for over 20GB +*/ +DECLARE @totSysMemKb INT; +DECLARE @NumOfCores INT; +DECLARE @NumOfProcessors INT; +DECLARE @NumOfSQLThreads INT; +DECLARE @isX64 BIT = 1; +DECLARE @ThreadStackSize INT; +DECLARE @osReserved INT; +DECLARE @newMaxMem INT; +DECLARE @appReserved INT = 4*1024*1024; --memory reserved for other apps on the server in Kb + +SELECT @totSysMemKb = [total_physical_memory_kb] +FROM [sys].[dm_os_sys_memory]; + +SELECT @NumOfCores = [cpu_count], @NumOfProcessors = [cpu_count] / [hyperthread_ratio] +FROM [sys].[dm_os_sys_info]; + +SELECT @isX64 = CHARINDEX('64-bit',CAST(SERVERPROPERTY('Edition') AS VARCHAR(MAX))); + +SELECT @ThreadStackSize = CASE WHEN @isX64=1 THEN 4096 ELSE 2048 END; + +--force 16 Go, 2 vcpu, 2 cores +SELECT @totSysMemKb = 16 * 1024 * 1024, @NumOfProcessors = 2, @NumOfCores = 2 + +SELECT @NumOfSQLThreads = 256 + (@NumOfProcessors - 4) * 8 * (CASE WHEN @NumOfProcessors >4 THEN @NumOfProcessors ELSE 0 END); + + +SELECT @osReserved = CASE WHEN @totSysMemKb < (20*1024*1024) THEN @totSysMemKb * 0.2 ELSE @totSysMemKb * 0.125 END; + +PRINT' +@totSysMemKb: '+COALESCE(CAST(@totSysMemKb AS VARCHAR(MAX)),'null')+' +@NumOfCores: '+COALESCE(CAST(@NumOfCores AS VARCHAR(MAX)),'null')+' +@NumOfProcessors: '+COALESCE(CAST(@NumOfProcessors AS VARCHAR(MAX)),'null')+' +@NumOfSQLThreads: '+COALESCE(CAST(@NumOfSQLThreads AS VARCHAR(MAX)),'null')+' +@isX64: '+COALESCE(CAST(@isX64 AS VARCHAR(MAX)),'null')+' +@ThreadStackSize: '+COALESCE(CAST(@ThreadStackSize AS VARCHAR(MAX)),'null')+' +@osReserved: '+COALESCE(CAST(@osReserved AS VARCHAR(MAX)),'null')+' +@appReserved: '+COALESCE(CAST(@appReserved AS VARCHAR(MAX)),'null')+' +'; +SELECT @newMaxMem = @totSysMemKb - (@NumOfSQLThreads * @ThreadStackSize) - ((1* 1024 * 1024) * CEILING(@NumOfCores/4)) - @osReserved - @appReserved; + +SELECT + @newMaxMem AS maxMemKb + , @newMaxMem / 1024 AS maxMemMb + , @newMaxMem / 1024 /1024 AS maxMemGb +; \ No newline at end of file diff --git a/TPDT-268 - ACP in task sequence/10_Change_Schedules_Subscriptions.sql b/TPDT-268 - ACP in task sequence/10_Change_Schedules_Subscriptions.sql new file mode 100644 index 0000000..88201b9 --- /dev/null +++ b/TPDT-268 - ACP in task sequence/10_Change_Schedules_Subscriptions.sql @@ -0,0 +1,30 @@ +/* Configuration des postes pour éviter le deadlock lors des rajout d'abonnements suite à des mises à jours doit être passé après la virtualisation des serveurs.*/ +Exec ActivePos_server.dbo.ExecuteOnAllPos ' + +DECLARE + @delay varchar(5), + @message NVARCHAR(4000) + + BEGIN TRY + DECLARE @mac AS TABLE (MacAddress VARCHAR(400) null) + DECLARE @posId AS VARCHAR(5) + + INSERT INTO @mac + EXEC xp_cmdshell ''getmac'' + SELECT @posId = Number FROM ActivePos_read..PointOfSale pos + join @mac m + ON LEFT(m.MacAddress, 18) = pos.MacAddress + SET @delay = ''@'' + convert(varchar(2),2*@posId) + ''m'' + UPDATE ActivePos_write.dbo.[Settings] + SET [SettingValue]= @delay + WHERE [SettingId]=''Configuration.ConfigSections.Plugins.Parts.ManageSqlSubscriptionJob.Schedule'' + AND [ApplicationId]=''e9f3ada2-555c-4fb9-b109-5d8684d77135'' + and @posId < 30 + + END TRY + BEGIN CATCH + select @message = ERROR_MESSAGE() + select @message = ''Error while updating schedule on POS '''' + convert(varchar(2),2*@posId) + ''''.'' + @message + raiserror (@message, 13,1) + END CATCH +', 1 diff --git a/TPDT-268 - ACP in task sequence/11_Run_Job_CheckReplications.sql b/TPDT-268 - ACP in task sequence/11_Run_Job_CheckReplications.sql new file mode 100644 index 0000000..6ad9486 --- /dev/null +++ b/TPDT-268 - ACP in task sequence/11_Run_Job_CheckReplications.sql @@ -0,0 +1,6 @@ +USE msdb +GO + +EXEC dbo.sp_start_job + @job_name = N'DR92160 - Replication Check' +GO \ No newline at end of file diff --git a/TPDT-268 - ACP in task sequence/12_Broker_Config.sql b/TPDT-268 - ACP in task sequence/12_Broker_Config.sql new file mode 100644 index 0000000..e9e640a --- /dev/null +++ b/TPDT-268 - ACP in task sequence/12_Broker_Config.sql @@ -0,0 +1,332 @@ +USE [master] + +/* Create SQL Master key */ +IF NOT EXISTS(SELECT 1 FROM sys.symmetric_keys WHERE name like '%DatabaseMasterKey%') +BEGIN + EXEC('CREATE MASTER KEY ENCRYPTION BY PASSWORD = ''$mk''') + + /* Backup SQL Master key */ + EXEC('BACKUP MASTER KEY TO FILE = ''$bck'' ENCRYPTION BY PASSWORD = ''$mk''') +END + +/* Create Atlas Service Broker Certificate */ +IF NOT EXISTS(SELECT 1 FROM sys.certificates WHERE name = 'TriaPharmSQLCert') +BEGIN + EXEC('CREATE CERTIFICATE TriaPharmSQLCert FROM FILE = ''D:\SQLDatabaseDump\Certificates\TriaPharmSQLCert.cer'' WITH PRIVATE KEY (FILE = ''D:\SQLDatabaseDump\Certificates\TriaPharmSQLCert.pvk'', DECRYPTION BY PASSWORD = ''$cert'');') +END + +/* SQL Broker Endpoint Creation */ +IF NOT EXISTS ( SELECT 1 FROM sys.tcp_endpoints WHERE name = 'ServiceBrokerEndpoint4022') +BEGIN + CREATE ENDPOINT [ServiceBrokerEndpoint4022] + STATE=STARTED + AS TCP (LISTENER_PORT = 4022, LISTENER_IP = ALL) + FOR SERVICE_BROKER (MESSAGE_FORWARDING = DISABLED +, MESSAGE_FORWARD_SIZE = 10 +, AUTHENTICATION = CERTIFICATE TriaPharmSQLCert +, ENCRYPTION = REQUIRED ALGORITHM AES) + +EXEC('GRANT CONNECT on ENDPOINT::[ServiceBrokerEndpoint4022] TO [PUBLIC]') + +END + +USE [Arizona] + +/*------------------- Declaration des variables --------------------*/ +DECLARE @cvCurrentOrganizationalUnit int, + @subsidiary_id int, + @skip tinyint, + @servicenamecheck varchar(255), + @out_default_value varchar(60), + @format varchar(60), + @ou varchar(3), + @envtype char(1), + @envtype2 char(1), + @ServiceName varchar(150), + @RteAddress varchar(150), + @stmt nvarchar(4000) + + + +/*------------ Affectation des parametres aux variables ------------*/ + +SET @cvCurrentOrganizationalUnit = null +SET @subsidiary_id = null +SET @ou = '' +SET @skip = 0 + +SELECT @envtype = CASE WHEN [Type] = 'DEVE' OR [Type] = 'VALI' THEN 'D' ELSE 'P' END FROM master.cfg.InstanceContext +SELECT @envtype2 = CASE WHEN [Type] = 'DEVE' THEN 'D' WHEN [Type] = 'VALI' THEN 'T' ELSE 'P' END FROM master.cfg.InstanceContext + + + + +/* ------------------------------------------------------------------------------------------------------------------------------------- */ +/* \\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\ 1 : RETRIEVE FORMAT AND OU CODE /////////////////////////////////////////////////// */ +/* ------------------------------------------------------------------------------------------------------------------------------------- */ + +IF EXISTS(SELECT 1 FROM [master].[cfg].[InstanceContext] WHERE Business = 'TPPHAR') +BEGIN + /* Get the cvCurrentOrganizationalUnit */ + EXEC arizona.dbo.sp_bmc_Bmc_Applic_Default + @in_job_type = 3, + @in_param_int_1 = null, + @in_param_int_2 = null, + @in_param_varchar_1 = 'cvCurrentOrganizationalUnit', + @out_default_value = @out_default_value OUTPUT, + @out_param_int_1 = null; + + SELECT @cvCurrentOrganizationalUnit = convert(int,@out_default_value); + + /* Get the subsidiary id and OU code */ + SELECT @subsidiary_id = ou.OU_subsidiary, @ou = ou.OU_Code + FROM arizona.dbo.Organizational_unit ou with (nolock) + WHERE ou.Organizational_unit_ID = @cvCurrentOrganizationalUnit; + + /* Get the current format */ + SELECT @format = UPPER(sub.SUB_code) + FROM arizona.dbo.Subsidiary sub with (nolock) + WHERE sub.Subsidiary_ID = @subsidiary_id; + + /* Check if we have a value, if not leave this SP */ + IF @format is null + BEGIN + PRINT 'ERROR: Format is not found!' + SET @skip = 1 + END + + IF @ou = '' + BEGIN + PRINT 'ERROR: OU is not found!' + SET @skip = 1 + END + + /* Change the value into a compatible format */ + IF @format = 'COOP' + BEGIN + SET @format = 'CVI' + END + + IF @format = 'CENT' + BEGIN + SET @format = 'SUN' + END + + IF @format = '000' + BEGIN + SET @format = 'AAI' + END + + + +/* ------------------------------------------------------------------------------------------------------------------------------------- */ +/* \\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\ 2 : CREATE SERVICE BROEKR OBJECTS ////////////////////////////////////////////////// */ +/* ------------------------------------------------------------------------------------------------------------------------------------- */ + + IF @skip = 0 + BEGIN + + /* Activate Service Broker */ + IF NOT EXISTS (SELECT 1 FROM sys.databases WHERE name = 'Arizona' and is_broker_enabled = 1) + BEGIN + IF (SERVERPROPERTY('EngineEdition') <> 8) + BEGIN + ALTER DATABASE [Arizona] SET ENABLE_BROKER + END + END + + /* Create Atlas Route */ + IF NOT EXISTS (select 1 from sys.routes where name = '//ATLAS/' + @envtype + 'GALATLAS/Atlas') + BEGIN + + SET @ServiceName = '//ATLAS/' + @envtype + 'GALATLAS/AtlasDataCheckRequestService' + IF @envtype = 'P' + BEGIN + SET @RteAddress = 'TCP://atlas.centralinfra.net:4022' + END + ELSE + BEGIN + SET @RteAddress = 'TCP://atlas-dev.centralinfra.net:4022' + END + + SET @stmt = N'CREATE ROUTE [//ATLAS/' + @envtype + 'GALATLAS/Atlas] WITH SERVICE_NAME = ''' + @ServiceName + ''', ADDRESS=''' + @RteAddress + ''' ;' + EXEC(@stmt) + + END + + /* Create Ceres Route */ + IF NOT EXISTS (select 1 from sys.routes where name = '//GAIA/' + @envtype2 + 'GALCTP/Ceres') + BEGIN + + SET @ServiceName = '//GAIA/' + @envtype2 + 'GALCTP/CeresRequestService' + IF @envtype = 'P' + BEGIN + SET @RteAddress = 'TCP://SWGCMDB01.centralinfra.net:4022' + END + IF @envtype2 = 'T' + BEGIN + SET @RteAddress = 'TCP://triafin-test.centralinfra.net:4022' + END + IF @envtype2 = 'D' + BEGIN + SET @RteAddress = 'TCP://triafin-integration.centralinfra.net:4022' + END + + SET @stmt = N'CREATE ROUTE [//GAIA/' + @envtype2 + 'GALCTP/Ceres] WITH SERVICE_NAME = ''' + @ServiceName + ''', ADDRESS=''' + @RteAddress + ''' ;' + EXEC(@stmt) + + END + + /* Drop service ATLAS */ + SELECT @servicenamecheck = name FROM sys.services WHERE name like '%AtlasDataCheckProcessingService%' + + IF EXISTS (SELECT 1 from sys.services WHERE name = @servicenamecheck) + BEGIN + EXEC('DROP SERVICE [' + @servicenamecheck +']') + END + + /* Drop contract ATLAS */ + IF EXISTS (SELECT 1 from sys.service_contracts WHERE name = 'AtlasDataCheckContract') + BEGIN + DROP CONTRACT AtlasDataCheckContract + END + + /* DROP AND CREATE MESSAGES ATLAS */ + IF EXISTS (SELECT 1 from sys.service_message_types WHERE name = 'AtlasDataCheckSenderMessageType') + BEGIN + DROP MESSAGE TYPE [AtlasDataCheckSenderMessageType] + END + + IF NOT EXISTS (SELECT 1 from sys.service_message_types WHERE name = 'AtlasDataCheckSenderMessageType') + BEGIN + CREATE MESSAGE TYPE AtlasDataCheckSenderMessageType validation=well_formed_xml + END + + IF EXISTS (SELECT 1 from sys.service_message_types WHERE name = 'AtlasDataCheckReceiverMessageType') + BEGIN + DROP MESSAGE TYPE [AtlasDataCheckReceiverMessageType] + END + + IF NOT EXISTS (SELECT 1 from sys.service_message_types WHERE name = 'AtlasDataCheckReceiverMessageType') + BEGIN + CREATE MESSAGE TYPE AtlasDataCheckReceiverMessageType validation=well_formed_xml + END + + /* CREATE CONTRACT ATLAS */ + IF NOT EXISTS (SELECT 1 FROM sys.service_contracts WHERE name = 'AtlasDataCheckContract') + BEGIN + CREATE CONTRACT AtlasDataCheckContract + ( + AtlasDataCheckSenderMessageType SENT BY INITIATOR, + AtlasDataCheckReceiverMessageType SENT BY TARGET + ) + END + + /* DROP AND CREATE QUEUE ATLAS */ + IF EXISTS (SELECT 1 from sys.service_queues WHERE name = 'AtlasDataCheckProcessingQueue') + BEGIN + DROP QUEUE AtlasDataCheckProcessingQueue + END + + IF NOT EXISTS (SELECT 1 from sys.service_queues WHERE name = 'AtlasDataCheckProcessingQueue') + BEGIN + CREATE QUEUE AtlasDataCheckProcessingQueue + WITH STATUS = ON , + ACTIVATION ( + STATUS = ON , + PROCEDURE_NAME = [atl].[ProcessCheckData] , + MAX_QUEUE_READERS = 10 , + EXECUTE AS SELF + ) + END + + /* CREATE SERVICE ATLAS */ + SET @servicenamecheck = '//' + @format+@ou + 'APS/APSSQL/AtlasDataCheckProcessingService' + + IF NOT EXISTS (SELECT 1 FROM sys.service_contracts WHERE name = @servicenamecheck) + BEGIN + EXEC('CREATE SERVICE [' + @servicenamecheck + '] ON QUEUE AtlasDataCheckProcessingQueue (AtlasDataCheckContract)') + END + + /* SET SECURITY ATLAS */ + EXEC('GRANT SEND on service::[' + @servicenamecheck + '] TO PUBLIC') + + + + + /* Drop service CERES */ + SELECT @servicenamecheck = name FROM sys.services WHERE name like '%CeresProcessingService%' + + IF EXISTS (SELECT 1 from sys.services WHERE name = @servicenamecheck) + BEGIN + EXEC('DROP SERVICE [' + @servicenamecheck +']') + END + + /* Drop contract CERES */ + IF EXISTS (SELECT 1 from sys.service_contracts WHERE name = 'CeresContract') + BEGIN + DROP CONTRACT CeresContract + END + + /* DROP AND CREATE MESSAGES CERES */ + IF EXISTS (SELECT 1 from sys.service_message_types WHERE name = 'CeresSenderMessageType') + BEGIN + DROP MESSAGE TYPE [CeresSenderMessageType] + END + + IF NOT EXISTS (SELECT 1 from sys.service_message_types WHERE name = 'CeresSenderMessageType') + BEGIN + CREATE MESSAGE TYPE CeresSenderMessageType validation=well_formed_xml + END + + IF EXISTS (SELECT 1 from sys.service_message_types WHERE name = 'CeresReceiverMessageType') + BEGIN + DROP MESSAGE TYPE [CeresReceiverMessageType] + END + + IF NOT EXISTS (SELECT 1 from sys.service_message_types WHERE name = 'CeresReceiverMessageType') + BEGIN + CREATE MESSAGE TYPE CeresReceiverMessageType validation=well_formed_xml + END + + /* CREATE CONTRACT CERES */ + IF NOT EXISTS (SELECT 1 FROM sys.service_contracts WHERE name = 'CeresContract') + BEGIN + CREATE CONTRACT CeresContract + ( + CeresSenderMessageType SENT BY INITIATOR, + CeresReceiverMessageType SENT BY TARGET + ) + END + + /* DROP AND CREATE QUEUE CERES */ + IF EXISTS (SELECT 1 from sys.service_queues WHERE name = 'CeresProcessingQueue') + BEGIN + DROP QUEUE CeresProcessingQueue + END + + IF NOT EXISTS (SELECT 1 from sys.service_queues WHERE name = 'CeresProcessingQueue') + BEGIN + CREATE QUEUE CeresProcessingQueue + WITH STATUS = ON , + ACTIVATION ( + STATUS = ON , + PROCEDURE_NAME = [crs].[ProcessRequest] , + MAX_QUEUE_READERS = 10 , + EXECUTE AS SELF + ) + END + + /* CREATE SERVICE CERES */ + SET @servicenamecheck = '//' + @format+@ou + 'APS/APSSQL/CeresProcessingService' + + IF NOT EXISTS (SELECT 1 FROM sys.service_contracts WHERE name = @servicenamecheck) + BEGIN + EXEC('CREATE SERVICE [' + @servicenamecheck + '] ON QUEUE CeresProcessingQueue (CeresContract)') + END + + /* SET SECURITY ATLAS */ + EXEC('GRANT SEND on service::[' + @servicenamecheck + '] TO PUBLIC') + + END +END diff --git a/TPDT-268 - ACP in task sequence/13_Create_AD_Logins.sql b/TPDT-268 - ACP in task sequence/13_Create_AD_Logins.sql new file mode 100644 index 0000000..f29301e --- /dev/null +++ b/TPDT-268 - ACP in task sequence/13_Create_AD_Logins.sql @@ -0,0 +1,12 @@ +/* +TSC 27.12.2023 Removed managmenent of login centralinfra\L-CP-GL-AP-ATLAS-SQL-WSVC1 (related to centralPharma domain, which doesn't exists anymore) +*/ + +USE [master] +GO + +IF EXISTS(SELECT 1 FROM SYS.syslogins WHERE name = 'BUILTIN\Administrators') +BEGIN + DROP LOGIN [BUILTIN\Administrators] +END +GO diff --git a/TPDT-268 - ACP in task sequence/14_Update_Security.sql b/TPDT-268 - ACP in task sequence/14_Update_Security.sql new file mode 100644 index 0000000..1d45fe4 --- /dev/null +++ b/TPDT-268 - ACP in task sequence/14_Update_Security.sql @@ -0,0 +1,35682 @@ +CREATE TABLE #AllRoles(STR_Definition VARCHAR(MAX), STR_Database VARCHAR(255), STR_Product VARCHAR(255)) + +INSERT INTO #AllRoles(STR_Definition,STR_Database,STR_Product)VALUES(' + +/*============================================================================= + + Script to create dbRoleActivePharmacy role. + + Role Name: dbRoleActivePharmacy + TEMPLATE: Default + + EXAMPLE OF SECURABLES TO SET: + + INSERT INTO #Securables + VALUES + (''DB'',''GRANT'',''VIEW DEFINITION'','''',''''), + (''SCHEMA'',''GRANT'',''SELECT,EXECUTE,INSERT,UPDATE,DELETE'','''',''AP''), + (''TABLE'',''GRANT'',''INSERT,UPDATE'',''Address'',''dbo''), + (''SP'',''GRANT'',''EXECUTE'',''sp_bmc_GetNextID'',''dbo''), + (''ROLE'',''GRANT'',''db_datareader'','''','''') + + ----------------------------------------------- + +Generate date : 2023-05-12 / up208700 + +=============================================================================*/ + +DECLARE @Command nvarchar(max), + @RoleName varchar(60), + @Users varchar(255), + @typeofobject varchar(50), + @grantordeny varchar(10), + @rightsaction varchar(255), + @objectname varchar(255), + @schemaid varchar(10), + @sysTarget varchar(255), + @sysType varchar(255) + +SET @RoleName = ''dbRoleActivePharmacy'' +SET @Command = '''' + +/* TEMP TABLES */ +CREATE TABLE #UsersOnRole(username varchar(255)) +CREATE TABLE #Securables(typeofobject varchar(50), grantordeny varchar(10), rightsaction varchar(255), objectname varchar(255), schemaid varchar(10),N2 bit) + +/* !!! LIST OF SECURABLES TO CHANGE !!! */ + +INSERT INTO #Securables +VALUES +(''ROLE'',''GRANT'',''DB_OWNER'','''',''dbo'',0) + + +/* GET ALL USERS ON THIS ROLE */ +INSERT INTO #UsersOnRole +SELECT + members.name +FROM sys.database_role_members + JOIN sys.database_principals roles ON database_role_members.role_principal_id = roles.principal_id + JOIN sys.database_principals members ON database_role_members.member_principal_id = members.principal_id +WHERE roles.name = @RoleName + +/* CREATE ROLE */ +SELECT @Command = '' +IF NOT EXISTS (SELECT 1 FROM sys.database_principals WHERE name = '''''' + @RoleName + '''''' AND type = ''''R'''') +BEGIN + CREATE ROLE ['' + @RoleName + ''] AUTHORIZATION [dbo] + PRINT ''''CREATE ROLE ['' + @RoleName + '']'''' +END +'' +EXEC sp_executesql @Command + +SET @Command = '' +DECLARE @SP_Name varchar(255) + +'' + +/* SET ALL ROLE SECURABLES */ +DECLARE SecurablesCurs CURSOR FOR +SELECT typeofobject, grantordeny, rightsaction, objectname, schemaid +FROM #Securables +WHERE N2 = 0 + +OPEN SecurablesCurs +FETCH NEXT FROM SecurablesCurs INTO @typeofobject, @grantordeny, @rightsaction, @objectname, @schemaid +WHILE @@FETCH_STATUS = 0 +BEGIN + + IF @typeofobject = ''DB'' + BEGIN + IF EXISTS(SELECT 1 FROM sys.fn_builtin_permissions(''DATABASE'') WHERE permission_name = '''' + @rightsaction + '''') + BEGIN + SET @Command = @Command + @grantordeny + '' '' + @rightsaction + '' TO ['' + @RoleName + ''] +'' + END + END + + IF @typeofobject = ''SCHEMA'' + BEGIN + SET @Command = @Command + '' +IF EXISTS (SELECT 1 FROM sys.schemas WHERE name = '''''' + @schemaid + '''''') +BEGIN + IF EXISTS(SELECT 1 FROM sys.fn_builtin_permissions(''''SCHEMA'''') WHERE permission_name = '''''' + @rightsaction + '''''') + BEGIN + '' + @grantordeny + '' '' + @rightsaction + '' ON SCHEMA::'' + @schemaid + '' TO ['' + @RoleName + ''] + END +END + +'' + END + + IF @typeofobject in(''TABLE'',''SP'',''FUNCTIONS'',''VIEWS'') + BEGIN + + IF @objectname like ''%[%]%'' + BEGIN + + IF @typeofobject = ''TABLE'' + BEGIN + SET @sysTarget = ''sys.tables'' + SET @sysType = '''' + END + + IF @typeofobject = ''SP'' + BEGIN + SET @sysTarget = ''sys.procedures'' + SET @sysType = '''' + END + + IF @typeofobject = ''FUNCTIONS'' + BEGIN + SET @sysTarget = ''sys.objects'' + SET @sysType = '' and p.Type IN ( N''''FN'''', N''''IF'''', N''''TF'''', N''''FS'''', N''''FT'''' )'' + END + + IF @typeofobject = ''VIEWS'' + BEGIN + SET @sysTarget = ''sys.views'' + SET @sysType = '''' + END + + SET @Command = @Command + '' +DECLARE SP_cursor CURSOR FOR +SELECT p.name FROM '' + @sysTarget + '' p JOIN sys.schemas s ON s.schema_id = p.schema_id WHERE (p.name like '''''' + @objectname + '''''') and s.name = '''''' + @schemaid + '''' + @sysType + '''''' + +OPEN SP_cursor +FETCH NEXT FROM SP_cursor INTO @SP_Name +WHILE @@FETCH_STATUS = 0 +BEGIN + IF EXISTS(SELECT 1 FROM sys.fn_builtin_permissions(''''OBJECT'''') WHERE permission_name = '''''' + @rightsaction + '''''') + BEGIN + EXEC('''''' + @grantordeny + '' '' + @rightsaction + '' ON ['' + @schemaid + ''].['''' + @SP_Name + ''''] TO ['' + @RoleName + '']'''') + END + FETCH NEXT FROM SP_cursor INTO @SP_Name +END + +CLOSE SP_cursor +DEALLOCATE SP_cursor + +'' + + END + ELSE + BEGIN + + SET @Command = @Command + '' +IF EXISTS(SELECT 1 FROM sys.objects o WITH (NOLOCK) JOIN sys.schemas s ON s.schema_id = o.schema_id WHERE o.name = '''''' + @objectname + '''''' AND o.type IN (N''''U'''',''''P'''',''''V'''',''''FN'''',''''IF'''',''''TF'''') AND s.name = '''''' + @schemaid + '''''') +BEGIN + IF EXISTS(SELECT 1 FROM sys.fn_builtin_permissions(''''OBJECT'''') WHERE permission_name = '''''' + @rightsaction + '''''') + BEGIN + '' + @grantordeny + '' '' + @rightsaction + '' ON ['' + @schemaid + ''].['' + @objectname + ''] TO ['' + @RoleName + ''] + END +END + +'' + END +END + +IF @typeofobject = ''ASSEMBLIES'' +BEGIN + SET @Command = @Command + '' +IF EXISTS(SELECT 1 FROM sys.assemblies WHERE NAME = '''''' + @objectname + '''''') +BEGIN + IF EXISTS(SELECT 1 FROM sys.fn_builtin_permissions(''''ASSEMBLY'''') WHERE permission_name = '''''' + @rightsaction + '''''') + BEGIN + '' + @grantordeny + '' '' + @rightsaction + ''::['' + @objectname + ''] TO ['' + @RoleName + ''] + END +END + +'' +END + +IF @typeofobject = ''ROLE'' +BEGIN + SET @Command = @Command + '' +IF NOT EXISTS (SELECT 1 FROM sys.database_role_members JOIN sys.database_principals roles ON database_role_members.role_principal_id = roles.principal_id JOIN sys.database_principals members ON database_role_members.member_principal_id = members.principal_id WHERE roles.name = '''''' + @rightsaction + '''''' AND members.name = '''''' + @RoleName + '''''') +BEGIN + EXEC sp_addrolemember N'''''' + @rightsaction + '''''', N'''''' + @RoleName + '''''' +END + +'' +END + +FETCH NEXT FROM SecurablesCurs INTO @typeofobject, @grantordeny, @rightsaction, @objectname, @schemaid +END + +CLOSE SecurablesCurs +DEALLOCATE SecurablesCurs + +PRINT ''SET ALL SECURABLES ON ROLE ['' + @RoleName + '']'' +EXEC sp_executesql @Command + +/* ADD USER */ +DECLARE UsersCurs CURSOR FOR +SELECT username + FROM #UsersOnRole + +OPEN UsersCurs + +FETCH NEXT FROM UsersCurs INTO @Users +WHILE @@FETCH_STATUS = 0 +BEGIN + + SELECT @Command = '' +EXEC sp_addrolemember N'''''' + @RoleName + '''''', N'''''' + @Users + '''''' +PRINT ''''ADD USER ['' + @Users + ''] ON ROLE ['' + @RoleName + '']'''' +'' + +FETCH NEXT FROM UsersCurs INTO @Users +END + +CLOSE UsersCurs +DEALLOCATE UsersCurs + +EXEC sp_executesql @Command + + +/*============================================================================= + Drop temp tables +=============================================================================*/ +DROP TABLE #Securables +DROP TABLE #UsersOnRole +','ActivePos_read','Pharmacies') + +INSERT INTO #AllRoles(STR_Definition,STR_Database,STR_Product)VALUES(' + +/*============================================================================= + + Script to create dbRoleCsltUsr role. + + Role Name: dbRoleCsltUsr + TEMPLATE: Default + + EXAMPLE OF SECURABLES TO SET: + + INSERT INTO #Securables + VALUES + (''DB'',''GRANT'',''VIEW DEFINITION'','''',''''), + (''SCHEMA'',''GRANT'',''SELECT,EXECUTE,INSERT,UPDATE,DELETE'','''',''AP''), + (''TABLE'',''GRANT'',''INSERT,UPDATE'',''Address'',''dbo''), + (''SP'',''GRANT'',''EXECUTE'',''sp_bmc_GetNextID'',''dbo''), + (''ROLE'',''GRANT'',''db_datareader'','''','''') + + ----------------------------------------------- + +Generate date : 2023-05-12 / up208700 + +=============================================================================*/ + +DECLARE @Command nvarchar(max), + @RoleName varchar(60), + @Users varchar(255), + @typeofobject varchar(50), + @grantordeny varchar(10), + @rightsaction varchar(255), + @objectname varchar(255), + @schemaid varchar(10), + @sysTarget varchar(255), + @sysType varchar(255) + +SET @RoleName = ''dbRoleCsltUsr'' +SET @Command = '''' + +/* TEMP TABLES */ +CREATE TABLE #UsersOnRole(username varchar(255)) +CREATE TABLE #Securables(typeofobject varchar(50), grantordeny varchar(10), rightsaction varchar(255), objectname varchar(255), schemaid varchar(10),N2 bit) + +/* !!! LIST OF SECURABLES TO CHANGE !!! */ + +INSERT INTO #Securables +VALUES +(''DB'',''GRANT'',''EXECUTE'','''',''dbo'',0) +,(''DB'',''GRANT'',''SHOWPLAN'','''',''dbo'',0) +,(''DB'',''GRANT'',''VIEW DEFINITION'','''',''dbo'',0) +,(''ROLE'',''GRANT'',''DB_DATAREADER'','''',''dbo'',0) +,(''ROLE'',''GRANT'',''DB_DATAWRITER'','''',''dbo'',0) +,(''ROLE'',''GRANT'',''DB_OWNER'','''',''dbo'',1) + + +/* GET ALL USERS ON THIS ROLE */ +INSERT INTO #UsersOnRole +SELECT + members.name +FROM sys.database_role_members + JOIN sys.database_principals roles ON database_role_members.role_principal_id = roles.principal_id + JOIN sys.database_principals members ON database_role_members.member_principal_id = members.principal_id +WHERE roles.name = @RoleName + +/* CREATE ROLE */ +SELECT @Command = '' +IF NOT EXISTS (SELECT 1 FROM sys.database_principals WHERE name = '''''' + @RoleName + '''''' AND type = ''''R'''') +BEGIN + CREATE ROLE ['' + @RoleName + ''] AUTHORIZATION [dbo] + PRINT ''''CREATE ROLE ['' + @RoleName + '']'''' +END +'' +EXEC sp_executesql @Command + +SET @Command = '' +DECLARE @SP_Name varchar(255) + +'' + +/* SET ALL ROLE SECURABLES */ +DECLARE SecurablesCurs CURSOR FOR +SELECT typeofobject, grantordeny, rightsaction, objectname, schemaid +FROM #Securables +WHERE N2 = 0 + +OPEN SecurablesCurs +FETCH NEXT FROM SecurablesCurs INTO @typeofobject, @grantordeny, @rightsaction, @objectname, @schemaid +WHILE @@FETCH_STATUS = 0 +BEGIN + + IF @typeofobject = ''DB'' + BEGIN + IF EXISTS(SELECT 1 FROM sys.fn_builtin_permissions(''DATABASE'') WHERE permission_name = '''' + @rightsaction + '''') + BEGIN + SET @Command = @Command + @grantordeny + '' '' + @rightsaction + '' TO ['' + @RoleName + ''] +'' + END + END + + IF @typeofobject = ''SCHEMA'' + BEGIN + SET @Command = @Command + '' +IF EXISTS (SELECT 1 FROM sys.schemas WHERE name = '''''' + @schemaid + '''''') +BEGIN + IF EXISTS(SELECT 1 FROM sys.fn_builtin_permissions(''''SCHEMA'''') WHERE permission_name = '''''' + @rightsaction + '''''') + BEGIN + '' + @grantordeny + '' '' + @rightsaction + '' ON SCHEMA::'' + @schemaid + '' TO ['' + @RoleName + ''] + END +END + +'' + END + + IF @typeofobject in(''TABLE'',''SP'',''FUNCTIONS'',''VIEWS'') + BEGIN + + IF @objectname like ''%[%]%'' + BEGIN + + IF @typeofobject = ''TABLE'' + BEGIN + SET @sysTarget = ''sys.tables'' + SET @sysType = '''' + END + + IF @typeofobject = ''SP'' + BEGIN + SET @sysTarget = ''sys.procedures'' + SET @sysType = '''' + END + + IF @typeofobject = ''FUNCTIONS'' + BEGIN + SET @sysTarget = ''sys.objects'' + SET @sysType = '' and p.Type IN ( N''''FN'''', N''''IF'''', N''''TF'''', N''''FS'''', N''''FT'''' )'' + END + + IF @typeofobject = ''VIEWS'' + BEGIN + SET @sysTarget = ''sys.views'' + SET @sysType = '''' + END + + SET @Command = @Command + '' +DECLARE SP_cursor CURSOR FOR +SELECT p.name FROM '' + @sysTarget + '' p JOIN sys.schemas s ON s.schema_id = p.schema_id WHERE (p.name like '''''' + @objectname + '''''') and s.name = '''''' + @schemaid + '''' + @sysType + '''''' + +OPEN SP_cursor +FETCH NEXT FROM SP_cursor INTO @SP_Name +WHILE @@FETCH_STATUS = 0 +BEGIN + IF EXISTS(SELECT 1 FROM sys.fn_builtin_permissions(''''OBJECT'''') WHERE permission_name = '''''' + @rightsaction + '''''') + BEGIN + EXEC('''''' + @grantordeny + '' '' + @rightsaction + '' ON ['' + @schemaid + ''].['''' + @SP_Name + ''''] TO ['' + @RoleName + '']'''') + END + FETCH NEXT FROM SP_cursor INTO @SP_Name +END + +CLOSE SP_cursor +DEALLOCATE SP_cursor + +'' + + END + ELSE + BEGIN + + SET @Command = @Command + '' +IF EXISTS(SELECT 1 FROM sys.objects o WITH (NOLOCK) JOIN sys.schemas s ON s.schema_id = o.schema_id WHERE o.name = '''''' + @objectname + '''''' AND o.type IN (N''''U'''',''''P'''',''''V'''',''''FN'''',''''IF'''',''''TF'''') AND s.name = '''''' + @schemaid + '''''') +BEGIN + IF EXISTS(SELECT 1 FROM sys.fn_builtin_permissions(''''OBJECT'''') WHERE permission_name = '''''' + @rightsaction + '''''') + BEGIN + '' + @grantordeny + '' '' + @rightsaction + '' ON ['' + @schemaid + ''].['' + @objectname + ''] TO ['' + @RoleName + ''] + END +END + +'' + END +END + +IF @typeofobject = ''ASSEMBLIES'' +BEGIN + SET @Command = @Command + '' +IF EXISTS(SELECT 1 FROM sys.assemblies WHERE NAME = '''''' + @objectname + '''''') +BEGIN + IF EXISTS(SELECT 1 FROM sys.fn_builtin_permissions(''''ASSEMBLY'''') WHERE permission_name = '''''' + @rightsaction + '''''') + BEGIN + '' + @grantordeny + '' '' + @rightsaction + ''::['' + @objectname + ''] TO ['' + @RoleName + ''] + END +END + +'' +END + +IF @typeofobject = ''ROLE'' +BEGIN + SET @Command = @Command + '' +IF NOT EXISTS (SELECT 1 FROM sys.database_role_members JOIN sys.database_principals roles ON database_role_members.role_principal_id = roles.principal_id JOIN sys.database_principals members ON database_role_members.member_principal_id = members.principal_id WHERE roles.name = '''''' + @rightsaction + '''''' AND members.name = '''''' + @RoleName + '''''') +BEGIN + EXEC sp_addrolemember N'''''' + @rightsaction + '''''', N'''''' + @RoleName + '''''' +END + +'' +END + +FETCH NEXT FROM SecurablesCurs INTO @typeofobject, @grantordeny, @rightsaction, @objectname, @schemaid +END + +CLOSE SecurablesCurs +DEALLOCATE SecurablesCurs + +PRINT ''SET ALL SECURABLES ON ROLE ['' + @RoleName + '']'' +EXEC sp_executesql @Command + +/* ADD USER */ +DECLARE UsersCurs CURSOR FOR +SELECT username + FROM #UsersOnRole + +OPEN UsersCurs + +FETCH NEXT FROM UsersCurs INTO @Users +WHILE @@FETCH_STATUS = 0 +BEGIN + + SELECT @Command = '' +EXEC sp_addrolemember N'''''' + @RoleName + '''''', N'''''' + @Users + '''''' +PRINT ''''ADD USER ['' + @Users + ''] ON ROLE ['' + @RoleName + '']'''' +'' + +FETCH NEXT FROM UsersCurs INTO @Users +END + +CLOSE UsersCurs +DEALLOCATE UsersCurs + +EXEC sp_executesql @Command + + +/*============================================================================= + Drop temp tables +=============================================================================*/ +DROP TABLE #Securables +DROP TABLE #UsersOnRole +','ActivePos_read','Pharmacies') + +INSERT INTO #AllRoles(STR_Definition,STR_Database,STR_Product)VALUES(' + +/*============================================================================= + + Script to create dbRoleDevUsr role. + + Role Name: dbRoleDevUsr + TEMPLATE: Default + + EXAMPLE OF SECURABLES TO SET: + + INSERT INTO #Securables + VALUES + (''DB'',''GRANT'',''VIEW DEFINITION'','''',''''), + (''SCHEMA'',''GRANT'',''SELECT,EXECUTE,INSERT,UPDATE,DELETE'','''',''AP''), + (''TABLE'',''GRANT'',''INSERT,UPDATE'',''Address'',''dbo''), + (''SP'',''GRANT'',''EXECUTE'',''sp_bmc_GetNextID'',''dbo''), + (''ROLE'',''GRANT'',''db_datareader'','''','''') + + ----------------------------------------------- + +Generate date : 2023-05-12 / up208700 + +=============================================================================*/ + +DECLARE @Command nvarchar(max), + @RoleName varchar(60), + @Users varchar(255), + @typeofobject varchar(50), + @grantordeny varchar(10), + @rightsaction varchar(255), + @objectname varchar(255), + @schemaid varchar(10), + @sysTarget varchar(255), + @sysType varchar(255) + +SET @RoleName = ''dbRoleDevUsr'' +SET @Command = '''' + +/* TEMP TABLES */ +CREATE TABLE #UsersOnRole(username varchar(255)) +CREATE TABLE #Securables(typeofobject varchar(50), grantordeny varchar(10), rightsaction varchar(255), objectname varchar(255), schemaid varchar(10),N2 bit) + +/* !!! LIST OF SECURABLES TO CHANGE !!! */ + +INSERT INTO #Securables +VALUES +(''DB'',''GRANT'',''EXECUTE'','''',''dbo'',0) +,(''DB'',''GRANT'',''SHOWPLAN'','''',''dbo'',0) +,(''DB'',''GRANT'',''VIEW DEFINITION'','''',''dbo'',0) +,(''ROLE'',''GRANT'',''DB_DATAREADER'','''',''dbo'',0) +,(''ROLE'',''GRANT'',''DB_DATAWRITER'','''',''dbo'',0) + + +/* GET ALL USERS ON THIS ROLE */ +INSERT INTO #UsersOnRole +SELECT + members.name +FROM sys.database_role_members + JOIN sys.database_principals roles ON database_role_members.role_principal_id = roles.principal_id + JOIN sys.database_principals members ON database_role_members.member_principal_id = members.principal_id +WHERE roles.name = @RoleName + +/* CREATE ROLE */ +SELECT @Command = '' +IF NOT EXISTS (SELECT 1 FROM sys.database_principals WHERE name = '''''' + @RoleName + '''''' AND type = ''''R'''') +BEGIN + CREATE ROLE ['' + @RoleName + ''] AUTHORIZATION [dbo] + PRINT ''''CREATE ROLE ['' + @RoleName + '']'''' +END +'' +EXEC sp_executesql @Command + +SET @Command = '' +DECLARE @SP_Name varchar(255) + +'' + +/* SET ALL ROLE SECURABLES */ +DECLARE SecurablesCurs CURSOR FOR +SELECT typeofobject, grantordeny, rightsaction, objectname, schemaid +FROM #Securables +WHERE N2 = 0 + +OPEN SecurablesCurs +FETCH NEXT FROM SecurablesCurs INTO @typeofobject, @grantordeny, @rightsaction, @objectname, @schemaid +WHILE @@FETCH_STATUS = 0 +BEGIN + + IF @typeofobject = ''DB'' + BEGIN + IF EXISTS(SELECT 1 FROM sys.fn_builtin_permissions(''DATABASE'') WHERE permission_name = '''' + @rightsaction + '''') + BEGIN + SET @Command = @Command + @grantordeny + '' '' + @rightsaction + '' TO ['' + @RoleName + ''] +'' + END + END + + IF @typeofobject = ''SCHEMA'' + BEGIN + SET @Command = @Command + '' +IF EXISTS (SELECT 1 FROM sys.schemas WHERE name = '''''' + @schemaid + '''''') +BEGIN + IF EXISTS(SELECT 1 FROM sys.fn_builtin_permissions(''''SCHEMA'''') WHERE permission_name = '''''' + @rightsaction + '''''') + BEGIN + '' + @grantordeny + '' '' + @rightsaction + '' ON SCHEMA::'' + @schemaid + '' TO ['' + @RoleName + ''] + END +END + +'' + END + + IF @typeofobject in(''TABLE'',''SP'',''FUNCTIONS'',''VIEWS'') + BEGIN + + IF @objectname like ''%[%]%'' + BEGIN + + IF @typeofobject = ''TABLE'' + BEGIN + SET @sysTarget = ''sys.tables'' + SET @sysType = '''' + END + + IF @typeofobject = ''SP'' + BEGIN + SET @sysTarget = ''sys.procedures'' + SET @sysType = '''' + END + + IF @typeofobject = ''FUNCTIONS'' + BEGIN + SET @sysTarget = ''sys.objects'' + SET @sysType = '' and p.Type IN ( N''''FN'''', N''''IF'''', N''''TF'''', N''''FS'''', N''''FT'''' )'' + END + + IF @typeofobject = ''VIEWS'' + BEGIN + SET @sysTarget = ''sys.views'' + SET @sysType = '''' + END + + SET @Command = @Command + '' +DECLARE SP_cursor CURSOR FOR +SELECT p.name FROM '' + @sysTarget + '' p JOIN sys.schemas s ON s.schema_id = p.schema_id WHERE (p.name like '''''' + @objectname + '''''') and s.name = '''''' + @schemaid + '''' + @sysType + '''''' + +OPEN SP_cursor +FETCH NEXT FROM SP_cursor INTO @SP_Name +WHILE @@FETCH_STATUS = 0 +BEGIN + IF EXISTS(SELECT 1 FROM sys.fn_builtin_permissions(''''OBJECT'''') WHERE permission_name = '''''' + @rightsaction + '''''') + BEGIN + EXEC('''''' + @grantordeny + '' '' + @rightsaction + '' ON ['' + @schemaid + ''].['''' + @SP_Name + ''''] TO ['' + @RoleName + '']'''') + END + FETCH NEXT FROM SP_cursor INTO @SP_Name +END + +CLOSE SP_cursor +DEALLOCATE SP_cursor + +'' + + END + ELSE + BEGIN + + SET @Command = @Command + '' +IF EXISTS(SELECT 1 FROM sys.objects o WITH (NOLOCK) JOIN sys.schemas s ON s.schema_id = o.schema_id WHERE o.name = '''''' + @objectname + '''''' AND o.type IN (N''''U'''',''''P'''',''''V'''',''''FN'''',''''IF'''',''''TF'''') AND s.name = '''''' + @schemaid + '''''') +BEGIN + IF EXISTS(SELECT 1 FROM sys.fn_builtin_permissions(''''OBJECT'''') WHERE permission_name = '''''' + @rightsaction + '''''') + BEGIN + '' + @grantordeny + '' '' + @rightsaction + '' ON ['' + @schemaid + ''].['' + @objectname + ''] TO ['' + @RoleName + ''] + END +END + +'' + END +END + +IF @typeofobject = ''ASSEMBLIES'' +BEGIN + SET @Command = @Command + '' +IF EXISTS(SELECT 1 FROM sys.assemblies WHERE NAME = '''''' + @objectname + '''''') +BEGIN + IF EXISTS(SELECT 1 FROM sys.fn_builtin_permissions(''''ASSEMBLY'''') WHERE permission_name = '''''' + @rightsaction + '''''') + BEGIN + '' + @grantordeny + '' '' + @rightsaction + ''::['' + @objectname + ''] TO ['' + @RoleName + ''] + END +END + +'' +END + +IF @typeofobject = ''ROLE'' +BEGIN + SET @Command = @Command + '' +IF NOT EXISTS (SELECT 1 FROM sys.database_role_members JOIN sys.database_principals roles ON database_role_members.role_principal_id = roles.principal_id JOIN sys.database_principals members ON database_role_members.member_principal_id = members.principal_id WHERE roles.name = '''''' + @rightsaction + '''''' AND members.name = '''''' + @RoleName + '''''') +BEGIN + EXEC sp_addrolemember N'''''' + @rightsaction + '''''', N'''''' + @RoleName + '''''' +END + +'' +END + +FETCH NEXT FROM SecurablesCurs INTO @typeofobject, @grantordeny, @rightsaction, @objectname, @schemaid +END + +CLOSE SecurablesCurs +DEALLOCATE SecurablesCurs + +PRINT ''SET ALL SECURABLES ON ROLE ['' + @RoleName + '']'' +EXEC sp_executesql @Command + +/* ADD USER */ +DECLARE UsersCurs CURSOR FOR +SELECT username + FROM #UsersOnRole + +OPEN UsersCurs + +FETCH NEXT FROM UsersCurs INTO @Users +WHILE @@FETCH_STATUS = 0 +BEGIN + + SELECT @Command = '' +EXEC sp_addrolemember N'''''' + @RoleName + '''''', N'''''' + @Users + '''''' +PRINT ''''ADD USER ['' + @Users + ''] ON ROLE ['' + @RoleName + '']'''' +'' + +FETCH NEXT FROM UsersCurs INTO @Users +END + +CLOSE UsersCurs +DEALLOCATE UsersCurs + +EXEC sp_executesql @Command + + +/*============================================================================= + Drop temp tables +=============================================================================*/ +DROP TABLE #Securables +DROP TABLE #UsersOnRole +','ActivePos_read','Pharmacies') + +INSERT INTO #AllRoles(STR_Definition,STR_Database,STR_Product)VALUES(' + +/*============================================================================= + + Script to create dbRoleIttechUsr role. + + Role Name: dbRoleIttechUsr + TEMPLATE: N2 and PROD + + EXAMPLE OF SECURABLES TO SET: + + INSERT INTO #Securables + VALUES + (''DB'',''GRANT'',''VIEW DEFINITION'','''',''''), + (''SCHEMA'',''GRANT'',''SELECT,EXECUTE,INSERT,UPDATE,DELETE'','''',''AP''), + (''TABLE'',''GRANT'',''INSERT,UPDATE'',''Address'',''dbo''), + (''SP'',''GRANT'',''EXECUTE'',''sp_bmc_GetNextID'',''dbo''), + (''ROLE'',''GRANT'',''db_datareader'','''','''') + + ----------------------------------------------- + +Generate date : 2023-05-12 / up208700 + +=============================================================================*/ + +DECLARE @Type varchar(6), + @Command nvarchar(max), + @RoleName varchar(60), + @Users varchar(255), + @typeofobject varchar(50), + @grantordeny varchar(10), + @rightsaction varchar(255), + @objectname varchar(255), + @schemaid varchar(10), + @sysTarget varchar(255), + @sysType varchar(255) + +SET @RoleName = ''dbRoleIttechUsr'' +SET @Command = '''' + +SELECT @Type = [Type] FROM [master].[cfg].[InstanceContext] + +/* TEMP TABLES */ +CREATE TABLE #UsersOnRole(username varchar(255)) +CREATE TABLE #Securables(typeofobject varchar(50), grantordeny varchar(10), rightsaction varchar(255), objectname varchar(255), schemaid varchar(10),N2 bit) + +/* !!! LIST OF SECURABLES TO CHANGE !!! */ + +INSERT INTO #Securables +VALUES +(''ROLE'',''GRANT'',''DB_OWNER'','''',''dbo'',0) +,(''ROLE'',''GRANT'',''DB_OWNER'','''',''dbo'',1) + + +/* GET ALL USERS ON THIS ROLE */ +INSERT INTO #UsersOnRole +SELECT + members.name +FROM sys.database_role_members + JOIN sys.database_principals roles ON database_role_members.role_principal_id = roles.principal_id + JOIN sys.database_principals members ON database_role_members.member_principal_id = members.principal_id +WHERE roles.name = @RoleName + +/* CREATE ROLE */ +SELECT @Command = '' +IF NOT EXISTS (SELECT 1 FROM sys.database_principals WHERE name = '''''' + @RoleName + '''''' AND type = ''''R'''') +BEGIN + CREATE ROLE ['' + @RoleName + ''] AUTHORIZATION [dbo] + PRINT ''''CREATE ROLE ['' + @RoleName + '']'''' +END +'' +EXEC sp_executesql @Command + +SET @Command = '' +DECLARE @SP_Name varchar(255) + +'' + +/* SET ALL ROLE SECURABLES */ +IF @Type = ''DEVE'' +BEGIN + + DECLARE SecurablesCurs CURSOR FOR + SELECT typeofobject, grantordeny, rightsaction, objectname, schemaid + FROM #Securables + WHERE N2 = 1 + + OPEN SecurablesCurs + FETCH NEXT FROM SecurablesCurs INTO @typeofobject, @grantordeny, @rightsaction, @objectname, @schemaid + WHILE @@FETCH_STATUS = 0 + BEGIN + + IF @typeofobject = ''DB'' + BEGIN + IF EXISTS(SELECT 1 FROM sys.fn_builtin_permissions(''DATABASE'') WHERE permission_name = '''' + @rightsaction + '''') + BEGIN + SET @Command = @Command + @grantordeny + '' '' + @rightsaction + '' TO ['' + @RoleName + ''] +'' + END + END + + IF @typeofobject = ''SCHEMA'' + BEGIN + SET @Command = @Command + '' +IF EXISTS (SELECT 1 FROM sys.schemas WHERE name = '''''' + @schemaid + '''''') +BEGIN + IF EXISTS(SELECT 1 FROM sys.fn_builtin_permissions(''''SCHEMA'''') WHERE permission_name = '''''' + @rightsaction + '''''') + BEGIN + '' + @grantordeny + '' '' + @rightsaction + '' ON SCHEMA::'' + @schemaid + '' TO ['' + @RoleName + ''] + END +END + +'' + END + + IF @typeofobject in(''TABLE'',''SP'',''FUNCTIONS'',''VIEWS'') + BEGIN + + IF @objectname like ''%[%]%'' + BEGIN + IF @typeofobject = ''TABLE'' + BEGIN + SET @sysTarget = ''sys.tables'' + SET @sysType = '''' + END + + IF @typeofobject = ''SP'' + BEGIN + SET @sysTarget = ''sys.procedures'' + SET @sysType = '''' + END + + IF @typeofobject = ''FUNCTIONS'' + BEGIN + SET @sysTarget = ''sys.objects'' + SET @sysType = '' and p.Type IN ( N''''FN'''', N''''IF'''', N''''TF'''', N''''FS'''', N''''FT'''' )'' + END + + IF @typeofobject = ''VIEWS'' + BEGIN + SET @sysTarget = ''sys.views'' + SET @sysType = '''' + END + + SET @Command = @Command + '' +DECLARE SP_cursor CURSOR FOR +SELECT p.name FROM '' + @sysTarget + '' p JOIN sys.schemas s ON s.schema_id = p.schema_id WHERE (p.name like '''''' + @objectname + '''''') and s.name = '''''' + @schemaid + '''' + @sysType + '''''' + +OPEN SP_cursor +FETCH NEXT FROM SP_cursor INTO @SP_Name +WHILE @@FETCH_STATUS = 0 +BEGIN + IF EXISTS(SELECT 1 FROM sys.fn_builtin_permissions(''''OBJECT'''') WHERE permission_name = '''''' + @rightsaction + '''''') + BEGIN + EXEC('''''' + @grantordeny + '' '' + @rightsaction + '' ON ['' + @schemaid + ''].['''' + @SP_Name + ''''] TO ['' + @RoleName + '']'''') + END + FETCH NEXT FROM SP_cursor INTO @SP_Name +END + +CLOSE SP_cursor +DEALLOCATE SP_cursor + +'' + + END + ELSE + BEGIN + + SET @Command = @Command + '' +IF EXISTS(SELECT 1 FROM sys.objects o WITH (NOLOCK) JOIN sys.schemas s ON s.schema_id = o.schema_id WHERE o.name = '''''' + @objectname + '''''' AND o.type IN (N''''U'''',''''P'''',''''V'''',''''FN'''',''''IF'''',''''TF'''') AND s.name = '''''' + @schemaid + '''''') +BEGIN + IF EXISTS(SELECT 1 FROM sys.fn_builtin_permissions(''''OBJECT'''') WHERE permission_name = '''''' + @rightsaction + '''''') + BEGIN + '' + @grantordeny + '' '' + @rightsaction + '' ON ['' + @schemaid + ''].['' + @objectname + ''] TO ['' + @RoleName + ''] + END +END + +'' + END + END + + IF @typeofobject = ''ASSEMBLIES'' + BEGIN + SET @Command = @Command + '' +IF EXISTS(SELECT 1 FROM sys.assemblies WHERE NAME = '''''' + @objectname + '''''') +BEGIN + IF EXISTS(SELECT 1 FROM sys.fn_builtin_permissions(''''ASSEMBLY'''') WHERE permission_name = '''''' + @rightsaction + '''''') + BEGIN + '' + @grantordeny + '' '' + @rightsaction + ''::['' + @objectname + ''] TO ['' + @RoleName + ''] + END +END + +'' + END + + IF @typeofobject = ''ROLE'' + BEGIN + SET @Command = @Command + '' +IF NOT EXISTS (SELECT 1 FROM sys.database_role_members JOIN sys.database_principals roles ON database_role_members.role_principal_id = roles.principal_id JOIN sys.database_principals members ON database_role_members.member_principal_id = members.principal_id WHERE roles.name = '''''' + @rightsaction + '''''' AND members.name = '''''' + @RoleName + '''''') +BEGIN + EXEC sp_addrolemember N'''''' + @rightsaction + '''''', N'''''' + @RoleName + '''''' +END + +'' + END + + FETCH NEXT FROM SecurablesCurs INTO @typeofobject, @grantordeny, @rightsaction, @objectname, @schemaid + END + +CLOSE SecurablesCurs +DEALLOCATE SecurablesCurs + +PRINT ''SET ALL SECURABLES ON ROLE ['' + @RoleName + '']'' +EXEC sp_executesql @Command + +END +ELSE +BEGIN + + DECLARE SecurablesCurs CURSOR FOR + SELECT typeofobject, grantordeny, rightsaction, objectname, schemaid + FROM #Securables + WHERE N2 = 0 + + OPEN SecurablesCurs + FETCH NEXT FROM SecurablesCurs INTO @typeofobject, @grantordeny, @rightsaction, @objectname, @schemaid + WHILE @@FETCH_STATUS = 0 + BEGIN + + IF @typeofobject = ''DB'' + BEGIN + IF EXISTS(SELECT 1 FROM sys.fn_builtin_permissions(''DATABASE'') WHERE permission_name = '''' + @rightsaction + '''') + BEGIN + SET @Command = @Command + @grantordeny + '' '' + @rightsaction + '' TO ['' + @RoleName + ''] +'' + END + END + + IF @typeofobject = ''SCHEMA'' + BEGIN + SET @Command = @Command + '' +IF EXISTS (SELECT 1 FROM sys.schemas WHERE name = '''''' + @schemaid + '''''') +BEGIN + IF EXISTS(SELECT 1 FROM sys.fn_builtin_permissions(''''SCHEMA'''') WHERE permission_name = '''''' + @rightsaction + '''''') + BEGIN + '' + @grantordeny + '' '' + @rightsaction + '' ON SCHEMA::'' + @schemaid + '' TO ['' + @RoleName + ''] + END +END + +'' + END + + IF @typeofobject in(''TABLE'',''SP'',''FUNCTIONS'',''VIEWS'') + BEGIN + + IF @objectname like ''%[%]%'' + BEGIN + + IF @typeofobject = ''TABLE'' + BEGIN + SET @sysTarget = ''sys.tables'' + SET @sysType = '''' + END + + IF @typeofobject = ''SP'' + BEGIN + SET @sysTarget = ''sys.procedures'' + SET @sysType = '''' + END + + IF @typeofobject = ''FUNCTIONS'' + BEGIN + SET @sysTarget = ''sys.objects'' + SET @sysType = '' and p.Type IN ( N''''FN'''', N''''IF'''', N''''TF'''', N''''FS'''', N''''FT'''' )'' + END + + IF @typeofobject = ''VIEWS'' + BEGIN + SET @sysTarget = ''sys.views'' + SET @sysType = '''' + END + + SET @Command = @Command + '' +DECLARE SP_cursor CURSOR FOR +SELECT p.name FROM '' + @sysTarget + '' p JOIN sys.schemas s ON s.schema_id = p.schema_id WHERE (p.name like '''''' + @objectname + '''''') and s.name = '''''' + @schemaid + '''' + @sysType + '''''' + +OPEN SP_cursor +FETCH NEXT FROM SP_cursor INTO @SP_Name +WHILE @@FETCH_STATUS = 0 +BEGIN + IF EXISTS(SELECT 1 FROM sys.fn_builtin_permissions(''''OBJECT'''') WHERE permission_name = '''''' + @rightsaction + '''''') + BEGIN + EXEC('''''' + @grantordeny + '' '' + @rightsaction + '' ON ['' + @schemaid + ''].['''' + @SP_Name + ''''] TO ['' + @RoleName + '']'''') + END + FETCH NEXT FROM SP_cursor INTO @SP_Name +END + +CLOSE SP_cursor +DEALLOCATE SP_cursor + +'' + + END + ELSE + BEGIN + + SET @Command = @Command + '' +IF EXISTS(SELECT 1 FROM sys.objects o WITH (NOLOCK) JOIN sys.schemas s ON s.schema_id = o.schema_id WHERE o.name = '''''' + @objectname + '''''' AND o.type IN (N''''U'''',''''P'''',''''V'''',''''FN'''',''''IF'''',''''TF'''') AND s.name = '''''' + @schemaid + '''''') +BEGIN + IF EXISTS(SELECT 1 FROM sys.fn_builtin_permissions(''''OBJECT'''') WHERE permission_name = '''''' + @rightsaction + '''''') + BEGIN + '' + @grantordeny + '' '' + @rightsaction + '' ON ['' + @schemaid + ''].['' + @objectname + ''] TO ['' + @RoleName + ''] + END +END + +'' + END + END + + IF @typeofobject = ''ASSEMBLIES'' + BEGIN + SET @Command = @Command + '' +IF EXISTS(SELECT 1 FROM sys.assemblies WHERE NAME = '''''' + @objectname + '''''') +BEGIN + IF EXISTS(SELECT 1 FROM sys.fn_builtin_permissions(''''ASSEMBLY'''') WHERE permission_name = '''''' + @rightsaction + '''''') + BEGIN + '' + @grantordeny + '' '' + @rightsaction + ''::['' + @objectname + ''] TO ['' + @RoleName + ''] + END +END + +'' + END + + IF @typeofobject = ''ROLE'' + BEGIN + SET @Command = @Command + '' +IF NOT EXISTS (SELECT 1 FROM sys.database_role_members JOIN sys.database_principals roles ON database_role_members.role_principal_id = roles.principal_id JOIN sys.database_principals members ON database_role_members.member_principal_id = members.principal_id WHERE roles.name = '''''' + @rightsaction + '''''' AND members.name = '''''' + @RoleName + '''''') +BEGIN + EXEC sp_addrolemember N'''''' + @rightsaction + '''''', N'''''' + @RoleName + '''''' +END + +'' + END + + FETCH NEXT FROM SecurablesCurs INTO @typeofobject, @grantordeny, @rightsaction, @objectname, @schemaid + END + +CLOSE SecurablesCurs +DEALLOCATE SecurablesCurs + +PRINT ''SET ALL SECURABLES ON ROLE ['' + @RoleName + '']'' +EXEC sp_executesql @Command + +END + +/* ADD USER */ +DECLARE UsersCurs CURSOR FOR +SELECT username + FROM #UsersOnRole + +OPEN UsersCurs + +FETCH NEXT FROM UsersCurs INTO @Users +WHILE @@FETCH_STATUS = 0 +BEGIN + + SELECT @Command = '' +EXEC sp_addrolemember N'''''' + @RoleName + '''''', N'''''' + @Users + '''''' +PRINT ''''ADD USER ['' + @Users + ''] ON ROLE ['' + @RoleName + '']'''' +'' + +FETCH NEXT FROM UsersCurs INTO @Users +END + +CLOSE UsersCurs +DEALLOCATE UsersCurs + +EXEC sp_executesql @Command + +/*============================================================================= + Drop temp tables +=============================================================================*/ +DROP TABLE #Securables +DROP TABLE #UsersOnRole','ActivePos_read','Pharmacies') + +INSERT INTO #AllRoles(STR_Definition,STR_Database,STR_Product)VALUES(' + +/*============================================================================= + + Script to create dbRoleSupUsr role. + + Role Name: dbRoleSupUsr + TEMPLATE: N2 and PROD + + EXAMPLE OF SECURABLES TO SET: + + INSERT INTO #Securables + VALUES + (''DB'',''GRANT'',''VIEW DEFINITION'','''',''''), + (''SCHEMA'',''GRANT'',''SELECT,EXECUTE,INSERT,UPDATE,DELETE'','''',''AP''), + (''TABLE'',''GRANT'',''INSERT,UPDATE'',''Address'',''dbo''), + (''SP'',''GRANT'',''EXECUTE'',''sp_bmc_GetNextID'',''dbo''), + (''ROLE'',''GRANT'',''db_datareader'','''','''') + + ----------------------------------------------- + +Generate date : 2023-05-12 / up208700 + +=============================================================================*/ + +DECLARE @Type varchar(6), + @Command nvarchar(max), + @RoleName varchar(60), + @Users varchar(255), + @typeofobject varchar(50), + @grantordeny varchar(10), + @rightsaction varchar(255), + @objectname varchar(255), + @schemaid varchar(10), + @sysTarget varchar(255), + @sysType varchar(255) + +SET @RoleName = ''dbRoleSupUsr'' +SET @Command = '''' + +SELECT @Type = [Type] FROM [master].[cfg].[InstanceContext] + +/* TEMP TABLES */ +CREATE TABLE #UsersOnRole(username varchar(255)) +CREATE TABLE #Securables(typeofobject varchar(50), grantordeny varchar(10), rightsaction varchar(255), objectname varchar(255), schemaid varchar(10),N2 bit) + +/* !!! LIST OF SECURABLES TO CHANGE !!! */ + +INSERT INTO #Securables +VALUES +(''ROLE'',''GRANT'',''DB_DATAREADER'','''',''dbo'',0) +,(''ROLE'',''GRANT'',''DB_OWNER'','''',''dbo'',1) + + +/* GET ALL USERS ON THIS ROLE */ +INSERT INTO #UsersOnRole +SELECT + members.name +FROM sys.database_role_members + JOIN sys.database_principals roles ON database_role_members.role_principal_id = roles.principal_id + JOIN sys.database_principals members ON database_role_members.member_principal_id = members.principal_id +WHERE roles.name = @RoleName + +/* CREATE ROLE */ +SELECT @Command = '' +IF NOT EXISTS (SELECT 1 FROM sys.database_principals WHERE name = '''''' + @RoleName + '''''' AND type = ''''R'''') +BEGIN + CREATE ROLE ['' + @RoleName + ''] AUTHORIZATION [dbo] + PRINT ''''CREATE ROLE ['' + @RoleName + '']'''' +END +'' +EXEC sp_executesql @Command + +SET @Command = '' +DECLARE @SP_Name varchar(255) + +'' + +/* SET ALL ROLE SECURABLES */ +IF @Type = ''DEVE'' +BEGIN + + DECLARE SecurablesCurs CURSOR FOR + SELECT typeofobject, grantordeny, rightsaction, objectname, schemaid + FROM #Securables + WHERE N2 = 1 + + OPEN SecurablesCurs + FETCH NEXT FROM SecurablesCurs INTO @typeofobject, @grantordeny, @rightsaction, @objectname, @schemaid + WHILE @@FETCH_STATUS = 0 + BEGIN + + IF @typeofobject = ''DB'' + BEGIN + IF EXISTS(SELECT 1 FROM sys.fn_builtin_permissions(''DATABASE'') WHERE permission_name = '''' + @rightsaction + '''') + BEGIN + SET @Command = @Command + @grantordeny + '' '' + @rightsaction + '' TO ['' + @RoleName + ''] +'' + END + END + + IF @typeofobject = ''SCHEMA'' + BEGIN + SET @Command = @Command + '' +IF EXISTS (SELECT 1 FROM sys.schemas WHERE name = '''''' + @schemaid + '''''') +BEGIN + IF EXISTS(SELECT 1 FROM sys.fn_builtin_permissions(''''SCHEMA'''') WHERE permission_name = '''''' + @rightsaction + '''''') + BEGIN + '' + @grantordeny + '' '' + @rightsaction + '' ON SCHEMA::'' + @schemaid + '' TO ['' + @RoleName + ''] + END +END + +'' + END + + IF @typeofobject in(''TABLE'',''SP'',''FUNCTIONS'',''VIEWS'') + BEGIN + + IF @objectname like ''%[%]%'' + BEGIN + IF @typeofobject = ''TABLE'' + BEGIN + SET @sysTarget = ''sys.tables'' + SET @sysType = '''' + END + + IF @typeofobject = ''SP'' + BEGIN + SET @sysTarget = ''sys.procedures'' + SET @sysType = '''' + END + + IF @typeofobject = ''FUNCTIONS'' + BEGIN + SET @sysTarget = ''sys.objects'' + SET @sysType = '' and p.Type IN ( N''''FN'''', N''''IF'''', N''''TF'''', N''''FS'''', N''''FT'''' )'' + END + + IF @typeofobject = ''VIEWS'' + BEGIN + SET @sysTarget = ''sys.views'' + SET @sysType = '''' + END + + SET @Command = @Command + '' +DECLARE SP_cursor CURSOR FOR +SELECT p.name FROM '' + @sysTarget + '' p JOIN sys.schemas s ON s.schema_id = p.schema_id WHERE (p.name like '''''' + @objectname + '''''') and s.name = '''''' + @schemaid + '''' + @sysType + '''''' + +OPEN SP_cursor +FETCH NEXT FROM SP_cursor INTO @SP_Name +WHILE @@FETCH_STATUS = 0 +BEGIN + IF EXISTS(SELECT 1 FROM sys.fn_builtin_permissions(''''OBJECT'''') WHERE permission_name = '''''' + @rightsaction + '''''') + BEGIN + EXEC('''''' + @grantordeny + '' '' + @rightsaction + '' ON ['' + @schemaid + ''].['''' + @SP_Name + ''''] TO ['' + @RoleName + '']'''') + END + FETCH NEXT FROM SP_cursor INTO @SP_Name +END + +CLOSE SP_cursor +DEALLOCATE SP_cursor + +'' + + END + ELSE + BEGIN + + SET @Command = @Command + '' +IF EXISTS(SELECT 1 FROM sys.objects o WITH (NOLOCK) JOIN sys.schemas s ON s.schema_id = o.schema_id WHERE o.name = '''''' + @objectname + '''''' AND o.type IN (N''''U'''',''''P'''',''''V'''',''''FN'''',''''IF'''',''''TF'''') AND s.name = '''''' + @schemaid + '''''') +BEGIN + IF EXISTS(SELECT 1 FROM sys.fn_builtin_permissions(''''OBJECT'''') WHERE permission_name = '''''' + @rightsaction + '''''') + BEGIN + '' + @grantordeny + '' '' + @rightsaction + '' ON ['' + @schemaid + ''].['' + @objectname + ''] TO ['' + @RoleName + ''] + END +END + +'' + END + END + + IF @typeofobject = ''ASSEMBLIES'' + BEGIN + SET @Command = @Command + '' +IF EXISTS(SELECT 1 FROM sys.assemblies WHERE NAME = '''''' + @objectname + '''''') +BEGIN + IF EXISTS(SELECT 1 FROM sys.fn_builtin_permissions(''''ASSEMBLY'''') WHERE permission_name = '''''' + @rightsaction + '''''') + BEGIN + '' + @grantordeny + '' '' + @rightsaction + ''::['' + @objectname + ''] TO ['' + @RoleName + ''] + END +END + +'' + END + + IF @typeofobject = ''ROLE'' + BEGIN + SET @Command = @Command + '' +IF NOT EXISTS (SELECT 1 FROM sys.database_role_members JOIN sys.database_principals roles ON database_role_members.role_principal_id = roles.principal_id JOIN sys.database_principals members ON database_role_members.member_principal_id = members.principal_id WHERE roles.name = '''''' + @rightsaction + '''''' AND members.name = '''''' + @RoleName + '''''') +BEGIN + EXEC sp_addrolemember N'''''' + @rightsaction + '''''', N'''''' + @RoleName + '''''' +END + +'' + END + + FETCH NEXT FROM SecurablesCurs INTO @typeofobject, @grantordeny, @rightsaction, @objectname, @schemaid + END + +CLOSE SecurablesCurs +DEALLOCATE SecurablesCurs + +PRINT ''SET ALL SECURABLES ON ROLE ['' + @RoleName + '']'' +EXEC sp_executesql @Command + +END +ELSE +BEGIN + + DECLARE SecurablesCurs CURSOR FOR + SELECT typeofobject, grantordeny, rightsaction, objectname, schemaid + FROM #Securables + WHERE N2 = 0 + + OPEN SecurablesCurs + FETCH NEXT FROM SecurablesCurs INTO @typeofobject, @grantordeny, @rightsaction, @objectname, @schemaid + WHILE @@FETCH_STATUS = 0 + BEGIN + + IF @typeofobject = ''DB'' + BEGIN + IF EXISTS(SELECT 1 FROM sys.fn_builtin_permissions(''DATABASE'') WHERE permission_name = '''' + @rightsaction + '''') + BEGIN + SET @Command = @Command + @grantordeny + '' '' + @rightsaction + '' TO ['' + @RoleName + ''] +'' + END + END + + IF @typeofobject = ''SCHEMA'' + BEGIN + SET @Command = @Command + '' +IF EXISTS (SELECT 1 FROM sys.schemas WHERE name = '''''' + @schemaid + '''''') +BEGIN + IF EXISTS(SELECT 1 FROM sys.fn_builtin_permissions(''''SCHEMA'''') WHERE permission_name = '''''' + @rightsaction + '''''') + BEGIN + '' + @grantordeny + '' '' + @rightsaction + '' ON SCHEMA::'' + @schemaid + '' TO ['' + @RoleName + ''] + END +END + +'' + END + + IF @typeofobject in(''TABLE'',''SP'',''FUNCTIONS'',''VIEWS'') + BEGIN + + IF @objectname like ''%[%]%'' + BEGIN + + IF @typeofobject = ''TABLE'' + BEGIN + SET @sysTarget = ''sys.tables'' + SET @sysType = '''' + END + + IF @typeofobject = ''SP'' + BEGIN + SET @sysTarget = ''sys.procedures'' + SET @sysType = '''' + END + + IF @typeofobject = ''FUNCTIONS'' + BEGIN + SET @sysTarget = ''sys.objects'' + SET @sysType = '' and p.Type IN ( N''''FN'''', N''''IF'''', N''''TF'''', N''''FS'''', N''''FT'''' )'' + END + + IF @typeofobject = ''VIEWS'' + BEGIN + SET @sysTarget = ''sys.views'' + SET @sysType = '''' + END + + SET @Command = @Command + '' +DECLARE SP_cursor CURSOR FOR +SELECT p.name FROM '' + @sysTarget + '' p JOIN sys.schemas s ON s.schema_id = p.schema_id WHERE (p.name like '''''' + @objectname + '''''') and s.name = '''''' + @schemaid + '''' + @sysType + '''''' + +OPEN SP_cursor +FETCH NEXT FROM SP_cursor INTO @SP_Name +WHILE @@FETCH_STATUS = 0 +BEGIN + IF EXISTS(SELECT 1 FROM sys.fn_builtin_permissions(''''OBJECT'''') WHERE permission_name = '''''' + @rightsaction + '''''') + BEGIN + EXEC('''''' + @grantordeny + '' '' + @rightsaction + '' ON ['' + @schemaid + ''].['''' + @SP_Name + ''''] TO ['' + @RoleName + '']'''') + END + FETCH NEXT FROM SP_cursor INTO @SP_Name +END + +CLOSE SP_cursor +DEALLOCATE SP_cursor + +'' + + END + ELSE + BEGIN + + SET @Command = @Command + '' +IF EXISTS(SELECT 1 FROM sys.objects o WITH (NOLOCK) JOIN sys.schemas s ON s.schema_id = o.schema_id WHERE o.name = '''''' + @objectname + '''''' AND o.type IN (N''''U'''',''''P'''',''''V'''',''''FN'''',''''IF'''',''''TF'''') AND s.name = '''''' + @schemaid + '''''') +BEGIN + IF EXISTS(SELECT 1 FROM sys.fn_builtin_permissions(''''OBJECT'''') WHERE permission_name = '''''' + @rightsaction + '''''') + BEGIN + '' + @grantordeny + '' '' + @rightsaction + '' ON ['' + @schemaid + ''].['' + @objectname + ''] TO ['' + @RoleName + ''] + END +END + +'' + END + END + + IF @typeofobject = ''ASSEMBLIES'' + BEGIN + SET @Command = @Command + '' +IF EXISTS(SELECT 1 FROM sys.assemblies WHERE NAME = '''''' + @objectname + '''''') +BEGIN + IF EXISTS(SELECT 1 FROM sys.fn_builtin_permissions(''''ASSEMBLY'''') WHERE permission_name = '''''' + @rightsaction + '''''') + BEGIN + '' + @grantordeny + '' '' + @rightsaction + ''::['' + @objectname + ''] TO ['' + @RoleName + ''] + END +END + +'' + END + + IF @typeofobject = ''ROLE'' + BEGIN + SET @Command = @Command + '' +IF NOT EXISTS (SELECT 1 FROM sys.database_role_members JOIN sys.database_principals roles ON database_role_members.role_principal_id = roles.principal_id JOIN sys.database_principals members ON database_role_members.member_principal_id = members.principal_id WHERE roles.name = '''''' + @rightsaction + '''''' AND members.name = '''''' + @RoleName + '''''') +BEGIN + EXEC sp_addrolemember N'''''' + @rightsaction + '''''', N'''''' + @RoleName + '''''' +END + +'' + END + + FETCH NEXT FROM SecurablesCurs INTO @typeofobject, @grantordeny, @rightsaction, @objectname, @schemaid + END + +CLOSE SecurablesCurs +DEALLOCATE SecurablesCurs + +PRINT ''SET ALL SECURABLES ON ROLE ['' + @RoleName + '']'' +EXEC sp_executesql @Command + +END + +/* ADD USER */ +DECLARE UsersCurs CURSOR FOR +SELECT username + FROM #UsersOnRole + +OPEN UsersCurs + +FETCH NEXT FROM UsersCurs INTO @Users +WHILE @@FETCH_STATUS = 0 +BEGIN + + SELECT @Command = '' +EXEC sp_addrolemember N'''''' + @RoleName + '''''', N'''''' + @Users + '''''' +PRINT ''''ADD USER ['' + @Users + ''] ON ROLE ['' + @RoleName + '']'''' +'' + +FETCH NEXT FROM UsersCurs INTO @Users +END + +CLOSE UsersCurs +DEALLOCATE UsersCurs + +EXEC sp_executesql @Command + +/*============================================================================= + Drop temp tables +=============================================================================*/ +DROP TABLE #Securables +DROP TABLE #UsersOnRole','ActivePos_read','Pharmacies') + +INSERT INTO #AllRoles(STR_Definition,STR_Database,STR_Product)VALUES(' + +/*============================================================================= + + Script to create dbRoleTPPos role. + + Role Name: dbRoleTPPos + TEMPLATE: Default + + EXAMPLE OF SECURABLES TO SET: + + INSERT INTO #Securables + VALUES + (''DB'',''GRANT'',''VIEW DEFINITION'','''',''''), + (''SCHEMA'',''GRANT'',''SELECT,EXECUTE,INSERT,UPDATE,DELETE'','''',''AP''), + (''TABLE'',''GRANT'',''INSERT,UPDATE'',''Address'',''dbo''), + (''SP'',''GRANT'',''EXECUTE'',''sp_bmc_GetNextID'',''dbo''), + (''ROLE'',''GRANT'',''db_datareader'','''','''') + + ----------------------------------------------- + +Generate date : 2023-05-12 / up208700 + +=============================================================================*/ + +DECLARE @Command nvarchar(max), + @RoleName varchar(60), + @Users varchar(255), + @typeofobject varchar(50), + @grantordeny varchar(10), + @rightsaction varchar(255), + @objectname varchar(255), + @schemaid varchar(10), + @sysTarget varchar(255), + @sysType varchar(255) + +SET @RoleName = ''dbRoleTPPos'' +SET @Command = '''' + +/* TEMP TABLES */ +CREATE TABLE #UsersOnRole(username varchar(255)) +CREATE TABLE #Securables(typeofobject varchar(50), grantordeny varchar(10), rightsaction varchar(255), objectname varchar(255), schemaid varchar(10),N2 bit) + +/* !!! LIST OF SECURABLES TO CHANGE !!! */ + +INSERT INTO #Securables +VALUES +(''DB'',''GRANT'',''EXECUTE'','''',''dbo'',0) +,(''ROLE'',''GRANT'',''DB_DATAREADER'','''',''dbo'',0) +,(''ROLE'',''GRANT'',''DB_DDLADMIN'','''',''dbo'',0) + + +/* GET ALL USERS ON THIS ROLE */ +INSERT INTO #UsersOnRole +SELECT + members.name +FROM sys.database_role_members + JOIN sys.database_principals roles ON database_role_members.role_principal_id = roles.principal_id + JOIN sys.database_principals members ON database_role_members.member_principal_id = members.principal_id +WHERE roles.name = @RoleName + +/* CREATE ROLE */ +SELECT @Command = '' +IF NOT EXISTS (SELECT 1 FROM sys.database_principals WHERE name = '''''' + @RoleName + '''''' AND type = ''''R'''') +BEGIN + CREATE ROLE ['' + @RoleName + ''] AUTHORIZATION [dbo] + PRINT ''''CREATE ROLE ['' + @RoleName + '']'''' +END +'' +EXEC sp_executesql @Command + +SET @Command = '' +DECLARE @SP_Name varchar(255) + +'' + +/* SET ALL ROLE SECURABLES */ +DECLARE SecurablesCurs CURSOR FOR +SELECT typeofobject, grantordeny, rightsaction, objectname, schemaid +FROM #Securables +WHERE N2 = 0 + +OPEN SecurablesCurs +FETCH NEXT FROM SecurablesCurs INTO @typeofobject, @grantordeny, @rightsaction, @objectname, @schemaid +WHILE @@FETCH_STATUS = 0 +BEGIN + + IF @typeofobject = ''DB'' + BEGIN + IF EXISTS(SELECT 1 FROM sys.fn_builtin_permissions(''DATABASE'') WHERE permission_name = '''' + @rightsaction + '''') + BEGIN + SET @Command = @Command + @grantordeny + '' '' + @rightsaction + '' TO ['' + @RoleName + ''] +'' + END + END + + IF @typeofobject = ''SCHEMA'' + BEGIN + SET @Command = @Command + '' +IF EXISTS (SELECT 1 FROM sys.schemas WHERE name = '''''' + @schemaid + '''''') +BEGIN + IF EXISTS(SELECT 1 FROM sys.fn_builtin_permissions(''''SCHEMA'''') WHERE permission_name = '''''' + @rightsaction + '''''') + BEGIN + '' + @grantordeny + '' '' + @rightsaction + '' ON SCHEMA::'' + @schemaid + '' TO ['' + @RoleName + ''] + END +END + +'' + END + + IF @typeofobject in(''TABLE'',''SP'',''FUNCTIONS'',''VIEWS'') + BEGIN + + IF @objectname like ''%[%]%'' + BEGIN + + IF @typeofobject = ''TABLE'' + BEGIN + SET @sysTarget = ''sys.tables'' + SET @sysType = '''' + END + + IF @typeofobject = ''SP'' + BEGIN + SET @sysTarget = ''sys.procedures'' + SET @sysType = '''' + END + + IF @typeofobject = ''FUNCTIONS'' + BEGIN + SET @sysTarget = ''sys.objects'' + SET @sysType = '' and p.Type IN ( N''''FN'''', N''''IF'''', N''''TF'''', N''''FS'''', N''''FT'''' )'' + END + + IF @typeofobject = ''VIEWS'' + BEGIN + SET @sysTarget = ''sys.views'' + SET @sysType = '''' + END + + SET @Command = @Command + '' +DECLARE SP_cursor CURSOR FOR +SELECT p.name FROM '' + @sysTarget + '' p JOIN sys.schemas s ON s.schema_id = p.schema_id WHERE (p.name like '''''' + @objectname + '''''') and s.name = '''''' + @schemaid + '''' + @sysType + '''''' + +OPEN SP_cursor +FETCH NEXT FROM SP_cursor INTO @SP_Name +WHILE @@FETCH_STATUS = 0 +BEGIN + IF EXISTS(SELECT 1 FROM sys.fn_builtin_permissions(''''OBJECT'''') WHERE permission_name = '''''' + @rightsaction + '''''') + BEGIN + EXEC('''''' + @grantordeny + '' '' + @rightsaction + '' ON ['' + @schemaid + ''].['''' + @SP_Name + ''''] TO ['' + @RoleName + '']'''') + END + FETCH NEXT FROM SP_cursor INTO @SP_Name +END + +CLOSE SP_cursor +DEALLOCATE SP_cursor + +'' + + END + ELSE + BEGIN + + SET @Command = @Command + '' +IF EXISTS(SELECT 1 FROM sys.objects o WITH (NOLOCK) JOIN sys.schemas s ON s.schema_id = o.schema_id WHERE o.name = '''''' + @objectname + '''''' AND o.type IN (N''''U'''',''''P'''',''''V'''',''''FN'''',''''IF'''',''''TF'''') AND s.name = '''''' + @schemaid + '''''') +BEGIN + IF EXISTS(SELECT 1 FROM sys.fn_builtin_permissions(''''OBJECT'''') WHERE permission_name = '''''' + @rightsaction + '''''') + BEGIN + '' + @grantordeny + '' '' + @rightsaction + '' ON ['' + @schemaid + ''].['' + @objectname + ''] TO ['' + @RoleName + ''] + END +END + +'' + END +END + +IF @typeofobject = ''ASSEMBLIES'' +BEGIN + SET @Command = @Command + '' +IF EXISTS(SELECT 1 FROM sys.assemblies WHERE NAME = '''''' + @objectname + '''''') +BEGIN + IF EXISTS(SELECT 1 FROM sys.fn_builtin_permissions(''''ASSEMBLY'''') WHERE permission_name = '''''' + @rightsaction + '''''') + BEGIN + '' + @grantordeny + '' '' + @rightsaction + ''::['' + @objectname + ''] TO ['' + @RoleName + ''] + END +END + +'' +END + +IF @typeofobject = ''ROLE'' +BEGIN + SET @Command = @Command + '' +IF NOT EXISTS (SELECT 1 FROM sys.database_role_members JOIN sys.database_principals roles ON database_role_members.role_principal_id = roles.principal_id JOIN sys.database_principals members ON database_role_members.member_principal_id = members.principal_id WHERE roles.name = '''''' + @rightsaction + '''''' AND members.name = '''''' + @RoleName + '''''') +BEGIN + EXEC sp_addrolemember N'''''' + @rightsaction + '''''', N'''''' + @RoleName + '''''' +END + +'' +END + +FETCH NEXT FROM SecurablesCurs INTO @typeofobject, @grantordeny, @rightsaction, @objectname, @schemaid +END + +CLOSE SecurablesCurs +DEALLOCATE SecurablesCurs + +PRINT ''SET ALL SECURABLES ON ROLE ['' + @RoleName + '']'' +EXEC sp_executesql @Command + +/* ADD USER */ +DECLARE UsersCurs CURSOR FOR +SELECT username + FROM #UsersOnRole + +OPEN UsersCurs + +FETCH NEXT FROM UsersCurs INTO @Users +WHILE @@FETCH_STATUS = 0 +BEGIN + + SELECT @Command = '' +EXEC sp_addrolemember N'''''' + @RoleName + '''''', N'''''' + @Users + '''''' +PRINT ''''ADD USER ['' + @Users + ''] ON ROLE ['' + @RoleName + '']'''' +'' + +FETCH NEXT FROM UsersCurs INTO @Users +END + +CLOSE UsersCurs +DEALLOCATE UsersCurs + +EXEC sp_executesql @Command + + +/*============================================================================= + Drop temp tables +=============================================================================*/ +DROP TABLE #Securables +DROP TABLE #UsersOnRole +','ActivePos_read','Pharmacies') + +INSERT INTO #AllRoles(STR_Definition,STR_Database,STR_Product)VALUES(' + +/*============================================================================= + + Script to create dbRoleActiveConfig role. + + Role Name: dbRoleActiveConfig + TEMPLATE: Default + + EXAMPLE OF SECURABLES TO SET: + + INSERT INTO #Securables + VALUES + (''DB'',''GRANT'',''VIEW DEFINITION'','''',''''), + (''SCHEMA'',''GRANT'',''SELECT,EXECUTE,INSERT,UPDATE,DELETE'','''',''AP''), + (''TABLE'',''GRANT'',''INSERT,UPDATE'',''Address'',''dbo''), + (''SP'',''GRANT'',''EXECUTE'',''sp_bmc_GetNextID'',''dbo''), + (''ROLE'',''GRANT'',''db_datareader'','''','''') + + ----------------------------------------------- + +Generate date : 2023-05-12 / up208700 + +=============================================================================*/ + +DECLARE @Command nvarchar(max), + @RoleName varchar(60), + @Users varchar(255), + @typeofobject varchar(50), + @grantordeny varchar(10), + @rightsaction varchar(255), + @objectname varchar(255), + @schemaid varchar(10), + @sysTarget varchar(255), + @sysType varchar(255) + +SET @RoleName = ''dbRoleActiveConfig'' +SET @Command = '''' + +/* TEMP TABLES */ +CREATE TABLE #UsersOnRole(username varchar(255)) +CREATE TABLE #Securables(typeofobject varchar(50), grantordeny varchar(10), rightsaction varchar(255), objectname varchar(255), schemaid varchar(10),N2 bit) + +/* !!! LIST OF SECURABLES TO CHANGE !!! */ + +INSERT INTO #Securables +VALUES +(''SP'',''GRANT'',''EXECUTE'',''GetApplications'',''dbo'',0) +,(''SP'',''GRANT'',''EXECUTE'',''GetConfigurationDatabaseSchemaVersion'',''dbo'',0) +,(''SP'',''GRANT'',''EXECUTE'',''GetSettings'',''dbo'',0) + + +/* GET ALL USERS ON THIS ROLE */ +INSERT INTO #UsersOnRole +SELECT + members.name +FROM sys.database_role_members + JOIN sys.database_principals roles ON database_role_members.role_principal_id = roles.principal_id + JOIN sys.database_principals members ON database_role_members.member_principal_id = members.principal_id +WHERE roles.name = @RoleName + +/* CREATE ROLE */ +SELECT @Command = '' +IF NOT EXISTS (SELECT 1 FROM sys.database_principals WHERE name = '''''' + @RoleName + '''''' AND type = ''''R'''') +BEGIN + CREATE ROLE ['' + @RoleName + ''] AUTHORIZATION [dbo] + PRINT ''''CREATE ROLE ['' + @RoleName + '']'''' +END +'' +EXEC sp_executesql @Command + +SET @Command = '' +DECLARE @SP_Name varchar(255) + +'' + +/* SET ALL ROLE SECURABLES */ +DECLARE SecurablesCurs CURSOR FOR +SELECT typeofobject, grantordeny, rightsaction, objectname, schemaid +FROM #Securables +WHERE N2 = 0 + +OPEN SecurablesCurs +FETCH NEXT FROM SecurablesCurs INTO @typeofobject, @grantordeny, @rightsaction, @objectname, @schemaid +WHILE @@FETCH_STATUS = 0 +BEGIN + + IF @typeofobject = ''DB'' + BEGIN + IF EXISTS(SELECT 1 FROM sys.fn_builtin_permissions(''DATABASE'') WHERE permission_name = '''' + @rightsaction + '''') + BEGIN + SET @Command = @Command + @grantordeny + '' '' + @rightsaction + '' TO ['' + @RoleName + ''] +'' + END + END + + IF @typeofobject = ''SCHEMA'' + BEGIN + SET @Command = @Command + '' +IF EXISTS (SELECT 1 FROM sys.schemas WHERE name = '''''' + @schemaid + '''''') +BEGIN + IF EXISTS(SELECT 1 FROM sys.fn_builtin_permissions(''''SCHEMA'''') WHERE permission_name = '''''' + @rightsaction + '''''') + BEGIN + '' + @grantordeny + '' '' + @rightsaction + '' ON SCHEMA::'' + @schemaid + '' TO ['' + @RoleName + ''] + END +END + +'' + END + + IF @typeofobject in(''TABLE'',''SP'',''FUNCTIONS'',''VIEWS'') + BEGIN + + IF @objectname like ''%[%]%'' + BEGIN + + IF @typeofobject = ''TABLE'' + BEGIN + SET @sysTarget = ''sys.tables'' + SET @sysType = '''' + END + + IF @typeofobject = ''SP'' + BEGIN + SET @sysTarget = ''sys.procedures'' + SET @sysType = '''' + END + + IF @typeofobject = ''FUNCTIONS'' + BEGIN + SET @sysTarget = ''sys.objects'' + SET @sysType = '' and p.Type IN ( N''''FN'''', N''''IF'''', N''''TF'''', N''''FS'''', N''''FT'''' )'' + END + + IF @typeofobject = ''VIEWS'' + BEGIN + SET @sysTarget = ''sys.views'' + SET @sysType = '''' + END + + SET @Command = @Command + '' +DECLARE SP_cursor CURSOR FOR +SELECT p.name FROM '' + @sysTarget + '' p JOIN sys.schemas s ON s.schema_id = p.schema_id WHERE (p.name like '''''' + @objectname + '''''') and s.name = '''''' + @schemaid + '''' + @sysType + '''''' + +OPEN SP_cursor +FETCH NEXT FROM SP_cursor INTO @SP_Name +WHILE @@FETCH_STATUS = 0 +BEGIN + IF EXISTS(SELECT 1 FROM sys.fn_builtin_permissions(''''OBJECT'''') WHERE permission_name = '''''' + @rightsaction + '''''') + BEGIN + EXEC('''''' + @grantordeny + '' '' + @rightsaction + '' ON ['' + @schemaid + ''].['''' + @SP_Name + ''''] TO ['' + @RoleName + '']'''') + END + FETCH NEXT FROM SP_cursor INTO @SP_Name +END + +CLOSE SP_cursor +DEALLOCATE SP_cursor + +'' + + END + ELSE + BEGIN + + SET @Command = @Command + '' +IF EXISTS(SELECT 1 FROM sys.objects o WITH (NOLOCK) JOIN sys.schemas s ON s.schema_id = o.schema_id WHERE o.name = '''''' + @objectname + '''''' AND o.type IN (N''''U'''',''''P'''',''''V'''',''''FN'''',''''IF'''',''''TF'''') AND s.name = '''''' + @schemaid + '''''') +BEGIN + IF EXISTS(SELECT 1 FROM sys.fn_builtin_permissions(''''OBJECT'''') WHERE permission_name = '''''' + @rightsaction + '''''') + BEGIN + '' + @grantordeny + '' '' + @rightsaction + '' ON ['' + @schemaid + ''].['' + @objectname + ''] TO ['' + @RoleName + ''] + END +END + +'' + END +END + +IF @typeofobject = ''ASSEMBLIES'' +BEGIN + SET @Command = @Command + '' +IF EXISTS(SELECT 1 FROM sys.assemblies WHERE NAME = '''''' + @objectname + '''''') +BEGIN + IF EXISTS(SELECT 1 FROM sys.fn_builtin_permissions(''''ASSEMBLY'''') WHERE permission_name = '''''' + @rightsaction + '''''') + BEGIN + '' + @grantordeny + '' '' + @rightsaction + ''::['' + @objectname + ''] TO ['' + @RoleName + ''] + END +END + +'' +END + +IF @typeofobject = ''ROLE'' +BEGIN + SET @Command = @Command + '' +IF NOT EXISTS (SELECT 1 FROM sys.database_role_members JOIN sys.database_principals roles ON database_role_members.role_principal_id = roles.principal_id JOIN sys.database_principals members ON database_role_members.member_principal_id = members.principal_id WHERE roles.name = '''''' + @rightsaction + '''''' AND members.name = '''''' + @RoleName + '''''') +BEGIN + EXEC sp_addrolemember N'''''' + @rightsaction + '''''', N'''''' + @RoleName + '''''' +END + +'' +END + +FETCH NEXT FROM SecurablesCurs INTO @typeofobject, @grantordeny, @rightsaction, @objectname, @schemaid +END + +CLOSE SecurablesCurs +DEALLOCATE SecurablesCurs + +PRINT ''SET ALL SECURABLES ON ROLE ['' + @RoleName + '']'' +EXEC sp_executesql @Command + +/* ADD USER */ +DECLARE UsersCurs CURSOR FOR +SELECT username + FROM #UsersOnRole + +OPEN UsersCurs + +FETCH NEXT FROM UsersCurs INTO @Users +WHILE @@FETCH_STATUS = 0 +BEGIN + + SELECT @Command = '' +EXEC sp_addrolemember N'''''' + @RoleName + '''''', N'''''' + @Users + '''''' +PRINT ''''ADD USER ['' + @Users + ''] ON ROLE ['' + @RoleName + '']'''' +'' + +FETCH NEXT FROM UsersCurs INTO @Users +END + +CLOSE UsersCurs +DEALLOCATE UsersCurs + +EXEC sp_executesql @Command + + +/*============================================================================= + Drop temp tables +=============================================================================*/ +DROP TABLE #Securables +DROP TABLE #UsersOnRole +','ActivePos_server','Pharmacies') + +INSERT INTO #AllRoles(STR_Definition,STR_Database,STR_Product)VALUES(' + +/*============================================================================= + + Script to create dbRoleActivePharmacy role. + + Role Name: dbRoleActivePharmacy + TEMPLATE: Default + + EXAMPLE OF SECURABLES TO SET: + + INSERT INTO #Securables + VALUES + (''DB'',''GRANT'',''VIEW DEFINITION'','''',''''), + (''SCHEMA'',''GRANT'',''SELECT,EXECUTE,INSERT,UPDATE,DELETE'','''',''AP''), + (''TABLE'',''GRANT'',''INSERT,UPDATE'',''Address'',''dbo''), + (''SP'',''GRANT'',''EXECUTE'',''sp_bmc_GetNextID'',''dbo''), + (''ROLE'',''GRANT'',''db_datareader'','''','''') + + ----------------------------------------------- + +Generate date : 2023-05-12 / up208700 + +=============================================================================*/ + +DECLARE @Command nvarchar(max), + @RoleName varchar(60), + @Users varchar(255), + @typeofobject varchar(50), + @grantordeny varchar(10), + @rightsaction varchar(255), + @objectname varchar(255), + @schemaid varchar(10), + @sysTarget varchar(255), + @sysType varchar(255) + +SET @RoleName = ''dbRoleActivePharmacy'' +SET @Command = '''' + +/* TEMP TABLES */ +CREATE TABLE #UsersOnRole(username varchar(255)) +CREATE TABLE #Securables(typeofobject varchar(50), grantordeny varchar(10), rightsaction varchar(255), objectname varchar(255), schemaid varchar(10),N2 bit) + +/* !!! LIST OF SECURABLES TO CHANGE !!! */ + +INSERT INTO #Securables +VALUES +(''ROLE'',''GRANT'',''DB_OWNER'','''',''dbo'',0) + + +/* GET ALL USERS ON THIS ROLE */ +INSERT INTO #UsersOnRole +SELECT + members.name +FROM sys.database_role_members + JOIN sys.database_principals roles ON database_role_members.role_principal_id = roles.principal_id + JOIN sys.database_principals members ON database_role_members.member_principal_id = members.principal_id +WHERE roles.name = @RoleName + +/* CREATE ROLE */ +SELECT @Command = '' +IF NOT EXISTS (SELECT 1 FROM sys.database_principals WHERE name = '''''' + @RoleName + '''''' AND type = ''''R'''') +BEGIN + CREATE ROLE ['' + @RoleName + ''] AUTHORIZATION [dbo] + PRINT ''''CREATE ROLE ['' + @RoleName + '']'''' +END +'' +EXEC sp_executesql @Command + +SET @Command = '' +DECLARE @SP_Name varchar(255) + +'' + +/* SET ALL ROLE SECURABLES */ +DECLARE SecurablesCurs CURSOR FOR +SELECT typeofobject, grantordeny, rightsaction, objectname, schemaid +FROM #Securables +WHERE N2 = 0 + +OPEN SecurablesCurs +FETCH NEXT FROM SecurablesCurs INTO @typeofobject, @grantordeny, @rightsaction, @objectname, @schemaid +WHILE @@FETCH_STATUS = 0 +BEGIN + + IF @typeofobject = ''DB'' + BEGIN + IF EXISTS(SELECT 1 FROM sys.fn_builtin_permissions(''DATABASE'') WHERE permission_name = '''' + @rightsaction + '''') + BEGIN + SET @Command = @Command + @grantordeny + '' '' + @rightsaction + '' TO ['' + @RoleName + ''] +'' + END + END + + IF @typeofobject = ''SCHEMA'' + BEGIN + SET @Command = @Command + '' +IF EXISTS (SELECT 1 FROM sys.schemas WHERE name = '''''' + @schemaid + '''''') +BEGIN + IF EXISTS(SELECT 1 FROM sys.fn_builtin_permissions(''''SCHEMA'''') WHERE permission_name = '''''' + @rightsaction + '''''') + BEGIN + '' + @grantordeny + '' '' + @rightsaction + '' ON SCHEMA::'' + @schemaid + '' TO ['' + @RoleName + ''] + END +END + +'' + END + + IF @typeofobject in(''TABLE'',''SP'',''FUNCTIONS'',''VIEWS'') + BEGIN + + IF @objectname like ''%[%]%'' + BEGIN + + IF @typeofobject = ''TABLE'' + BEGIN + SET @sysTarget = ''sys.tables'' + SET @sysType = '''' + END + + IF @typeofobject = ''SP'' + BEGIN + SET @sysTarget = ''sys.procedures'' + SET @sysType = '''' + END + + IF @typeofobject = ''FUNCTIONS'' + BEGIN + SET @sysTarget = ''sys.objects'' + SET @sysType = '' and p.Type IN ( N''''FN'''', N''''IF'''', N''''TF'''', N''''FS'''', N''''FT'''' )'' + END + + IF @typeofobject = ''VIEWS'' + BEGIN + SET @sysTarget = ''sys.views'' + SET @sysType = '''' + END + + SET @Command = @Command + '' +DECLARE SP_cursor CURSOR FOR +SELECT p.name FROM '' + @sysTarget + '' p JOIN sys.schemas s ON s.schema_id = p.schema_id WHERE (p.name like '''''' + @objectname + '''''') and s.name = '''''' + @schemaid + '''' + @sysType + '''''' + +OPEN SP_cursor +FETCH NEXT FROM SP_cursor INTO @SP_Name +WHILE @@FETCH_STATUS = 0 +BEGIN + IF EXISTS(SELECT 1 FROM sys.fn_builtin_permissions(''''OBJECT'''') WHERE permission_name = '''''' + @rightsaction + '''''') + BEGIN + EXEC('''''' + @grantordeny + '' '' + @rightsaction + '' ON ['' + @schemaid + ''].['''' + @SP_Name + ''''] TO ['' + @RoleName + '']'''') + END + FETCH NEXT FROM SP_cursor INTO @SP_Name +END + +CLOSE SP_cursor +DEALLOCATE SP_cursor + +'' + + END + ELSE + BEGIN + + SET @Command = @Command + '' +IF EXISTS(SELECT 1 FROM sys.objects o WITH (NOLOCK) JOIN sys.schemas s ON s.schema_id = o.schema_id WHERE o.name = '''''' + @objectname + '''''' AND o.type IN (N''''U'''',''''P'''',''''V'''',''''FN'''',''''IF'''',''''TF'''') AND s.name = '''''' + @schemaid + '''''') +BEGIN + IF EXISTS(SELECT 1 FROM sys.fn_builtin_permissions(''''OBJECT'''') WHERE permission_name = '''''' + @rightsaction + '''''') + BEGIN + '' + @grantordeny + '' '' + @rightsaction + '' ON ['' + @schemaid + ''].['' + @objectname + ''] TO ['' + @RoleName + ''] + END +END + +'' + END +END + +IF @typeofobject = ''ASSEMBLIES'' +BEGIN + SET @Command = @Command + '' +IF EXISTS(SELECT 1 FROM sys.assemblies WHERE NAME = '''''' + @objectname + '''''') +BEGIN + IF EXISTS(SELECT 1 FROM sys.fn_builtin_permissions(''''ASSEMBLY'''') WHERE permission_name = '''''' + @rightsaction + '''''') + BEGIN + '' + @grantordeny + '' '' + @rightsaction + ''::['' + @objectname + ''] TO ['' + @RoleName + ''] + END +END + +'' +END + +IF @typeofobject = ''ROLE'' +BEGIN + SET @Command = @Command + '' +IF NOT EXISTS (SELECT 1 FROM sys.database_role_members JOIN sys.database_principals roles ON database_role_members.role_principal_id = roles.principal_id JOIN sys.database_principals members ON database_role_members.member_principal_id = members.principal_id WHERE roles.name = '''''' + @rightsaction + '''''' AND members.name = '''''' + @RoleName + '''''') +BEGIN + EXEC sp_addrolemember N'''''' + @rightsaction + '''''', N'''''' + @RoleName + '''''' +END + +'' +END + +FETCH NEXT FROM SecurablesCurs INTO @typeofobject, @grantordeny, @rightsaction, @objectname, @schemaid +END + +CLOSE SecurablesCurs +DEALLOCATE SecurablesCurs + +PRINT ''SET ALL SECURABLES ON ROLE ['' + @RoleName + '']'' +EXEC sp_executesql @Command + +/* ADD USER */ +DECLARE UsersCurs CURSOR FOR +SELECT username + FROM #UsersOnRole + +OPEN UsersCurs + +FETCH NEXT FROM UsersCurs INTO @Users +WHILE @@FETCH_STATUS = 0 +BEGIN + + SELECT @Command = '' +EXEC sp_addrolemember N'''''' + @RoleName + '''''', N'''''' + @Users + '''''' +PRINT ''''ADD USER ['' + @Users + ''] ON ROLE ['' + @RoleName + '']'''' +'' + +FETCH NEXT FROM UsersCurs INTO @Users +END + +CLOSE UsersCurs +DEALLOCATE UsersCurs + +EXEC sp_executesql @Command + + +/*============================================================================= + Drop temp tables +=============================================================================*/ +DROP TABLE #Securables +DROP TABLE #UsersOnRole +','ActivePos_server','Pharmacies') + +INSERT INTO #AllRoles(STR_Definition,STR_Database,STR_Product)VALUES(' + +/*============================================================================= + + Script to create dbRoleCsltUsr role. + + Role Name: dbRoleCsltUsr + TEMPLATE: N2 and PROD + + EXAMPLE OF SECURABLES TO SET: + + INSERT INTO #Securables + VALUES + (''DB'',''GRANT'',''VIEW DEFINITION'','''',''''), + (''SCHEMA'',''GRANT'',''SELECT,EXECUTE,INSERT,UPDATE,DELETE'','''',''AP''), + (''TABLE'',''GRANT'',''INSERT,UPDATE'',''Address'',''dbo''), + (''SP'',''GRANT'',''EXECUTE'',''sp_bmc_GetNextID'',''dbo''), + (''ROLE'',''GRANT'',''db_datareader'','''','''') + + ----------------------------------------------- + +Generate date : 2023-05-12 / up208700 + +=============================================================================*/ + +DECLARE @Type varchar(6), + @Command nvarchar(max), + @RoleName varchar(60), + @Users varchar(255), + @typeofobject varchar(50), + @grantordeny varchar(10), + @rightsaction varchar(255), + @objectname varchar(255), + @schemaid varchar(10), + @sysTarget varchar(255), + @sysType varchar(255) + +SET @RoleName = ''dbRoleCsltUsr'' +SET @Command = '''' + +SELECT @Type = [Type] FROM [master].[cfg].[InstanceContext] + +/* TEMP TABLES */ +CREATE TABLE #UsersOnRole(username varchar(255)) +CREATE TABLE #Securables(typeofobject varchar(50), grantordeny varchar(10), rightsaction varchar(255), objectname varchar(255), schemaid varchar(10),N2 bit) + +/* !!! LIST OF SECURABLES TO CHANGE !!! */ + +INSERT INTO #Securables +VALUES +(''DB'',''GRANT'',''CREATE TABLE'','''',''dbo'',0) +,(''DB'',''GRANT'',''EXECUTE'','''',''dbo'',0) +,(''DB'',''GRANT'',''SHOWPLAN'','''',''dbo'',0) +,(''DB'',''GRANT'',''VIEW DEFINITION'','''',''dbo'',0) +,(''ROLE'',''GRANT'',''DB_DATAREADER'','''',''dbo'',0) +,(''ROLE'',''GRANT'',''DB_DATAWRITER'','''',''dbo'',0) +,(''ROLE'',''GRANT'',''DB_OWNER'','''',''dbo'',1) +,(''SCHEMA'',''GRANT'',''ALTER'',''Entire Schema'',''tmp'',0) +,(''SCHEMA'',''GRANT'',''DELETE'',''Entire Schema'',''tmp'',0) +,(''SCHEMA'',''GRANT'',''EXECUTE'',''Entire Schema'',''tmp'',0) +,(''SCHEMA'',''GRANT'',''INSERT'',''Entire Schema'',''tmp'',0) +,(''SCHEMA'',''GRANT'',''SELECT'',''Entire Schema'',''tmp'',0) +,(''SCHEMA'',''GRANT'',''UPDATE'',''Entire Schema'',''tmp'',0) + + +/* GET ALL USERS ON THIS ROLE */ +INSERT INTO #UsersOnRole +SELECT + members.name +FROM sys.database_role_members + JOIN sys.database_principals roles ON database_role_members.role_principal_id = roles.principal_id + JOIN sys.database_principals members ON database_role_members.member_principal_id = members.principal_id +WHERE roles.name = @RoleName + +/* CREATE ROLE */ +SELECT @Command = '' +IF NOT EXISTS (SELECT 1 FROM sys.database_principals WHERE name = '''''' + @RoleName + '''''' AND type = ''''R'''') +BEGIN + CREATE ROLE ['' + @RoleName + ''] AUTHORIZATION [dbo] + PRINT ''''CREATE ROLE ['' + @RoleName + '']'''' +END +'' +EXEC sp_executesql @Command + +SET @Command = '' +DECLARE @SP_Name varchar(255) + +'' + +/* SET ALL ROLE SECURABLES */ +IF @Type = ''DEVE'' +BEGIN + + DECLARE SecurablesCurs CURSOR FOR + SELECT typeofobject, grantordeny, rightsaction, objectname, schemaid + FROM #Securables + WHERE N2 = 1 + + OPEN SecurablesCurs + FETCH NEXT FROM SecurablesCurs INTO @typeofobject, @grantordeny, @rightsaction, @objectname, @schemaid + WHILE @@FETCH_STATUS = 0 + BEGIN + + IF @typeofobject = ''DB'' + BEGIN + IF EXISTS(SELECT 1 FROM sys.fn_builtin_permissions(''DATABASE'') WHERE permission_name = '''' + @rightsaction + '''') + BEGIN + SET @Command = @Command + @grantordeny + '' '' + @rightsaction + '' TO ['' + @RoleName + ''] +'' + END + END + + IF @typeofobject = ''SCHEMA'' + BEGIN + SET @Command = @Command + '' +IF EXISTS (SELECT 1 FROM sys.schemas WHERE name = '''''' + @schemaid + '''''') +BEGIN + IF EXISTS(SELECT 1 FROM sys.fn_builtin_permissions(''''SCHEMA'''') WHERE permission_name = '''''' + @rightsaction + '''''') + BEGIN + '' + @grantordeny + '' '' + @rightsaction + '' ON SCHEMA::'' + @schemaid + '' TO ['' + @RoleName + ''] + END +END + +'' + END + + IF @typeofobject in(''TABLE'',''SP'',''FUNCTIONS'',''VIEWS'') + BEGIN + + IF @objectname like ''%[%]%'' + BEGIN + IF @typeofobject = ''TABLE'' + BEGIN + SET @sysTarget = ''sys.tables'' + SET @sysType = '''' + END + + IF @typeofobject = ''SP'' + BEGIN + SET @sysTarget = ''sys.procedures'' + SET @sysType = '''' + END + + IF @typeofobject = ''FUNCTIONS'' + BEGIN + SET @sysTarget = ''sys.objects'' + SET @sysType = '' and p.Type IN ( N''''FN'''', N''''IF'''', N''''TF'''', N''''FS'''', N''''FT'''' )'' + END + + IF @typeofobject = ''VIEWS'' + BEGIN + SET @sysTarget = ''sys.views'' + SET @sysType = '''' + END + + SET @Command = @Command + '' +DECLARE SP_cursor CURSOR FOR +SELECT p.name FROM '' + @sysTarget + '' p JOIN sys.schemas s ON s.schema_id = p.schema_id WHERE (p.name like '''''' + @objectname + '''''') and s.name = '''''' + @schemaid + '''' + @sysType + '''''' + +OPEN SP_cursor +FETCH NEXT FROM SP_cursor INTO @SP_Name +WHILE @@FETCH_STATUS = 0 +BEGIN + IF EXISTS(SELECT 1 FROM sys.fn_builtin_permissions(''''OBJECT'''') WHERE permission_name = '''''' + @rightsaction + '''''') + BEGIN + EXEC('''''' + @grantordeny + '' '' + @rightsaction + '' ON ['' + @schemaid + ''].['''' + @SP_Name + ''''] TO ['' + @RoleName + '']'''') + END + FETCH NEXT FROM SP_cursor INTO @SP_Name +END + +CLOSE SP_cursor +DEALLOCATE SP_cursor + +'' + + END + ELSE + BEGIN + + SET @Command = @Command + '' +IF EXISTS(SELECT 1 FROM sys.objects o WITH (NOLOCK) JOIN sys.schemas s ON s.schema_id = o.schema_id WHERE o.name = '''''' + @objectname + '''''' AND o.type IN (N''''U'''',''''P'''',''''V'''',''''FN'''',''''IF'''',''''TF'''') AND s.name = '''''' + @schemaid + '''''') +BEGIN + IF EXISTS(SELECT 1 FROM sys.fn_builtin_permissions(''''OBJECT'''') WHERE permission_name = '''''' + @rightsaction + '''''') + BEGIN + '' + @grantordeny + '' '' + @rightsaction + '' ON ['' + @schemaid + ''].['' + @objectname + ''] TO ['' + @RoleName + ''] + END +END + +'' + END + END + + IF @typeofobject = ''ASSEMBLIES'' + BEGIN + SET @Command = @Command + '' +IF EXISTS(SELECT 1 FROM sys.assemblies WHERE NAME = '''''' + @objectname + '''''') +BEGIN + IF EXISTS(SELECT 1 FROM sys.fn_builtin_permissions(''''ASSEMBLY'''') WHERE permission_name = '''''' + @rightsaction + '''''') + BEGIN + '' + @grantordeny + '' '' + @rightsaction + ''::['' + @objectname + ''] TO ['' + @RoleName + ''] + END +END + +'' + END + + IF @typeofobject = ''ROLE'' + BEGIN + SET @Command = @Command + '' +IF NOT EXISTS (SELECT 1 FROM sys.database_role_members JOIN sys.database_principals roles ON database_role_members.role_principal_id = roles.principal_id JOIN sys.database_principals members ON database_role_members.member_principal_id = members.principal_id WHERE roles.name = '''''' + @rightsaction + '''''' AND members.name = '''''' + @RoleName + '''''') +BEGIN + EXEC sp_addrolemember N'''''' + @rightsaction + '''''', N'''''' + @RoleName + '''''' +END + +'' + END + + FETCH NEXT FROM SecurablesCurs INTO @typeofobject, @grantordeny, @rightsaction, @objectname, @schemaid + END + +CLOSE SecurablesCurs +DEALLOCATE SecurablesCurs + +PRINT ''SET ALL SECURABLES ON ROLE ['' + @RoleName + '']'' +EXEC sp_executesql @Command + +END +ELSE +BEGIN + + DECLARE SecurablesCurs CURSOR FOR + SELECT typeofobject, grantordeny, rightsaction, objectname, schemaid + FROM #Securables + WHERE N2 = 0 + + OPEN SecurablesCurs + FETCH NEXT FROM SecurablesCurs INTO @typeofobject, @grantordeny, @rightsaction, @objectname, @schemaid + WHILE @@FETCH_STATUS = 0 + BEGIN + + IF @typeofobject = ''DB'' + BEGIN + IF EXISTS(SELECT 1 FROM sys.fn_builtin_permissions(''DATABASE'') WHERE permission_name = '''' + @rightsaction + '''') + BEGIN + SET @Command = @Command + @grantordeny + '' '' + @rightsaction + '' TO ['' + @RoleName + ''] +'' + END + END + + IF @typeofobject = ''SCHEMA'' + BEGIN + SET @Command = @Command + '' +IF EXISTS (SELECT 1 FROM sys.schemas WHERE name = '''''' + @schemaid + '''''') +BEGIN + IF EXISTS(SELECT 1 FROM sys.fn_builtin_permissions(''''SCHEMA'''') WHERE permission_name = '''''' + @rightsaction + '''''') + BEGIN + '' + @grantordeny + '' '' + @rightsaction + '' ON SCHEMA::'' + @schemaid + '' TO ['' + @RoleName + ''] + END +END + +'' + END + + IF @typeofobject in(''TABLE'',''SP'',''FUNCTIONS'',''VIEWS'') + BEGIN + + IF @objectname like ''%[%]%'' + BEGIN + + IF @typeofobject = ''TABLE'' + BEGIN + SET @sysTarget = ''sys.tables'' + SET @sysType = '''' + END + + IF @typeofobject = ''SP'' + BEGIN + SET @sysTarget = ''sys.procedures'' + SET @sysType = '''' + END + + IF @typeofobject = ''FUNCTIONS'' + BEGIN + SET @sysTarget = ''sys.objects'' + SET @sysType = '' and p.Type IN ( N''''FN'''', N''''IF'''', N''''TF'''', N''''FS'''', N''''FT'''' )'' + END + + IF @typeofobject = ''VIEWS'' + BEGIN + SET @sysTarget = ''sys.views'' + SET @sysType = '''' + END + + SET @Command = @Command + '' +DECLARE SP_cursor CURSOR FOR +SELECT p.name FROM '' + @sysTarget + '' p JOIN sys.schemas s ON s.schema_id = p.schema_id WHERE (p.name like '''''' + @objectname + '''''') and s.name = '''''' + @schemaid + '''' + @sysType + '''''' + +OPEN SP_cursor +FETCH NEXT FROM SP_cursor INTO @SP_Name +WHILE @@FETCH_STATUS = 0 +BEGIN + IF EXISTS(SELECT 1 FROM sys.fn_builtin_permissions(''''OBJECT'''') WHERE permission_name = '''''' + @rightsaction + '''''') + BEGIN + EXEC('''''' + @grantordeny + '' '' + @rightsaction + '' ON ['' + @schemaid + ''].['''' + @SP_Name + ''''] TO ['' + @RoleName + '']'''') + END + FETCH NEXT FROM SP_cursor INTO @SP_Name +END + +CLOSE SP_cursor +DEALLOCATE SP_cursor + +'' + + END + ELSE + BEGIN + + SET @Command = @Command + '' +IF EXISTS(SELECT 1 FROM sys.objects o WITH (NOLOCK) JOIN sys.schemas s ON s.schema_id = o.schema_id WHERE o.name = '''''' + @objectname + '''''' AND o.type IN (N''''U'''',''''P'''',''''V'''',''''FN'''',''''IF'''',''''TF'''') AND s.name = '''''' + @schemaid + '''''') +BEGIN + IF EXISTS(SELECT 1 FROM sys.fn_builtin_permissions(''''OBJECT'''') WHERE permission_name = '''''' + @rightsaction + '''''') + BEGIN + '' + @grantordeny + '' '' + @rightsaction + '' ON ['' + @schemaid + ''].['' + @objectname + ''] TO ['' + @RoleName + ''] + END +END + +'' + END + END + + IF @typeofobject = ''ASSEMBLIES'' + BEGIN + SET @Command = @Command + '' +IF EXISTS(SELECT 1 FROM sys.assemblies WHERE NAME = '''''' + @objectname + '''''') +BEGIN + IF EXISTS(SELECT 1 FROM sys.fn_builtin_permissions(''''ASSEMBLY'''') WHERE permission_name = '''''' + @rightsaction + '''''') + BEGIN + '' + @grantordeny + '' '' + @rightsaction + ''::['' + @objectname + ''] TO ['' + @RoleName + ''] + END +END + +'' + END + + IF @typeofobject = ''ROLE'' + BEGIN + SET @Command = @Command + '' +IF NOT EXISTS (SELECT 1 FROM sys.database_role_members JOIN sys.database_principals roles ON database_role_members.role_principal_id = roles.principal_id JOIN sys.database_principals members ON database_role_members.member_principal_id = members.principal_id WHERE roles.name = '''''' + @rightsaction + '''''' AND members.name = '''''' + @RoleName + '''''') +BEGIN + EXEC sp_addrolemember N'''''' + @rightsaction + '''''', N'''''' + @RoleName + '''''' +END + +'' + END + + FETCH NEXT FROM SecurablesCurs INTO @typeofobject, @grantordeny, @rightsaction, @objectname, @schemaid + END + +CLOSE SecurablesCurs +DEALLOCATE SecurablesCurs + +PRINT ''SET ALL SECURABLES ON ROLE ['' + @RoleName + '']'' +EXEC sp_executesql @Command + +END + +/* ADD USER */ +DECLARE UsersCurs CURSOR FOR +SELECT username + FROM #UsersOnRole + +OPEN UsersCurs + +FETCH NEXT FROM UsersCurs INTO @Users +WHILE @@FETCH_STATUS = 0 +BEGIN + + SELECT @Command = '' +EXEC sp_addrolemember N'''''' + @RoleName + '''''', N'''''' + @Users + '''''' +PRINT ''''ADD USER ['' + @Users + ''] ON ROLE ['' + @RoleName + '']'''' +'' + +FETCH NEXT FROM UsersCurs INTO @Users +END + +CLOSE UsersCurs +DEALLOCATE UsersCurs + +EXEC sp_executesql @Command + +/*============================================================================= + Drop temp tables +=============================================================================*/ +DROP TABLE #Securables +DROP TABLE #UsersOnRole','ActivePos_server','Pharmacies') + +INSERT INTO #AllRoles(STR_Definition,STR_Database,STR_Product)VALUES(' + +/*============================================================================= + + Script to create dbRoleDevUsr role. + + Role Name: dbRoleDevUsr + TEMPLATE: Default + + EXAMPLE OF SECURABLES TO SET: + + INSERT INTO #Securables + VALUES + (''DB'',''GRANT'',''VIEW DEFINITION'','''',''''), + (''SCHEMA'',''GRANT'',''SELECT,EXECUTE,INSERT,UPDATE,DELETE'','''',''AP''), + (''TABLE'',''GRANT'',''INSERT,UPDATE'',''Address'',''dbo''), + (''SP'',''GRANT'',''EXECUTE'',''sp_bmc_GetNextID'',''dbo''), + (''ROLE'',''GRANT'',''db_datareader'','''','''') + + ----------------------------------------------- + +Generate date : 2023-05-12 / up208700 + +=============================================================================*/ + +DECLARE @Command nvarchar(max), + @RoleName varchar(60), + @Users varchar(255), + @typeofobject varchar(50), + @grantordeny varchar(10), + @rightsaction varchar(255), + @objectname varchar(255), + @schemaid varchar(10), + @sysTarget varchar(255), + @sysType varchar(255) + +SET @RoleName = ''dbRoleDevUsr'' +SET @Command = '''' + +/* TEMP TABLES */ +CREATE TABLE #UsersOnRole(username varchar(255)) +CREATE TABLE #Securables(typeofobject varchar(50), grantordeny varchar(10), rightsaction varchar(255), objectname varchar(255), schemaid varchar(10),N2 bit) + +/* !!! LIST OF SECURABLES TO CHANGE !!! */ + +INSERT INTO #Securables +VALUES +(''ROLE'',''GRANT'',''DB_OWNER'','''',''dbo'',0) + + +/* GET ALL USERS ON THIS ROLE */ +INSERT INTO #UsersOnRole +SELECT + members.name +FROM sys.database_role_members + JOIN sys.database_principals roles ON database_role_members.role_principal_id = roles.principal_id + JOIN sys.database_principals members ON database_role_members.member_principal_id = members.principal_id +WHERE roles.name = @RoleName + +/* CREATE ROLE */ +SELECT @Command = '' +IF NOT EXISTS (SELECT 1 FROM sys.database_principals WHERE name = '''''' + @RoleName + '''''' AND type = ''''R'''') +BEGIN + CREATE ROLE ['' + @RoleName + ''] AUTHORIZATION [dbo] + PRINT ''''CREATE ROLE ['' + @RoleName + '']'''' +END +'' +EXEC sp_executesql @Command + +SET @Command = '' +DECLARE @SP_Name varchar(255) + +'' + +/* SET ALL ROLE SECURABLES */ +DECLARE SecurablesCurs CURSOR FOR +SELECT typeofobject, grantordeny, rightsaction, objectname, schemaid +FROM #Securables +WHERE N2 = 0 + +OPEN SecurablesCurs +FETCH NEXT FROM SecurablesCurs INTO @typeofobject, @grantordeny, @rightsaction, @objectname, @schemaid +WHILE @@FETCH_STATUS = 0 +BEGIN + + IF @typeofobject = ''DB'' + BEGIN + IF EXISTS(SELECT 1 FROM sys.fn_builtin_permissions(''DATABASE'') WHERE permission_name = '''' + @rightsaction + '''') + BEGIN + SET @Command = @Command + @grantordeny + '' '' + @rightsaction + '' TO ['' + @RoleName + ''] +'' + END + END + + IF @typeofobject = ''SCHEMA'' + BEGIN + SET @Command = @Command + '' +IF EXISTS (SELECT 1 FROM sys.schemas WHERE name = '''''' + @schemaid + '''''') +BEGIN + IF EXISTS(SELECT 1 FROM sys.fn_builtin_permissions(''''SCHEMA'''') WHERE permission_name = '''''' + @rightsaction + '''''') + BEGIN + '' + @grantordeny + '' '' + @rightsaction + '' ON SCHEMA::'' + @schemaid + '' TO ['' + @RoleName + ''] + END +END + +'' + END + + IF @typeofobject in(''TABLE'',''SP'',''FUNCTIONS'',''VIEWS'') + BEGIN + + IF @objectname like ''%[%]%'' + BEGIN + + IF @typeofobject = ''TABLE'' + BEGIN + SET @sysTarget = ''sys.tables'' + SET @sysType = '''' + END + + IF @typeofobject = ''SP'' + BEGIN + SET @sysTarget = ''sys.procedures'' + SET @sysType = '''' + END + + IF @typeofobject = ''FUNCTIONS'' + BEGIN + SET @sysTarget = ''sys.objects'' + SET @sysType = '' and p.Type IN ( N''''FN'''', N''''IF'''', N''''TF'''', N''''FS'''', N''''FT'''' )'' + END + + IF @typeofobject = ''VIEWS'' + BEGIN + SET @sysTarget = ''sys.views'' + SET @sysType = '''' + END + + SET @Command = @Command + '' +DECLARE SP_cursor CURSOR FOR +SELECT p.name FROM '' + @sysTarget + '' p JOIN sys.schemas s ON s.schema_id = p.schema_id WHERE (p.name like '''''' + @objectname + '''''') and s.name = '''''' + @schemaid + '''' + @sysType + '''''' + +OPEN SP_cursor +FETCH NEXT FROM SP_cursor INTO @SP_Name +WHILE @@FETCH_STATUS = 0 +BEGIN + IF EXISTS(SELECT 1 FROM sys.fn_builtin_permissions(''''OBJECT'''') WHERE permission_name = '''''' + @rightsaction + '''''') + BEGIN + EXEC('''''' + @grantordeny + '' '' + @rightsaction + '' ON ['' + @schemaid + ''].['''' + @SP_Name + ''''] TO ['' + @RoleName + '']'''') + END + FETCH NEXT FROM SP_cursor INTO @SP_Name +END + +CLOSE SP_cursor +DEALLOCATE SP_cursor + +'' + + END + ELSE + BEGIN + + SET @Command = @Command + '' +IF EXISTS(SELECT 1 FROM sys.objects o WITH (NOLOCK) JOIN sys.schemas s ON s.schema_id = o.schema_id WHERE o.name = '''''' + @objectname + '''''' AND o.type IN (N''''U'''',''''P'''',''''V'''',''''FN'''',''''IF'''',''''TF'''') AND s.name = '''''' + @schemaid + '''''') +BEGIN + IF EXISTS(SELECT 1 FROM sys.fn_builtin_permissions(''''OBJECT'''') WHERE permission_name = '''''' + @rightsaction + '''''') + BEGIN + '' + @grantordeny + '' '' + @rightsaction + '' ON ['' + @schemaid + ''].['' + @objectname + ''] TO ['' + @RoleName + ''] + END +END + +'' + END +END + +IF @typeofobject = ''ASSEMBLIES'' +BEGIN + SET @Command = @Command + '' +IF EXISTS(SELECT 1 FROM sys.assemblies WHERE NAME = '''''' + @objectname + '''''') +BEGIN + IF EXISTS(SELECT 1 FROM sys.fn_builtin_permissions(''''ASSEMBLY'''') WHERE permission_name = '''''' + @rightsaction + '''''') + BEGIN + '' + @grantordeny + '' '' + @rightsaction + ''::['' + @objectname + ''] TO ['' + @RoleName + ''] + END +END + +'' +END + +IF @typeofobject = ''ROLE'' +BEGIN + SET @Command = @Command + '' +IF NOT EXISTS (SELECT 1 FROM sys.database_role_members JOIN sys.database_principals roles ON database_role_members.role_principal_id = roles.principal_id JOIN sys.database_principals members ON database_role_members.member_principal_id = members.principal_id WHERE roles.name = '''''' + @rightsaction + '''''' AND members.name = '''''' + @RoleName + '''''') +BEGIN + EXEC sp_addrolemember N'''''' + @rightsaction + '''''', N'''''' + @RoleName + '''''' +END + +'' +END + +FETCH NEXT FROM SecurablesCurs INTO @typeofobject, @grantordeny, @rightsaction, @objectname, @schemaid +END + +CLOSE SecurablesCurs +DEALLOCATE SecurablesCurs + +PRINT ''SET ALL SECURABLES ON ROLE ['' + @RoleName + '']'' +EXEC sp_executesql @Command + +/* ADD USER */ +DECLARE UsersCurs CURSOR FOR +SELECT username + FROM #UsersOnRole + +OPEN UsersCurs + +FETCH NEXT FROM UsersCurs INTO @Users +WHILE @@FETCH_STATUS = 0 +BEGIN + + SELECT @Command = '' +EXEC sp_addrolemember N'''''' + @RoleName + '''''', N'''''' + @Users + '''''' +PRINT ''''ADD USER ['' + @Users + ''] ON ROLE ['' + @RoleName + '']'''' +'' + +FETCH NEXT FROM UsersCurs INTO @Users +END + +CLOSE UsersCurs +DEALLOCATE UsersCurs + +EXEC sp_executesql @Command + + +/*============================================================================= + Drop temp tables +=============================================================================*/ +DROP TABLE #Securables +DROP TABLE #UsersOnRole +','ActivePos_server','Pharmacies') + +INSERT INTO #AllRoles(STR_Definition,STR_Database,STR_Product)VALUES(' + +/*============================================================================= + + Script to create dbRoleIttechUsr role. + + Role Name: dbRoleIttechUsr + TEMPLATE: N2 and PROD + + EXAMPLE OF SECURABLES TO SET: + + INSERT INTO #Securables + VALUES + (''DB'',''GRANT'',''VIEW DEFINITION'','''',''''), + (''SCHEMA'',''GRANT'',''SELECT,EXECUTE,INSERT,UPDATE,DELETE'','''',''AP''), + (''TABLE'',''GRANT'',''INSERT,UPDATE'',''Address'',''dbo''), + (''SP'',''GRANT'',''EXECUTE'',''sp_bmc_GetNextID'',''dbo''), + (''ROLE'',''GRANT'',''db_datareader'','''','''') + + ----------------------------------------------- + +Generate date : 2023-05-12 / up208700 + +=============================================================================*/ + +DECLARE @Type varchar(6), + @Command nvarchar(max), + @RoleName varchar(60), + @Users varchar(255), + @typeofobject varchar(50), + @grantordeny varchar(10), + @rightsaction varchar(255), + @objectname varchar(255), + @schemaid varchar(10), + @sysTarget varchar(255), + @sysType varchar(255) + +SET @RoleName = ''dbRoleIttechUsr'' +SET @Command = '''' + +SELECT @Type = [Type] FROM [master].[cfg].[InstanceContext] + +/* TEMP TABLES */ +CREATE TABLE #UsersOnRole(username varchar(255)) +CREATE TABLE #Securables(typeofobject varchar(50), grantordeny varchar(10), rightsaction varchar(255), objectname varchar(255), schemaid varchar(10),N2 bit) + +/* !!! LIST OF SECURABLES TO CHANGE !!! */ + +INSERT INTO #Securables +VALUES +(''DB'',''GRANT'',''CREATE TABLE'','''',''dbo'',0) +,(''DB'',''GRANT'',''EXECUTE'','''',''dbo'',0) +,(''ROLE'',''GRANT'',''DB_DATAREADER'','''',''dbo'',0) +,(''ROLE'',''GRANT'',''DB_DATAWRITER'','''',''dbo'',0) +,(''ROLE'',''GRANT'',''DB_OWNER'','''',''dbo'',1) +,(''SCHEMA'',''GRANT'',''ALTER'',''Entire Schema'',''tmp'',0) +,(''SCHEMA'',''GRANT'',''DELETE'',''Entire Schema'',''tmp'',0) +,(''SCHEMA'',''GRANT'',''EXECUTE'',''Entire Schema'',''tmp'',0) +,(''SCHEMA'',''GRANT'',''INSERT'',''Entire Schema'',''tmp'',0) +,(''SCHEMA'',''GRANT'',''SELECT'',''Entire Schema'',''tmp'',0) +,(''SCHEMA'',''GRANT'',''UPDATE'',''Entire Schema'',''tmp'',0) + + +/* GET ALL USERS ON THIS ROLE */ +INSERT INTO #UsersOnRole +SELECT + members.name +FROM sys.database_role_members + JOIN sys.database_principals roles ON database_role_members.role_principal_id = roles.principal_id + JOIN sys.database_principals members ON database_role_members.member_principal_id = members.principal_id +WHERE roles.name = @RoleName + +/* CREATE ROLE */ +SELECT @Command = '' +IF NOT EXISTS (SELECT 1 FROM sys.database_principals WHERE name = '''''' + @RoleName + '''''' AND type = ''''R'''') +BEGIN + CREATE ROLE ['' + @RoleName + ''] AUTHORIZATION [dbo] + PRINT ''''CREATE ROLE ['' + @RoleName + '']'''' +END +'' +EXEC sp_executesql @Command + +SET @Command = '' +DECLARE @SP_Name varchar(255) + +'' + +/* SET ALL ROLE SECURABLES */ +IF @Type = ''DEVE'' +BEGIN + + DECLARE SecurablesCurs CURSOR FOR + SELECT typeofobject, grantordeny, rightsaction, objectname, schemaid + FROM #Securables + WHERE N2 = 1 + + OPEN SecurablesCurs + FETCH NEXT FROM SecurablesCurs INTO @typeofobject, @grantordeny, @rightsaction, @objectname, @schemaid + WHILE @@FETCH_STATUS = 0 + BEGIN + + IF @typeofobject = ''DB'' + BEGIN + IF EXISTS(SELECT 1 FROM sys.fn_builtin_permissions(''DATABASE'') WHERE permission_name = '''' + @rightsaction + '''') + BEGIN + SET @Command = @Command + @grantordeny + '' '' + @rightsaction + '' TO ['' + @RoleName + ''] +'' + END + END + + IF @typeofobject = ''SCHEMA'' + BEGIN + SET @Command = @Command + '' +IF EXISTS (SELECT 1 FROM sys.schemas WHERE name = '''''' + @schemaid + '''''') +BEGIN + IF EXISTS(SELECT 1 FROM sys.fn_builtin_permissions(''''SCHEMA'''') WHERE permission_name = '''''' + @rightsaction + '''''') + BEGIN + '' + @grantordeny + '' '' + @rightsaction + '' ON SCHEMA::'' + @schemaid + '' TO ['' + @RoleName + ''] + END +END + +'' + END + + IF @typeofobject in(''TABLE'',''SP'',''FUNCTIONS'',''VIEWS'') + BEGIN + + IF @objectname like ''%[%]%'' + BEGIN + IF @typeofobject = ''TABLE'' + BEGIN + SET @sysTarget = ''sys.tables'' + SET @sysType = '''' + END + + IF @typeofobject = ''SP'' + BEGIN + SET @sysTarget = ''sys.procedures'' + SET @sysType = '''' + END + + IF @typeofobject = ''FUNCTIONS'' + BEGIN + SET @sysTarget = ''sys.objects'' + SET @sysType = '' and p.Type IN ( N''''FN'''', N''''IF'''', N''''TF'''', N''''FS'''', N''''FT'''' )'' + END + + IF @typeofobject = ''VIEWS'' + BEGIN + SET @sysTarget = ''sys.views'' + SET @sysType = '''' + END + + SET @Command = @Command + '' +DECLARE SP_cursor CURSOR FOR +SELECT p.name FROM '' + @sysTarget + '' p JOIN sys.schemas s ON s.schema_id = p.schema_id WHERE (p.name like '''''' + @objectname + '''''') and s.name = '''''' + @schemaid + '''' + @sysType + '''''' + +OPEN SP_cursor +FETCH NEXT FROM SP_cursor INTO @SP_Name +WHILE @@FETCH_STATUS = 0 +BEGIN + IF EXISTS(SELECT 1 FROM sys.fn_builtin_permissions(''''OBJECT'''') WHERE permission_name = '''''' + @rightsaction + '''''') + BEGIN + EXEC('''''' + @grantordeny + '' '' + @rightsaction + '' ON ['' + @schemaid + ''].['''' + @SP_Name + ''''] TO ['' + @RoleName + '']'''') + END + FETCH NEXT FROM SP_cursor INTO @SP_Name +END + +CLOSE SP_cursor +DEALLOCATE SP_cursor + +'' + + END + ELSE + BEGIN + + SET @Command = @Command + '' +IF EXISTS(SELECT 1 FROM sys.objects o WITH (NOLOCK) JOIN sys.schemas s ON s.schema_id = o.schema_id WHERE o.name = '''''' + @objectname + '''''' AND o.type IN (N''''U'''',''''P'''',''''V'''',''''FN'''',''''IF'''',''''TF'''') AND s.name = '''''' + @schemaid + '''''') +BEGIN + IF EXISTS(SELECT 1 FROM sys.fn_builtin_permissions(''''OBJECT'''') WHERE permission_name = '''''' + @rightsaction + '''''') + BEGIN + '' + @grantordeny + '' '' + @rightsaction + '' ON ['' + @schemaid + ''].['' + @objectname + ''] TO ['' + @RoleName + ''] + END +END + +'' + END + END + + IF @typeofobject = ''ASSEMBLIES'' + BEGIN + SET @Command = @Command + '' +IF EXISTS(SELECT 1 FROM sys.assemblies WHERE NAME = '''''' + @objectname + '''''') +BEGIN + IF EXISTS(SELECT 1 FROM sys.fn_builtin_permissions(''''ASSEMBLY'''') WHERE permission_name = '''''' + @rightsaction + '''''') + BEGIN + '' + @grantordeny + '' '' + @rightsaction + ''::['' + @objectname + ''] TO ['' + @RoleName + ''] + END +END + +'' + END + + IF @typeofobject = ''ROLE'' + BEGIN + SET @Command = @Command + '' +IF NOT EXISTS (SELECT 1 FROM sys.database_role_members JOIN sys.database_principals roles ON database_role_members.role_principal_id = roles.principal_id JOIN sys.database_principals members ON database_role_members.member_principal_id = members.principal_id WHERE roles.name = '''''' + @rightsaction + '''''' AND members.name = '''''' + @RoleName + '''''') +BEGIN + EXEC sp_addrolemember N'''''' + @rightsaction + '''''', N'''''' + @RoleName + '''''' +END + +'' + END + + FETCH NEXT FROM SecurablesCurs INTO @typeofobject, @grantordeny, @rightsaction, @objectname, @schemaid + END + +CLOSE SecurablesCurs +DEALLOCATE SecurablesCurs + +PRINT ''SET ALL SECURABLES ON ROLE ['' + @RoleName + '']'' +EXEC sp_executesql @Command + +END +ELSE +BEGIN + + DECLARE SecurablesCurs CURSOR FOR + SELECT typeofobject, grantordeny, rightsaction, objectname, schemaid + FROM #Securables + WHERE N2 = 0 + + OPEN SecurablesCurs + FETCH NEXT FROM SecurablesCurs INTO @typeofobject, @grantordeny, @rightsaction, @objectname, @schemaid + WHILE @@FETCH_STATUS = 0 + BEGIN + + IF @typeofobject = ''DB'' + BEGIN + IF EXISTS(SELECT 1 FROM sys.fn_builtin_permissions(''DATABASE'') WHERE permission_name = '''' + @rightsaction + '''') + BEGIN + SET @Command = @Command + @grantordeny + '' '' + @rightsaction + '' TO ['' + @RoleName + ''] +'' + END + END + + IF @typeofobject = ''SCHEMA'' + BEGIN + SET @Command = @Command + '' +IF EXISTS (SELECT 1 FROM sys.schemas WHERE name = '''''' + @schemaid + '''''') +BEGIN + IF EXISTS(SELECT 1 FROM sys.fn_builtin_permissions(''''SCHEMA'''') WHERE permission_name = '''''' + @rightsaction + '''''') + BEGIN + '' + @grantordeny + '' '' + @rightsaction + '' ON SCHEMA::'' + @schemaid + '' TO ['' + @RoleName + ''] + END +END + +'' + END + + IF @typeofobject in(''TABLE'',''SP'',''FUNCTIONS'',''VIEWS'') + BEGIN + + IF @objectname like ''%[%]%'' + BEGIN + + IF @typeofobject = ''TABLE'' + BEGIN + SET @sysTarget = ''sys.tables'' + SET @sysType = '''' + END + + IF @typeofobject = ''SP'' + BEGIN + SET @sysTarget = ''sys.procedures'' + SET @sysType = '''' + END + + IF @typeofobject = ''FUNCTIONS'' + BEGIN + SET @sysTarget = ''sys.objects'' + SET @sysType = '' and p.Type IN ( N''''FN'''', N''''IF'''', N''''TF'''', N''''FS'''', N''''FT'''' )'' + END + + IF @typeofobject = ''VIEWS'' + BEGIN + SET @sysTarget = ''sys.views'' + SET @sysType = '''' + END + + SET @Command = @Command + '' +DECLARE SP_cursor CURSOR FOR +SELECT p.name FROM '' + @sysTarget + '' p JOIN sys.schemas s ON s.schema_id = p.schema_id WHERE (p.name like '''''' + @objectname + '''''') and s.name = '''''' + @schemaid + '''' + @sysType + '''''' + +OPEN SP_cursor +FETCH NEXT FROM SP_cursor INTO @SP_Name +WHILE @@FETCH_STATUS = 0 +BEGIN + IF EXISTS(SELECT 1 FROM sys.fn_builtin_permissions(''''OBJECT'''') WHERE permission_name = '''''' + @rightsaction + '''''') + BEGIN + EXEC('''''' + @grantordeny + '' '' + @rightsaction + '' ON ['' + @schemaid + ''].['''' + @SP_Name + ''''] TO ['' + @RoleName + '']'''') + END + FETCH NEXT FROM SP_cursor INTO @SP_Name +END + +CLOSE SP_cursor +DEALLOCATE SP_cursor + +'' + + END + ELSE + BEGIN + + SET @Command = @Command + '' +IF EXISTS(SELECT 1 FROM sys.objects o WITH (NOLOCK) JOIN sys.schemas s ON s.schema_id = o.schema_id WHERE o.name = '''''' + @objectname + '''''' AND o.type IN (N''''U'''',''''P'''',''''V'''',''''FN'''',''''IF'''',''''TF'''') AND s.name = '''''' + @schemaid + '''''') +BEGIN + IF EXISTS(SELECT 1 FROM sys.fn_builtin_permissions(''''OBJECT'''') WHERE permission_name = '''''' + @rightsaction + '''''') + BEGIN + '' + @grantordeny + '' '' + @rightsaction + '' ON ['' + @schemaid + ''].['' + @objectname + ''] TO ['' + @RoleName + ''] + END +END + +'' + END + END + + IF @typeofobject = ''ASSEMBLIES'' + BEGIN + SET @Command = @Command + '' +IF EXISTS(SELECT 1 FROM sys.assemblies WHERE NAME = '''''' + @objectname + '''''') +BEGIN + IF EXISTS(SELECT 1 FROM sys.fn_builtin_permissions(''''ASSEMBLY'''') WHERE permission_name = '''''' + @rightsaction + '''''') + BEGIN + '' + @grantordeny + '' '' + @rightsaction + ''::['' + @objectname + ''] TO ['' + @RoleName + ''] + END +END + +'' + END + + IF @typeofobject = ''ROLE'' + BEGIN + SET @Command = @Command + '' +IF NOT EXISTS (SELECT 1 FROM sys.database_role_members JOIN sys.database_principals roles ON database_role_members.role_principal_id = roles.principal_id JOIN sys.database_principals members ON database_role_members.member_principal_id = members.principal_id WHERE roles.name = '''''' + @rightsaction + '''''' AND members.name = '''''' + @RoleName + '''''') +BEGIN + EXEC sp_addrolemember N'''''' + @rightsaction + '''''', N'''''' + @RoleName + '''''' +END + +'' + END + + FETCH NEXT FROM SecurablesCurs INTO @typeofobject, @grantordeny, @rightsaction, @objectname, @schemaid + END + +CLOSE SecurablesCurs +DEALLOCATE SecurablesCurs + +PRINT ''SET ALL SECURABLES ON ROLE ['' + @RoleName + '']'' +EXEC sp_executesql @Command + +END + +/* ADD USER */ +DECLARE UsersCurs CURSOR FOR +SELECT username + FROM #UsersOnRole + +OPEN UsersCurs + +FETCH NEXT FROM UsersCurs INTO @Users +WHILE @@FETCH_STATUS = 0 +BEGIN + + SELECT @Command = '' +EXEC sp_addrolemember N'''''' + @RoleName + '''''', N'''''' + @Users + '''''' +PRINT ''''ADD USER ['' + @Users + ''] ON ROLE ['' + @RoleName + '']'''' +'' + +FETCH NEXT FROM UsersCurs INTO @Users +END + +CLOSE UsersCurs +DEALLOCATE UsersCurs + +EXEC sp_executesql @Command + +/*============================================================================= + Drop temp tables +=============================================================================*/ +DROP TABLE #Securables +DROP TABLE #UsersOnRole','ActivePos_server','Pharmacies') + +INSERT INTO #AllRoles(STR_Definition,STR_Database,STR_Product)VALUES(' + +/*============================================================================= + + Script to create dbRoleSupUsr role. + + Role Name: dbRoleSupUsr + TEMPLATE: N2 and PROD + + EXAMPLE OF SECURABLES TO SET: + + INSERT INTO #Securables + VALUES + (''DB'',''GRANT'',''VIEW DEFINITION'','''',''''), + (''SCHEMA'',''GRANT'',''SELECT,EXECUTE,INSERT,UPDATE,DELETE'','''',''AP''), + (''TABLE'',''GRANT'',''INSERT,UPDATE'',''Address'',''dbo''), + (''SP'',''GRANT'',''EXECUTE'',''sp_bmc_GetNextID'',''dbo''), + (''ROLE'',''GRANT'',''db_datareader'','''','''') + + ----------------------------------------------- + +Generate date : 2023-05-12 / up208700 + +=============================================================================*/ + +DECLARE @Type varchar(6), + @Command nvarchar(max), + @RoleName varchar(60), + @Users varchar(255), + @typeofobject varchar(50), + @grantordeny varchar(10), + @rightsaction varchar(255), + @objectname varchar(255), + @schemaid varchar(10), + @sysTarget varchar(255), + @sysType varchar(255) + +SET @RoleName = ''dbRoleSupUsr'' +SET @Command = '''' + +SELECT @Type = [Type] FROM [master].[cfg].[InstanceContext] + +/* TEMP TABLES */ +CREATE TABLE #UsersOnRole(username varchar(255)) +CREATE TABLE #Securables(typeofobject varchar(50), grantordeny varchar(10), rightsaction varchar(255), objectname varchar(255), schemaid varchar(10),N2 bit) + +/* !!! LIST OF SECURABLES TO CHANGE !!! */ + +INSERT INTO #Securables +VALUES +(''DB'',''GRANT'',''CREATE TABLE'','''',''dbo'',0) +,(''DB'',''GRANT'',''EXECUTE'','''',''dbo'',0) +,(''ROLE'',''GRANT'',''DB_DATAREADER'','''',''dbo'',0) +,(''ROLE'',''GRANT'',''DB_DATAWRITER'','''',''dbo'',0) +,(''ROLE'',''GRANT'',''DB_OWNER'','''',''dbo'',1) +,(''SCHEMA'',''GRANT'',''ALTER'',''Entire Schema'',''tmp'',0) +,(''SCHEMA'',''GRANT'',''DELETE'',''Entire Schema'',''tmp'',0) +,(''SCHEMA'',''GRANT'',''EXECUTE'',''Entire Schema'',''tmp'',0) +,(''SCHEMA'',''GRANT'',''INSERT'',''Entire Schema'',''tmp'',0) +,(''SCHEMA'',''GRANT'',''SELECT'',''Entire Schema'',''tmp'',0) +,(''SCHEMA'',''GRANT'',''UPDATE'',''Entire Schema'',''tmp'',0) + + +/* GET ALL USERS ON THIS ROLE */ +INSERT INTO #UsersOnRole +SELECT + members.name +FROM sys.database_role_members + JOIN sys.database_principals roles ON database_role_members.role_principal_id = roles.principal_id + JOIN sys.database_principals members ON database_role_members.member_principal_id = members.principal_id +WHERE roles.name = @RoleName + +/* CREATE ROLE */ +SELECT @Command = '' +IF NOT EXISTS (SELECT 1 FROM sys.database_principals WHERE name = '''''' + @RoleName + '''''' AND type = ''''R'''') +BEGIN + CREATE ROLE ['' + @RoleName + ''] AUTHORIZATION [dbo] + PRINT ''''CREATE ROLE ['' + @RoleName + '']'''' +END +'' +EXEC sp_executesql @Command + +SET @Command = '' +DECLARE @SP_Name varchar(255) + +'' + +/* SET ALL ROLE SECURABLES */ +IF @Type = ''DEVE'' +BEGIN + + DECLARE SecurablesCurs CURSOR FOR + SELECT typeofobject, grantordeny, rightsaction, objectname, schemaid + FROM #Securables + WHERE N2 = 1 + + OPEN SecurablesCurs + FETCH NEXT FROM SecurablesCurs INTO @typeofobject, @grantordeny, @rightsaction, @objectname, @schemaid + WHILE @@FETCH_STATUS = 0 + BEGIN + + IF @typeofobject = ''DB'' + BEGIN + IF EXISTS(SELECT 1 FROM sys.fn_builtin_permissions(''DATABASE'') WHERE permission_name = '''' + @rightsaction + '''') + BEGIN + SET @Command = @Command + @grantordeny + '' '' + @rightsaction + '' TO ['' + @RoleName + ''] +'' + END + END + + IF @typeofobject = ''SCHEMA'' + BEGIN + SET @Command = @Command + '' +IF EXISTS (SELECT 1 FROM sys.schemas WHERE name = '''''' + @schemaid + '''''') +BEGIN + IF EXISTS(SELECT 1 FROM sys.fn_builtin_permissions(''''SCHEMA'''') WHERE permission_name = '''''' + @rightsaction + '''''') + BEGIN + '' + @grantordeny + '' '' + @rightsaction + '' ON SCHEMA::'' + @schemaid + '' TO ['' + @RoleName + ''] + END +END + +'' + END + + IF @typeofobject in(''TABLE'',''SP'',''FUNCTIONS'',''VIEWS'') + BEGIN + + IF @objectname like ''%[%]%'' + BEGIN + IF @typeofobject = ''TABLE'' + BEGIN + SET @sysTarget = ''sys.tables'' + SET @sysType = '''' + END + + IF @typeofobject = ''SP'' + BEGIN + SET @sysTarget = ''sys.procedures'' + SET @sysType = '''' + END + + IF @typeofobject = ''FUNCTIONS'' + BEGIN + SET @sysTarget = ''sys.objects'' + SET @sysType = '' and p.Type IN ( N''''FN'''', N''''IF'''', N''''TF'''', N''''FS'''', N''''FT'''' )'' + END + + IF @typeofobject = ''VIEWS'' + BEGIN + SET @sysTarget = ''sys.views'' + SET @sysType = '''' + END + + SET @Command = @Command + '' +DECLARE SP_cursor CURSOR FOR +SELECT p.name FROM '' + @sysTarget + '' p JOIN sys.schemas s ON s.schema_id = p.schema_id WHERE (p.name like '''''' + @objectname + '''''') and s.name = '''''' + @schemaid + '''' + @sysType + '''''' + +OPEN SP_cursor +FETCH NEXT FROM SP_cursor INTO @SP_Name +WHILE @@FETCH_STATUS = 0 +BEGIN + IF EXISTS(SELECT 1 FROM sys.fn_builtin_permissions(''''OBJECT'''') WHERE permission_name = '''''' + @rightsaction + '''''') + BEGIN + EXEC('''''' + @grantordeny + '' '' + @rightsaction + '' ON ['' + @schemaid + ''].['''' + @SP_Name + ''''] TO ['' + @RoleName + '']'''') + END + FETCH NEXT FROM SP_cursor INTO @SP_Name +END + +CLOSE SP_cursor +DEALLOCATE SP_cursor + +'' + + END + ELSE + BEGIN + + SET @Command = @Command + '' +IF EXISTS(SELECT 1 FROM sys.objects o WITH (NOLOCK) JOIN sys.schemas s ON s.schema_id = o.schema_id WHERE o.name = '''''' + @objectname + '''''' AND o.type IN (N''''U'''',''''P'''',''''V'''',''''FN'''',''''IF'''',''''TF'''') AND s.name = '''''' + @schemaid + '''''') +BEGIN + IF EXISTS(SELECT 1 FROM sys.fn_builtin_permissions(''''OBJECT'''') WHERE permission_name = '''''' + @rightsaction + '''''') + BEGIN + '' + @grantordeny + '' '' + @rightsaction + '' ON ['' + @schemaid + ''].['' + @objectname + ''] TO ['' + @RoleName + ''] + END +END + +'' + END + END + + IF @typeofobject = ''ASSEMBLIES'' + BEGIN + SET @Command = @Command + '' +IF EXISTS(SELECT 1 FROM sys.assemblies WHERE NAME = '''''' + @objectname + '''''') +BEGIN + IF EXISTS(SELECT 1 FROM sys.fn_builtin_permissions(''''ASSEMBLY'''') WHERE permission_name = '''''' + @rightsaction + '''''') + BEGIN + '' + @grantordeny + '' '' + @rightsaction + ''::['' + @objectname + ''] TO ['' + @RoleName + ''] + END +END + +'' + END + + IF @typeofobject = ''ROLE'' + BEGIN + SET @Command = @Command + '' +IF NOT EXISTS (SELECT 1 FROM sys.database_role_members JOIN sys.database_principals roles ON database_role_members.role_principal_id = roles.principal_id JOIN sys.database_principals members ON database_role_members.member_principal_id = members.principal_id WHERE roles.name = '''''' + @rightsaction + '''''' AND members.name = '''''' + @RoleName + '''''') +BEGIN + EXEC sp_addrolemember N'''''' + @rightsaction + '''''', N'''''' + @RoleName + '''''' +END + +'' + END + + FETCH NEXT FROM SecurablesCurs INTO @typeofobject, @grantordeny, @rightsaction, @objectname, @schemaid + END + +CLOSE SecurablesCurs +DEALLOCATE SecurablesCurs + +PRINT ''SET ALL SECURABLES ON ROLE ['' + @RoleName + '']'' +EXEC sp_executesql @Command + +END +ELSE +BEGIN + + DECLARE SecurablesCurs CURSOR FOR + SELECT typeofobject, grantordeny, rightsaction, objectname, schemaid + FROM #Securables + WHERE N2 = 0 + + OPEN SecurablesCurs + FETCH NEXT FROM SecurablesCurs INTO @typeofobject, @grantordeny, @rightsaction, @objectname, @schemaid + WHILE @@FETCH_STATUS = 0 + BEGIN + + IF @typeofobject = ''DB'' + BEGIN + IF EXISTS(SELECT 1 FROM sys.fn_builtin_permissions(''DATABASE'') WHERE permission_name = '''' + @rightsaction + '''') + BEGIN + SET @Command = @Command + @grantordeny + '' '' + @rightsaction + '' TO ['' + @RoleName + ''] +'' + END + END + + IF @typeofobject = ''SCHEMA'' + BEGIN + SET @Command = @Command + '' +IF EXISTS (SELECT 1 FROM sys.schemas WHERE name = '''''' + @schemaid + '''''') +BEGIN + IF EXISTS(SELECT 1 FROM sys.fn_builtin_permissions(''''SCHEMA'''') WHERE permission_name = '''''' + @rightsaction + '''''') + BEGIN + '' + @grantordeny + '' '' + @rightsaction + '' ON SCHEMA::'' + @schemaid + '' TO ['' + @RoleName + ''] + END +END + +'' + END + + IF @typeofobject in(''TABLE'',''SP'',''FUNCTIONS'',''VIEWS'') + BEGIN + + IF @objectname like ''%[%]%'' + BEGIN + + IF @typeofobject = ''TABLE'' + BEGIN + SET @sysTarget = ''sys.tables'' + SET @sysType = '''' + END + + IF @typeofobject = ''SP'' + BEGIN + SET @sysTarget = ''sys.procedures'' + SET @sysType = '''' + END + + IF @typeofobject = ''FUNCTIONS'' + BEGIN + SET @sysTarget = ''sys.objects'' + SET @sysType = '' and p.Type IN ( N''''FN'''', N''''IF'''', N''''TF'''', N''''FS'''', N''''FT'''' )'' + END + + IF @typeofobject = ''VIEWS'' + BEGIN + SET @sysTarget = ''sys.views'' + SET @sysType = '''' + END + + SET @Command = @Command + '' +DECLARE SP_cursor CURSOR FOR +SELECT p.name FROM '' + @sysTarget + '' p JOIN sys.schemas s ON s.schema_id = p.schema_id WHERE (p.name like '''''' + @objectname + '''''') and s.name = '''''' + @schemaid + '''' + @sysType + '''''' + +OPEN SP_cursor +FETCH NEXT FROM SP_cursor INTO @SP_Name +WHILE @@FETCH_STATUS = 0 +BEGIN + IF EXISTS(SELECT 1 FROM sys.fn_builtin_permissions(''''OBJECT'''') WHERE permission_name = '''''' + @rightsaction + '''''') + BEGIN + EXEC('''''' + @grantordeny + '' '' + @rightsaction + '' ON ['' + @schemaid + ''].['''' + @SP_Name + ''''] TO ['' + @RoleName + '']'''') + END + FETCH NEXT FROM SP_cursor INTO @SP_Name +END + +CLOSE SP_cursor +DEALLOCATE SP_cursor + +'' + + END + ELSE + BEGIN + + SET @Command = @Command + '' +IF EXISTS(SELECT 1 FROM sys.objects o WITH (NOLOCK) JOIN sys.schemas s ON s.schema_id = o.schema_id WHERE o.name = '''''' + @objectname + '''''' AND o.type IN (N''''U'''',''''P'''',''''V'''',''''FN'''',''''IF'''',''''TF'''') AND s.name = '''''' + @schemaid + '''''') +BEGIN + IF EXISTS(SELECT 1 FROM sys.fn_builtin_permissions(''''OBJECT'''') WHERE permission_name = '''''' + @rightsaction + '''''') + BEGIN + '' + @grantordeny + '' '' + @rightsaction + '' ON ['' + @schemaid + ''].['' + @objectname + ''] TO ['' + @RoleName + ''] + END +END + +'' + END + END + + IF @typeofobject = ''ASSEMBLIES'' + BEGIN + SET @Command = @Command + '' +IF EXISTS(SELECT 1 FROM sys.assemblies WHERE NAME = '''''' + @objectname + '''''') +BEGIN + IF EXISTS(SELECT 1 FROM sys.fn_builtin_permissions(''''ASSEMBLY'''') WHERE permission_name = '''''' + @rightsaction + '''''') + BEGIN + '' + @grantordeny + '' '' + @rightsaction + ''::['' + @objectname + ''] TO ['' + @RoleName + ''] + END +END + +'' + END + + IF @typeofobject = ''ROLE'' + BEGIN + SET @Command = @Command + '' +IF NOT EXISTS (SELECT 1 FROM sys.database_role_members JOIN sys.database_principals roles ON database_role_members.role_principal_id = roles.principal_id JOIN sys.database_principals members ON database_role_members.member_principal_id = members.principal_id WHERE roles.name = '''''' + @rightsaction + '''''' AND members.name = '''''' + @RoleName + '''''') +BEGIN + EXEC sp_addrolemember N'''''' + @rightsaction + '''''', N'''''' + @RoleName + '''''' +END + +'' + END + + FETCH NEXT FROM SecurablesCurs INTO @typeofobject, @grantordeny, @rightsaction, @objectname, @schemaid + END + +CLOSE SecurablesCurs +DEALLOCATE SecurablesCurs + +PRINT ''SET ALL SECURABLES ON ROLE ['' + @RoleName + '']'' +EXEC sp_executesql @Command + +END + +/* ADD USER */ +DECLARE UsersCurs CURSOR FOR +SELECT username + FROM #UsersOnRole + +OPEN UsersCurs + +FETCH NEXT FROM UsersCurs INTO @Users +WHILE @@FETCH_STATUS = 0 +BEGIN + + SELECT @Command = '' +EXEC sp_addrolemember N'''''' + @RoleName + '''''', N'''''' + @Users + '''''' +PRINT ''''ADD USER ['' + @Users + ''] ON ROLE ['' + @RoleName + '']'''' +'' + +FETCH NEXT FROM UsersCurs INTO @Users +END + +CLOSE UsersCurs +DEALLOCATE UsersCurs + +EXEC sp_executesql @Command + +/*============================================================================= + Drop temp tables +=============================================================================*/ +DROP TABLE #Securables +DROP TABLE #UsersOnRole','ActivePos_server','Pharmacies') + +INSERT INTO #AllRoles(STR_Definition,STR_Database,STR_Product)VALUES(' + +/*============================================================================= + + Script to create dbRoleTPPos role. + + Role Name: dbRoleTPPos + TEMPLATE: Default + + EXAMPLE OF SECURABLES TO SET: + + INSERT INTO #Securables + VALUES + (''DB'',''GRANT'',''VIEW DEFINITION'','''',''''), + (''SCHEMA'',''GRANT'',''SELECT,EXECUTE,INSERT,UPDATE,DELETE'','''',''AP''), + (''TABLE'',''GRANT'',''INSERT,UPDATE'',''Address'',''dbo''), + (''SP'',''GRANT'',''EXECUTE'',''sp_bmc_GetNextID'',''dbo''), + (''ROLE'',''GRANT'',''db_datareader'','''','''') + + ----------------------------------------------- + +Generate date : 2023-05-12 / up208700 + +=============================================================================*/ + +DECLARE @Command nvarchar(max), + @RoleName varchar(60), + @Users varchar(255), + @typeofobject varchar(50), + @grantordeny varchar(10), + @rightsaction varchar(255), + @objectname varchar(255), + @schemaid varchar(10), + @sysTarget varchar(255), + @sysType varchar(255) + +SET @RoleName = ''dbRoleTPPos'' +SET @Command = '''' + +/* TEMP TABLES */ +CREATE TABLE #UsersOnRole(username varchar(255)) +CREATE TABLE #Securables(typeofobject varchar(50), grantordeny varchar(10), rightsaction varchar(255), objectname varchar(255), schemaid varchar(10),N2 bit) + +/* !!! LIST OF SECURABLES TO CHANGE !!! */ + +INSERT INTO #Securables +VALUES +(''DB'',''GRANT'',''EXECUTE'','''',''dbo'',0) +,(''ROLE'',''GRANT'',''DB_DATAREADER'','''',''dbo'',0) +,(''ROLE'',''GRANT'',''DB_DATAWRITER'','''',''dbo'',0) +,(''ROLE'',''GRANT'',''DB_DDLADMIN'','''',''dbo'',0) + + +/* GET ALL USERS ON THIS ROLE */ +INSERT INTO #UsersOnRole +SELECT + members.name +FROM sys.database_role_members + JOIN sys.database_principals roles ON database_role_members.role_principal_id = roles.principal_id + JOIN sys.database_principals members ON database_role_members.member_principal_id = members.principal_id +WHERE roles.name = @RoleName + +/* CREATE ROLE */ +SELECT @Command = '' +IF NOT EXISTS (SELECT 1 FROM sys.database_principals WHERE name = '''''' + @RoleName + '''''' AND type = ''''R'''') +BEGIN + CREATE ROLE ['' + @RoleName + ''] AUTHORIZATION [dbo] + PRINT ''''CREATE ROLE ['' + @RoleName + '']'''' +END +'' +EXEC sp_executesql @Command + +SET @Command = '' +DECLARE @SP_Name varchar(255) + +'' + +/* SET ALL ROLE SECURABLES */ +DECLARE SecurablesCurs CURSOR FOR +SELECT typeofobject, grantordeny, rightsaction, objectname, schemaid +FROM #Securables +WHERE N2 = 0 + +OPEN SecurablesCurs +FETCH NEXT FROM SecurablesCurs INTO @typeofobject, @grantordeny, @rightsaction, @objectname, @schemaid +WHILE @@FETCH_STATUS = 0 +BEGIN + + IF @typeofobject = ''DB'' + BEGIN + IF EXISTS(SELECT 1 FROM sys.fn_builtin_permissions(''DATABASE'') WHERE permission_name = '''' + @rightsaction + '''') + BEGIN + SET @Command = @Command + @grantordeny + '' '' + @rightsaction + '' TO ['' + @RoleName + ''] +'' + END + END + + IF @typeofobject = ''SCHEMA'' + BEGIN + SET @Command = @Command + '' +IF EXISTS (SELECT 1 FROM sys.schemas WHERE name = '''''' + @schemaid + '''''') +BEGIN + IF EXISTS(SELECT 1 FROM sys.fn_builtin_permissions(''''SCHEMA'''') WHERE permission_name = '''''' + @rightsaction + '''''') + BEGIN + '' + @grantordeny + '' '' + @rightsaction + '' ON SCHEMA::'' + @schemaid + '' TO ['' + @RoleName + ''] + END +END + +'' + END + + IF @typeofobject in(''TABLE'',''SP'',''FUNCTIONS'',''VIEWS'') + BEGIN + + IF @objectname like ''%[%]%'' + BEGIN + + IF @typeofobject = ''TABLE'' + BEGIN + SET @sysTarget = ''sys.tables'' + SET @sysType = '''' + END + + IF @typeofobject = ''SP'' + BEGIN + SET @sysTarget = ''sys.procedures'' + SET @sysType = '''' + END + + IF @typeofobject = ''FUNCTIONS'' + BEGIN + SET @sysTarget = ''sys.objects'' + SET @sysType = '' and p.Type IN ( N''''FN'''', N''''IF'''', N''''TF'''', N''''FS'''', N''''FT'''' )'' + END + + IF @typeofobject = ''VIEWS'' + BEGIN + SET @sysTarget = ''sys.views'' + SET @sysType = '''' + END + + SET @Command = @Command + '' +DECLARE SP_cursor CURSOR FOR +SELECT p.name FROM '' + @sysTarget + '' p JOIN sys.schemas s ON s.schema_id = p.schema_id WHERE (p.name like '''''' + @objectname + '''''') and s.name = '''''' + @schemaid + '''' + @sysType + '''''' + +OPEN SP_cursor +FETCH NEXT FROM SP_cursor INTO @SP_Name +WHILE @@FETCH_STATUS = 0 +BEGIN + IF EXISTS(SELECT 1 FROM sys.fn_builtin_permissions(''''OBJECT'''') WHERE permission_name = '''''' + @rightsaction + '''''') + BEGIN + EXEC('''''' + @grantordeny + '' '' + @rightsaction + '' ON ['' + @schemaid + ''].['''' + @SP_Name + ''''] TO ['' + @RoleName + '']'''') + END + FETCH NEXT FROM SP_cursor INTO @SP_Name +END + +CLOSE SP_cursor +DEALLOCATE SP_cursor + +'' + + END + ELSE + BEGIN + + SET @Command = @Command + '' +IF EXISTS(SELECT 1 FROM sys.objects o WITH (NOLOCK) JOIN sys.schemas s ON s.schema_id = o.schema_id WHERE o.name = '''''' + @objectname + '''''' AND o.type IN (N''''U'''',''''P'''',''''V'''',''''FN'''',''''IF'''',''''TF'''') AND s.name = '''''' + @schemaid + '''''') +BEGIN + IF EXISTS(SELECT 1 FROM sys.fn_builtin_permissions(''''OBJECT'''') WHERE permission_name = '''''' + @rightsaction + '''''') + BEGIN + '' + @grantordeny + '' '' + @rightsaction + '' ON ['' + @schemaid + ''].['' + @objectname + ''] TO ['' + @RoleName + ''] + END +END + +'' + END +END + +IF @typeofobject = ''ASSEMBLIES'' +BEGIN + SET @Command = @Command + '' +IF EXISTS(SELECT 1 FROM sys.assemblies WHERE NAME = '''''' + @objectname + '''''') +BEGIN + IF EXISTS(SELECT 1 FROM sys.fn_builtin_permissions(''''ASSEMBLY'''') WHERE permission_name = '''''' + @rightsaction + '''''') + BEGIN + '' + @grantordeny + '' '' + @rightsaction + ''::['' + @objectname + ''] TO ['' + @RoleName + ''] + END +END + +'' +END + +IF @typeofobject = ''ROLE'' +BEGIN + SET @Command = @Command + '' +IF NOT EXISTS (SELECT 1 FROM sys.database_role_members JOIN sys.database_principals roles ON database_role_members.role_principal_id = roles.principal_id JOIN sys.database_principals members ON database_role_members.member_principal_id = members.principal_id WHERE roles.name = '''''' + @rightsaction + '''''' AND members.name = '''''' + @RoleName + '''''') +BEGIN + EXEC sp_addrolemember N'''''' + @rightsaction + '''''', N'''''' + @RoleName + '''''' +END + +'' +END + +FETCH NEXT FROM SecurablesCurs INTO @typeofobject, @grantordeny, @rightsaction, @objectname, @schemaid +END + +CLOSE SecurablesCurs +DEALLOCATE SecurablesCurs + +PRINT ''SET ALL SECURABLES ON ROLE ['' + @RoleName + '']'' +EXEC sp_executesql @Command + +/* ADD USER */ +DECLARE UsersCurs CURSOR FOR +SELECT username + FROM #UsersOnRole + +OPEN UsersCurs + +FETCH NEXT FROM UsersCurs INTO @Users +WHILE @@FETCH_STATUS = 0 +BEGIN + + SELECT @Command = '' +EXEC sp_addrolemember N'''''' + @RoleName + '''''', N'''''' + @Users + '''''' +PRINT ''''ADD USER ['' + @Users + ''] ON ROLE ['' + @RoleName + '']'''' +'' + +FETCH NEXT FROM UsersCurs INTO @Users +END + +CLOSE UsersCurs +DEALLOCATE UsersCurs + +EXEC sp_executesql @Command + + +/*============================================================================= + Drop temp tables +=============================================================================*/ +DROP TABLE #Securables +DROP TABLE #UsersOnRole +','ActivePos_server','Pharmacies') + +INSERT INTO #AllRoles(STR_Definition,STR_Database,STR_Product)VALUES(' + +/*============================================================================= + + Script to create dbRoleActiveConfig role. + + Role Name: dbRoleActiveConfig + TEMPLATE: Default + + EXAMPLE OF SECURABLES TO SET: + + INSERT INTO #Securables + VALUES + (''DB'',''GRANT'',''VIEW DEFINITION'','''',''''), + (''SCHEMA'',''GRANT'',''SELECT,EXECUTE,INSERT,UPDATE,DELETE'','''',''AP''), + (''TABLE'',''GRANT'',''INSERT,UPDATE'',''Address'',''dbo''), + (''SP'',''GRANT'',''EXECUTE'',''sp_bmc_GetNextID'',''dbo''), + (''ROLE'',''GRANT'',''db_datareader'','''','''') + + ----------------------------------------------- + +Generate date : 2023-05-12 / up208700 + +=============================================================================*/ + +DECLARE @Command nvarchar(max), + @RoleName varchar(60), + @Users varchar(255), + @typeofobject varchar(50), + @grantordeny varchar(10), + @rightsaction varchar(255), + @objectname varchar(255), + @schemaid varchar(10), + @sysTarget varchar(255), + @sysType varchar(255) + +SET @RoleName = ''dbRoleActiveConfig'' +SET @Command = '''' + +/* TEMP TABLES */ +CREATE TABLE #UsersOnRole(username varchar(255)) +CREATE TABLE #Securables(typeofobject varchar(50), grantordeny varchar(10), rightsaction varchar(255), objectname varchar(255), schemaid varchar(10),N2 bit) + +/* !!! LIST OF SECURABLES TO CHANGE !!! */ + +INSERT INTO #Securables +VALUES +(''SP'',''GRANT'',''EXECUTE'',''GetApplications'',''dbo'',0) +,(''SP'',''GRANT'',''EXECUTE'',''GetConfigurationDatabaseSchemaVersion'',''dbo'',0) +,(''SP'',''GRANT'',''EXECUTE'',''GetSettings'',''dbo'',0) + + +/* GET ALL USERS ON THIS ROLE */ +INSERT INTO #UsersOnRole +SELECT + members.name +FROM sys.database_role_members + JOIN sys.database_principals roles ON database_role_members.role_principal_id = roles.principal_id + JOIN sys.database_principals members ON database_role_members.member_principal_id = members.principal_id +WHERE roles.name = @RoleName + +/* CREATE ROLE */ +SELECT @Command = '' +IF NOT EXISTS (SELECT 1 FROM sys.database_principals WHERE name = '''''' + @RoleName + '''''' AND type = ''''R'''') +BEGIN + CREATE ROLE ['' + @RoleName + ''] AUTHORIZATION [dbo] + PRINT ''''CREATE ROLE ['' + @RoleName + '']'''' +END +'' +EXEC sp_executesql @Command + +SET @Command = '' +DECLARE @SP_Name varchar(255) + +'' + +/* SET ALL ROLE SECURABLES */ +DECLARE SecurablesCurs CURSOR FOR +SELECT typeofobject, grantordeny, rightsaction, objectname, schemaid +FROM #Securables +WHERE N2 = 0 + +OPEN SecurablesCurs +FETCH NEXT FROM SecurablesCurs INTO @typeofobject, @grantordeny, @rightsaction, @objectname, @schemaid +WHILE @@FETCH_STATUS = 0 +BEGIN + + IF @typeofobject = ''DB'' + BEGIN + IF EXISTS(SELECT 1 FROM sys.fn_builtin_permissions(''DATABASE'') WHERE permission_name = '''' + @rightsaction + '''') + BEGIN + SET @Command = @Command + @grantordeny + '' '' + @rightsaction + '' TO ['' + @RoleName + ''] +'' + END + END + + IF @typeofobject = ''SCHEMA'' + BEGIN + SET @Command = @Command + '' +IF EXISTS (SELECT 1 FROM sys.schemas WHERE name = '''''' + @schemaid + '''''') +BEGIN + IF EXISTS(SELECT 1 FROM sys.fn_builtin_permissions(''''SCHEMA'''') WHERE permission_name = '''''' + @rightsaction + '''''') + BEGIN + '' + @grantordeny + '' '' + @rightsaction + '' ON SCHEMA::'' + @schemaid + '' TO ['' + @RoleName + ''] + END +END + +'' + END + + IF @typeofobject in(''TABLE'',''SP'',''FUNCTIONS'',''VIEWS'') + BEGIN + + IF @objectname like ''%[%]%'' + BEGIN + + IF @typeofobject = ''TABLE'' + BEGIN + SET @sysTarget = ''sys.tables'' + SET @sysType = '''' + END + + IF @typeofobject = ''SP'' + BEGIN + SET @sysTarget = ''sys.procedures'' + SET @sysType = '''' + END + + IF @typeofobject = ''FUNCTIONS'' + BEGIN + SET @sysTarget = ''sys.objects'' + SET @sysType = '' and p.Type IN ( N''''FN'''', N''''IF'''', N''''TF'''', N''''FS'''', N''''FT'''' )'' + END + + IF @typeofobject = ''VIEWS'' + BEGIN + SET @sysTarget = ''sys.views'' + SET @sysType = '''' + END + + SET @Command = @Command + '' +DECLARE SP_cursor CURSOR FOR +SELECT p.name FROM '' + @sysTarget + '' p JOIN sys.schemas s ON s.schema_id = p.schema_id WHERE (p.name like '''''' + @objectname + '''''') and s.name = '''''' + @schemaid + '''' + @sysType + '''''' + +OPEN SP_cursor +FETCH NEXT FROM SP_cursor INTO @SP_Name +WHILE @@FETCH_STATUS = 0 +BEGIN + IF EXISTS(SELECT 1 FROM sys.fn_builtin_permissions(''''OBJECT'''') WHERE permission_name = '''''' + @rightsaction + '''''') + BEGIN + EXEC('''''' + @grantordeny + '' '' + @rightsaction + '' ON ['' + @schemaid + ''].['''' + @SP_Name + ''''] TO ['' + @RoleName + '']'''') + END + FETCH NEXT FROM SP_cursor INTO @SP_Name +END + +CLOSE SP_cursor +DEALLOCATE SP_cursor + +'' + + END + ELSE + BEGIN + + SET @Command = @Command + '' +IF EXISTS(SELECT 1 FROM sys.objects o WITH (NOLOCK) JOIN sys.schemas s ON s.schema_id = o.schema_id WHERE o.name = '''''' + @objectname + '''''' AND o.type IN (N''''U'''',''''P'''',''''V'''',''''FN'''',''''IF'''',''''TF'''') AND s.name = '''''' + @schemaid + '''''') +BEGIN + IF EXISTS(SELECT 1 FROM sys.fn_builtin_permissions(''''OBJECT'''') WHERE permission_name = '''''' + @rightsaction + '''''') + BEGIN + '' + @grantordeny + '' '' + @rightsaction + '' ON ['' + @schemaid + ''].['' + @objectname + ''] TO ['' + @RoleName + ''] + END +END + +'' + END +END + +IF @typeofobject = ''ASSEMBLIES'' +BEGIN + SET @Command = @Command + '' +IF EXISTS(SELECT 1 FROM sys.assemblies WHERE NAME = '''''' + @objectname + '''''') +BEGIN + IF EXISTS(SELECT 1 FROM sys.fn_builtin_permissions(''''ASSEMBLY'''') WHERE permission_name = '''''' + @rightsaction + '''''') + BEGIN + '' + @grantordeny + '' '' + @rightsaction + ''::['' + @objectname + ''] TO ['' + @RoleName + ''] + END +END + +'' +END + +IF @typeofobject = ''ROLE'' +BEGIN + SET @Command = @Command + '' +IF NOT EXISTS (SELECT 1 FROM sys.database_role_members JOIN sys.database_principals roles ON database_role_members.role_principal_id = roles.principal_id JOIN sys.database_principals members ON database_role_members.member_principal_id = members.principal_id WHERE roles.name = '''''' + @rightsaction + '''''' AND members.name = '''''' + @RoleName + '''''') +BEGIN + EXEC sp_addrolemember N'''''' + @rightsaction + '''''', N'''''' + @RoleName + '''''' +END + +'' +END + +FETCH NEXT FROM SecurablesCurs INTO @typeofobject, @grantordeny, @rightsaction, @objectname, @schemaid +END + +CLOSE SecurablesCurs +DEALLOCATE SecurablesCurs + +PRINT ''SET ALL SECURABLES ON ROLE ['' + @RoleName + '']'' +EXEC sp_executesql @Command + +/* ADD USER */ +DECLARE UsersCurs CURSOR FOR +SELECT username + FROM #UsersOnRole + +OPEN UsersCurs + +FETCH NEXT FROM UsersCurs INTO @Users +WHILE @@FETCH_STATUS = 0 +BEGIN + + SELECT @Command = '' +EXEC sp_addrolemember N'''''' + @RoleName + '''''', N'''''' + @Users + '''''' +PRINT ''''ADD USER ['' + @Users + ''] ON ROLE ['' + @RoleName + '']'''' +'' + +FETCH NEXT FROM UsersCurs INTO @Users +END + +CLOSE UsersCurs +DEALLOCATE UsersCurs + +EXEC sp_executesql @Command + + +/*============================================================================= + Drop temp tables +=============================================================================*/ +DROP TABLE #Securables +DROP TABLE #UsersOnRole +','ActivePos_write','Pharmacies') + +INSERT INTO #AllRoles(STR_Definition,STR_Database,STR_Product)VALUES(' + +/*============================================================================= + + Script to create dbRoleActivePharmacy role. + + Role Name: dbRoleActivePharmacy + TEMPLATE: Default + + EXAMPLE OF SECURABLES TO SET: + + INSERT INTO #Securables + VALUES + (''DB'',''GRANT'',''VIEW DEFINITION'','''',''''), + (''SCHEMA'',''GRANT'',''SELECT,EXECUTE,INSERT,UPDATE,DELETE'','''',''AP''), + (''TABLE'',''GRANT'',''INSERT,UPDATE'',''Address'',''dbo''), + (''SP'',''GRANT'',''EXECUTE'',''sp_bmc_GetNextID'',''dbo''), + (''ROLE'',''GRANT'',''db_datareader'','''','''') + + ----------------------------------------------- + +Generate date : 2023-05-12 / up208700 + +=============================================================================*/ + +DECLARE @Command nvarchar(max), + @RoleName varchar(60), + @Users varchar(255), + @typeofobject varchar(50), + @grantordeny varchar(10), + @rightsaction varchar(255), + @objectname varchar(255), + @schemaid varchar(10), + @sysTarget varchar(255), + @sysType varchar(255) + +SET @RoleName = ''dbRoleActivePharmacy'' +SET @Command = '''' + +/* TEMP TABLES */ +CREATE TABLE #UsersOnRole(username varchar(255)) +CREATE TABLE #Securables(typeofobject varchar(50), grantordeny varchar(10), rightsaction varchar(255), objectname varchar(255), schemaid varchar(10),N2 bit) + +/* !!! LIST OF SECURABLES TO CHANGE !!! */ + +INSERT INTO #Securables +VALUES +(''ROLE'',''GRANT'',''DB_OWNER'','''',''dbo'',0) + + +/* GET ALL USERS ON THIS ROLE */ +INSERT INTO #UsersOnRole +SELECT + members.name +FROM sys.database_role_members + JOIN sys.database_principals roles ON database_role_members.role_principal_id = roles.principal_id + JOIN sys.database_principals members ON database_role_members.member_principal_id = members.principal_id +WHERE roles.name = @RoleName + +/* CREATE ROLE */ +SELECT @Command = '' +IF NOT EXISTS (SELECT 1 FROM sys.database_principals WHERE name = '''''' + @RoleName + '''''' AND type = ''''R'''') +BEGIN + CREATE ROLE ['' + @RoleName + ''] AUTHORIZATION [dbo] + PRINT ''''CREATE ROLE ['' + @RoleName + '']'''' +END +'' +EXEC sp_executesql @Command + +SET @Command = '' +DECLARE @SP_Name varchar(255) + +'' + +/* SET ALL ROLE SECURABLES */ +DECLARE SecurablesCurs CURSOR FOR +SELECT typeofobject, grantordeny, rightsaction, objectname, schemaid +FROM #Securables +WHERE N2 = 0 + +OPEN SecurablesCurs +FETCH NEXT FROM SecurablesCurs INTO @typeofobject, @grantordeny, @rightsaction, @objectname, @schemaid +WHILE @@FETCH_STATUS = 0 +BEGIN + + IF @typeofobject = ''DB'' + BEGIN + IF EXISTS(SELECT 1 FROM sys.fn_builtin_permissions(''DATABASE'') WHERE permission_name = '''' + @rightsaction + '''') + BEGIN + SET @Command = @Command + @grantordeny + '' '' + @rightsaction + '' TO ['' + @RoleName + ''] +'' + END + END + + IF @typeofobject = ''SCHEMA'' + BEGIN + SET @Command = @Command + '' +IF EXISTS (SELECT 1 FROM sys.schemas WHERE name = '''''' + @schemaid + '''''') +BEGIN + IF EXISTS(SELECT 1 FROM sys.fn_builtin_permissions(''''SCHEMA'''') WHERE permission_name = '''''' + @rightsaction + '''''') + BEGIN + '' + @grantordeny + '' '' + @rightsaction + '' ON SCHEMA::'' + @schemaid + '' TO ['' + @RoleName + ''] + END +END + +'' + END + + IF @typeofobject in(''TABLE'',''SP'',''FUNCTIONS'',''VIEWS'') + BEGIN + + IF @objectname like ''%[%]%'' + BEGIN + + IF @typeofobject = ''TABLE'' + BEGIN + SET @sysTarget = ''sys.tables'' + SET @sysType = '''' + END + + IF @typeofobject = ''SP'' + BEGIN + SET @sysTarget = ''sys.procedures'' + SET @sysType = '''' + END + + IF @typeofobject = ''FUNCTIONS'' + BEGIN + SET @sysTarget = ''sys.objects'' + SET @sysType = '' and p.Type IN ( N''''FN'''', N''''IF'''', N''''TF'''', N''''FS'''', N''''FT'''' )'' + END + + IF @typeofobject = ''VIEWS'' + BEGIN + SET @sysTarget = ''sys.views'' + SET @sysType = '''' + END + + SET @Command = @Command + '' +DECLARE SP_cursor CURSOR FOR +SELECT p.name FROM '' + @sysTarget + '' p JOIN sys.schemas s ON s.schema_id = p.schema_id WHERE (p.name like '''''' + @objectname + '''''') and s.name = '''''' + @schemaid + '''' + @sysType + '''''' + +OPEN SP_cursor +FETCH NEXT FROM SP_cursor INTO @SP_Name +WHILE @@FETCH_STATUS = 0 +BEGIN + IF EXISTS(SELECT 1 FROM sys.fn_builtin_permissions(''''OBJECT'''') WHERE permission_name = '''''' + @rightsaction + '''''') + BEGIN + EXEC('''''' + @grantordeny + '' '' + @rightsaction + '' ON ['' + @schemaid + ''].['''' + @SP_Name + ''''] TO ['' + @RoleName + '']'''') + END + FETCH NEXT FROM SP_cursor INTO @SP_Name +END + +CLOSE SP_cursor +DEALLOCATE SP_cursor + +'' + + END + ELSE + BEGIN + + SET @Command = @Command + '' +IF EXISTS(SELECT 1 FROM sys.objects o WITH (NOLOCK) JOIN sys.schemas s ON s.schema_id = o.schema_id WHERE o.name = '''''' + @objectname + '''''' AND o.type IN (N''''U'''',''''P'''',''''V'''',''''FN'''',''''IF'''',''''TF'''') AND s.name = '''''' + @schemaid + '''''') +BEGIN + IF EXISTS(SELECT 1 FROM sys.fn_builtin_permissions(''''OBJECT'''') WHERE permission_name = '''''' + @rightsaction + '''''') + BEGIN + '' + @grantordeny + '' '' + @rightsaction + '' ON ['' + @schemaid + ''].['' + @objectname + ''] TO ['' + @RoleName + ''] + END +END + +'' + END +END + +IF @typeofobject = ''ASSEMBLIES'' +BEGIN + SET @Command = @Command + '' +IF EXISTS(SELECT 1 FROM sys.assemblies WHERE NAME = '''''' + @objectname + '''''') +BEGIN + IF EXISTS(SELECT 1 FROM sys.fn_builtin_permissions(''''ASSEMBLY'''') WHERE permission_name = '''''' + @rightsaction + '''''') + BEGIN + '' + @grantordeny + '' '' + @rightsaction + ''::['' + @objectname + ''] TO ['' + @RoleName + ''] + END +END + +'' +END + +IF @typeofobject = ''ROLE'' +BEGIN + SET @Command = @Command + '' +IF NOT EXISTS (SELECT 1 FROM sys.database_role_members JOIN sys.database_principals roles ON database_role_members.role_principal_id = roles.principal_id JOIN sys.database_principals members ON database_role_members.member_principal_id = members.principal_id WHERE roles.name = '''''' + @rightsaction + '''''' AND members.name = '''''' + @RoleName + '''''') +BEGIN + EXEC sp_addrolemember N'''''' + @rightsaction + '''''', N'''''' + @RoleName + '''''' +END + +'' +END + +FETCH NEXT FROM SecurablesCurs INTO @typeofobject, @grantordeny, @rightsaction, @objectname, @schemaid +END + +CLOSE SecurablesCurs +DEALLOCATE SecurablesCurs + +PRINT ''SET ALL SECURABLES ON ROLE ['' + @RoleName + '']'' +EXEC sp_executesql @Command + +/* ADD USER */ +DECLARE UsersCurs CURSOR FOR +SELECT username + FROM #UsersOnRole + +OPEN UsersCurs + +FETCH NEXT FROM UsersCurs INTO @Users +WHILE @@FETCH_STATUS = 0 +BEGIN + + SELECT @Command = '' +EXEC sp_addrolemember N'''''' + @RoleName + '''''', N'''''' + @Users + '''''' +PRINT ''''ADD USER ['' + @Users + ''] ON ROLE ['' + @RoleName + '']'''' +'' + +FETCH NEXT FROM UsersCurs INTO @Users +END + +CLOSE UsersCurs +DEALLOCATE UsersCurs + +EXEC sp_executesql @Command + + +/*============================================================================= + Drop temp tables +=============================================================================*/ +DROP TABLE #Securables +DROP TABLE #UsersOnRole +','ActivePos_write','Pharmacies') + +INSERT INTO #AllRoles(STR_Definition,STR_Database,STR_Product)VALUES(' + +/*============================================================================= + + Script to create dbRoleCsltUsr role. + + Role Name: dbRoleCsltUsr + TEMPLATE: N2 and PROD + + EXAMPLE OF SECURABLES TO SET: + + INSERT INTO #Securables + VALUES + (''DB'',''GRANT'',''VIEW DEFINITION'','''',''''), + (''SCHEMA'',''GRANT'',''SELECT,EXECUTE,INSERT,UPDATE,DELETE'','''',''AP''), + (''TABLE'',''GRANT'',''INSERT,UPDATE'',''Address'',''dbo''), + (''SP'',''GRANT'',''EXECUTE'',''sp_bmc_GetNextID'',''dbo''), + (''ROLE'',''GRANT'',''db_datareader'','''','''') + + ----------------------------------------------- + +Generate date : 2023-05-12 / up208700 + +=============================================================================*/ + +DECLARE @Type varchar(6), + @Command nvarchar(max), + @RoleName varchar(60), + @Users varchar(255), + @typeofobject varchar(50), + @grantordeny varchar(10), + @rightsaction varchar(255), + @objectname varchar(255), + @schemaid varchar(10), + @sysTarget varchar(255), + @sysType varchar(255) + +SET @RoleName = ''dbRoleCsltUsr'' +SET @Command = '''' + +SELECT @Type = [Type] FROM [master].[cfg].[InstanceContext] + +/* TEMP TABLES */ +CREATE TABLE #UsersOnRole(username varchar(255)) +CREATE TABLE #Securables(typeofobject varchar(50), grantordeny varchar(10), rightsaction varchar(255), objectname varchar(255), schemaid varchar(10),N2 bit) + +/* !!! LIST OF SECURABLES TO CHANGE !!! */ + +INSERT INTO #Securables +VALUES +(''DB'',''GRANT'',''EXECUTE'','''',''dbo'',0) +,(''DB'',''GRANT'',''SHOWPLAN'','''',''dbo'',0) +,(''DB'',''GRANT'',''VIEW DEFINITION'','''',''dbo'',0) +,(''ROLE'',''GRANT'',''DB_DATAREADER'','''',''dbo'',0) +,(''ROLE'',''GRANT'',''DB_DATAWRITER'','''',''dbo'',0) +,(''ROLE'',''GRANT'',''DB_OWNER'','''',''dbo'',1) + + +/* GET ALL USERS ON THIS ROLE */ +INSERT INTO #UsersOnRole +SELECT + members.name +FROM sys.database_role_members + JOIN sys.database_principals roles ON database_role_members.role_principal_id = roles.principal_id + JOIN sys.database_principals members ON database_role_members.member_principal_id = members.principal_id +WHERE roles.name = @RoleName + +/* CREATE ROLE */ +SELECT @Command = '' +IF NOT EXISTS (SELECT 1 FROM sys.database_principals WHERE name = '''''' + @RoleName + '''''' AND type = ''''R'''') +BEGIN + CREATE ROLE ['' + @RoleName + ''] AUTHORIZATION [dbo] + PRINT ''''CREATE ROLE ['' + @RoleName + '']'''' +END +'' +EXEC sp_executesql @Command + +SET @Command = '' +DECLARE @SP_Name varchar(255) + +'' + +/* SET ALL ROLE SECURABLES */ +IF @Type = ''DEVE'' +BEGIN + + DECLARE SecurablesCurs CURSOR FOR + SELECT typeofobject, grantordeny, rightsaction, objectname, schemaid + FROM #Securables + WHERE N2 = 1 + + OPEN SecurablesCurs + FETCH NEXT FROM SecurablesCurs INTO @typeofobject, @grantordeny, @rightsaction, @objectname, @schemaid + WHILE @@FETCH_STATUS = 0 + BEGIN + + IF @typeofobject = ''DB'' + BEGIN + IF EXISTS(SELECT 1 FROM sys.fn_builtin_permissions(''DATABASE'') WHERE permission_name = '''' + @rightsaction + '''') + BEGIN + SET @Command = @Command + @grantordeny + '' '' + @rightsaction + '' TO ['' + @RoleName + ''] +'' + END + END + + IF @typeofobject = ''SCHEMA'' + BEGIN + SET @Command = @Command + '' +IF EXISTS (SELECT 1 FROM sys.schemas WHERE name = '''''' + @schemaid + '''''') +BEGIN + IF EXISTS(SELECT 1 FROM sys.fn_builtin_permissions(''''SCHEMA'''') WHERE permission_name = '''''' + @rightsaction + '''''') + BEGIN + '' + @grantordeny + '' '' + @rightsaction + '' ON SCHEMA::'' + @schemaid + '' TO ['' + @RoleName + ''] + END +END + +'' + END + + IF @typeofobject in(''TABLE'',''SP'',''FUNCTIONS'',''VIEWS'') + BEGIN + + IF @objectname like ''%[%]%'' + BEGIN + IF @typeofobject = ''TABLE'' + BEGIN + SET @sysTarget = ''sys.tables'' + SET @sysType = '''' + END + + IF @typeofobject = ''SP'' + BEGIN + SET @sysTarget = ''sys.procedures'' + SET @sysType = '''' + END + + IF @typeofobject = ''FUNCTIONS'' + BEGIN + SET @sysTarget = ''sys.objects'' + SET @sysType = '' and p.Type IN ( N''''FN'''', N''''IF'''', N''''TF'''', N''''FS'''', N''''FT'''' )'' + END + + IF @typeofobject = ''VIEWS'' + BEGIN + SET @sysTarget = ''sys.views'' + SET @sysType = '''' + END + + SET @Command = @Command + '' +DECLARE SP_cursor CURSOR FOR +SELECT p.name FROM '' + @sysTarget + '' p JOIN sys.schemas s ON s.schema_id = p.schema_id WHERE (p.name like '''''' + @objectname + '''''') and s.name = '''''' + @schemaid + '''' + @sysType + '''''' + +OPEN SP_cursor +FETCH NEXT FROM SP_cursor INTO @SP_Name +WHILE @@FETCH_STATUS = 0 +BEGIN + IF EXISTS(SELECT 1 FROM sys.fn_builtin_permissions(''''OBJECT'''') WHERE permission_name = '''''' + @rightsaction + '''''') + BEGIN + EXEC('''''' + @grantordeny + '' '' + @rightsaction + '' ON ['' + @schemaid + ''].['''' + @SP_Name + ''''] TO ['' + @RoleName + '']'''') + END + FETCH NEXT FROM SP_cursor INTO @SP_Name +END + +CLOSE SP_cursor +DEALLOCATE SP_cursor + +'' + + END + ELSE + BEGIN + + SET @Command = @Command + '' +IF EXISTS(SELECT 1 FROM sys.objects o WITH (NOLOCK) JOIN sys.schemas s ON s.schema_id = o.schema_id WHERE o.name = '''''' + @objectname + '''''' AND o.type IN (N''''U'''',''''P'''',''''V'''',''''FN'''',''''IF'''',''''TF'''') AND s.name = '''''' + @schemaid + '''''') +BEGIN + IF EXISTS(SELECT 1 FROM sys.fn_builtin_permissions(''''OBJECT'''') WHERE permission_name = '''''' + @rightsaction + '''''') + BEGIN + '' + @grantordeny + '' '' + @rightsaction + '' ON ['' + @schemaid + ''].['' + @objectname + ''] TO ['' + @RoleName + ''] + END +END + +'' + END + END + + IF @typeofobject = ''ASSEMBLIES'' + BEGIN + SET @Command = @Command + '' +IF EXISTS(SELECT 1 FROM sys.assemblies WHERE NAME = '''''' + @objectname + '''''') +BEGIN + IF EXISTS(SELECT 1 FROM sys.fn_builtin_permissions(''''ASSEMBLY'''') WHERE permission_name = '''''' + @rightsaction + '''''') + BEGIN + '' + @grantordeny + '' '' + @rightsaction + ''::['' + @objectname + ''] TO ['' + @RoleName + ''] + END +END + +'' + END + + IF @typeofobject = ''ROLE'' + BEGIN + SET @Command = @Command + '' +IF NOT EXISTS (SELECT 1 FROM sys.database_role_members JOIN sys.database_principals roles ON database_role_members.role_principal_id = roles.principal_id JOIN sys.database_principals members ON database_role_members.member_principal_id = members.principal_id WHERE roles.name = '''''' + @rightsaction + '''''' AND members.name = '''''' + @RoleName + '''''') +BEGIN + EXEC sp_addrolemember N'''''' + @rightsaction + '''''', N'''''' + @RoleName + '''''' +END + +'' + END + + FETCH NEXT FROM SecurablesCurs INTO @typeofobject, @grantordeny, @rightsaction, @objectname, @schemaid + END + +CLOSE SecurablesCurs +DEALLOCATE SecurablesCurs + +PRINT ''SET ALL SECURABLES ON ROLE ['' + @RoleName + '']'' +EXEC sp_executesql @Command + +END +ELSE +BEGIN + + DECLARE SecurablesCurs CURSOR FOR + SELECT typeofobject, grantordeny, rightsaction, objectname, schemaid + FROM #Securables + WHERE N2 = 0 + + OPEN SecurablesCurs + FETCH NEXT FROM SecurablesCurs INTO @typeofobject, @grantordeny, @rightsaction, @objectname, @schemaid + WHILE @@FETCH_STATUS = 0 + BEGIN + + IF @typeofobject = ''DB'' + BEGIN + IF EXISTS(SELECT 1 FROM sys.fn_builtin_permissions(''DATABASE'') WHERE permission_name = '''' + @rightsaction + '''') + BEGIN + SET @Command = @Command + @grantordeny + '' '' + @rightsaction + '' TO ['' + @RoleName + ''] +'' + END + END + + IF @typeofobject = ''SCHEMA'' + BEGIN + SET @Command = @Command + '' +IF EXISTS (SELECT 1 FROM sys.schemas WHERE name = '''''' + @schemaid + '''''') +BEGIN + IF EXISTS(SELECT 1 FROM sys.fn_builtin_permissions(''''SCHEMA'''') WHERE permission_name = '''''' + @rightsaction + '''''') + BEGIN + '' + @grantordeny + '' '' + @rightsaction + '' ON SCHEMA::'' + @schemaid + '' TO ['' + @RoleName + ''] + END +END + +'' + END + + IF @typeofobject in(''TABLE'',''SP'',''FUNCTIONS'',''VIEWS'') + BEGIN + + IF @objectname like ''%[%]%'' + BEGIN + + IF @typeofobject = ''TABLE'' + BEGIN + SET @sysTarget = ''sys.tables'' + SET @sysType = '''' + END + + IF @typeofobject = ''SP'' + BEGIN + SET @sysTarget = ''sys.procedures'' + SET @sysType = '''' + END + + IF @typeofobject = ''FUNCTIONS'' + BEGIN + SET @sysTarget = ''sys.objects'' + SET @sysType = '' and p.Type IN ( N''''FN'''', N''''IF'''', N''''TF'''', N''''FS'''', N''''FT'''' )'' + END + + IF @typeofobject = ''VIEWS'' + BEGIN + SET @sysTarget = ''sys.views'' + SET @sysType = '''' + END + + SET @Command = @Command + '' +DECLARE SP_cursor CURSOR FOR +SELECT p.name FROM '' + @sysTarget + '' p JOIN sys.schemas s ON s.schema_id = p.schema_id WHERE (p.name like '''''' + @objectname + '''''') and s.name = '''''' + @schemaid + '''' + @sysType + '''''' + +OPEN SP_cursor +FETCH NEXT FROM SP_cursor INTO @SP_Name +WHILE @@FETCH_STATUS = 0 +BEGIN + IF EXISTS(SELECT 1 FROM sys.fn_builtin_permissions(''''OBJECT'''') WHERE permission_name = '''''' + @rightsaction + '''''') + BEGIN + EXEC('''''' + @grantordeny + '' '' + @rightsaction + '' ON ['' + @schemaid + ''].['''' + @SP_Name + ''''] TO ['' + @RoleName + '']'''') + END + FETCH NEXT FROM SP_cursor INTO @SP_Name +END + +CLOSE SP_cursor +DEALLOCATE SP_cursor + +'' + + END + ELSE + BEGIN + + SET @Command = @Command + '' +IF EXISTS(SELECT 1 FROM sys.objects o WITH (NOLOCK) JOIN sys.schemas s ON s.schema_id = o.schema_id WHERE o.name = '''''' + @objectname + '''''' AND o.type IN (N''''U'''',''''P'''',''''V'''',''''FN'''',''''IF'''',''''TF'''') AND s.name = '''''' + @schemaid + '''''') +BEGIN + IF EXISTS(SELECT 1 FROM sys.fn_builtin_permissions(''''OBJECT'''') WHERE permission_name = '''''' + @rightsaction + '''''') + BEGIN + '' + @grantordeny + '' '' + @rightsaction + '' ON ['' + @schemaid + ''].['' + @objectname + ''] TO ['' + @RoleName + ''] + END +END + +'' + END + END + + IF @typeofobject = ''ASSEMBLIES'' + BEGIN + SET @Command = @Command + '' +IF EXISTS(SELECT 1 FROM sys.assemblies WHERE NAME = '''''' + @objectname + '''''') +BEGIN + IF EXISTS(SELECT 1 FROM sys.fn_builtin_permissions(''''ASSEMBLY'''') WHERE permission_name = '''''' + @rightsaction + '''''') + BEGIN + '' + @grantordeny + '' '' + @rightsaction + ''::['' + @objectname + ''] TO ['' + @RoleName + ''] + END +END + +'' + END + + IF @typeofobject = ''ROLE'' + BEGIN + SET @Command = @Command + '' +IF NOT EXISTS (SELECT 1 FROM sys.database_role_members JOIN sys.database_principals roles ON database_role_members.role_principal_id = roles.principal_id JOIN sys.database_principals members ON database_role_members.member_principal_id = members.principal_id WHERE roles.name = '''''' + @rightsaction + '''''' AND members.name = '''''' + @RoleName + '''''') +BEGIN + EXEC sp_addrolemember N'''''' + @rightsaction + '''''', N'''''' + @RoleName + '''''' +END + +'' + END + + FETCH NEXT FROM SecurablesCurs INTO @typeofobject, @grantordeny, @rightsaction, @objectname, @schemaid + END + +CLOSE SecurablesCurs +DEALLOCATE SecurablesCurs + +PRINT ''SET ALL SECURABLES ON ROLE ['' + @RoleName + '']'' +EXEC sp_executesql @Command + +END + +/* ADD USER */ +DECLARE UsersCurs CURSOR FOR +SELECT username + FROM #UsersOnRole + +OPEN UsersCurs + +FETCH NEXT FROM UsersCurs INTO @Users +WHILE @@FETCH_STATUS = 0 +BEGIN + + SELECT @Command = '' +EXEC sp_addrolemember N'''''' + @RoleName + '''''', N'''''' + @Users + '''''' +PRINT ''''ADD USER ['' + @Users + ''] ON ROLE ['' + @RoleName + '']'''' +'' + +FETCH NEXT FROM UsersCurs INTO @Users +END + +CLOSE UsersCurs +DEALLOCATE UsersCurs + +EXEC sp_executesql @Command + +/*============================================================================= + Drop temp tables +=============================================================================*/ +DROP TABLE #Securables +DROP TABLE #UsersOnRole','ActivePos_write','Pharmacies') + +INSERT INTO #AllRoles(STR_Definition,STR_Database,STR_Product)VALUES(' + +/*============================================================================= + + Script to create dbRoleDevUsr role. + + Role Name: dbRoleDevUsr + TEMPLATE: Default + + EXAMPLE OF SECURABLES TO SET: + + INSERT INTO #Securables + VALUES + (''DB'',''GRANT'',''VIEW DEFINITION'','''',''''), + (''SCHEMA'',''GRANT'',''SELECT,EXECUTE,INSERT,UPDATE,DELETE'','''',''AP''), + (''TABLE'',''GRANT'',''INSERT,UPDATE'',''Address'',''dbo''), + (''SP'',''GRANT'',''EXECUTE'',''sp_bmc_GetNextID'',''dbo''), + (''ROLE'',''GRANT'',''db_datareader'','''','''') + + ----------------------------------------------- + +Generate date : 2023-05-12 / up208700 + +=============================================================================*/ + +DECLARE @Command nvarchar(max), + @RoleName varchar(60), + @Users varchar(255), + @typeofobject varchar(50), + @grantordeny varchar(10), + @rightsaction varchar(255), + @objectname varchar(255), + @schemaid varchar(10), + @sysTarget varchar(255), + @sysType varchar(255) + +SET @RoleName = ''dbRoleDevUsr'' +SET @Command = '''' + +/* TEMP TABLES */ +CREATE TABLE #UsersOnRole(username varchar(255)) +CREATE TABLE #Securables(typeofobject varchar(50), grantordeny varchar(10), rightsaction varchar(255), objectname varchar(255), schemaid varchar(10),N2 bit) + +/* !!! LIST OF SECURABLES TO CHANGE !!! */ + +INSERT INTO #Securables +VALUES +(''DB'',''GRANT'',''EXECUTE'','''',''dbo'',0) +,(''DB'',''GRANT'',''SHOWPLAN'','''',''dbo'',0) +,(''DB'',''GRANT'',''VIEW DEFINITION'','''',''dbo'',0) +,(''ROLE'',''GRANT'',''DB_DATAREADER'','''',''dbo'',0) +,(''ROLE'',''GRANT'',''DB_DATAWRITER'','''',''dbo'',0) + + +/* GET ALL USERS ON THIS ROLE */ +INSERT INTO #UsersOnRole +SELECT + members.name +FROM sys.database_role_members + JOIN sys.database_principals roles ON database_role_members.role_principal_id = roles.principal_id + JOIN sys.database_principals members ON database_role_members.member_principal_id = members.principal_id +WHERE roles.name = @RoleName + +/* CREATE ROLE */ +SELECT @Command = '' +IF NOT EXISTS (SELECT 1 FROM sys.database_principals WHERE name = '''''' + @RoleName + '''''' AND type = ''''R'''') +BEGIN + CREATE ROLE ['' + @RoleName + ''] AUTHORIZATION [dbo] + PRINT ''''CREATE ROLE ['' + @RoleName + '']'''' +END +'' +EXEC sp_executesql @Command + +SET @Command = '' +DECLARE @SP_Name varchar(255) + +'' + +/* SET ALL ROLE SECURABLES */ +DECLARE SecurablesCurs CURSOR FOR +SELECT typeofobject, grantordeny, rightsaction, objectname, schemaid +FROM #Securables +WHERE N2 = 0 + +OPEN SecurablesCurs +FETCH NEXT FROM SecurablesCurs INTO @typeofobject, @grantordeny, @rightsaction, @objectname, @schemaid +WHILE @@FETCH_STATUS = 0 +BEGIN + + IF @typeofobject = ''DB'' + BEGIN + IF EXISTS(SELECT 1 FROM sys.fn_builtin_permissions(''DATABASE'') WHERE permission_name = '''' + @rightsaction + '''') + BEGIN + SET @Command = @Command + @grantordeny + '' '' + @rightsaction + '' TO ['' + @RoleName + ''] +'' + END + END + + IF @typeofobject = ''SCHEMA'' + BEGIN + SET @Command = @Command + '' +IF EXISTS (SELECT 1 FROM sys.schemas WHERE name = '''''' + @schemaid + '''''') +BEGIN + IF EXISTS(SELECT 1 FROM sys.fn_builtin_permissions(''''SCHEMA'''') WHERE permission_name = '''''' + @rightsaction + '''''') + BEGIN + '' + @grantordeny + '' '' + @rightsaction + '' ON SCHEMA::'' + @schemaid + '' TO ['' + @RoleName + ''] + END +END + +'' + END + + IF @typeofobject in(''TABLE'',''SP'',''FUNCTIONS'',''VIEWS'') + BEGIN + + IF @objectname like ''%[%]%'' + BEGIN + + IF @typeofobject = ''TABLE'' + BEGIN + SET @sysTarget = ''sys.tables'' + SET @sysType = '''' + END + + IF @typeofobject = ''SP'' + BEGIN + SET @sysTarget = ''sys.procedures'' + SET @sysType = '''' + END + + IF @typeofobject = ''FUNCTIONS'' + BEGIN + SET @sysTarget = ''sys.objects'' + SET @sysType = '' and p.Type IN ( N''''FN'''', N''''IF'''', N''''TF'''', N''''FS'''', N''''FT'''' )'' + END + + IF @typeofobject = ''VIEWS'' + BEGIN + SET @sysTarget = ''sys.views'' + SET @sysType = '''' + END + + SET @Command = @Command + '' +DECLARE SP_cursor CURSOR FOR +SELECT p.name FROM '' + @sysTarget + '' p JOIN sys.schemas s ON s.schema_id = p.schema_id WHERE (p.name like '''''' + @objectname + '''''') and s.name = '''''' + @schemaid + '''' + @sysType + '''''' + +OPEN SP_cursor +FETCH NEXT FROM SP_cursor INTO @SP_Name +WHILE @@FETCH_STATUS = 0 +BEGIN + IF EXISTS(SELECT 1 FROM sys.fn_builtin_permissions(''''OBJECT'''') WHERE permission_name = '''''' + @rightsaction + '''''') + BEGIN + EXEC('''''' + @grantordeny + '' '' + @rightsaction + '' ON ['' + @schemaid + ''].['''' + @SP_Name + ''''] TO ['' + @RoleName + '']'''') + END + FETCH NEXT FROM SP_cursor INTO @SP_Name +END + +CLOSE SP_cursor +DEALLOCATE SP_cursor + +'' + + END + ELSE + BEGIN + + SET @Command = @Command + '' +IF EXISTS(SELECT 1 FROM sys.objects o WITH (NOLOCK) JOIN sys.schemas s ON s.schema_id = o.schema_id WHERE o.name = '''''' + @objectname + '''''' AND o.type IN (N''''U'''',''''P'''',''''V'''',''''FN'''',''''IF'''',''''TF'''') AND s.name = '''''' + @schemaid + '''''') +BEGIN + IF EXISTS(SELECT 1 FROM sys.fn_builtin_permissions(''''OBJECT'''') WHERE permission_name = '''''' + @rightsaction + '''''') + BEGIN + '' + @grantordeny + '' '' + @rightsaction + '' ON ['' + @schemaid + ''].['' + @objectname + ''] TO ['' + @RoleName + ''] + END +END + +'' + END +END + +IF @typeofobject = ''ASSEMBLIES'' +BEGIN + SET @Command = @Command + '' +IF EXISTS(SELECT 1 FROM sys.assemblies WHERE NAME = '''''' + @objectname + '''''') +BEGIN + IF EXISTS(SELECT 1 FROM sys.fn_builtin_permissions(''''ASSEMBLY'''') WHERE permission_name = '''''' + @rightsaction + '''''') + BEGIN + '' + @grantordeny + '' '' + @rightsaction + ''::['' + @objectname + ''] TO ['' + @RoleName + ''] + END +END + +'' +END + +IF @typeofobject = ''ROLE'' +BEGIN + SET @Command = @Command + '' +IF NOT EXISTS (SELECT 1 FROM sys.database_role_members JOIN sys.database_principals roles ON database_role_members.role_principal_id = roles.principal_id JOIN sys.database_principals members ON database_role_members.member_principal_id = members.principal_id WHERE roles.name = '''''' + @rightsaction + '''''' AND members.name = '''''' + @RoleName + '''''') +BEGIN + EXEC sp_addrolemember N'''''' + @rightsaction + '''''', N'''''' + @RoleName + '''''' +END + +'' +END + +FETCH NEXT FROM SecurablesCurs INTO @typeofobject, @grantordeny, @rightsaction, @objectname, @schemaid +END + +CLOSE SecurablesCurs +DEALLOCATE SecurablesCurs + +PRINT ''SET ALL SECURABLES ON ROLE ['' + @RoleName + '']'' +EXEC sp_executesql @Command + +/* ADD USER */ +DECLARE UsersCurs CURSOR FOR +SELECT username + FROM #UsersOnRole + +OPEN UsersCurs + +FETCH NEXT FROM UsersCurs INTO @Users +WHILE @@FETCH_STATUS = 0 +BEGIN + + SELECT @Command = '' +EXEC sp_addrolemember N'''''' + @RoleName + '''''', N'''''' + @Users + '''''' +PRINT ''''ADD USER ['' + @Users + ''] ON ROLE ['' + @RoleName + '']'''' +'' + +FETCH NEXT FROM UsersCurs INTO @Users +END + +CLOSE UsersCurs +DEALLOCATE UsersCurs + +EXEC sp_executesql @Command + + +/*============================================================================= + Drop temp tables +=============================================================================*/ +DROP TABLE #Securables +DROP TABLE #UsersOnRole +','ActivePos_write','Pharmacies') + +INSERT INTO #AllRoles(STR_Definition,STR_Database,STR_Product)VALUES(' + +/*============================================================================= + + Script to create dbRoleIttechUsr role. + + Role Name: dbRoleIttechUsr + TEMPLATE: N2 and PROD + + EXAMPLE OF SECURABLES TO SET: + + INSERT INTO #Securables + VALUES + (''DB'',''GRANT'',''VIEW DEFINITION'','''',''''), + (''SCHEMA'',''GRANT'',''SELECT,EXECUTE,INSERT,UPDATE,DELETE'','''',''AP''), + (''TABLE'',''GRANT'',''INSERT,UPDATE'',''Address'',''dbo''), + (''SP'',''GRANT'',''EXECUTE'',''sp_bmc_GetNextID'',''dbo''), + (''ROLE'',''GRANT'',''db_datareader'','''','''') + + ----------------------------------------------- + +Generate date : 2023-05-12 / up208700 + +=============================================================================*/ + +DECLARE @Type varchar(6), + @Command nvarchar(max), + @RoleName varchar(60), + @Users varchar(255), + @typeofobject varchar(50), + @grantordeny varchar(10), + @rightsaction varchar(255), + @objectname varchar(255), + @schemaid varchar(10), + @sysTarget varchar(255), + @sysType varchar(255) + +SET @RoleName = ''dbRoleIttechUsr'' +SET @Command = '''' + +SELECT @Type = [Type] FROM [master].[cfg].[InstanceContext] + +/* TEMP TABLES */ +CREATE TABLE #UsersOnRole(username varchar(255)) +CREATE TABLE #Securables(typeofobject varchar(50), grantordeny varchar(10), rightsaction varchar(255), objectname varchar(255), schemaid varchar(10),N2 bit) + +/* !!! LIST OF SECURABLES TO CHANGE !!! */ + +INSERT INTO #Securables +VALUES +(''DB'',''GRANT'',''EXECUTE'','''',''dbo'',0) +,(''ROLE'',''GRANT'',''DB_DATAREADER'','''',''dbo'',0) +,(''ROLE'',''GRANT'',''DB_DATAWRITER'','''',''dbo'',0) +,(''ROLE'',''GRANT'',''DB_OWNER'','''',''dbo'',1) + + +/* GET ALL USERS ON THIS ROLE */ +INSERT INTO #UsersOnRole +SELECT + members.name +FROM sys.database_role_members + JOIN sys.database_principals roles ON database_role_members.role_principal_id = roles.principal_id + JOIN sys.database_principals members ON database_role_members.member_principal_id = members.principal_id +WHERE roles.name = @RoleName + +/* CREATE ROLE */ +SELECT @Command = '' +IF NOT EXISTS (SELECT 1 FROM sys.database_principals WHERE name = '''''' + @RoleName + '''''' AND type = ''''R'''') +BEGIN + CREATE ROLE ['' + @RoleName + ''] AUTHORIZATION [dbo] + PRINT ''''CREATE ROLE ['' + @RoleName + '']'''' +END +'' +EXEC sp_executesql @Command + +SET @Command = '' +DECLARE @SP_Name varchar(255) + +'' + +/* SET ALL ROLE SECURABLES */ +IF @Type = ''DEVE'' +BEGIN + + DECLARE SecurablesCurs CURSOR FOR + SELECT typeofobject, grantordeny, rightsaction, objectname, schemaid + FROM #Securables + WHERE N2 = 1 + + OPEN SecurablesCurs + FETCH NEXT FROM SecurablesCurs INTO @typeofobject, @grantordeny, @rightsaction, @objectname, @schemaid + WHILE @@FETCH_STATUS = 0 + BEGIN + + IF @typeofobject = ''DB'' + BEGIN + IF EXISTS(SELECT 1 FROM sys.fn_builtin_permissions(''DATABASE'') WHERE permission_name = '''' + @rightsaction + '''') + BEGIN + SET @Command = @Command + @grantordeny + '' '' + @rightsaction + '' TO ['' + @RoleName + ''] +'' + END + END + + IF @typeofobject = ''SCHEMA'' + BEGIN + SET @Command = @Command + '' +IF EXISTS (SELECT 1 FROM sys.schemas WHERE name = '''''' + @schemaid + '''''') +BEGIN + IF EXISTS(SELECT 1 FROM sys.fn_builtin_permissions(''''SCHEMA'''') WHERE permission_name = '''''' + @rightsaction + '''''') + BEGIN + '' + @grantordeny + '' '' + @rightsaction + '' ON SCHEMA::'' + @schemaid + '' TO ['' + @RoleName + ''] + END +END + +'' + END + + IF @typeofobject in(''TABLE'',''SP'',''FUNCTIONS'',''VIEWS'') + BEGIN + + IF @objectname like ''%[%]%'' + BEGIN + IF @typeofobject = ''TABLE'' + BEGIN + SET @sysTarget = ''sys.tables'' + SET @sysType = '''' + END + + IF @typeofobject = ''SP'' + BEGIN + SET @sysTarget = ''sys.procedures'' + SET @sysType = '''' + END + + IF @typeofobject = ''FUNCTIONS'' + BEGIN + SET @sysTarget = ''sys.objects'' + SET @sysType = '' and p.Type IN ( N''''FN'''', N''''IF'''', N''''TF'''', N''''FS'''', N''''FT'''' )'' + END + + IF @typeofobject = ''VIEWS'' + BEGIN + SET @sysTarget = ''sys.views'' + SET @sysType = '''' + END + + SET @Command = @Command + '' +DECLARE SP_cursor CURSOR FOR +SELECT p.name FROM '' + @sysTarget + '' p JOIN sys.schemas s ON s.schema_id = p.schema_id WHERE (p.name like '''''' + @objectname + '''''') and s.name = '''''' + @schemaid + '''' + @sysType + '''''' + +OPEN SP_cursor +FETCH NEXT FROM SP_cursor INTO @SP_Name +WHILE @@FETCH_STATUS = 0 +BEGIN + IF EXISTS(SELECT 1 FROM sys.fn_builtin_permissions(''''OBJECT'''') WHERE permission_name = '''''' + @rightsaction + '''''') + BEGIN + EXEC('''''' + @grantordeny + '' '' + @rightsaction + '' ON ['' + @schemaid + ''].['''' + @SP_Name + ''''] TO ['' + @RoleName + '']'''') + END + FETCH NEXT FROM SP_cursor INTO @SP_Name +END + +CLOSE SP_cursor +DEALLOCATE SP_cursor + +'' + + END + ELSE + BEGIN + + SET @Command = @Command + '' +IF EXISTS(SELECT 1 FROM sys.objects o WITH (NOLOCK) JOIN sys.schemas s ON s.schema_id = o.schema_id WHERE o.name = '''''' + @objectname + '''''' AND o.type IN (N''''U'''',''''P'''',''''V'''',''''FN'''',''''IF'''',''''TF'''') AND s.name = '''''' + @schemaid + '''''') +BEGIN + IF EXISTS(SELECT 1 FROM sys.fn_builtin_permissions(''''OBJECT'''') WHERE permission_name = '''''' + @rightsaction + '''''') + BEGIN + '' + @grantordeny + '' '' + @rightsaction + '' ON ['' + @schemaid + ''].['' + @objectname + ''] TO ['' + @RoleName + ''] + END +END + +'' + END + END + + IF @typeofobject = ''ASSEMBLIES'' + BEGIN + SET @Command = @Command + '' +IF EXISTS(SELECT 1 FROM sys.assemblies WHERE NAME = '''''' + @objectname + '''''') +BEGIN + IF EXISTS(SELECT 1 FROM sys.fn_builtin_permissions(''''ASSEMBLY'''') WHERE permission_name = '''''' + @rightsaction + '''''') + BEGIN + '' + @grantordeny + '' '' + @rightsaction + ''::['' + @objectname + ''] TO ['' + @RoleName + ''] + END +END + +'' + END + + IF @typeofobject = ''ROLE'' + BEGIN + SET @Command = @Command + '' +IF NOT EXISTS (SELECT 1 FROM sys.database_role_members JOIN sys.database_principals roles ON database_role_members.role_principal_id = roles.principal_id JOIN sys.database_principals members ON database_role_members.member_principal_id = members.principal_id WHERE roles.name = '''''' + @rightsaction + '''''' AND members.name = '''''' + @RoleName + '''''') +BEGIN + EXEC sp_addrolemember N'''''' + @rightsaction + '''''', N'''''' + @RoleName + '''''' +END + +'' + END + + FETCH NEXT FROM SecurablesCurs INTO @typeofobject, @grantordeny, @rightsaction, @objectname, @schemaid + END + +CLOSE SecurablesCurs +DEALLOCATE SecurablesCurs + +PRINT ''SET ALL SECURABLES ON ROLE ['' + @RoleName + '']'' +EXEC sp_executesql @Command + +END +ELSE +BEGIN + + DECLARE SecurablesCurs CURSOR FOR + SELECT typeofobject, grantordeny, rightsaction, objectname, schemaid + FROM #Securables + WHERE N2 = 0 + + OPEN SecurablesCurs + FETCH NEXT FROM SecurablesCurs INTO @typeofobject, @grantordeny, @rightsaction, @objectname, @schemaid + WHILE @@FETCH_STATUS = 0 + BEGIN + + IF @typeofobject = ''DB'' + BEGIN + IF EXISTS(SELECT 1 FROM sys.fn_builtin_permissions(''DATABASE'') WHERE permission_name = '''' + @rightsaction + '''') + BEGIN + SET @Command = @Command + @grantordeny + '' '' + @rightsaction + '' TO ['' + @RoleName + ''] +'' + END + END + + IF @typeofobject = ''SCHEMA'' + BEGIN + SET @Command = @Command + '' +IF EXISTS (SELECT 1 FROM sys.schemas WHERE name = '''''' + @schemaid + '''''') +BEGIN + IF EXISTS(SELECT 1 FROM sys.fn_builtin_permissions(''''SCHEMA'''') WHERE permission_name = '''''' + @rightsaction + '''''') + BEGIN + '' + @grantordeny + '' '' + @rightsaction + '' ON SCHEMA::'' + @schemaid + '' TO ['' + @RoleName + ''] + END +END + +'' + END + + IF @typeofobject in(''TABLE'',''SP'',''FUNCTIONS'',''VIEWS'') + BEGIN + + IF @objectname like ''%[%]%'' + BEGIN + + IF @typeofobject = ''TABLE'' + BEGIN + SET @sysTarget = ''sys.tables'' + SET @sysType = '''' + END + + IF @typeofobject = ''SP'' + BEGIN + SET @sysTarget = ''sys.procedures'' + SET @sysType = '''' + END + + IF @typeofobject = ''FUNCTIONS'' + BEGIN + SET @sysTarget = ''sys.objects'' + SET @sysType = '' and p.Type IN ( N''''FN'''', N''''IF'''', N''''TF'''', N''''FS'''', N''''FT'''' )'' + END + + IF @typeofobject = ''VIEWS'' + BEGIN + SET @sysTarget = ''sys.views'' + SET @sysType = '''' + END + + SET @Command = @Command + '' +DECLARE SP_cursor CURSOR FOR +SELECT p.name FROM '' + @sysTarget + '' p JOIN sys.schemas s ON s.schema_id = p.schema_id WHERE (p.name like '''''' + @objectname + '''''') and s.name = '''''' + @schemaid + '''' + @sysType + '''''' + +OPEN SP_cursor +FETCH NEXT FROM SP_cursor INTO @SP_Name +WHILE @@FETCH_STATUS = 0 +BEGIN + IF EXISTS(SELECT 1 FROM sys.fn_builtin_permissions(''''OBJECT'''') WHERE permission_name = '''''' + @rightsaction + '''''') + BEGIN + EXEC('''''' + @grantordeny + '' '' + @rightsaction + '' ON ['' + @schemaid + ''].['''' + @SP_Name + ''''] TO ['' + @RoleName + '']'''') + END + FETCH NEXT FROM SP_cursor INTO @SP_Name +END + +CLOSE SP_cursor +DEALLOCATE SP_cursor + +'' + + END + ELSE + BEGIN + + SET @Command = @Command + '' +IF EXISTS(SELECT 1 FROM sys.objects o WITH (NOLOCK) JOIN sys.schemas s ON s.schema_id = o.schema_id WHERE o.name = '''''' + @objectname + '''''' AND o.type IN (N''''U'''',''''P'''',''''V'''',''''FN'''',''''IF'''',''''TF'''') AND s.name = '''''' + @schemaid + '''''') +BEGIN + IF EXISTS(SELECT 1 FROM sys.fn_builtin_permissions(''''OBJECT'''') WHERE permission_name = '''''' + @rightsaction + '''''') + BEGIN + '' + @grantordeny + '' '' + @rightsaction + '' ON ['' + @schemaid + ''].['' + @objectname + ''] TO ['' + @RoleName + ''] + END +END + +'' + END + END + + IF @typeofobject = ''ASSEMBLIES'' + BEGIN + SET @Command = @Command + '' +IF EXISTS(SELECT 1 FROM sys.assemblies WHERE NAME = '''''' + @objectname + '''''') +BEGIN + IF EXISTS(SELECT 1 FROM sys.fn_builtin_permissions(''''ASSEMBLY'''') WHERE permission_name = '''''' + @rightsaction + '''''') + BEGIN + '' + @grantordeny + '' '' + @rightsaction + ''::['' + @objectname + ''] TO ['' + @RoleName + ''] + END +END + +'' + END + + IF @typeofobject = ''ROLE'' + BEGIN + SET @Command = @Command + '' +IF NOT EXISTS (SELECT 1 FROM sys.database_role_members JOIN sys.database_principals roles ON database_role_members.role_principal_id = roles.principal_id JOIN sys.database_principals members ON database_role_members.member_principal_id = members.principal_id WHERE roles.name = '''''' + @rightsaction + '''''' AND members.name = '''''' + @RoleName + '''''') +BEGIN + EXEC sp_addrolemember N'''''' + @rightsaction + '''''', N'''''' + @RoleName + '''''' +END + +'' + END + + FETCH NEXT FROM SecurablesCurs INTO @typeofobject, @grantordeny, @rightsaction, @objectname, @schemaid + END + +CLOSE SecurablesCurs +DEALLOCATE SecurablesCurs + +PRINT ''SET ALL SECURABLES ON ROLE ['' + @RoleName + '']'' +EXEC sp_executesql @Command + +END + +/* ADD USER */ +DECLARE UsersCurs CURSOR FOR +SELECT username + FROM #UsersOnRole + +OPEN UsersCurs + +FETCH NEXT FROM UsersCurs INTO @Users +WHILE @@FETCH_STATUS = 0 +BEGIN + + SELECT @Command = '' +EXEC sp_addrolemember N'''''' + @RoleName + '''''', N'''''' + @Users + '''''' +PRINT ''''ADD USER ['' + @Users + ''] ON ROLE ['' + @RoleName + '']'''' +'' + +FETCH NEXT FROM UsersCurs INTO @Users +END + +CLOSE UsersCurs +DEALLOCATE UsersCurs + +EXEC sp_executesql @Command + +/*============================================================================= + Drop temp tables +=============================================================================*/ +DROP TABLE #Securables +DROP TABLE #UsersOnRole','ActivePos_write','Pharmacies') + +INSERT INTO #AllRoles(STR_Definition,STR_Database,STR_Product)VALUES(' + +/*============================================================================= + + Script to create dbRoleSupUsr role. + + Role Name: dbRoleSupUsr + TEMPLATE: N2 and PROD + + EXAMPLE OF SECURABLES TO SET: + + INSERT INTO #Securables + VALUES + (''DB'',''GRANT'',''VIEW DEFINITION'','''',''''), + (''SCHEMA'',''GRANT'',''SELECT,EXECUTE,INSERT,UPDATE,DELETE'','''',''AP''), + (''TABLE'',''GRANT'',''INSERT,UPDATE'',''Address'',''dbo''), + (''SP'',''GRANT'',''EXECUTE'',''sp_bmc_GetNextID'',''dbo''), + (''ROLE'',''GRANT'',''db_datareader'','''','''') + + ----------------------------------------------- + +Generate date : 2023-05-12 / up208700 + +=============================================================================*/ + +DECLARE @Type varchar(6), + @Command nvarchar(max), + @RoleName varchar(60), + @Users varchar(255), + @typeofobject varchar(50), + @grantordeny varchar(10), + @rightsaction varchar(255), + @objectname varchar(255), + @schemaid varchar(10), + @sysTarget varchar(255), + @sysType varchar(255) + +SET @RoleName = ''dbRoleSupUsr'' +SET @Command = '''' + +SELECT @Type = [Type] FROM [master].[cfg].[InstanceContext] + +/* TEMP TABLES */ +CREATE TABLE #UsersOnRole(username varchar(255)) +CREATE TABLE #Securables(typeofobject varchar(50), grantordeny varchar(10), rightsaction varchar(255), objectname varchar(255), schemaid varchar(10),N2 bit) + +/* !!! LIST OF SECURABLES TO CHANGE !!! */ + +INSERT INTO #Securables +VALUES +(''DB'',''GRANT'',''EXECUTE'','''',''dbo'',0) +,(''ROLE'',''GRANT'',''DB_DATAREADER'','''',''dbo'',0) +,(''ROLE'',''GRANT'',''DB_DATAWRITER'','''',''dbo'',0) +,(''ROLE'',''GRANT'',''DB_OWNER'','''',''dbo'',1) + + +/* GET ALL USERS ON THIS ROLE */ +INSERT INTO #UsersOnRole +SELECT + members.name +FROM sys.database_role_members + JOIN sys.database_principals roles ON database_role_members.role_principal_id = roles.principal_id + JOIN sys.database_principals members ON database_role_members.member_principal_id = members.principal_id +WHERE roles.name = @RoleName + +/* CREATE ROLE */ +SELECT @Command = '' +IF NOT EXISTS (SELECT 1 FROM sys.database_principals WHERE name = '''''' + @RoleName + '''''' AND type = ''''R'''') +BEGIN + CREATE ROLE ['' + @RoleName + ''] AUTHORIZATION [dbo] + PRINT ''''CREATE ROLE ['' + @RoleName + '']'''' +END +'' +EXEC sp_executesql @Command + +SET @Command = '' +DECLARE @SP_Name varchar(255) + +'' + +/* SET ALL ROLE SECURABLES */ +IF @Type = ''DEVE'' +BEGIN + + DECLARE SecurablesCurs CURSOR FOR + SELECT typeofobject, grantordeny, rightsaction, objectname, schemaid + FROM #Securables + WHERE N2 = 1 + + OPEN SecurablesCurs + FETCH NEXT FROM SecurablesCurs INTO @typeofobject, @grantordeny, @rightsaction, @objectname, @schemaid + WHILE @@FETCH_STATUS = 0 + BEGIN + + IF @typeofobject = ''DB'' + BEGIN + IF EXISTS(SELECT 1 FROM sys.fn_builtin_permissions(''DATABASE'') WHERE permission_name = '''' + @rightsaction + '''') + BEGIN + SET @Command = @Command + @grantordeny + '' '' + @rightsaction + '' TO ['' + @RoleName + ''] +'' + END + END + + IF @typeofobject = ''SCHEMA'' + BEGIN + SET @Command = @Command + '' +IF EXISTS (SELECT 1 FROM sys.schemas WHERE name = '''''' + @schemaid + '''''') +BEGIN + IF EXISTS(SELECT 1 FROM sys.fn_builtin_permissions(''''SCHEMA'''') WHERE permission_name = '''''' + @rightsaction + '''''') + BEGIN + '' + @grantordeny + '' '' + @rightsaction + '' ON SCHEMA::'' + @schemaid + '' TO ['' + @RoleName + ''] + END +END + +'' + END + + IF @typeofobject in(''TABLE'',''SP'',''FUNCTIONS'',''VIEWS'') + BEGIN + + IF @objectname like ''%[%]%'' + BEGIN + IF @typeofobject = ''TABLE'' + BEGIN + SET @sysTarget = ''sys.tables'' + SET @sysType = '''' + END + + IF @typeofobject = ''SP'' + BEGIN + SET @sysTarget = ''sys.procedures'' + SET @sysType = '''' + END + + IF @typeofobject = ''FUNCTIONS'' + BEGIN + SET @sysTarget = ''sys.objects'' + SET @sysType = '' and p.Type IN ( N''''FN'''', N''''IF'''', N''''TF'''', N''''FS'''', N''''FT'''' )'' + END + + IF @typeofobject = ''VIEWS'' + BEGIN + SET @sysTarget = ''sys.views'' + SET @sysType = '''' + END + + SET @Command = @Command + '' +DECLARE SP_cursor CURSOR FOR +SELECT p.name FROM '' + @sysTarget + '' p JOIN sys.schemas s ON s.schema_id = p.schema_id WHERE (p.name like '''''' + @objectname + '''''') and s.name = '''''' + @schemaid + '''' + @sysType + '''''' + +OPEN SP_cursor +FETCH NEXT FROM SP_cursor INTO @SP_Name +WHILE @@FETCH_STATUS = 0 +BEGIN + IF EXISTS(SELECT 1 FROM sys.fn_builtin_permissions(''''OBJECT'''') WHERE permission_name = '''''' + @rightsaction + '''''') + BEGIN + EXEC('''''' + @grantordeny + '' '' + @rightsaction + '' ON ['' + @schemaid + ''].['''' + @SP_Name + ''''] TO ['' + @RoleName + '']'''') + END + FETCH NEXT FROM SP_cursor INTO @SP_Name +END + +CLOSE SP_cursor +DEALLOCATE SP_cursor + +'' + + END + ELSE + BEGIN + + SET @Command = @Command + '' +IF EXISTS(SELECT 1 FROM sys.objects o WITH (NOLOCK) JOIN sys.schemas s ON s.schema_id = o.schema_id WHERE o.name = '''''' + @objectname + '''''' AND o.type IN (N''''U'''',''''P'''',''''V'''',''''FN'''',''''IF'''',''''TF'''') AND s.name = '''''' + @schemaid + '''''') +BEGIN + IF EXISTS(SELECT 1 FROM sys.fn_builtin_permissions(''''OBJECT'''') WHERE permission_name = '''''' + @rightsaction + '''''') + BEGIN + '' + @grantordeny + '' '' + @rightsaction + '' ON ['' + @schemaid + ''].['' + @objectname + ''] TO ['' + @RoleName + ''] + END +END + +'' + END + END + + IF @typeofobject = ''ASSEMBLIES'' + BEGIN + SET @Command = @Command + '' +IF EXISTS(SELECT 1 FROM sys.assemblies WHERE NAME = '''''' + @objectname + '''''') +BEGIN + IF EXISTS(SELECT 1 FROM sys.fn_builtin_permissions(''''ASSEMBLY'''') WHERE permission_name = '''''' + @rightsaction + '''''') + BEGIN + '' + @grantordeny + '' '' + @rightsaction + ''::['' + @objectname + ''] TO ['' + @RoleName + ''] + END +END + +'' + END + + IF @typeofobject = ''ROLE'' + BEGIN + SET @Command = @Command + '' +IF NOT EXISTS (SELECT 1 FROM sys.database_role_members JOIN sys.database_principals roles ON database_role_members.role_principal_id = roles.principal_id JOIN sys.database_principals members ON database_role_members.member_principal_id = members.principal_id WHERE roles.name = '''''' + @rightsaction + '''''' AND members.name = '''''' + @RoleName + '''''') +BEGIN + EXEC sp_addrolemember N'''''' + @rightsaction + '''''', N'''''' + @RoleName + '''''' +END + +'' + END + + FETCH NEXT FROM SecurablesCurs INTO @typeofobject, @grantordeny, @rightsaction, @objectname, @schemaid + END + +CLOSE SecurablesCurs +DEALLOCATE SecurablesCurs + +PRINT ''SET ALL SECURABLES ON ROLE ['' + @RoleName + '']'' +EXEC sp_executesql @Command + +END +ELSE +BEGIN + + DECLARE SecurablesCurs CURSOR FOR + SELECT typeofobject, grantordeny, rightsaction, objectname, schemaid + FROM #Securables + WHERE N2 = 0 + + OPEN SecurablesCurs + FETCH NEXT FROM SecurablesCurs INTO @typeofobject, @grantordeny, @rightsaction, @objectname, @schemaid + WHILE @@FETCH_STATUS = 0 + BEGIN + + IF @typeofobject = ''DB'' + BEGIN + IF EXISTS(SELECT 1 FROM sys.fn_builtin_permissions(''DATABASE'') WHERE permission_name = '''' + @rightsaction + '''') + BEGIN + SET @Command = @Command + @grantordeny + '' '' + @rightsaction + '' TO ['' + @RoleName + ''] +'' + END + END + + IF @typeofobject = ''SCHEMA'' + BEGIN + SET @Command = @Command + '' +IF EXISTS (SELECT 1 FROM sys.schemas WHERE name = '''''' + @schemaid + '''''') +BEGIN + IF EXISTS(SELECT 1 FROM sys.fn_builtin_permissions(''''SCHEMA'''') WHERE permission_name = '''''' + @rightsaction + '''''') + BEGIN + '' + @grantordeny + '' '' + @rightsaction + '' ON SCHEMA::'' + @schemaid + '' TO ['' + @RoleName + ''] + END +END + +'' + END + + IF @typeofobject in(''TABLE'',''SP'',''FUNCTIONS'',''VIEWS'') + BEGIN + + IF @objectname like ''%[%]%'' + BEGIN + + IF @typeofobject = ''TABLE'' + BEGIN + SET @sysTarget = ''sys.tables'' + SET @sysType = '''' + END + + IF @typeofobject = ''SP'' + BEGIN + SET @sysTarget = ''sys.procedures'' + SET @sysType = '''' + END + + IF @typeofobject = ''FUNCTIONS'' + BEGIN + SET @sysTarget = ''sys.objects'' + SET @sysType = '' and p.Type IN ( N''''FN'''', N''''IF'''', N''''TF'''', N''''FS'''', N''''FT'''' )'' + END + + IF @typeofobject = ''VIEWS'' + BEGIN + SET @sysTarget = ''sys.views'' + SET @sysType = '''' + END + + SET @Command = @Command + '' +DECLARE SP_cursor CURSOR FOR +SELECT p.name FROM '' + @sysTarget + '' p JOIN sys.schemas s ON s.schema_id = p.schema_id WHERE (p.name like '''''' + @objectname + '''''') and s.name = '''''' + @schemaid + '''' + @sysType + '''''' + +OPEN SP_cursor +FETCH NEXT FROM SP_cursor INTO @SP_Name +WHILE @@FETCH_STATUS = 0 +BEGIN + IF EXISTS(SELECT 1 FROM sys.fn_builtin_permissions(''''OBJECT'''') WHERE permission_name = '''''' + @rightsaction + '''''') + BEGIN + EXEC('''''' + @grantordeny + '' '' + @rightsaction + '' ON ['' + @schemaid + ''].['''' + @SP_Name + ''''] TO ['' + @RoleName + '']'''') + END + FETCH NEXT FROM SP_cursor INTO @SP_Name +END + +CLOSE SP_cursor +DEALLOCATE SP_cursor + +'' + + END + ELSE + BEGIN + + SET @Command = @Command + '' +IF EXISTS(SELECT 1 FROM sys.objects o WITH (NOLOCK) JOIN sys.schemas s ON s.schema_id = o.schema_id WHERE o.name = '''''' + @objectname + '''''' AND o.type IN (N''''U'''',''''P'''',''''V'''',''''FN'''',''''IF'''',''''TF'''') AND s.name = '''''' + @schemaid + '''''') +BEGIN + IF EXISTS(SELECT 1 FROM sys.fn_builtin_permissions(''''OBJECT'''') WHERE permission_name = '''''' + @rightsaction + '''''') + BEGIN + '' + @grantordeny + '' '' + @rightsaction + '' ON ['' + @schemaid + ''].['' + @objectname + ''] TO ['' + @RoleName + ''] + END +END + +'' + END + END + + IF @typeofobject = ''ASSEMBLIES'' + BEGIN + SET @Command = @Command + '' +IF EXISTS(SELECT 1 FROM sys.assemblies WHERE NAME = '''''' + @objectname + '''''') +BEGIN + IF EXISTS(SELECT 1 FROM sys.fn_builtin_permissions(''''ASSEMBLY'''') WHERE permission_name = '''''' + @rightsaction + '''''') + BEGIN + '' + @grantordeny + '' '' + @rightsaction + ''::['' + @objectname + ''] TO ['' + @RoleName + ''] + END +END + +'' + END + + IF @typeofobject = ''ROLE'' + BEGIN + SET @Command = @Command + '' +IF NOT EXISTS (SELECT 1 FROM sys.database_role_members JOIN sys.database_principals roles ON database_role_members.role_principal_id = roles.principal_id JOIN sys.database_principals members ON database_role_members.member_principal_id = members.principal_id WHERE roles.name = '''''' + @rightsaction + '''''' AND members.name = '''''' + @RoleName + '''''') +BEGIN + EXEC sp_addrolemember N'''''' + @rightsaction + '''''', N'''''' + @RoleName + '''''' +END + +'' + END + + FETCH NEXT FROM SecurablesCurs INTO @typeofobject, @grantordeny, @rightsaction, @objectname, @schemaid + END + +CLOSE SecurablesCurs +DEALLOCATE SecurablesCurs + +PRINT ''SET ALL SECURABLES ON ROLE ['' + @RoleName + '']'' +EXEC sp_executesql @Command + +END + +/* ADD USER */ +DECLARE UsersCurs CURSOR FOR +SELECT username + FROM #UsersOnRole + +OPEN UsersCurs + +FETCH NEXT FROM UsersCurs INTO @Users +WHILE @@FETCH_STATUS = 0 +BEGIN + + SELECT @Command = '' +EXEC sp_addrolemember N'''''' + @RoleName + '''''', N'''''' + @Users + '''''' +PRINT ''''ADD USER ['' + @Users + ''] ON ROLE ['' + @RoleName + '']'''' +'' + +FETCH NEXT FROM UsersCurs INTO @Users +END + +CLOSE UsersCurs +DEALLOCATE UsersCurs + +EXEC sp_executesql @Command + +/*============================================================================= + Drop temp tables +=============================================================================*/ +DROP TABLE #Securables +DROP TABLE #UsersOnRole','ActivePos_write','Pharmacies') + +INSERT INTO #AllRoles(STR_Definition,STR_Database,STR_Product)VALUES(' + +/*============================================================================= + + Script to create dbRoleTPPos role. + + Role Name: dbRoleTPPos + TEMPLATE: Default + + EXAMPLE OF SECURABLES TO SET: + + INSERT INTO #Securables + VALUES + (''DB'',''GRANT'',''VIEW DEFINITION'','''',''''), + (''SCHEMA'',''GRANT'',''SELECT,EXECUTE,INSERT,UPDATE,DELETE'','''',''AP''), + (''TABLE'',''GRANT'',''INSERT,UPDATE'',''Address'',''dbo''), + (''SP'',''GRANT'',''EXECUTE'',''sp_bmc_GetNextID'',''dbo''), + (''ROLE'',''GRANT'',''db_datareader'','''','''') + + ----------------------------------------------- + +Generate date : 2023-05-12 / up208700 + +=============================================================================*/ + +DECLARE @Command nvarchar(max), + @RoleName varchar(60), + @Users varchar(255), + @typeofobject varchar(50), + @grantordeny varchar(10), + @rightsaction varchar(255), + @objectname varchar(255), + @schemaid varchar(10), + @sysTarget varchar(255), + @sysType varchar(255) + +SET @RoleName = ''dbRoleTPPos'' +SET @Command = '''' + +/* TEMP TABLES */ +CREATE TABLE #UsersOnRole(username varchar(255)) +CREATE TABLE #Securables(typeofobject varchar(50), grantordeny varchar(10), rightsaction varchar(255), objectname varchar(255), schemaid varchar(10),N2 bit) + +/* !!! LIST OF SECURABLES TO CHANGE !!! */ + +INSERT INTO #Securables +VALUES +(''DB'',''GRANT'',''EXECUTE'','''',''dbo'',0) +,(''ROLE'',''GRANT'',''DB_DATAREADER'','''',''dbo'',0) +,(''ROLE'',''GRANT'',''DB_DATAWRITER'','''',''dbo'',0) +,(''ROLE'',''GRANT'',''DB_DDLADMIN'','''',''dbo'',0) + + +/* GET ALL USERS ON THIS ROLE */ +INSERT INTO #UsersOnRole +SELECT + members.name +FROM sys.database_role_members + JOIN sys.database_principals roles ON database_role_members.role_principal_id = roles.principal_id + JOIN sys.database_principals members ON database_role_members.member_principal_id = members.principal_id +WHERE roles.name = @RoleName + +/* CREATE ROLE */ +SELECT @Command = '' +IF NOT EXISTS (SELECT 1 FROM sys.database_principals WHERE name = '''''' + @RoleName + '''''' AND type = ''''R'''') +BEGIN + CREATE ROLE ['' + @RoleName + ''] AUTHORIZATION [dbo] + PRINT ''''CREATE ROLE ['' + @RoleName + '']'''' +END +'' +EXEC sp_executesql @Command + +SET @Command = '' +DECLARE @SP_Name varchar(255) + +'' + +/* SET ALL ROLE SECURABLES */ +DECLARE SecurablesCurs CURSOR FOR +SELECT typeofobject, grantordeny, rightsaction, objectname, schemaid +FROM #Securables +WHERE N2 = 0 + +OPEN SecurablesCurs +FETCH NEXT FROM SecurablesCurs INTO @typeofobject, @grantordeny, @rightsaction, @objectname, @schemaid +WHILE @@FETCH_STATUS = 0 +BEGIN + + IF @typeofobject = ''DB'' + BEGIN + IF EXISTS(SELECT 1 FROM sys.fn_builtin_permissions(''DATABASE'') WHERE permission_name = '''' + @rightsaction + '''') + BEGIN + SET @Command = @Command + @grantordeny + '' '' + @rightsaction + '' TO ['' + @RoleName + ''] +'' + END + END + + IF @typeofobject = ''SCHEMA'' + BEGIN + SET @Command = @Command + '' +IF EXISTS (SELECT 1 FROM sys.schemas WHERE name = '''''' + @schemaid + '''''') +BEGIN + IF EXISTS(SELECT 1 FROM sys.fn_builtin_permissions(''''SCHEMA'''') WHERE permission_name = '''''' + @rightsaction + '''''') + BEGIN + '' + @grantordeny + '' '' + @rightsaction + '' ON SCHEMA::'' + @schemaid + '' TO ['' + @RoleName + ''] + END +END + +'' + END + + IF @typeofobject in(''TABLE'',''SP'',''FUNCTIONS'',''VIEWS'') + BEGIN + + IF @objectname like ''%[%]%'' + BEGIN + + IF @typeofobject = ''TABLE'' + BEGIN + SET @sysTarget = ''sys.tables'' + SET @sysType = '''' + END + + IF @typeofobject = ''SP'' + BEGIN + SET @sysTarget = ''sys.procedures'' + SET @sysType = '''' + END + + IF @typeofobject = ''FUNCTIONS'' + BEGIN + SET @sysTarget = ''sys.objects'' + SET @sysType = '' and p.Type IN ( N''''FN'''', N''''IF'''', N''''TF'''', N''''FS'''', N''''FT'''' )'' + END + + IF @typeofobject = ''VIEWS'' + BEGIN + SET @sysTarget = ''sys.views'' + SET @sysType = '''' + END + + SET @Command = @Command + '' +DECLARE SP_cursor CURSOR FOR +SELECT p.name FROM '' + @sysTarget + '' p JOIN sys.schemas s ON s.schema_id = p.schema_id WHERE (p.name like '''''' + @objectname + '''''') and s.name = '''''' + @schemaid + '''' + @sysType + '''''' + +OPEN SP_cursor +FETCH NEXT FROM SP_cursor INTO @SP_Name +WHILE @@FETCH_STATUS = 0 +BEGIN + IF EXISTS(SELECT 1 FROM sys.fn_builtin_permissions(''''OBJECT'''') WHERE permission_name = '''''' + @rightsaction + '''''') + BEGIN + EXEC('''''' + @grantordeny + '' '' + @rightsaction + '' ON ['' + @schemaid + ''].['''' + @SP_Name + ''''] TO ['' + @RoleName + '']'''') + END + FETCH NEXT FROM SP_cursor INTO @SP_Name +END + +CLOSE SP_cursor +DEALLOCATE SP_cursor + +'' + + END + ELSE + BEGIN + + SET @Command = @Command + '' +IF EXISTS(SELECT 1 FROM sys.objects o WITH (NOLOCK) JOIN sys.schemas s ON s.schema_id = o.schema_id WHERE o.name = '''''' + @objectname + '''''' AND o.type IN (N''''U'''',''''P'''',''''V'''',''''FN'''',''''IF'''',''''TF'''') AND s.name = '''''' + @schemaid + '''''') +BEGIN + IF EXISTS(SELECT 1 FROM sys.fn_builtin_permissions(''''OBJECT'''') WHERE permission_name = '''''' + @rightsaction + '''''') + BEGIN + '' + @grantordeny + '' '' + @rightsaction + '' ON ['' + @schemaid + ''].['' + @objectname + ''] TO ['' + @RoleName + ''] + END +END + +'' + END +END + +IF @typeofobject = ''ASSEMBLIES'' +BEGIN + SET @Command = @Command + '' +IF EXISTS(SELECT 1 FROM sys.assemblies WHERE NAME = '''''' + @objectname + '''''') +BEGIN + IF EXISTS(SELECT 1 FROM sys.fn_builtin_permissions(''''ASSEMBLY'''') WHERE permission_name = '''''' + @rightsaction + '''''') + BEGIN + '' + @grantordeny + '' '' + @rightsaction + ''::['' + @objectname + ''] TO ['' + @RoleName + ''] + END +END + +'' +END + +IF @typeofobject = ''ROLE'' +BEGIN + SET @Command = @Command + '' +IF NOT EXISTS (SELECT 1 FROM sys.database_role_members JOIN sys.database_principals roles ON database_role_members.role_principal_id = roles.principal_id JOIN sys.database_principals members ON database_role_members.member_principal_id = members.principal_id WHERE roles.name = '''''' + @rightsaction + '''''' AND members.name = '''''' + @RoleName + '''''') +BEGIN + EXEC sp_addrolemember N'''''' + @rightsaction + '''''', N'''''' + @RoleName + '''''' +END + +'' +END + +FETCH NEXT FROM SecurablesCurs INTO @typeofobject, @grantordeny, @rightsaction, @objectname, @schemaid +END + +CLOSE SecurablesCurs +DEALLOCATE SecurablesCurs + +PRINT ''SET ALL SECURABLES ON ROLE ['' + @RoleName + '']'' +EXEC sp_executesql @Command + +/* ADD USER */ +DECLARE UsersCurs CURSOR FOR +SELECT username + FROM #UsersOnRole + +OPEN UsersCurs + +FETCH NEXT FROM UsersCurs INTO @Users +WHILE @@FETCH_STATUS = 0 +BEGIN + + SELECT @Command = '' +EXEC sp_addrolemember N'''''' + @RoleName + '''''', N'''''' + @Users + '''''' +PRINT ''''ADD USER ['' + @Users + ''] ON ROLE ['' + @RoleName + '']'''' +'' + +FETCH NEXT FROM UsersCurs INTO @Users +END + +CLOSE UsersCurs +DEALLOCATE UsersCurs + +EXEC sp_executesql @Command + + +/*============================================================================= + Drop temp tables +=============================================================================*/ +DROP TABLE #Securables +DROP TABLE #UsersOnRole +','ActivePos_write','Pharmacies') + +INSERT INTO #AllRoles(STR_Definition,STR_Database,STR_Product)VALUES(' + +/*============================================================================= + + Script to create dbRoleActiveConfig role. + + Role Name: dbRoleActiveConfig + TEMPLATE: Default + + EXAMPLE OF SECURABLES TO SET: + + INSERT INTO #Securables + VALUES + (''DB'',''GRANT'',''VIEW DEFINITION'','''',''''), + (''SCHEMA'',''GRANT'',''SELECT,EXECUTE,INSERT,UPDATE,DELETE'','''',''AP''), + (''TABLE'',''GRANT'',''INSERT,UPDATE'',''Address'',''dbo''), + (''SP'',''GRANT'',''EXECUTE'',''sp_bmc_GetNextID'',''dbo''), + (''ROLE'',''GRANT'',''db_datareader'','''','''') + + ----------------------------------------------- + +Generate date : 2023-05-12 / up208700 + +=============================================================================*/ + +DECLARE @Command nvarchar(max), + @RoleName varchar(60), + @Users varchar(255), + @typeofobject varchar(50), + @grantordeny varchar(10), + @rightsaction varchar(255), + @objectname varchar(255), + @schemaid varchar(10), + @sysTarget varchar(255), + @sysType varchar(255) + +SET @RoleName = ''dbRoleActiveConfig'' +SET @Command = '''' + +/* TEMP TABLES */ +CREATE TABLE #UsersOnRole(username varchar(255)) +CREATE TABLE #Securables(typeofobject varchar(50), grantordeny varchar(10), rightsaction varchar(255), objectname varchar(255), schemaid varchar(10),N2 bit) + +/* !!! LIST OF SECURABLES TO CHANGE !!! */ + +INSERT INTO #Securables +VALUES +(''SP'',''GRANT'',''EXECUTE'',''GetApplications'',''cfg'',0) +,(''SP'',''GRANT'',''EXECUTE'',''GetConfigurationDatabaseSchemaVersion'',''cfg'',0) +,(''SP'',''GRANT'',''EXECUTE'',''GetSettings'',''cfg'',0) + + +/* GET ALL USERS ON THIS ROLE */ +INSERT INTO #UsersOnRole +SELECT + members.name +FROM sys.database_role_members + JOIN sys.database_principals roles ON database_role_members.role_principal_id = roles.principal_id + JOIN sys.database_principals members ON database_role_members.member_principal_id = members.principal_id +WHERE roles.name = @RoleName + +/* CREATE ROLE */ +SELECT @Command = '' +IF NOT EXISTS (SELECT 1 FROM sys.database_principals WHERE name = '''''' + @RoleName + '''''' AND type = ''''R'''') +BEGIN + CREATE ROLE ['' + @RoleName + ''] AUTHORIZATION [dbo] + PRINT ''''CREATE ROLE ['' + @RoleName + '']'''' +END +'' +EXEC sp_executesql @Command + +SET @Command = '' +DECLARE @SP_Name varchar(255) + +'' + +/* SET ALL ROLE SECURABLES */ +DECLARE SecurablesCurs CURSOR FOR +SELECT typeofobject, grantordeny, rightsaction, objectname, schemaid +FROM #Securables +WHERE N2 = 0 + +OPEN SecurablesCurs +FETCH NEXT FROM SecurablesCurs INTO @typeofobject, @grantordeny, @rightsaction, @objectname, @schemaid +WHILE @@FETCH_STATUS = 0 +BEGIN + + IF @typeofobject = ''DB'' + BEGIN + IF EXISTS(SELECT 1 FROM sys.fn_builtin_permissions(''DATABASE'') WHERE permission_name = '''' + @rightsaction + '''') + BEGIN + SET @Command = @Command + @grantordeny + '' '' + @rightsaction + '' TO ['' + @RoleName + ''] +'' + END + END + + IF @typeofobject = ''SCHEMA'' + BEGIN + SET @Command = @Command + '' +IF EXISTS (SELECT 1 FROM sys.schemas WHERE name = '''''' + @schemaid + '''''') +BEGIN + IF EXISTS(SELECT 1 FROM sys.fn_builtin_permissions(''''SCHEMA'''') WHERE permission_name = '''''' + @rightsaction + '''''') + BEGIN + '' + @grantordeny + '' '' + @rightsaction + '' ON SCHEMA::'' + @schemaid + '' TO ['' + @RoleName + ''] + END +END + +'' + END + + IF @typeofobject in(''TABLE'',''SP'',''FUNCTIONS'',''VIEWS'') + BEGIN + + IF @objectname like ''%[%]%'' + BEGIN + + IF @typeofobject = ''TABLE'' + BEGIN + SET @sysTarget = ''sys.tables'' + SET @sysType = '''' + END + + IF @typeofobject = ''SP'' + BEGIN + SET @sysTarget = ''sys.procedures'' + SET @sysType = '''' + END + + IF @typeofobject = ''FUNCTIONS'' + BEGIN + SET @sysTarget = ''sys.objects'' + SET @sysType = '' and p.Type IN ( N''''FN'''', N''''IF'''', N''''TF'''', N''''FS'''', N''''FT'''' )'' + END + + IF @typeofobject = ''VIEWS'' + BEGIN + SET @sysTarget = ''sys.views'' + SET @sysType = '''' + END + + SET @Command = @Command + '' +DECLARE SP_cursor CURSOR FOR +SELECT p.name FROM '' + @sysTarget + '' p JOIN sys.schemas s ON s.schema_id = p.schema_id WHERE (p.name like '''''' + @objectname + '''''') and s.name = '''''' + @schemaid + '''' + @sysType + '''''' + +OPEN SP_cursor +FETCH NEXT FROM SP_cursor INTO @SP_Name +WHILE @@FETCH_STATUS = 0 +BEGIN + IF EXISTS(SELECT 1 FROM sys.fn_builtin_permissions(''''OBJECT'''') WHERE permission_name = '''''' + @rightsaction + '''''') + BEGIN + EXEC('''''' + @grantordeny + '' '' + @rightsaction + '' ON ['' + @schemaid + ''].['''' + @SP_Name + ''''] TO ['' + @RoleName + '']'''') + END + FETCH NEXT FROM SP_cursor INTO @SP_Name +END + +CLOSE SP_cursor +DEALLOCATE SP_cursor + +'' + + END + ELSE + BEGIN + + SET @Command = @Command + '' +IF EXISTS(SELECT 1 FROM sys.objects o WITH (NOLOCK) JOIN sys.schemas s ON s.schema_id = o.schema_id WHERE o.name = '''''' + @objectname + '''''' AND o.type IN (N''''U'''',''''P'''',''''V'''',''''FN'''',''''IF'''',''''TF'''') AND s.name = '''''' + @schemaid + '''''') +BEGIN + IF EXISTS(SELECT 1 FROM sys.fn_builtin_permissions(''''OBJECT'''') WHERE permission_name = '''''' + @rightsaction + '''''') + BEGIN + '' + @grantordeny + '' '' + @rightsaction + '' ON ['' + @schemaid + ''].['' + @objectname + ''] TO ['' + @RoleName + ''] + END +END + +'' + END +END + +IF @typeofobject = ''ASSEMBLIES'' +BEGIN + SET @Command = @Command + '' +IF EXISTS(SELECT 1 FROM sys.assemblies WHERE NAME = '''''' + @objectname + '''''') +BEGIN + IF EXISTS(SELECT 1 FROM sys.fn_builtin_permissions(''''ASSEMBLY'''') WHERE permission_name = '''''' + @rightsaction + '''''') + BEGIN + '' + @grantordeny + '' '' + @rightsaction + ''::['' + @objectname + ''] TO ['' + @RoleName + ''] + END +END + +'' +END + +IF @typeofobject = ''ROLE'' +BEGIN + SET @Command = @Command + '' +IF NOT EXISTS (SELECT 1 FROM sys.database_role_members JOIN sys.database_principals roles ON database_role_members.role_principal_id = roles.principal_id JOIN sys.database_principals members ON database_role_members.member_principal_id = members.principal_id WHERE roles.name = '''''' + @rightsaction + '''''' AND members.name = '''''' + @RoleName + '''''') +BEGIN + EXEC sp_addrolemember N'''''' + @rightsaction + '''''', N'''''' + @RoleName + '''''' +END + +'' +END + +FETCH NEXT FROM SecurablesCurs INTO @typeofobject, @grantordeny, @rightsaction, @objectname, @schemaid +END + +CLOSE SecurablesCurs +DEALLOCATE SecurablesCurs + +PRINT ''SET ALL SECURABLES ON ROLE ['' + @RoleName + '']'' +EXEC sp_executesql @Command + +/* ADD USER */ +DECLARE UsersCurs CURSOR FOR +SELECT username + FROM #UsersOnRole + +OPEN UsersCurs + +FETCH NEXT FROM UsersCurs INTO @Users +WHILE @@FETCH_STATUS = 0 +BEGIN + + SELECT @Command = '' +EXEC sp_addrolemember N'''''' + @RoleName + '''''', N'''''' + @Users + '''''' +PRINT ''''ADD USER ['' + @Users + ''] ON ROLE ['' + @RoleName + '']'''' +'' + +FETCH NEXT FROM UsersCurs INTO @Users +END + +CLOSE UsersCurs +DEALLOCATE UsersCurs + +EXEC sp_executesql @Command + + +/*============================================================================= + Drop temp tables +=============================================================================*/ +DROP TABLE #Securables +DROP TABLE #UsersOnRole +','ActiveSystemClient','Pharmacies') + +INSERT INTO #AllRoles(STR_Definition,STR_Database,STR_Product)VALUES(' + +/*============================================================================= + + Script to create dbRoleActivePharmacy role. + + Role Name: dbRoleActivePharmacy + TEMPLATE: Default + + EXAMPLE OF SECURABLES TO SET: + + INSERT INTO #Securables + VALUES + (''DB'',''GRANT'',''VIEW DEFINITION'','''',''''), + (''SCHEMA'',''GRANT'',''SELECT,EXECUTE,INSERT,UPDATE,DELETE'','''',''AP''), + (''TABLE'',''GRANT'',''INSERT,UPDATE'',''Address'',''dbo''), + (''SP'',''GRANT'',''EXECUTE'',''sp_bmc_GetNextID'',''dbo''), + (''ROLE'',''GRANT'',''db_datareader'','''','''') + + ----------------------------------------------- + +Generate date : 2023-05-12 / up208700 + +=============================================================================*/ + +DECLARE @Command nvarchar(max), + @RoleName varchar(60), + @Users varchar(255), + @typeofobject varchar(50), + @grantordeny varchar(10), + @rightsaction varchar(255), + @objectname varchar(255), + @schemaid varchar(10), + @sysTarget varchar(255), + @sysType varchar(255) + +SET @RoleName = ''dbRoleActivePharmacy'' +SET @Command = '''' + +/* TEMP TABLES */ +CREATE TABLE #UsersOnRole(username varchar(255)) +CREATE TABLE #Securables(typeofobject varchar(50), grantordeny varchar(10), rightsaction varchar(255), objectname varchar(255), schemaid varchar(10),N2 bit) + +/* !!! LIST OF SECURABLES TO CHANGE !!! */ + +INSERT INTO #Securables +VALUES +(''ROLE'',''GRANT'',''DB_OWNER'','''',''dbo'',0) + + +/* GET ALL USERS ON THIS ROLE */ +INSERT INTO #UsersOnRole +SELECT + members.name +FROM sys.database_role_members + JOIN sys.database_principals roles ON database_role_members.role_principal_id = roles.principal_id + JOIN sys.database_principals members ON database_role_members.member_principal_id = members.principal_id +WHERE roles.name = @RoleName + +/* CREATE ROLE */ +SELECT @Command = '' +IF NOT EXISTS (SELECT 1 FROM sys.database_principals WHERE name = '''''' + @RoleName + '''''' AND type = ''''R'''') +BEGIN + CREATE ROLE ['' + @RoleName + ''] AUTHORIZATION [dbo] + PRINT ''''CREATE ROLE ['' + @RoleName + '']'''' +END +'' +EXEC sp_executesql @Command + +SET @Command = '' +DECLARE @SP_Name varchar(255) + +'' + +/* SET ALL ROLE SECURABLES */ +DECLARE SecurablesCurs CURSOR FOR +SELECT typeofobject, grantordeny, rightsaction, objectname, schemaid +FROM #Securables +WHERE N2 = 0 + +OPEN SecurablesCurs +FETCH NEXT FROM SecurablesCurs INTO @typeofobject, @grantordeny, @rightsaction, @objectname, @schemaid +WHILE @@FETCH_STATUS = 0 +BEGIN + + IF @typeofobject = ''DB'' + BEGIN + IF EXISTS(SELECT 1 FROM sys.fn_builtin_permissions(''DATABASE'') WHERE permission_name = '''' + @rightsaction + '''') + BEGIN + SET @Command = @Command + @grantordeny + '' '' + @rightsaction + '' TO ['' + @RoleName + ''] +'' + END + END + + IF @typeofobject = ''SCHEMA'' + BEGIN + SET @Command = @Command + '' +IF EXISTS (SELECT 1 FROM sys.schemas WHERE name = '''''' + @schemaid + '''''') +BEGIN + IF EXISTS(SELECT 1 FROM sys.fn_builtin_permissions(''''SCHEMA'''') WHERE permission_name = '''''' + @rightsaction + '''''') + BEGIN + '' + @grantordeny + '' '' + @rightsaction + '' ON SCHEMA::'' + @schemaid + '' TO ['' + @RoleName + ''] + END +END + +'' + END + + IF @typeofobject in(''TABLE'',''SP'',''FUNCTIONS'',''VIEWS'') + BEGIN + + IF @objectname like ''%[%]%'' + BEGIN + + IF @typeofobject = ''TABLE'' + BEGIN + SET @sysTarget = ''sys.tables'' + SET @sysType = '''' + END + + IF @typeofobject = ''SP'' + BEGIN + SET @sysTarget = ''sys.procedures'' + SET @sysType = '''' + END + + IF @typeofobject = ''FUNCTIONS'' + BEGIN + SET @sysTarget = ''sys.objects'' + SET @sysType = '' and p.Type IN ( N''''FN'''', N''''IF'''', N''''TF'''', N''''FS'''', N''''FT'''' )'' + END + + IF @typeofobject = ''VIEWS'' + BEGIN + SET @sysTarget = ''sys.views'' + SET @sysType = '''' + END + + SET @Command = @Command + '' +DECLARE SP_cursor CURSOR FOR +SELECT p.name FROM '' + @sysTarget + '' p JOIN sys.schemas s ON s.schema_id = p.schema_id WHERE (p.name like '''''' + @objectname + '''''') and s.name = '''''' + @schemaid + '''' + @sysType + '''''' + +OPEN SP_cursor +FETCH NEXT FROM SP_cursor INTO @SP_Name +WHILE @@FETCH_STATUS = 0 +BEGIN + IF EXISTS(SELECT 1 FROM sys.fn_builtin_permissions(''''OBJECT'''') WHERE permission_name = '''''' + @rightsaction + '''''') + BEGIN + EXEC('''''' + @grantordeny + '' '' + @rightsaction + '' ON ['' + @schemaid + ''].['''' + @SP_Name + ''''] TO ['' + @RoleName + '']'''') + END + FETCH NEXT FROM SP_cursor INTO @SP_Name +END + +CLOSE SP_cursor +DEALLOCATE SP_cursor + +'' + + END + ELSE + BEGIN + + SET @Command = @Command + '' +IF EXISTS(SELECT 1 FROM sys.objects o WITH (NOLOCK) JOIN sys.schemas s ON s.schema_id = o.schema_id WHERE o.name = '''''' + @objectname + '''''' AND o.type IN (N''''U'''',''''P'''',''''V'''',''''FN'''',''''IF'''',''''TF'''') AND s.name = '''''' + @schemaid + '''''') +BEGIN + IF EXISTS(SELECT 1 FROM sys.fn_builtin_permissions(''''OBJECT'''') WHERE permission_name = '''''' + @rightsaction + '''''') + BEGIN + '' + @grantordeny + '' '' + @rightsaction + '' ON ['' + @schemaid + ''].['' + @objectname + ''] TO ['' + @RoleName + ''] + END +END + +'' + END +END + +IF @typeofobject = ''ASSEMBLIES'' +BEGIN + SET @Command = @Command + '' +IF EXISTS(SELECT 1 FROM sys.assemblies WHERE NAME = '''''' + @objectname + '''''') +BEGIN + IF EXISTS(SELECT 1 FROM sys.fn_builtin_permissions(''''ASSEMBLY'''') WHERE permission_name = '''''' + @rightsaction + '''''') + BEGIN + '' + @grantordeny + '' '' + @rightsaction + ''::['' + @objectname + ''] TO ['' + @RoleName + ''] + END +END + +'' +END + +IF @typeofobject = ''ROLE'' +BEGIN + SET @Command = @Command + '' +IF NOT EXISTS (SELECT 1 FROM sys.database_role_members JOIN sys.database_principals roles ON database_role_members.role_principal_id = roles.principal_id JOIN sys.database_principals members ON database_role_members.member_principal_id = members.principal_id WHERE roles.name = '''''' + @rightsaction + '''''' AND members.name = '''''' + @RoleName + '''''') +BEGIN + EXEC sp_addrolemember N'''''' + @rightsaction + '''''', N'''''' + @RoleName + '''''' +END + +'' +END + +FETCH NEXT FROM SecurablesCurs INTO @typeofobject, @grantordeny, @rightsaction, @objectname, @schemaid +END + +CLOSE SecurablesCurs +DEALLOCATE SecurablesCurs + +PRINT ''SET ALL SECURABLES ON ROLE ['' + @RoleName + '']'' +EXEC sp_executesql @Command + +/* ADD USER */ +DECLARE UsersCurs CURSOR FOR +SELECT username + FROM #UsersOnRole + +OPEN UsersCurs + +FETCH NEXT FROM UsersCurs INTO @Users +WHILE @@FETCH_STATUS = 0 +BEGIN + + SELECT @Command = '' +EXEC sp_addrolemember N'''''' + @RoleName + '''''', N'''''' + @Users + '''''' +PRINT ''''ADD USER ['' + @Users + ''] ON ROLE ['' + @RoleName + '']'''' +'' + +FETCH NEXT FROM UsersCurs INTO @Users +END + +CLOSE UsersCurs +DEALLOCATE UsersCurs + +EXEC sp_executesql @Command + + +/*============================================================================= + Drop temp tables +=============================================================================*/ +DROP TABLE #Securables +DROP TABLE #UsersOnRole +','ActiveSystemClient','Pharmacies') + +INSERT INTO #AllRoles(STR_Definition,STR_Database,STR_Product)VALUES(' + +/*============================================================================= + + Script to create dbRoleCsltUsr role. + + Role Name: dbRoleCsltUsr + TEMPLATE: N2 and PROD + + EXAMPLE OF SECURABLES TO SET: + + INSERT INTO #Securables + VALUES + (''DB'',''GRANT'',''VIEW DEFINITION'','''',''''), + (''SCHEMA'',''GRANT'',''SELECT,EXECUTE,INSERT,UPDATE,DELETE'','''',''AP''), + (''TABLE'',''GRANT'',''INSERT,UPDATE'',''Address'',''dbo''), + (''SP'',''GRANT'',''EXECUTE'',''sp_bmc_GetNextID'',''dbo''), + (''ROLE'',''GRANT'',''db_datareader'','''','''') + + ----------------------------------------------- + +Generate date : 2023-05-12 / up208700 + +=============================================================================*/ + +DECLARE @Type varchar(6), + @Command nvarchar(max), + @RoleName varchar(60), + @Users varchar(255), + @typeofobject varchar(50), + @grantordeny varchar(10), + @rightsaction varchar(255), + @objectname varchar(255), + @schemaid varchar(10), + @sysTarget varchar(255), + @sysType varchar(255) + +SET @RoleName = ''dbRoleCsltUsr'' +SET @Command = '''' + +SELECT @Type = [Type] FROM [master].[cfg].[InstanceContext] + +/* TEMP TABLES */ +CREATE TABLE #UsersOnRole(username varchar(255)) +CREATE TABLE #Securables(typeofobject varchar(50), grantordeny varchar(10), rightsaction varchar(255), objectname varchar(255), schemaid varchar(10),N2 bit) + +/* !!! LIST OF SECURABLES TO CHANGE !!! */ + +INSERT INTO #Securables +VALUES +(''DB'',''GRANT'',''EXECUTE'','''',''dbo'',0) +,(''DB'',''GRANT'',''SHOWPLAN'','''',''dbo'',0) +,(''DB'',''GRANT'',''VIEW DEFINITION'','''',''dbo'',0) +,(''ROLE'',''GRANT'',''DB_DATAREADER'','''',''dbo'',0) +,(''ROLE'',''GRANT'',''DB_DATAWRITER'','''',''dbo'',0) +,(''ROLE'',''GRANT'',''DB_OWNER'','''',''dbo'',1) + + +/* GET ALL USERS ON THIS ROLE */ +INSERT INTO #UsersOnRole +SELECT + members.name +FROM sys.database_role_members + JOIN sys.database_principals roles ON database_role_members.role_principal_id = roles.principal_id + JOIN sys.database_principals members ON database_role_members.member_principal_id = members.principal_id +WHERE roles.name = @RoleName + +/* CREATE ROLE */ +SELECT @Command = '' +IF NOT EXISTS (SELECT 1 FROM sys.database_principals WHERE name = '''''' + @RoleName + '''''' AND type = ''''R'''') +BEGIN + CREATE ROLE ['' + @RoleName + ''] AUTHORIZATION [dbo] + PRINT ''''CREATE ROLE ['' + @RoleName + '']'''' +END +'' +EXEC sp_executesql @Command + +SET @Command = '' +DECLARE @SP_Name varchar(255) + +'' + +/* SET ALL ROLE SECURABLES */ +IF @Type = ''DEVE'' +BEGIN + + DECLARE SecurablesCurs CURSOR FOR + SELECT typeofobject, grantordeny, rightsaction, objectname, schemaid + FROM #Securables + WHERE N2 = 1 + + OPEN SecurablesCurs + FETCH NEXT FROM SecurablesCurs INTO @typeofobject, @grantordeny, @rightsaction, @objectname, @schemaid + WHILE @@FETCH_STATUS = 0 + BEGIN + + IF @typeofobject = ''DB'' + BEGIN + IF EXISTS(SELECT 1 FROM sys.fn_builtin_permissions(''DATABASE'') WHERE permission_name = '''' + @rightsaction + '''') + BEGIN + SET @Command = @Command + @grantordeny + '' '' + @rightsaction + '' TO ['' + @RoleName + ''] +'' + END + END + + IF @typeofobject = ''SCHEMA'' + BEGIN + SET @Command = @Command + '' +IF EXISTS (SELECT 1 FROM sys.schemas WHERE name = '''''' + @schemaid + '''''') +BEGIN + IF EXISTS(SELECT 1 FROM sys.fn_builtin_permissions(''''SCHEMA'''') WHERE permission_name = '''''' + @rightsaction + '''''') + BEGIN + '' + @grantordeny + '' '' + @rightsaction + '' ON SCHEMA::'' + @schemaid + '' TO ['' + @RoleName + ''] + END +END + +'' + END + + IF @typeofobject in(''TABLE'',''SP'',''FUNCTIONS'',''VIEWS'') + BEGIN + + IF @objectname like ''%[%]%'' + BEGIN + IF @typeofobject = ''TABLE'' + BEGIN + SET @sysTarget = ''sys.tables'' + SET @sysType = '''' + END + + IF @typeofobject = ''SP'' + BEGIN + SET @sysTarget = ''sys.procedures'' + SET @sysType = '''' + END + + IF @typeofobject = ''FUNCTIONS'' + BEGIN + SET @sysTarget = ''sys.objects'' + SET @sysType = '' and p.Type IN ( N''''FN'''', N''''IF'''', N''''TF'''', N''''FS'''', N''''FT'''' )'' + END + + IF @typeofobject = ''VIEWS'' + BEGIN + SET @sysTarget = ''sys.views'' + SET @sysType = '''' + END + + SET @Command = @Command + '' +DECLARE SP_cursor CURSOR FOR +SELECT p.name FROM '' + @sysTarget + '' p JOIN sys.schemas s ON s.schema_id = p.schema_id WHERE (p.name like '''''' + @objectname + '''''') and s.name = '''''' + @schemaid + '''' + @sysType + '''''' + +OPEN SP_cursor +FETCH NEXT FROM SP_cursor INTO @SP_Name +WHILE @@FETCH_STATUS = 0 +BEGIN + IF EXISTS(SELECT 1 FROM sys.fn_builtin_permissions(''''OBJECT'''') WHERE permission_name = '''''' + @rightsaction + '''''') + BEGIN + EXEC('''''' + @grantordeny + '' '' + @rightsaction + '' ON ['' + @schemaid + ''].['''' + @SP_Name + ''''] TO ['' + @RoleName + '']'''') + END + FETCH NEXT FROM SP_cursor INTO @SP_Name +END + +CLOSE SP_cursor +DEALLOCATE SP_cursor + +'' + + END + ELSE + BEGIN + + SET @Command = @Command + '' +IF EXISTS(SELECT 1 FROM sys.objects o WITH (NOLOCK) JOIN sys.schemas s ON s.schema_id = o.schema_id WHERE o.name = '''''' + @objectname + '''''' AND o.type IN (N''''U'''',''''P'''',''''V'''',''''FN'''',''''IF'''',''''TF'''') AND s.name = '''''' + @schemaid + '''''') +BEGIN + IF EXISTS(SELECT 1 FROM sys.fn_builtin_permissions(''''OBJECT'''') WHERE permission_name = '''''' + @rightsaction + '''''') + BEGIN + '' + @grantordeny + '' '' + @rightsaction + '' ON ['' + @schemaid + ''].['' + @objectname + ''] TO ['' + @RoleName + ''] + END +END + +'' + END + END + + IF @typeofobject = ''ASSEMBLIES'' + BEGIN + SET @Command = @Command + '' +IF EXISTS(SELECT 1 FROM sys.assemblies WHERE NAME = '''''' + @objectname + '''''') +BEGIN + IF EXISTS(SELECT 1 FROM sys.fn_builtin_permissions(''''ASSEMBLY'''') WHERE permission_name = '''''' + @rightsaction + '''''') + BEGIN + '' + @grantordeny + '' '' + @rightsaction + ''::['' + @objectname + ''] TO ['' + @RoleName + ''] + END +END + +'' + END + + IF @typeofobject = ''ROLE'' + BEGIN + SET @Command = @Command + '' +IF NOT EXISTS (SELECT 1 FROM sys.database_role_members JOIN sys.database_principals roles ON database_role_members.role_principal_id = roles.principal_id JOIN sys.database_principals members ON database_role_members.member_principal_id = members.principal_id WHERE roles.name = '''''' + @rightsaction + '''''' AND members.name = '''''' + @RoleName + '''''') +BEGIN + EXEC sp_addrolemember N'''''' + @rightsaction + '''''', N'''''' + @RoleName + '''''' +END + +'' + END + + FETCH NEXT FROM SecurablesCurs INTO @typeofobject, @grantordeny, @rightsaction, @objectname, @schemaid + END + +CLOSE SecurablesCurs +DEALLOCATE SecurablesCurs + +PRINT ''SET ALL SECURABLES ON ROLE ['' + @RoleName + '']'' +EXEC sp_executesql @Command + +END +ELSE +BEGIN + + DECLARE SecurablesCurs CURSOR FOR + SELECT typeofobject, grantordeny, rightsaction, objectname, schemaid + FROM #Securables + WHERE N2 = 0 + + OPEN SecurablesCurs + FETCH NEXT FROM SecurablesCurs INTO @typeofobject, @grantordeny, @rightsaction, @objectname, @schemaid + WHILE @@FETCH_STATUS = 0 + BEGIN + + IF @typeofobject = ''DB'' + BEGIN + IF EXISTS(SELECT 1 FROM sys.fn_builtin_permissions(''DATABASE'') WHERE permission_name = '''' + @rightsaction + '''') + BEGIN + SET @Command = @Command + @grantordeny + '' '' + @rightsaction + '' TO ['' + @RoleName + ''] +'' + END + END + + IF @typeofobject = ''SCHEMA'' + BEGIN + SET @Command = @Command + '' +IF EXISTS (SELECT 1 FROM sys.schemas WHERE name = '''''' + @schemaid + '''''') +BEGIN + IF EXISTS(SELECT 1 FROM sys.fn_builtin_permissions(''''SCHEMA'''') WHERE permission_name = '''''' + @rightsaction + '''''') + BEGIN + '' + @grantordeny + '' '' + @rightsaction + '' ON SCHEMA::'' + @schemaid + '' TO ['' + @RoleName + ''] + END +END + +'' + END + + IF @typeofobject in(''TABLE'',''SP'',''FUNCTIONS'',''VIEWS'') + BEGIN + + IF @objectname like ''%[%]%'' + BEGIN + + IF @typeofobject = ''TABLE'' + BEGIN + SET @sysTarget = ''sys.tables'' + SET @sysType = '''' + END + + IF @typeofobject = ''SP'' + BEGIN + SET @sysTarget = ''sys.procedures'' + SET @sysType = '''' + END + + IF @typeofobject = ''FUNCTIONS'' + BEGIN + SET @sysTarget = ''sys.objects'' + SET @sysType = '' and p.Type IN ( N''''FN'''', N''''IF'''', N''''TF'''', N''''FS'''', N''''FT'''' )'' + END + + IF @typeofobject = ''VIEWS'' + BEGIN + SET @sysTarget = ''sys.views'' + SET @sysType = '''' + END + + SET @Command = @Command + '' +DECLARE SP_cursor CURSOR FOR +SELECT p.name FROM '' + @sysTarget + '' p JOIN sys.schemas s ON s.schema_id = p.schema_id WHERE (p.name like '''''' + @objectname + '''''') and s.name = '''''' + @schemaid + '''' + @sysType + '''''' + +OPEN SP_cursor +FETCH NEXT FROM SP_cursor INTO @SP_Name +WHILE @@FETCH_STATUS = 0 +BEGIN + IF EXISTS(SELECT 1 FROM sys.fn_builtin_permissions(''''OBJECT'''') WHERE permission_name = '''''' + @rightsaction + '''''') + BEGIN + EXEC('''''' + @grantordeny + '' '' + @rightsaction + '' ON ['' + @schemaid + ''].['''' + @SP_Name + ''''] TO ['' + @RoleName + '']'''') + END + FETCH NEXT FROM SP_cursor INTO @SP_Name +END + +CLOSE SP_cursor +DEALLOCATE SP_cursor + +'' + + END + ELSE + BEGIN + + SET @Command = @Command + '' +IF EXISTS(SELECT 1 FROM sys.objects o WITH (NOLOCK) JOIN sys.schemas s ON s.schema_id = o.schema_id WHERE o.name = '''''' + @objectname + '''''' AND o.type IN (N''''U'''',''''P'''',''''V'''',''''FN'''',''''IF'''',''''TF'''') AND s.name = '''''' + @schemaid + '''''') +BEGIN + IF EXISTS(SELECT 1 FROM sys.fn_builtin_permissions(''''OBJECT'''') WHERE permission_name = '''''' + @rightsaction + '''''') + BEGIN + '' + @grantordeny + '' '' + @rightsaction + '' ON ['' + @schemaid + ''].['' + @objectname + ''] TO ['' + @RoleName + ''] + END +END + +'' + END + END + + IF @typeofobject = ''ASSEMBLIES'' + BEGIN + SET @Command = @Command + '' +IF EXISTS(SELECT 1 FROM sys.assemblies WHERE NAME = '''''' + @objectname + '''''') +BEGIN + IF EXISTS(SELECT 1 FROM sys.fn_builtin_permissions(''''ASSEMBLY'''') WHERE permission_name = '''''' + @rightsaction + '''''') + BEGIN + '' + @grantordeny + '' '' + @rightsaction + ''::['' + @objectname + ''] TO ['' + @RoleName + ''] + END +END + +'' + END + + IF @typeofobject = ''ROLE'' + BEGIN + SET @Command = @Command + '' +IF NOT EXISTS (SELECT 1 FROM sys.database_role_members JOIN sys.database_principals roles ON database_role_members.role_principal_id = roles.principal_id JOIN sys.database_principals members ON database_role_members.member_principal_id = members.principal_id WHERE roles.name = '''''' + @rightsaction + '''''' AND members.name = '''''' + @RoleName + '''''') +BEGIN + EXEC sp_addrolemember N'''''' + @rightsaction + '''''', N'''''' + @RoleName + '''''' +END + +'' + END + + FETCH NEXT FROM SecurablesCurs INTO @typeofobject, @grantordeny, @rightsaction, @objectname, @schemaid + END + +CLOSE SecurablesCurs +DEALLOCATE SecurablesCurs + +PRINT ''SET ALL SECURABLES ON ROLE ['' + @RoleName + '']'' +EXEC sp_executesql @Command + +END + +/* ADD USER */ +DECLARE UsersCurs CURSOR FOR +SELECT username + FROM #UsersOnRole + +OPEN UsersCurs + +FETCH NEXT FROM UsersCurs INTO @Users +WHILE @@FETCH_STATUS = 0 +BEGIN + + SELECT @Command = '' +EXEC sp_addrolemember N'''''' + @RoleName + '''''', N'''''' + @Users + '''''' +PRINT ''''ADD USER ['' + @Users + ''] ON ROLE ['' + @RoleName + '']'''' +'' + +FETCH NEXT FROM UsersCurs INTO @Users +END + +CLOSE UsersCurs +DEALLOCATE UsersCurs + +EXEC sp_executesql @Command + +/*============================================================================= + Drop temp tables +=============================================================================*/ +DROP TABLE #Securables +DROP TABLE #UsersOnRole','ActiveSystemClient','Pharmacies') + +INSERT INTO #AllRoles(STR_Definition,STR_Database,STR_Product)VALUES(' + +/*============================================================================= + + Script to create dbRoleDevUsr role. + + Role Name: dbRoleDevUsr + TEMPLATE: Default + + EXAMPLE OF SECURABLES TO SET: + + INSERT INTO #Securables + VALUES + (''DB'',''GRANT'',''VIEW DEFINITION'','''',''''), + (''SCHEMA'',''GRANT'',''SELECT,EXECUTE,INSERT,UPDATE,DELETE'','''',''AP''), + (''TABLE'',''GRANT'',''INSERT,UPDATE'',''Address'',''dbo''), + (''SP'',''GRANT'',''EXECUTE'',''sp_bmc_GetNextID'',''dbo''), + (''ROLE'',''GRANT'',''db_datareader'','''','''') + + ----------------------------------------------- + +Generate date : 2023-05-12 / up208700 + +=============================================================================*/ + +DECLARE @Command nvarchar(max), + @RoleName varchar(60), + @Users varchar(255), + @typeofobject varchar(50), + @grantordeny varchar(10), + @rightsaction varchar(255), + @objectname varchar(255), + @schemaid varchar(10), + @sysTarget varchar(255), + @sysType varchar(255) + +SET @RoleName = ''dbRoleDevUsr'' +SET @Command = '''' + +/* TEMP TABLES */ +CREATE TABLE #UsersOnRole(username varchar(255)) +CREATE TABLE #Securables(typeofobject varchar(50), grantordeny varchar(10), rightsaction varchar(255), objectname varchar(255), schemaid varchar(10),N2 bit) + +/* !!! LIST OF SECURABLES TO CHANGE !!! */ + +INSERT INTO #Securables +VALUES +(''DB'',''GRANT'',''EXECUTE'','''',''dbo'',0) +,(''DB'',''GRANT'',''SHOWPLAN'','''',''dbo'',0) +,(''DB'',''GRANT'',''VIEW DEFINITION'','''',''dbo'',0) +,(''ROLE'',''GRANT'',''DB_DATAREADER'','''',''dbo'',0) +,(''ROLE'',''GRANT'',''DB_DATAWRITER'','''',''dbo'',0) + + +/* GET ALL USERS ON THIS ROLE */ +INSERT INTO #UsersOnRole +SELECT + members.name +FROM sys.database_role_members + JOIN sys.database_principals roles ON database_role_members.role_principal_id = roles.principal_id + JOIN sys.database_principals members ON database_role_members.member_principal_id = members.principal_id +WHERE roles.name = @RoleName + +/* CREATE ROLE */ +SELECT @Command = '' +IF NOT EXISTS (SELECT 1 FROM sys.database_principals WHERE name = '''''' + @RoleName + '''''' AND type = ''''R'''') +BEGIN + CREATE ROLE ['' + @RoleName + ''] AUTHORIZATION [dbo] + PRINT ''''CREATE ROLE ['' + @RoleName + '']'''' +END +'' +EXEC sp_executesql @Command + +SET @Command = '' +DECLARE @SP_Name varchar(255) + +'' + +/* SET ALL ROLE SECURABLES */ +DECLARE SecurablesCurs CURSOR FOR +SELECT typeofobject, grantordeny, rightsaction, objectname, schemaid +FROM #Securables +WHERE N2 = 0 + +OPEN SecurablesCurs +FETCH NEXT FROM SecurablesCurs INTO @typeofobject, @grantordeny, @rightsaction, @objectname, @schemaid +WHILE @@FETCH_STATUS = 0 +BEGIN + + IF @typeofobject = ''DB'' + BEGIN + IF EXISTS(SELECT 1 FROM sys.fn_builtin_permissions(''DATABASE'') WHERE permission_name = '''' + @rightsaction + '''') + BEGIN + SET @Command = @Command + @grantordeny + '' '' + @rightsaction + '' TO ['' + @RoleName + ''] +'' + END + END + + IF @typeofobject = ''SCHEMA'' + BEGIN + SET @Command = @Command + '' +IF EXISTS (SELECT 1 FROM sys.schemas WHERE name = '''''' + @schemaid + '''''') +BEGIN + IF EXISTS(SELECT 1 FROM sys.fn_builtin_permissions(''''SCHEMA'''') WHERE permission_name = '''''' + @rightsaction + '''''') + BEGIN + '' + @grantordeny + '' '' + @rightsaction + '' ON SCHEMA::'' + @schemaid + '' TO ['' + @RoleName + ''] + END +END + +'' + END + + IF @typeofobject in(''TABLE'',''SP'',''FUNCTIONS'',''VIEWS'') + BEGIN + + IF @objectname like ''%[%]%'' + BEGIN + + IF @typeofobject = ''TABLE'' + BEGIN + SET @sysTarget = ''sys.tables'' + SET @sysType = '''' + END + + IF @typeofobject = ''SP'' + BEGIN + SET @sysTarget = ''sys.procedures'' + SET @sysType = '''' + END + + IF @typeofobject = ''FUNCTIONS'' + BEGIN + SET @sysTarget = ''sys.objects'' + SET @sysType = '' and p.Type IN ( N''''FN'''', N''''IF'''', N''''TF'''', N''''FS'''', N''''FT'''' )'' + END + + IF @typeofobject = ''VIEWS'' + BEGIN + SET @sysTarget = ''sys.views'' + SET @sysType = '''' + END + + SET @Command = @Command + '' +DECLARE SP_cursor CURSOR FOR +SELECT p.name FROM '' + @sysTarget + '' p JOIN sys.schemas s ON s.schema_id = p.schema_id WHERE (p.name like '''''' + @objectname + '''''') and s.name = '''''' + @schemaid + '''' + @sysType + '''''' + +OPEN SP_cursor +FETCH NEXT FROM SP_cursor INTO @SP_Name +WHILE @@FETCH_STATUS = 0 +BEGIN + IF EXISTS(SELECT 1 FROM sys.fn_builtin_permissions(''''OBJECT'''') WHERE permission_name = '''''' + @rightsaction + '''''') + BEGIN + EXEC('''''' + @grantordeny + '' '' + @rightsaction + '' ON ['' + @schemaid + ''].['''' + @SP_Name + ''''] TO ['' + @RoleName + '']'''') + END + FETCH NEXT FROM SP_cursor INTO @SP_Name +END + +CLOSE SP_cursor +DEALLOCATE SP_cursor + +'' + + END + ELSE + BEGIN + + SET @Command = @Command + '' +IF EXISTS(SELECT 1 FROM sys.objects o WITH (NOLOCK) JOIN sys.schemas s ON s.schema_id = o.schema_id WHERE o.name = '''''' + @objectname + '''''' AND o.type IN (N''''U'''',''''P'''',''''V'''',''''FN'''',''''IF'''',''''TF'''') AND s.name = '''''' + @schemaid + '''''') +BEGIN + IF EXISTS(SELECT 1 FROM sys.fn_builtin_permissions(''''OBJECT'''') WHERE permission_name = '''''' + @rightsaction + '''''') + BEGIN + '' + @grantordeny + '' '' + @rightsaction + '' ON ['' + @schemaid + ''].['' + @objectname + ''] TO ['' + @RoleName + ''] + END +END + +'' + END +END + +IF @typeofobject = ''ASSEMBLIES'' +BEGIN + SET @Command = @Command + '' +IF EXISTS(SELECT 1 FROM sys.assemblies WHERE NAME = '''''' + @objectname + '''''') +BEGIN + IF EXISTS(SELECT 1 FROM sys.fn_builtin_permissions(''''ASSEMBLY'''') WHERE permission_name = '''''' + @rightsaction + '''''') + BEGIN + '' + @grantordeny + '' '' + @rightsaction + ''::['' + @objectname + ''] TO ['' + @RoleName + ''] + END +END + +'' +END + +IF @typeofobject = ''ROLE'' +BEGIN + SET @Command = @Command + '' +IF NOT EXISTS (SELECT 1 FROM sys.database_role_members JOIN sys.database_principals roles ON database_role_members.role_principal_id = roles.principal_id JOIN sys.database_principals members ON database_role_members.member_principal_id = members.principal_id WHERE roles.name = '''''' + @rightsaction + '''''' AND members.name = '''''' + @RoleName + '''''') +BEGIN + EXEC sp_addrolemember N'''''' + @rightsaction + '''''', N'''''' + @RoleName + '''''' +END + +'' +END + +FETCH NEXT FROM SecurablesCurs INTO @typeofobject, @grantordeny, @rightsaction, @objectname, @schemaid +END + +CLOSE SecurablesCurs +DEALLOCATE SecurablesCurs + +PRINT ''SET ALL SECURABLES ON ROLE ['' + @RoleName + '']'' +EXEC sp_executesql @Command + +/* ADD USER */ +DECLARE UsersCurs CURSOR FOR +SELECT username + FROM #UsersOnRole + +OPEN UsersCurs + +FETCH NEXT FROM UsersCurs INTO @Users +WHILE @@FETCH_STATUS = 0 +BEGIN + + SELECT @Command = '' +EXEC sp_addrolemember N'''''' + @RoleName + '''''', N'''''' + @Users + '''''' +PRINT ''''ADD USER ['' + @Users + ''] ON ROLE ['' + @RoleName + '']'''' +'' + +FETCH NEXT FROM UsersCurs INTO @Users +END + +CLOSE UsersCurs +DEALLOCATE UsersCurs + +EXEC sp_executesql @Command + + +/*============================================================================= + Drop temp tables +=============================================================================*/ +DROP TABLE #Securables +DROP TABLE #UsersOnRole +','ActiveSystemClient','Pharmacies') + +INSERT INTO #AllRoles(STR_Definition,STR_Database,STR_Product)VALUES(' + +/*============================================================================= + + Script to create dbRoleIttechUsr role. + + Role Name: dbRoleIttechUsr + TEMPLATE: N2 and PROD + + EXAMPLE OF SECURABLES TO SET: + + INSERT INTO #Securables + VALUES + (''DB'',''GRANT'',''VIEW DEFINITION'','''',''''), + (''SCHEMA'',''GRANT'',''SELECT,EXECUTE,INSERT,UPDATE,DELETE'','''',''AP''), + (''TABLE'',''GRANT'',''INSERT,UPDATE'',''Address'',''dbo''), + (''SP'',''GRANT'',''EXECUTE'',''sp_bmc_GetNextID'',''dbo''), + (''ROLE'',''GRANT'',''db_datareader'','''','''') + + ----------------------------------------------- + +Generate date : 2023-05-12 / up208700 + +=============================================================================*/ + +DECLARE @Type varchar(6), + @Command nvarchar(max), + @RoleName varchar(60), + @Users varchar(255), + @typeofobject varchar(50), + @grantordeny varchar(10), + @rightsaction varchar(255), + @objectname varchar(255), + @schemaid varchar(10), + @sysTarget varchar(255), + @sysType varchar(255) + +SET @RoleName = ''dbRoleIttechUsr'' +SET @Command = '''' + +SELECT @Type = [Type] FROM [master].[cfg].[InstanceContext] + +/* TEMP TABLES */ +CREATE TABLE #UsersOnRole(username varchar(255)) +CREATE TABLE #Securables(typeofobject varchar(50), grantordeny varchar(10), rightsaction varchar(255), objectname varchar(255), schemaid varchar(10),N2 bit) + +/* !!! LIST OF SECURABLES TO CHANGE !!! */ + +INSERT INTO #Securables +VALUES +(''DB'',''GRANT'',''EXECUTE'','''',''dbo'',0) +,(''ROLE'',''GRANT'',''DB_DATAREADER'','''',''dbo'',0) +,(''ROLE'',''GRANT'',''DB_DATAWRITER'','''',''dbo'',0) +,(''ROLE'',''GRANT'',''DB_OWNER'','''',''dbo'',1) + + +/* GET ALL USERS ON THIS ROLE */ +INSERT INTO #UsersOnRole +SELECT + members.name +FROM sys.database_role_members + JOIN sys.database_principals roles ON database_role_members.role_principal_id = roles.principal_id + JOIN sys.database_principals members ON database_role_members.member_principal_id = members.principal_id +WHERE roles.name = @RoleName + +/* CREATE ROLE */ +SELECT @Command = '' +IF NOT EXISTS (SELECT 1 FROM sys.database_principals WHERE name = '''''' + @RoleName + '''''' AND type = ''''R'''') +BEGIN + CREATE ROLE ['' + @RoleName + ''] AUTHORIZATION [dbo] + PRINT ''''CREATE ROLE ['' + @RoleName + '']'''' +END +'' +EXEC sp_executesql @Command + +SET @Command = '' +DECLARE @SP_Name varchar(255) + +'' + +/* SET ALL ROLE SECURABLES */ +IF @Type = ''DEVE'' +BEGIN + + DECLARE SecurablesCurs CURSOR FOR + SELECT typeofobject, grantordeny, rightsaction, objectname, schemaid + FROM #Securables + WHERE N2 = 1 + + OPEN SecurablesCurs + FETCH NEXT FROM SecurablesCurs INTO @typeofobject, @grantordeny, @rightsaction, @objectname, @schemaid + WHILE @@FETCH_STATUS = 0 + BEGIN + + IF @typeofobject = ''DB'' + BEGIN + IF EXISTS(SELECT 1 FROM sys.fn_builtin_permissions(''DATABASE'') WHERE permission_name = '''' + @rightsaction + '''') + BEGIN + SET @Command = @Command + @grantordeny + '' '' + @rightsaction + '' TO ['' + @RoleName + ''] +'' + END + END + + IF @typeofobject = ''SCHEMA'' + BEGIN + SET @Command = @Command + '' +IF EXISTS (SELECT 1 FROM sys.schemas WHERE name = '''''' + @schemaid + '''''') +BEGIN + IF EXISTS(SELECT 1 FROM sys.fn_builtin_permissions(''''SCHEMA'''') WHERE permission_name = '''''' + @rightsaction + '''''') + BEGIN + '' + @grantordeny + '' '' + @rightsaction + '' ON SCHEMA::'' + @schemaid + '' TO ['' + @RoleName + ''] + END +END + +'' + END + + IF @typeofobject in(''TABLE'',''SP'',''FUNCTIONS'',''VIEWS'') + BEGIN + + IF @objectname like ''%[%]%'' + BEGIN + IF @typeofobject = ''TABLE'' + BEGIN + SET @sysTarget = ''sys.tables'' + SET @sysType = '''' + END + + IF @typeofobject = ''SP'' + BEGIN + SET @sysTarget = ''sys.procedures'' + SET @sysType = '''' + END + + IF @typeofobject = ''FUNCTIONS'' + BEGIN + SET @sysTarget = ''sys.objects'' + SET @sysType = '' and p.Type IN ( N''''FN'''', N''''IF'''', N''''TF'''', N''''FS'''', N''''FT'''' )'' + END + + IF @typeofobject = ''VIEWS'' + BEGIN + SET @sysTarget = ''sys.views'' + SET @sysType = '''' + END + + SET @Command = @Command + '' +DECLARE SP_cursor CURSOR FOR +SELECT p.name FROM '' + @sysTarget + '' p JOIN sys.schemas s ON s.schema_id = p.schema_id WHERE (p.name like '''''' + @objectname + '''''') and s.name = '''''' + @schemaid + '''' + @sysType + '''''' + +OPEN SP_cursor +FETCH NEXT FROM SP_cursor INTO @SP_Name +WHILE @@FETCH_STATUS = 0 +BEGIN + IF EXISTS(SELECT 1 FROM sys.fn_builtin_permissions(''''OBJECT'''') WHERE permission_name = '''''' + @rightsaction + '''''') + BEGIN + EXEC('''''' + @grantordeny + '' '' + @rightsaction + '' ON ['' + @schemaid + ''].['''' + @SP_Name + ''''] TO ['' + @RoleName + '']'''') + END + FETCH NEXT FROM SP_cursor INTO @SP_Name +END + +CLOSE SP_cursor +DEALLOCATE SP_cursor + +'' + + END + ELSE + BEGIN + + SET @Command = @Command + '' +IF EXISTS(SELECT 1 FROM sys.objects o WITH (NOLOCK) JOIN sys.schemas s ON s.schema_id = o.schema_id WHERE o.name = '''''' + @objectname + '''''' AND o.type IN (N''''U'''',''''P'''',''''V'''',''''FN'''',''''IF'''',''''TF'''') AND s.name = '''''' + @schemaid + '''''') +BEGIN + IF EXISTS(SELECT 1 FROM sys.fn_builtin_permissions(''''OBJECT'''') WHERE permission_name = '''''' + @rightsaction + '''''') + BEGIN + '' + @grantordeny + '' '' + @rightsaction + '' ON ['' + @schemaid + ''].['' + @objectname + ''] TO ['' + @RoleName + ''] + END +END + +'' + END + END + + IF @typeofobject = ''ASSEMBLIES'' + BEGIN + SET @Command = @Command + '' +IF EXISTS(SELECT 1 FROM sys.assemblies WHERE NAME = '''''' + @objectname + '''''') +BEGIN + IF EXISTS(SELECT 1 FROM sys.fn_builtin_permissions(''''ASSEMBLY'''') WHERE permission_name = '''''' + @rightsaction + '''''') + BEGIN + '' + @grantordeny + '' '' + @rightsaction + ''::['' + @objectname + ''] TO ['' + @RoleName + ''] + END +END + +'' + END + + IF @typeofobject = ''ROLE'' + BEGIN + SET @Command = @Command + '' +IF NOT EXISTS (SELECT 1 FROM sys.database_role_members JOIN sys.database_principals roles ON database_role_members.role_principal_id = roles.principal_id JOIN sys.database_principals members ON database_role_members.member_principal_id = members.principal_id WHERE roles.name = '''''' + @rightsaction + '''''' AND members.name = '''''' + @RoleName + '''''') +BEGIN + EXEC sp_addrolemember N'''''' + @rightsaction + '''''', N'''''' + @RoleName + '''''' +END + +'' + END + + FETCH NEXT FROM SecurablesCurs INTO @typeofobject, @grantordeny, @rightsaction, @objectname, @schemaid + END + +CLOSE SecurablesCurs +DEALLOCATE SecurablesCurs + +PRINT ''SET ALL SECURABLES ON ROLE ['' + @RoleName + '']'' +EXEC sp_executesql @Command + +END +ELSE +BEGIN + + DECLARE SecurablesCurs CURSOR FOR + SELECT typeofobject, grantordeny, rightsaction, objectname, schemaid + FROM #Securables + WHERE N2 = 0 + + OPEN SecurablesCurs + FETCH NEXT FROM SecurablesCurs INTO @typeofobject, @grantordeny, @rightsaction, @objectname, @schemaid + WHILE @@FETCH_STATUS = 0 + BEGIN + + IF @typeofobject = ''DB'' + BEGIN + IF EXISTS(SELECT 1 FROM sys.fn_builtin_permissions(''DATABASE'') WHERE permission_name = '''' + @rightsaction + '''') + BEGIN + SET @Command = @Command + @grantordeny + '' '' + @rightsaction + '' TO ['' + @RoleName + ''] +'' + END + END + + IF @typeofobject = ''SCHEMA'' + BEGIN + SET @Command = @Command + '' +IF EXISTS (SELECT 1 FROM sys.schemas WHERE name = '''''' + @schemaid + '''''') +BEGIN + IF EXISTS(SELECT 1 FROM sys.fn_builtin_permissions(''''SCHEMA'''') WHERE permission_name = '''''' + @rightsaction + '''''') + BEGIN + '' + @grantordeny + '' '' + @rightsaction + '' ON SCHEMA::'' + @schemaid + '' TO ['' + @RoleName + ''] + END +END + +'' + END + + IF @typeofobject in(''TABLE'',''SP'',''FUNCTIONS'',''VIEWS'') + BEGIN + + IF @objectname like ''%[%]%'' + BEGIN + + IF @typeofobject = ''TABLE'' + BEGIN + SET @sysTarget = ''sys.tables'' + SET @sysType = '''' + END + + IF @typeofobject = ''SP'' + BEGIN + SET @sysTarget = ''sys.procedures'' + SET @sysType = '''' + END + + IF @typeofobject = ''FUNCTIONS'' + BEGIN + SET @sysTarget = ''sys.objects'' + SET @sysType = '' and p.Type IN ( N''''FN'''', N''''IF'''', N''''TF'''', N''''FS'''', N''''FT'''' )'' + END + + IF @typeofobject = ''VIEWS'' + BEGIN + SET @sysTarget = ''sys.views'' + SET @sysType = '''' + END + + SET @Command = @Command + '' +DECLARE SP_cursor CURSOR FOR +SELECT p.name FROM '' + @sysTarget + '' p JOIN sys.schemas s ON s.schema_id = p.schema_id WHERE (p.name like '''''' + @objectname + '''''') and s.name = '''''' + @schemaid + '''' + @sysType + '''''' + +OPEN SP_cursor +FETCH NEXT FROM SP_cursor INTO @SP_Name +WHILE @@FETCH_STATUS = 0 +BEGIN + IF EXISTS(SELECT 1 FROM sys.fn_builtin_permissions(''''OBJECT'''') WHERE permission_name = '''''' + @rightsaction + '''''') + BEGIN + EXEC('''''' + @grantordeny + '' '' + @rightsaction + '' ON ['' + @schemaid + ''].['''' + @SP_Name + ''''] TO ['' + @RoleName + '']'''') + END + FETCH NEXT FROM SP_cursor INTO @SP_Name +END + +CLOSE SP_cursor +DEALLOCATE SP_cursor + +'' + + END + ELSE + BEGIN + + SET @Command = @Command + '' +IF EXISTS(SELECT 1 FROM sys.objects o WITH (NOLOCK) JOIN sys.schemas s ON s.schema_id = o.schema_id WHERE o.name = '''''' + @objectname + '''''' AND o.type IN (N''''U'''',''''P'''',''''V'''',''''FN'''',''''IF'''',''''TF'''') AND s.name = '''''' + @schemaid + '''''') +BEGIN + IF EXISTS(SELECT 1 FROM sys.fn_builtin_permissions(''''OBJECT'''') WHERE permission_name = '''''' + @rightsaction + '''''') + BEGIN + '' + @grantordeny + '' '' + @rightsaction + '' ON ['' + @schemaid + ''].['' + @objectname + ''] TO ['' + @RoleName + ''] + END +END + +'' + END + END + + IF @typeofobject = ''ASSEMBLIES'' + BEGIN + SET @Command = @Command + '' +IF EXISTS(SELECT 1 FROM sys.assemblies WHERE NAME = '''''' + @objectname + '''''') +BEGIN + IF EXISTS(SELECT 1 FROM sys.fn_builtin_permissions(''''ASSEMBLY'''') WHERE permission_name = '''''' + @rightsaction + '''''') + BEGIN + '' + @grantordeny + '' '' + @rightsaction + ''::['' + @objectname + ''] TO ['' + @RoleName + ''] + END +END + +'' + END + + IF @typeofobject = ''ROLE'' + BEGIN + SET @Command = @Command + '' +IF NOT EXISTS (SELECT 1 FROM sys.database_role_members JOIN sys.database_principals roles ON database_role_members.role_principal_id = roles.principal_id JOIN sys.database_principals members ON database_role_members.member_principal_id = members.principal_id WHERE roles.name = '''''' + @rightsaction + '''''' AND members.name = '''''' + @RoleName + '''''') +BEGIN + EXEC sp_addrolemember N'''''' + @rightsaction + '''''', N'''''' + @RoleName + '''''' +END + +'' + END + + FETCH NEXT FROM SecurablesCurs INTO @typeofobject, @grantordeny, @rightsaction, @objectname, @schemaid + END + +CLOSE SecurablesCurs +DEALLOCATE SecurablesCurs + +PRINT ''SET ALL SECURABLES ON ROLE ['' + @RoleName + '']'' +EXEC sp_executesql @Command + +END + +/* ADD USER */ +DECLARE UsersCurs CURSOR FOR +SELECT username + FROM #UsersOnRole + +OPEN UsersCurs + +FETCH NEXT FROM UsersCurs INTO @Users +WHILE @@FETCH_STATUS = 0 +BEGIN + + SELECT @Command = '' +EXEC sp_addrolemember N'''''' + @RoleName + '''''', N'''''' + @Users + '''''' +PRINT ''''ADD USER ['' + @Users + ''] ON ROLE ['' + @RoleName + '']'''' +'' + +FETCH NEXT FROM UsersCurs INTO @Users +END + +CLOSE UsersCurs +DEALLOCATE UsersCurs + +EXEC sp_executesql @Command + +/*============================================================================= + Drop temp tables +=============================================================================*/ +DROP TABLE #Securables +DROP TABLE #UsersOnRole','ActiveSystemClient','Pharmacies') + +INSERT INTO #AllRoles(STR_Definition,STR_Database,STR_Product)VALUES(' + +/*============================================================================= + + Script to create dbRoleSupUsr role. + + Role Name: dbRoleSupUsr + TEMPLATE: N2 and PROD + + EXAMPLE OF SECURABLES TO SET: + + INSERT INTO #Securables + VALUES + (''DB'',''GRANT'',''VIEW DEFINITION'','''',''''), + (''SCHEMA'',''GRANT'',''SELECT,EXECUTE,INSERT,UPDATE,DELETE'','''',''AP''), + (''TABLE'',''GRANT'',''INSERT,UPDATE'',''Address'',''dbo''), + (''SP'',''GRANT'',''EXECUTE'',''sp_bmc_GetNextID'',''dbo''), + (''ROLE'',''GRANT'',''db_datareader'','''','''') + + ----------------------------------------------- + +Generate date : 2023-05-12 / up208700 + +=============================================================================*/ + +DECLARE @Type varchar(6), + @Command nvarchar(max), + @RoleName varchar(60), + @Users varchar(255), + @typeofobject varchar(50), + @grantordeny varchar(10), + @rightsaction varchar(255), + @objectname varchar(255), + @schemaid varchar(10), + @sysTarget varchar(255), + @sysType varchar(255) + +SET @RoleName = ''dbRoleSupUsr'' +SET @Command = '''' + +SELECT @Type = [Type] FROM [master].[cfg].[InstanceContext] + +/* TEMP TABLES */ +CREATE TABLE #UsersOnRole(username varchar(255)) +CREATE TABLE #Securables(typeofobject varchar(50), grantordeny varchar(10), rightsaction varchar(255), objectname varchar(255), schemaid varchar(10),N2 bit) + +/* !!! LIST OF SECURABLES TO CHANGE !!! */ + +INSERT INTO #Securables +VALUES +(''DB'',''GRANT'',''EXECUTE'','''',''dbo'',0) +,(''ROLE'',''GRANT'',''DB_DATAREADER'','''',''dbo'',0) +,(''ROLE'',''GRANT'',''DB_DATAWRITER'','''',''dbo'',0) +,(''ROLE'',''GRANT'',''DB_OWNER'','''',''dbo'',1) + + +/* GET ALL USERS ON THIS ROLE */ +INSERT INTO #UsersOnRole +SELECT + members.name +FROM sys.database_role_members + JOIN sys.database_principals roles ON database_role_members.role_principal_id = roles.principal_id + JOIN sys.database_principals members ON database_role_members.member_principal_id = members.principal_id +WHERE roles.name = @RoleName + +/* CREATE ROLE */ +SELECT @Command = '' +IF NOT EXISTS (SELECT 1 FROM sys.database_principals WHERE name = '''''' + @RoleName + '''''' AND type = ''''R'''') +BEGIN + CREATE ROLE ['' + @RoleName + ''] AUTHORIZATION [dbo] + PRINT ''''CREATE ROLE ['' + @RoleName + '']'''' +END +'' +EXEC sp_executesql @Command + +SET @Command = '' +DECLARE @SP_Name varchar(255) + +'' + +/* SET ALL ROLE SECURABLES */ +IF @Type = ''DEVE'' +BEGIN + + DECLARE SecurablesCurs CURSOR FOR + SELECT typeofobject, grantordeny, rightsaction, objectname, schemaid + FROM #Securables + WHERE N2 = 1 + + OPEN SecurablesCurs + FETCH NEXT FROM SecurablesCurs INTO @typeofobject, @grantordeny, @rightsaction, @objectname, @schemaid + WHILE @@FETCH_STATUS = 0 + BEGIN + + IF @typeofobject = ''DB'' + BEGIN + IF EXISTS(SELECT 1 FROM sys.fn_builtin_permissions(''DATABASE'') WHERE permission_name = '''' + @rightsaction + '''') + BEGIN + SET @Command = @Command + @grantordeny + '' '' + @rightsaction + '' TO ['' + @RoleName + ''] +'' + END + END + + IF @typeofobject = ''SCHEMA'' + BEGIN + SET @Command = @Command + '' +IF EXISTS (SELECT 1 FROM sys.schemas WHERE name = '''''' + @schemaid + '''''') +BEGIN + IF EXISTS(SELECT 1 FROM sys.fn_builtin_permissions(''''SCHEMA'''') WHERE permission_name = '''''' + @rightsaction + '''''') + BEGIN + '' + @grantordeny + '' '' + @rightsaction + '' ON SCHEMA::'' + @schemaid + '' TO ['' + @RoleName + ''] + END +END + +'' + END + + IF @typeofobject in(''TABLE'',''SP'',''FUNCTIONS'',''VIEWS'') + BEGIN + + IF @objectname like ''%[%]%'' + BEGIN + IF @typeofobject = ''TABLE'' + BEGIN + SET @sysTarget = ''sys.tables'' + SET @sysType = '''' + END + + IF @typeofobject = ''SP'' + BEGIN + SET @sysTarget = ''sys.procedures'' + SET @sysType = '''' + END + + IF @typeofobject = ''FUNCTIONS'' + BEGIN + SET @sysTarget = ''sys.objects'' + SET @sysType = '' and p.Type IN ( N''''FN'''', N''''IF'''', N''''TF'''', N''''FS'''', N''''FT'''' )'' + END + + IF @typeofobject = ''VIEWS'' + BEGIN + SET @sysTarget = ''sys.views'' + SET @sysType = '''' + END + + SET @Command = @Command + '' +DECLARE SP_cursor CURSOR FOR +SELECT p.name FROM '' + @sysTarget + '' p JOIN sys.schemas s ON s.schema_id = p.schema_id WHERE (p.name like '''''' + @objectname + '''''') and s.name = '''''' + @schemaid + '''' + @sysType + '''''' + +OPEN SP_cursor +FETCH NEXT FROM SP_cursor INTO @SP_Name +WHILE @@FETCH_STATUS = 0 +BEGIN + IF EXISTS(SELECT 1 FROM sys.fn_builtin_permissions(''''OBJECT'''') WHERE permission_name = '''''' + @rightsaction + '''''') + BEGIN + EXEC('''''' + @grantordeny + '' '' + @rightsaction + '' ON ['' + @schemaid + ''].['''' + @SP_Name + ''''] TO ['' + @RoleName + '']'''') + END + FETCH NEXT FROM SP_cursor INTO @SP_Name +END + +CLOSE SP_cursor +DEALLOCATE SP_cursor + +'' + + END + ELSE + BEGIN + + SET @Command = @Command + '' +IF EXISTS(SELECT 1 FROM sys.objects o WITH (NOLOCK) JOIN sys.schemas s ON s.schema_id = o.schema_id WHERE o.name = '''''' + @objectname + '''''' AND o.type IN (N''''U'''',''''P'''',''''V'''',''''FN'''',''''IF'''',''''TF'''') AND s.name = '''''' + @schemaid + '''''') +BEGIN + IF EXISTS(SELECT 1 FROM sys.fn_builtin_permissions(''''OBJECT'''') WHERE permission_name = '''''' + @rightsaction + '''''') + BEGIN + '' + @grantordeny + '' '' + @rightsaction + '' ON ['' + @schemaid + ''].['' + @objectname + ''] TO ['' + @RoleName + ''] + END +END + +'' + END + END + + IF @typeofobject = ''ASSEMBLIES'' + BEGIN + SET @Command = @Command + '' +IF EXISTS(SELECT 1 FROM sys.assemblies WHERE NAME = '''''' + @objectname + '''''') +BEGIN + IF EXISTS(SELECT 1 FROM sys.fn_builtin_permissions(''''ASSEMBLY'''') WHERE permission_name = '''''' + @rightsaction + '''''') + BEGIN + '' + @grantordeny + '' '' + @rightsaction + ''::['' + @objectname + ''] TO ['' + @RoleName + ''] + END +END + +'' + END + + IF @typeofobject = ''ROLE'' + BEGIN + SET @Command = @Command + '' +IF NOT EXISTS (SELECT 1 FROM sys.database_role_members JOIN sys.database_principals roles ON database_role_members.role_principal_id = roles.principal_id JOIN sys.database_principals members ON database_role_members.member_principal_id = members.principal_id WHERE roles.name = '''''' + @rightsaction + '''''' AND members.name = '''''' + @RoleName + '''''') +BEGIN + EXEC sp_addrolemember N'''''' + @rightsaction + '''''', N'''''' + @RoleName + '''''' +END + +'' + END + + FETCH NEXT FROM SecurablesCurs INTO @typeofobject, @grantordeny, @rightsaction, @objectname, @schemaid + END + +CLOSE SecurablesCurs +DEALLOCATE SecurablesCurs + +PRINT ''SET ALL SECURABLES ON ROLE ['' + @RoleName + '']'' +EXEC sp_executesql @Command + +END +ELSE +BEGIN + + DECLARE SecurablesCurs CURSOR FOR + SELECT typeofobject, grantordeny, rightsaction, objectname, schemaid + FROM #Securables + WHERE N2 = 0 + + OPEN SecurablesCurs + FETCH NEXT FROM SecurablesCurs INTO @typeofobject, @grantordeny, @rightsaction, @objectname, @schemaid + WHILE @@FETCH_STATUS = 0 + BEGIN + + IF @typeofobject = ''DB'' + BEGIN + IF EXISTS(SELECT 1 FROM sys.fn_builtin_permissions(''DATABASE'') WHERE permission_name = '''' + @rightsaction + '''') + BEGIN + SET @Command = @Command + @grantordeny + '' '' + @rightsaction + '' TO ['' + @RoleName + ''] +'' + END + END + + IF @typeofobject = ''SCHEMA'' + BEGIN + SET @Command = @Command + '' +IF EXISTS (SELECT 1 FROM sys.schemas WHERE name = '''''' + @schemaid + '''''') +BEGIN + IF EXISTS(SELECT 1 FROM sys.fn_builtin_permissions(''''SCHEMA'''') WHERE permission_name = '''''' + @rightsaction + '''''') + BEGIN + '' + @grantordeny + '' '' + @rightsaction + '' ON SCHEMA::'' + @schemaid + '' TO ['' + @RoleName + ''] + END +END + +'' + END + + IF @typeofobject in(''TABLE'',''SP'',''FUNCTIONS'',''VIEWS'') + BEGIN + + IF @objectname like ''%[%]%'' + BEGIN + + IF @typeofobject = ''TABLE'' + BEGIN + SET @sysTarget = ''sys.tables'' + SET @sysType = '''' + END + + IF @typeofobject = ''SP'' + BEGIN + SET @sysTarget = ''sys.procedures'' + SET @sysType = '''' + END + + IF @typeofobject = ''FUNCTIONS'' + BEGIN + SET @sysTarget = ''sys.objects'' + SET @sysType = '' and p.Type IN ( N''''FN'''', N''''IF'''', N''''TF'''', N''''FS'''', N''''FT'''' )'' + END + + IF @typeofobject = ''VIEWS'' + BEGIN + SET @sysTarget = ''sys.views'' + SET @sysType = '''' + END + + SET @Command = @Command + '' +DECLARE SP_cursor CURSOR FOR +SELECT p.name FROM '' + @sysTarget + '' p JOIN sys.schemas s ON s.schema_id = p.schema_id WHERE (p.name like '''''' + @objectname + '''''') and s.name = '''''' + @schemaid + '''' + @sysType + '''''' + +OPEN SP_cursor +FETCH NEXT FROM SP_cursor INTO @SP_Name +WHILE @@FETCH_STATUS = 0 +BEGIN + IF EXISTS(SELECT 1 FROM sys.fn_builtin_permissions(''''OBJECT'''') WHERE permission_name = '''''' + @rightsaction + '''''') + BEGIN + EXEC('''''' + @grantordeny + '' '' + @rightsaction + '' ON ['' + @schemaid + ''].['''' + @SP_Name + ''''] TO ['' + @RoleName + '']'''') + END + FETCH NEXT FROM SP_cursor INTO @SP_Name +END + +CLOSE SP_cursor +DEALLOCATE SP_cursor + +'' + + END + ELSE + BEGIN + + SET @Command = @Command + '' +IF EXISTS(SELECT 1 FROM sys.objects o WITH (NOLOCK) JOIN sys.schemas s ON s.schema_id = o.schema_id WHERE o.name = '''''' + @objectname + '''''' AND o.type IN (N''''U'''',''''P'''',''''V'''',''''FN'''',''''IF'''',''''TF'''') AND s.name = '''''' + @schemaid + '''''') +BEGIN + IF EXISTS(SELECT 1 FROM sys.fn_builtin_permissions(''''OBJECT'''') WHERE permission_name = '''''' + @rightsaction + '''''') + BEGIN + '' + @grantordeny + '' '' + @rightsaction + '' ON ['' + @schemaid + ''].['' + @objectname + ''] TO ['' + @RoleName + ''] + END +END + +'' + END + END + + IF @typeofobject = ''ASSEMBLIES'' + BEGIN + SET @Command = @Command + '' +IF EXISTS(SELECT 1 FROM sys.assemblies WHERE NAME = '''''' + @objectname + '''''') +BEGIN + IF EXISTS(SELECT 1 FROM sys.fn_builtin_permissions(''''ASSEMBLY'''') WHERE permission_name = '''''' + @rightsaction + '''''') + BEGIN + '' + @grantordeny + '' '' + @rightsaction + ''::['' + @objectname + ''] TO ['' + @RoleName + ''] + END +END + +'' + END + + IF @typeofobject = ''ROLE'' + BEGIN + SET @Command = @Command + '' +IF NOT EXISTS (SELECT 1 FROM sys.database_role_members JOIN sys.database_principals roles ON database_role_members.role_principal_id = roles.principal_id JOIN sys.database_principals members ON database_role_members.member_principal_id = members.principal_id WHERE roles.name = '''''' + @rightsaction + '''''' AND members.name = '''''' + @RoleName + '''''') +BEGIN + EXEC sp_addrolemember N'''''' + @rightsaction + '''''', N'''''' + @RoleName + '''''' +END + +'' + END + + FETCH NEXT FROM SecurablesCurs INTO @typeofobject, @grantordeny, @rightsaction, @objectname, @schemaid + END + +CLOSE SecurablesCurs +DEALLOCATE SecurablesCurs + +PRINT ''SET ALL SECURABLES ON ROLE ['' + @RoleName + '']'' +EXEC sp_executesql @Command + +END + +/* ADD USER */ +DECLARE UsersCurs CURSOR FOR +SELECT username + FROM #UsersOnRole + +OPEN UsersCurs + +FETCH NEXT FROM UsersCurs INTO @Users +WHILE @@FETCH_STATUS = 0 +BEGIN + + SELECT @Command = '' +EXEC sp_addrolemember N'''''' + @RoleName + '''''', N'''''' + @Users + '''''' +PRINT ''''ADD USER ['' + @Users + ''] ON ROLE ['' + @RoleName + '']'''' +'' + +FETCH NEXT FROM UsersCurs INTO @Users +END + +CLOSE UsersCurs +DEALLOCATE UsersCurs + +EXEC sp_executesql @Command + +/*============================================================================= + Drop temp tables +=============================================================================*/ +DROP TABLE #Securables +DROP TABLE #UsersOnRole','ActiveSystemClient','Pharmacies') + +INSERT INTO #AllRoles(STR_Definition,STR_Database,STR_Product)VALUES(' + +/*============================================================================= + + Script to create dbRoleActiveConfig role. + + Role Name: dbRoleActiveConfig + TEMPLATE: Default + + EXAMPLE OF SECURABLES TO SET: + + INSERT INTO #Securables + VALUES + (''DB'',''GRANT'',''VIEW DEFINITION'','''',''''), + (''SCHEMA'',''GRANT'',''SELECT,EXECUTE,INSERT,UPDATE,DELETE'','''',''AP''), + (''TABLE'',''GRANT'',''INSERT,UPDATE'',''Address'',''dbo''), + (''SP'',''GRANT'',''EXECUTE'',''sp_bmc_GetNextID'',''dbo''), + (''ROLE'',''GRANT'',''db_datareader'','''','''') + + ----------------------------------------------- + +Generate date : 2023-05-12 / up208700 + +=============================================================================*/ + +DECLARE @Command nvarchar(max), + @RoleName varchar(60), + @Users varchar(255), + @typeofobject varchar(50), + @grantordeny varchar(10), + @rightsaction varchar(255), + @objectname varchar(255), + @schemaid varchar(10), + @sysTarget varchar(255), + @sysType varchar(255) + +SET @RoleName = ''dbRoleActiveConfig'' +SET @Command = '''' + +/* TEMP TABLES */ +CREATE TABLE #UsersOnRole(username varchar(255)) +CREATE TABLE #Securables(typeofobject varchar(50), grantordeny varchar(10), rightsaction varchar(255), objectname varchar(255), schemaid varchar(10),N2 bit) + +/* !!! LIST OF SECURABLES TO CHANGE !!! */ + +INSERT INTO #Securables +VALUES +(''SP'',''GRANT'',''EXECUTE'',''GetApplications'',''cfg'',0) +,(''SP'',''GRANT'',''EXECUTE'',''GetConfigurationDatabaseSchemaVersion'',''cfg'',0) +,(''SP'',''GRANT'',''EXECUTE'',''GetSettings'',''cfg'',0) + + +/* GET ALL USERS ON THIS ROLE */ +INSERT INTO #UsersOnRole +SELECT + members.name +FROM sys.database_role_members + JOIN sys.database_principals roles ON database_role_members.role_principal_id = roles.principal_id + JOIN sys.database_principals members ON database_role_members.member_principal_id = members.principal_id +WHERE roles.name = @RoleName + +/* CREATE ROLE */ +SELECT @Command = '' +IF NOT EXISTS (SELECT 1 FROM sys.database_principals WHERE name = '''''' + @RoleName + '''''' AND type = ''''R'''') +BEGIN + CREATE ROLE ['' + @RoleName + ''] AUTHORIZATION [dbo] + PRINT ''''CREATE ROLE ['' + @RoleName + '']'''' +END +'' +EXEC sp_executesql @Command + +SET @Command = '' +DECLARE @SP_Name varchar(255) + +'' + +/* SET ALL ROLE SECURABLES */ +DECLARE SecurablesCurs CURSOR FOR +SELECT typeofobject, grantordeny, rightsaction, objectname, schemaid +FROM #Securables +WHERE N2 = 0 + +OPEN SecurablesCurs +FETCH NEXT FROM SecurablesCurs INTO @typeofobject, @grantordeny, @rightsaction, @objectname, @schemaid +WHILE @@FETCH_STATUS = 0 +BEGIN + + IF @typeofobject = ''DB'' + BEGIN + IF EXISTS(SELECT 1 FROM sys.fn_builtin_permissions(''DATABASE'') WHERE permission_name = '''' + @rightsaction + '''') + BEGIN + SET @Command = @Command + @grantordeny + '' '' + @rightsaction + '' TO ['' + @RoleName + ''] +'' + END + END + + IF @typeofobject = ''SCHEMA'' + BEGIN + SET @Command = @Command + '' +IF EXISTS (SELECT 1 FROM sys.schemas WHERE name = '''''' + @schemaid + '''''') +BEGIN + IF EXISTS(SELECT 1 FROM sys.fn_builtin_permissions(''''SCHEMA'''') WHERE permission_name = '''''' + @rightsaction + '''''') + BEGIN + '' + @grantordeny + '' '' + @rightsaction + '' ON SCHEMA::'' + @schemaid + '' TO ['' + @RoleName + ''] + END +END + +'' + END + + IF @typeofobject in(''TABLE'',''SP'',''FUNCTIONS'',''VIEWS'') + BEGIN + + IF @objectname like ''%[%]%'' + BEGIN + + IF @typeofobject = ''TABLE'' + BEGIN + SET @sysTarget = ''sys.tables'' + SET @sysType = '''' + END + + IF @typeofobject = ''SP'' + BEGIN + SET @sysTarget = ''sys.procedures'' + SET @sysType = '''' + END + + IF @typeofobject = ''FUNCTIONS'' + BEGIN + SET @sysTarget = ''sys.objects'' + SET @sysType = '' and p.Type IN ( N''''FN'''', N''''IF'''', N''''TF'''', N''''FS'''', N''''FT'''' )'' + END + + IF @typeofobject = ''VIEWS'' + BEGIN + SET @sysTarget = ''sys.views'' + SET @sysType = '''' + END + + SET @Command = @Command + '' +DECLARE SP_cursor CURSOR FOR +SELECT p.name FROM '' + @sysTarget + '' p JOIN sys.schemas s ON s.schema_id = p.schema_id WHERE (p.name like '''''' + @objectname + '''''') and s.name = '''''' + @schemaid + '''' + @sysType + '''''' + +OPEN SP_cursor +FETCH NEXT FROM SP_cursor INTO @SP_Name +WHILE @@FETCH_STATUS = 0 +BEGIN + IF EXISTS(SELECT 1 FROM sys.fn_builtin_permissions(''''OBJECT'''') WHERE permission_name = '''''' + @rightsaction + '''''') + BEGIN + EXEC('''''' + @grantordeny + '' '' + @rightsaction + '' ON ['' + @schemaid + ''].['''' + @SP_Name + ''''] TO ['' + @RoleName + '']'''') + END + FETCH NEXT FROM SP_cursor INTO @SP_Name +END + +CLOSE SP_cursor +DEALLOCATE SP_cursor + +'' + + END + ELSE + BEGIN + + SET @Command = @Command + '' +IF EXISTS(SELECT 1 FROM sys.objects o WITH (NOLOCK) JOIN sys.schemas s ON s.schema_id = o.schema_id WHERE o.name = '''''' + @objectname + '''''' AND o.type IN (N''''U'''',''''P'''',''''V'''',''''FN'''',''''IF'''',''''TF'''') AND s.name = '''''' + @schemaid + '''''') +BEGIN + IF EXISTS(SELECT 1 FROM sys.fn_builtin_permissions(''''OBJECT'''') WHERE permission_name = '''''' + @rightsaction + '''''') + BEGIN + '' + @grantordeny + '' '' + @rightsaction + '' ON ['' + @schemaid + ''].['' + @objectname + ''] TO ['' + @RoleName + ''] + END +END + +'' + END +END + +IF @typeofobject = ''ASSEMBLIES'' +BEGIN + SET @Command = @Command + '' +IF EXISTS(SELECT 1 FROM sys.assemblies WHERE NAME = '''''' + @objectname + '''''') +BEGIN + IF EXISTS(SELECT 1 FROM sys.fn_builtin_permissions(''''ASSEMBLY'''') WHERE permission_name = '''''' + @rightsaction + '''''') + BEGIN + '' + @grantordeny + '' '' + @rightsaction + ''::['' + @objectname + ''] TO ['' + @RoleName + ''] + END +END + +'' +END + +IF @typeofobject = ''ROLE'' +BEGIN + SET @Command = @Command + '' +IF NOT EXISTS (SELECT 1 FROM sys.database_role_members JOIN sys.database_principals roles ON database_role_members.role_principal_id = roles.principal_id JOIN sys.database_principals members ON database_role_members.member_principal_id = members.principal_id WHERE roles.name = '''''' + @rightsaction + '''''' AND members.name = '''''' + @RoleName + '''''') +BEGIN + EXEC sp_addrolemember N'''''' + @rightsaction + '''''', N'''''' + @RoleName + '''''' +END + +'' +END + +FETCH NEXT FROM SecurablesCurs INTO @typeofobject, @grantordeny, @rightsaction, @objectname, @schemaid +END + +CLOSE SecurablesCurs +DEALLOCATE SecurablesCurs + +PRINT ''SET ALL SECURABLES ON ROLE ['' + @RoleName + '']'' +EXEC sp_executesql @Command + +/* ADD USER */ +DECLARE UsersCurs CURSOR FOR +SELECT username + FROM #UsersOnRole + +OPEN UsersCurs + +FETCH NEXT FROM UsersCurs INTO @Users +WHILE @@FETCH_STATUS = 0 +BEGIN + + SELECT @Command = '' +EXEC sp_addrolemember N'''''' + @RoleName + '''''', N'''''' + @Users + '''''' +PRINT ''''ADD USER ['' + @Users + ''] ON ROLE ['' + @RoleName + '']'''' +'' + +FETCH NEXT FROM UsersCurs INTO @Users +END + +CLOSE UsersCurs +DEALLOCATE UsersCurs + +EXEC sp_executesql @Command + + +/*============================================================================= + Drop temp tables +=============================================================================*/ +DROP TABLE #Securables +DROP TABLE #UsersOnRole +','ActiveSystemServer','Pharmacies') + +INSERT INTO #AllRoles(STR_Definition,STR_Database,STR_Product)VALUES(' + +/*============================================================================= + + Script to create dbRoleActivePharmacy role. + + Role Name: dbRoleActivePharmacy + TEMPLATE: Default + + EXAMPLE OF SECURABLES TO SET: + + INSERT INTO #Securables + VALUES + (''DB'',''GRANT'',''VIEW DEFINITION'','''',''''), + (''SCHEMA'',''GRANT'',''SELECT,EXECUTE,INSERT,UPDATE,DELETE'','''',''AP''), + (''TABLE'',''GRANT'',''INSERT,UPDATE'',''Address'',''dbo''), + (''SP'',''GRANT'',''EXECUTE'',''sp_bmc_GetNextID'',''dbo''), + (''ROLE'',''GRANT'',''db_datareader'','''','''') + + ----------------------------------------------- + +Generate date : 2023-05-12 / up208700 + +=============================================================================*/ + +DECLARE @Command nvarchar(max), + @RoleName varchar(60), + @Users varchar(255), + @typeofobject varchar(50), + @grantordeny varchar(10), + @rightsaction varchar(255), + @objectname varchar(255), + @schemaid varchar(10), + @sysTarget varchar(255), + @sysType varchar(255) + +SET @RoleName = ''dbRoleActivePharmacy'' +SET @Command = '''' + +/* TEMP TABLES */ +CREATE TABLE #UsersOnRole(username varchar(255)) +CREATE TABLE #Securables(typeofobject varchar(50), grantordeny varchar(10), rightsaction varchar(255), objectname varchar(255), schemaid varchar(10),N2 bit) + +/* !!! LIST OF SECURABLES TO CHANGE !!! */ + +INSERT INTO #Securables +VALUES +(''ROLE'',''GRANT'',''DB_OWNER'','''',''dbo'',0) + + +/* GET ALL USERS ON THIS ROLE */ +INSERT INTO #UsersOnRole +SELECT + members.name +FROM sys.database_role_members + JOIN sys.database_principals roles ON database_role_members.role_principal_id = roles.principal_id + JOIN sys.database_principals members ON database_role_members.member_principal_id = members.principal_id +WHERE roles.name = @RoleName + +/* CREATE ROLE */ +SELECT @Command = '' +IF NOT EXISTS (SELECT 1 FROM sys.database_principals WHERE name = '''''' + @RoleName + '''''' AND type = ''''R'''') +BEGIN + CREATE ROLE ['' + @RoleName + ''] AUTHORIZATION [dbo] + PRINT ''''CREATE ROLE ['' + @RoleName + '']'''' +END +'' +EXEC sp_executesql @Command + +SET @Command = '' +DECLARE @SP_Name varchar(255) + +'' + +/* SET ALL ROLE SECURABLES */ +DECLARE SecurablesCurs CURSOR FOR +SELECT typeofobject, grantordeny, rightsaction, objectname, schemaid +FROM #Securables +WHERE N2 = 0 + +OPEN SecurablesCurs +FETCH NEXT FROM SecurablesCurs INTO @typeofobject, @grantordeny, @rightsaction, @objectname, @schemaid +WHILE @@FETCH_STATUS = 0 +BEGIN + + IF @typeofobject = ''DB'' + BEGIN + IF EXISTS(SELECT 1 FROM sys.fn_builtin_permissions(''DATABASE'') WHERE permission_name = '''' + @rightsaction + '''') + BEGIN + SET @Command = @Command + @grantordeny + '' '' + @rightsaction + '' TO ['' + @RoleName + ''] +'' + END + END + + IF @typeofobject = ''SCHEMA'' + BEGIN + SET @Command = @Command + '' +IF EXISTS (SELECT 1 FROM sys.schemas WHERE name = '''''' + @schemaid + '''''') +BEGIN + IF EXISTS(SELECT 1 FROM sys.fn_builtin_permissions(''''SCHEMA'''') WHERE permission_name = '''''' + @rightsaction + '''''') + BEGIN + '' + @grantordeny + '' '' + @rightsaction + '' ON SCHEMA::'' + @schemaid + '' TO ['' + @RoleName + ''] + END +END + +'' + END + + IF @typeofobject in(''TABLE'',''SP'',''FUNCTIONS'',''VIEWS'') + BEGIN + + IF @objectname like ''%[%]%'' + BEGIN + + IF @typeofobject = ''TABLE'' + BEGIN + SET @sysTarget = ''sys.tables'' + SET @sysType = '''' + END + + IF @typeofobject = ''SP'' + BEGIN + SET @sysTarget = ''sys.procedures'' + SET @sysType = '''' + END + + IF @typeofobject = ''FUNCTIONS'' + BEGIN + SET @sysTarget = ''sys.objects'' + SET @sysType = '' and p.Type IN ( N''''FN'''', N''''IF'''', N''''TF'''', N''''FS'''', N''''FT'''' )'' + END + + IF @typeofobject = ''VIEWS'' + BEGIN + SET @sysTarget = ''sys.views'' + SET @sysType = '''' + END + + SET @Command = @Command + '' +DECLARE SP_cursor CURSOR FOR +SELECT p.name FROM '' + @sysTarget + '' p JOIN sys.schemas s ON s.schema_id = p.schema_id WHERE (p.name like '''''' + @objectname + '''''') and s.name = '''''' + @schemaid + '''' + @sysType + '''''' + +OPEN SP_cursor +FETCH NEXT FROM SP_cursor INTO @SP_Name +WHILE @@FETCH_STATUS = 0 +BEGIN + IF EXISTS(SELECT 1 FROM sys.fn_builtin_permissions(''''OBJECT'''') WHERE permission_name = '''''' + @rightsaction + '''''') + BEGIN + EXEC('''''' + @grantordeny + '' '' + @rightsaction + '' ON ['' + @schemaid + ''].['''' + @SP_Name + ''''] TO ['' + @RoleName + '']'''') + END + FETCH NEXT FROM SP_cursor INTO @SP_Name +END + +CLOSE SP_cursor +DEALLOCATE SP_cursor + +'' + + END + ELSE + BEGIN + + SET @Command = @Command + '' +IF EXISTS(SELECT 1 FROM sys.objects o WITH (NOLOCK) JOIN sys.schemas s ON s.schema_id = o.schema_id WHERE o.name = '''''' + @objectname + '''''' AND o.type IN (N''''U'''',''''P'''',''''V'''',''''FN'''',''''IF'''',''''TF'''') AND s.name = '''''' + @schemaid + '''''') +BEGIN + IF EXISTS(SELECT 1 FROM sys.fn_builtin_permissions(''''OBJECT'''') WHERE permission_name = '''''' + @rightsaction + '''''') + BEGIN + '' + @grantordeny + '' '' + @rightsaction + '' ON ['' + @schemaid + ''].['' + @objectname + ''] TO ['' + @RoleName + ''] + END +END + +'' + END +END + +IF @typeofobject = ''ASSEMBLIES'' +BEGIN + SET @Command = @Command + '' +IF EXISTS(SELECT 1 FROM sys.assemblies WHERE NAME = '''''' + @objectname + '''''') +BEGIN + IF EXISTS(SELECT 1 FROM sys.fn_builtin_permissions(''''ASSEMBLY'''') WHERE permission_name = '''''' + @rightsaction + '''''') + BEGIN + '' + @grantordeny + '' '' + @rightsaction + ''::['' + @objectname + ''] TO ['' + @RoleName + ''] + END +END + +'' +END + +IF @typeofobject = ''ROLE'' +BEGIN + SET @Command = @Command + '' +IF NOT EXISTS (SELECT 1 FROM sys.database_role_members JOIN sys.database_principals roles ON database_role_members.role_principal_id = roles.principal_id JOIN sys.database_principals members ON database_role_members.member_principal_id = members.principal_id WHERE roles.name = '''''' + @rightsaction + '''''' AND members.name = '''''' + @RoleName + '''''') +BEGIN + EXEC sp_addrolemember N'''''' + @rightsaction + '''''', N'''''' + @RoleName + '''''' +END + +'' +END + +FETCH NEXT FROM SecurablesCurs INTO @typeofobject, @grantordeny, @rightsaction, @objectname, @schemaid +END + +CLOSE SecurablesCurs +DEALLOCATE SecurablesCurs + +PRINT ''SET ALL SECURABLES ON ROLE ['' + @RoleName + '']'' +EXEC sp_executesql @Command + +/* ADD USER */ +DECLARE UsersCurs CURSOR FOR +SELECT username + FROM #UsersOnRole + +OPEN UsersCurs + +FETCH NEXT FROM UsersCurs INTO @Users +WHILE @@FETCH_STATUS = 0 +BEGIN + + SELECT @Command = '' +EXEC sp_addrolemember N'''''' + @RoleName + '''''', N'''''' + @Users + '''''' +PRINT ''''ADD USER ['' + @Users + ''] ON ROLE ['' + @RoleName + '']'''' +'' + +FETCH NEXT FROM UsersCurs INTO @Users +END + +CLOSE UsersCurs +DEALLOCATE UsersCurs + +EXEC sp_executesql @Command + + +/*============================================================================= + Drop temp tables +=============================================================================*/ +DROP TABLE #Securables +DROP TABLE #UsersOnRole +','ActiveSystemServer','Pharmacies') + +INSERT INTO #AllRoles(STR_Definition,STR_Database,STR_Product)VALUES(' + +/*============================================================================= + + Script to create dbRoleCsltUsr role. + + Role Name: dbRoleCsltUsr + TEMPLATE: N2 and PROD + + EXAMPLE OF SECURABLES TO SET: + + INSERT INTO #Securables + VALUES + (''DB'',''GRANT'',''VIEW DEFINITION'','''',''''), + (''SCHEMA'',''GRANT'',''SELECT,EXECUTE,INSERT,UPDATE,DELETE'','''',''AP''), + (''TABLE'',''GRANT'',''INSERT,UPDATE'',''Address'',''dbo''), + (''SP'',''GRANT'',''EXECUTE'',''sp_bmc_GetNextID'',''dbo''), + (''ROLE'',''GRANT'',''db_datareader'','''','''') + + ----------------------------------------------- + +Generate date : 2023-05-12 / up208700 + +=============================================================================*/ + +DECLARE @Type varchar(6), + @Command nvarchar(max), + @RoleName varchar(60), + @Users varchar(255), + @typeofobject varchar(50), + @grantordeny varchar(10), + @rightsaction varchar(255), + @objectname varchar(255), + @schemaid varchar(10), + @sysTarget varchar(255), + @sysType varchar(255) + +SET @RoleName = ''dbRoleCsltUsr'' +SET @Command = '''' + +SELECT @Type = [Type] FROM [master].[cfg].[InstanceContext] + +/* TEMP TABLES */ +CREATE TABLE #UsersOnRole(username varchar(255)) +CREATE TABLE #Securables(typeofobject varchar(50), grantordeny varchar(10), rightsaction varchar(255), objectname varchar(255), schemaid varchar(10),N2 bit) + +/* !!! LIST OF SECURABLES TO CHANGE !!! */ + +INSERT INTO #Securables +VALUES +(''DB'',''GRANT'',''EXECUTE'','''',''dbo'',0) +,(''DB'',''GRANT'',''SHOWPLAN'','''',''dbo'',0) +,(''DB'',''GRANT'',''VIEW DEFINITION'','''',''dbo'',0) +,(''ROLE'',''GRANT'',''DB_DATAREADER'','''',''dbo'',0) +,(''ROLE'',''GRANT'',''DB_DATAWRITER'','''',''dbo'',0) +,(''ROLE'',''GRANT'',''DB_OWNER'','''',''dbo'',1) + + +/* GET ALL USERS ON THIS ROLE */ +INSERT INTO #UsersOnRole +SELECT + members.name +FROM sys.database_role_members + JOIN sys.database_principals roles ON database_role_members.role_principal_id = roles.principal_id + JOIN sys.database_principals members ON database_role_members.member_principal_id = members.principal_id +WHERE roles.name = @RoleName + +/* CREATE ROLE */ +SELECT @Command = '' +IF NOT EXISTS (SELECT 1 FROM sys.database_principals WHERE name = '''''' + @RoleName + '''''' AND type = ''''R'''') +BEGIN + CREATE ROLE ['' + @RoleName + ''] AUTHORIZATION [dbo] + PRINT ''''CREATE ROLE ['' + @RoleName + '']'''' +END +'' +EXEC sp_executesql @Command + +SET @Command = '' +DECLARE @SP_Name varchar(255) + +'' + +/* SET ALL ROLE SECURABLES */ +IF @Type = ''DEVE'' +BEGIN + + DECLARE SecurablesCurs CURSOR FOR + SELECT typeofobject, grantordeny, rightsaction, objectname, schemaid + FROM #Securables + WHERE N2 = 1 + + OPEN SecurablesCurs + FETCH NEXT FROM SecurablesCurs INTO @typeofobject, @grantordeny, @rightsaction, @objectname, @schemaid + WHILE @@FETCH_STATUS = 0 + BEGIN + + IF @typeofobject = ''DB'' + BEGIN + IF EXISTS(SELECT 1 FROM sys.fn_builtin_permissions(''DATABASE'') WHERE permission_name = '''' + @rightsaction + '''') + BEGIN + SET @Command = @Command + @grantordeny + '' '' + @rightsaction + '' TO ['' + @RoleName + ''] +'' + END + END + + IF @typeofobject = ''SCHEMA'' + BEGIN + SET @Command = @Command + '' +IF EXISTS (SELECT 1 FROM sys.schemas WHERE name = '''''' + @schemaid + '''''') +BEGIN + IF EXISTS(SELECT 1 FROM sys.fn_builtin_permissions(''''SCHEMA'''') WHERE permission_name = '''''' + @rightsaction + '''''') + BEGIN + '' + @grantordeny + '' '' + @rightsaction + '' ON SCHEMA::'' + @schemaid + '' TO ['' + @RoleName + ''] + END +END + +'' + END + + IF @typeofobject in(''TABLE'',''SP'',''FUNCTIONS'',''VIEWS'') + BEGIN + + IF @objectname like ''%[%]%'' + BEGIN + IF @typeofobject = ''TABLE'' + BEGIN + SET @sysTarget = ''sys.tables'' + SET @sysType = '''' + END + + IF @typeofobject = ''SP'' + BEGIN + SET @sysTarget = ''sys.procedures'' + SET @sysType = '''' + END + + IF @typeofobject = ''FUNCTIONS'' + BEGIN + SET @sysTarget = ''sys.objects'' + SET @sysType = '' and p.Type IN ( N''''FN'''', N''''IF'''', N''''TF'''', N''''FS'''', N''''FT'''' )'' + END + + IF @typeofobject = ''VIEWS'' + BEGIN + SET @sysTarget = ''sys.views'' + SET @sysType = '''' + END + + SET @Command = @Command + '' +DECLARE SP_cursor CURSOR FOR +SELECT p.name FROM '' + @sysTarget + '' p JOIN sys.schemas s ON s.schema_id = p.schema_id WHERE (p.name like '''''' + @objectname + '''''') and s.name = '''''' + @schemaid + '''' + @sysType + '''''' + +OPEN SP_cursor +FETCH NEXT FROM SP_cursor INTO @SP_Name +WHILE @@FETCH_STATUS = 0 +BEGIN + IF EXISTS(SELECT 1 FROM sys.fn_builtin_permissions(''''OBJECT'''') WHERE permission_name = '''''' + @rightsaction + '''''') + BEGIN + EXEC('''''' + @grantordeny + '' '' + @rightsaction + '' ON ['' + @schemaid + ''].['''' + @SP_Name + ''''] TO ['' + @RoleName + '']'''') + END + FETCH NEXT FROM SP_cursor INTO @SP_Name +END + +CLOSE SP_cursor +DEALLOCATE SP_cursor + +'' + + END + ELSE + BEGIN + + SET @Command = @Command + '' +IF EXISTS(SELECT 1 FROM sys.objects o WITH (NOLOCK) JOIN sys.schemas s ON s.schema_id = o.schema_id WHERE o.name = '''''' + @objectname + '''''' AND o.type IN (N''''U'''',''''P'''',''''V'''',''''FN'''',''''IF'''',''''TF'''') AND s.name = '''''' + @schemaid + '''''') +BEGIN + IF EXISTS(SELECT 1 FROM sys.fn_builtin_permissions(''''OBJECT'''') WHERE permission_name = '''''' + @rightsaction + '''''') + BEGIN + '' + @grantordeny + '' '' + @rightsaction + '' ON ['' + @schemaid + ''].['' + @objectname + ''] TO ['' + @RoleName + ''] + END +END + +'' + END + END + + IF @typeofobject = ''ASSEMBLIES'' + BEGIN + SET @Command = @Command + '' +IF EXISTS(SELECT 1 FROM sys.assemblies WHERE NAME = '''''' + @objectname + '''''') +BEGIN + IF EXISTS(SELECT 1 FROM sys.fn_builtin_permissions(''''ASSEMBLY'''') WHERE permission_name = '''''' + @rightsaction + '''''') + BEGIN + '' + @grantordeny + '' '' + @rightsaction + ''::['' + @objectname + ''] TO ['' + @RoleName + ''] + END +END + +'' + END + + IF @typeofobject = ''ROLE'' + BEGIN + SET @Command = @Command + '' +IF NOT EXISTS (SELECT 1 FROM sys.database_role_members JOIN sys.database_principals roles ON database_role_members.role_principal_id = roles.principal_id JOIN sys.database_principals members ON database_role_members.member_principal_id = members.principal_id WHERE roles.name = '''''' + @rightsaction + '''''' AND members.name = '''''' + @RoleName + '''''') +BEGIN + EXEC sp_addrolemember N'''''' + @rightsaction + '''''', N'''''' + @RoleName + '''''' +END + +'' + END + + FETCH NEXT FROM SecurablesCurs INTO @typeofobject, @grantordeny, @rightsaction, @objectname, @schemaid + END + +CLOSE SecurablesCurs +DEALLOCATE SecurablesCurs + +PRINT ''SET ALL SECURABLES ON ROLE ['' + @RoleName + '']'' +EXEC sp_executesql @Command + +END +ELSE +BEGIN + + DECLARE SecurablesCurs CURSOR FOR + SELECT typeofobject, grantordeny, rightsaction, objectname, schemaid + FROM #Securables + WHERE N2 = 0 + + OPEN SecurablesCurs + FETCH NEXT FROM SecurablesCurs INTO @typeofobject, @grantordeny, @rightsaction, @objectname, @schemaid + WHILE @@FETCH_STATUS = 0 + BEGIN + + IF @typeofobject = ''DB'' + BEGIN + IF EXISTS(SELECT 1 FROM sys.fn_builtin_permissions(''DATABASE'') WHERE permission_name = '''' + @rightsaction + '''') + BEGIN + SET @Command = @Command + @grantordeny + '' '' + @rightsaction + '' TO ['' + @RoleName + ''] +'' + END + END + + IF @typeofobject = ''SCHEMA'' + BEGIN + SET @Command = @Command + '' +IF EXISTS (SELECT 1 FROM sys.schemas WHERE name = '''''' + @schemaid + '''''') +BEGIN + IF EXISTS(SELECT 1 FROM sys.fn_builtin_permissions(''''SCHEMA'''') WHERE permission_name = '''''' + @rightsaction + '''''') + BEGIN + '' + @grantordeny + '' '' + @rightsaction + '' ON SCHEMA::'' + @schemaid + '' TO ['' + @RoleName + ''] + END +END + +'' + END + + IF @typeofobject in(''TABLE'',''SP'',''FUNCTIONS'',''VIEWS'') + BEGIN + + IF @objectname like ''%[%]%'' + BEGIN + + IF @typeofobject = ''TABLE'' + BEGIN + SET @sysTarget = ''sys.tables'' + SET @sysType = '''' + END + + IF @typeofobject = ''SP'' + BEGIN + SET @sysTarget = ''sys.procedures'' + SET @sysType = '''' + END + + IF @typeofobject = ''FUNCTIONS'' + BEGIN + SET @sysTarget = ''sys.objects'' + SET @sysType = '' and p.Type IN ( N''''FN'''', N''''IF'''', N''''TF'''', N''''FS'''', N''''FT'''' )'' + END + + IF @typeofobject = ''VIEWS'' + BEGIN + SET @sysTarget = ''sys.views'' + SET @sysType = '''' + END + + SET @Command = @Command + '' +DECLARE SP_cursor CURSOR FOR +SELECT p.name FROM '' + @sysTarget + '' p JOIN sys.schemas s ON s.schema_id = p.schema_id WHERE (p.name like '''''' + @objectname + '''''') and s.name = '''''' + @schemaid + '''' + @sysType + '''''' + +OPEN SP_cursor +FETCH NEXT FROM SP_cursor INTO @SP_Name +WHILE @@FETCH_STATUS = 0 +BEGIN + IF EXISTS(SELECT 1 FROM sys.fn_builtin_permissions(''''OBJECT'''') WHERE permission_name = '''''' + @rightsaction + '''''') + BEGIN + EXEC('''''' + @grantordeny + '' '' + @rightsaction + '' ON ['' + @schemaid + ''].['''' + @SP_Name + ''''] TO ['' + @RoleName + '']'''') + END + FETCH NEXT FROM SP_cursor INTO @SP_Name +END + +CLOSE SP_cursor +DEALLOCATE SP_cursor + +'' + + END + ELSE + BEGIN + + SET @Command = @Command + '' +IF EXISTS(SELECT 1 FROM sys.objects o WITH (NOLOCK) JOIN sys.schemas s ON s.schema_id = o.schema_id WHERE o.name = '''''' + @objectname + '''''' AND o.type IN (N''''U'''',''''P'''',''''V'''',''''FN'''',''''IF'''',''''TF'''') AND s.name = '''''' + @schemaid + '''''') +BEGIN + IF EXISTS(SELECT 1 FROM sys.fn_builtin_permissions(''''OBJECT'''') WHERE permission_name = '''''' + @rightsaction + '''''') + BEGIN + '' + @grantordeny + '' '' + @rightsaction + '' ON ['' + @schemaid + ''].['' + @objectname + ''] TO ['' + @RoleName + ''] + END +END + +'' + END + END + + IF @typeofobject = ''ASSEMBLIES'' + BEGIN + SET @Command = @Command + '' +IF EXISTS(SELECT 1 FROM sys.assemblies WHERE NAME = '''''' + @objectname + '''''') +BEGIN + IF EXISTS(SELECT 1 FROM sys.fn_builtin_permissions(''''ASSEMBLY'''') WHERE permission_name = '''''' + @rightsaction + '''''') + BEGIN + '' + @grantordeny + '' '' + @rightsaction + ''::['' + @objectname + ''] TO ['' + @RoleName + ''] + END +END + +'' + END + + IF @typeofobject = ''ROLE'' + BEGIN + SET @Command = @Command + '' +IF NOT EXISTS (SELECT 1 FROM sys.database_role_members JOIN sys.database_principals roles ON database_role_members.role_principal_id = roles.principal_id JOIN sys.database_principals members ON database_role_members.member_principal_id = members.principal_id WHERE roles.name = '''''' + @rightsaction + '''''' AND members.name = '''''' + @RoleName + '''''') +BEGIN + EXEC sp_addrolemember N'''''' + @rightsaction + '''''', N'''''' + @RoleName + '''''' +END + +'' + END + + FETCH NEXT FROM SecurablesCurs INTO @typeofobject, @grantordeny, @rightsaction, @objectname, @schemaid + END + +CLOSE SecurablesCurs +DEALLOCATE SecurablesCurs + +PRINT ''SET ALL SECURABLES ON ROLE ['' + @RoleName + '']'' +EXEC sp_executesql @Command + +END + +/* ADD USER */ +DECLARE UsersCurs CURSOR FOR +SELECT username + FROM #UsersOnRole + +OPEN UsersCurs + +FETCH NEXT FROM UsersCurs INTO @Users +WHILE @@FETCH_STATUS = 0 +BEGIN + + SELECT @Command = '' +EXEC sp_addrolemember N'''''' + @RoleName + '''''', N'''''' + @Users + '''''' +PRINT ''''ADD USER ['' + @Users + ''] ON ROLE ['' + @RoleName + '']'''' +'' + +FETCH NEXT FROM UsersCurs INTO @Users +END + +CLOSE UsersCurs +DEALLOCATE UsersCurs + +EXEC sp_executesql @Command + +/*============================================================================= + Drop temp tables +=============================================================================*/ +DROP TABLE #Securables +DROP TABLE #UsersOnRole','ActiveSystemServer','Pharmacies') + +INSERT INTO #AllRoles(STR_Definition,STR_Database,STR_Product)VALUES(' + +/*============================================================================= + + Script to create dbRoleDevUsr role. + + Role Name: dbRoleDevUsr + TEMPLATE: Default + + EXAMPLE OF SECURABLES TO SET: + + INSERT INTO #Securables + VALUES + (''DB'',''GRANT'',''VIEW DEFINITION'','''',''''), + (''SCHEMA'',''GRANT'',''SELECT,EXECUTE,INSERT,UPDATE,DELETE'','''',''AP''), + (''TABLE'',''GRANT'',''INSERT,UPDATE'',''Address'',''dbo''), + (''SP'',''GRANT'',''EXECUTE'',''sp_bmc_GetNextID'',''dbo''), + (''ROLE'',''GRANT'',''db_datareader'','''','''') + + ----------------------------------------------- + +Generate date : 2023-05-12 / up208700 + +=============================================================================*/ + +DECLARE @Command nvarchar(max), + @RoleName varchar(60), + @Users varchar(255), + @typeofobject varchar(50), + @grantordeny varchar(10), + @rightsaction varchar(255), + @objectname varchar(255), + @schemaid varchar(10), + @sysTarget varchar(255), + @sysType varchar(255) + +SET @RoleName = ''dbRoleDevUsr'' +SET @Command = '''' + +/* TEMP TABLES */ +CREATE TABLE #UsersOnRole(username varchar(255)) +CREATE TABLE #Securables(typeofobject varchar(50), grantordeny varchar(10), rightsaction varchar(255), objectname varchar(255), schemaid varchar(10),N2 bit) + +/* !!! LIST OF SECURABLES TO CHANGE !!! */ + +INSERT INTO #Securables +VALUES +(''DB'',''GRANT'',''EXECUTE'','''',''dbo'',0) +,(''DB'',''GRANT'',''SHOWPLAN'','''',''dbo'',0) +,(''DB'',''GRANT'',''VIEW DEFINITION'','''',''dbo'',0) +,(''ROLE'',''GRANT'',''DB_DATAREADER'','''',''dbo'',0) +,(''ROLE'',''GRANT'',''DB_DATAWRITER'','''',''dbo'',0) + + +/* GET ALL USERS ON THIS ROLE */ +INSERT INTO #UsersOnRole +SELECT + members.name +FROM sys.database_role_members + JOIN sys.database_principals roles ON database_role_members.role_principal_id = roles.principal_id + JOIN sys.database_principals members ON database_role_members.member_principal_id = members.principal_id +WHERE roles.name = @RoleName + +/* CREATE ROLE */ +SELECT @Command = '' +IF NOT EXISTS (SELECT 1 FROM sys.database_principals WHERE name = '''''' + @RoleName + '''''' AND type = ''''R'''') +BEGIN + CREATE ROLE ['' + @RoleName + ''] AUTHORIZATION [dbo] + PRINT ''''CREATE ROLE ['' + @RoleName + '']'''' +END +'' +EXEC sp_executesql @Command + +SET @Command = '' +DECLARE @SP_Name varchar(255) + +'' + +/* SET ALL ROLE SECURABLES */ +DECLARE SecurablesCurs CURSOR FOR +SELECT typeofobject, grantordeny, rightsaction, objectname, schemaid +FROM #Securables +WHERE N2 = 0 + +OPEN SecurablesCurs +FETCH NEXT FROM SecurablesCurs INTO @typeofobject, @grantordeny, @rightsaction, @objectname, @schemaid +WHILE @@FETCH_STATUS = 0 +BEGIN + + IF @typeofobject = ''DB'' + BEGIN + IF EXISTS(SELECT 1 FROM sys.fn_builtin_permissions(''DATABASE'') WHERE permission_name = '''' + @rightsaction + '''') + BEGIN + SET @Command = @Command + @grantordeny + '' '' + @rightsaction + '' TO ['' + @RoleName + ''] +'' + END + END + + IF @typeofobject = ''SCHEMA'' + BEGIN + SET @Command = @Command + '' +IF EXISTS (SELECT 1 FROM sys.schemas WHERE name = '''''' + @schemaid + '''''') +BEGIN + IF EXISTS(SELECT 1 FROM sys.fn_builtin_permissions(''''SCHEMA'''') WHERE permission_name = '''''' + @rightsaction + '''''') + BEGIN + '' + @grantordeny + '' '' + @rightsaction + '' ON SCHEMA::'' + @schemaid + '' TO ['' + @RoleName + ''] + END +END + +'' + END + + IF @typeofobject in(''TABLE'',''SP'',''FUNCTIONS'',''VIEWS'') + BEGIN + + IF @objectname like ''%[%]%'' + BEGIN + + IF @typeofobject = ''TABLE'' + BEGIN + SET @sysTarget = ''sys.tables'' + SET @sysType = '''' + END + + IF @typeofobject = ''SP'' + BEGIN + SET @sysTarget = ''sys.procedures'' + SET @sysType = '''' + END + + IF @typeofobject = ''FUNCTIONS'' + BEGIN + SET @sysTarget = ''sys.objects'' + SET @sysType = '' and p.Type IN ( N''''FN'''', N''''IF'''', N''''TF'''', N''''FS'''', N''''FT'''' )'' + END + + IF @typeofobject = ''VIEWS'' + BEGIN + SET @sysTarget = ''sys.views'' + SET @sysType = '''' + END + + SET @Command = @Command + '' +DECLARE SP_cursor CURSOR FOR +SELECT p.name FROM '' + @sysTarget + '' p JOIN sys.schemas s ON s.schema_id = p.schema_id WHERE (p.name like '''''' + @objectname + '''''') and s.name = '''''' + @schemaid + '''' + @sysType + '''''' + +OPEN SP_cursor +FETCH NEXT FROM SP_cursor INTO @SP_Name +WHILE @@FETCH_STATUS = 0 +BEGIN + IF EXISTS(SELECT 1 FROM sys.fn_builtin_permissions(''''OBJECT'''') WHERE permission_name = '''''' + @rightsaction + '''''') + BEGIN + EXEC('''''' + @grantordeny + '' '' + @rightsaction + '' ON ['' + @schemaid + ''].['''' + @SP_Name + ''''] TO ['' + @RoleName + '']'''') + END + FETCH NEXT FROM SP_cursor INTO @SP_Name +END + +CLOSE SP_cursor +DEALLOCATE SP_cursor + +'' + + END + ELSE + BEGIN + + SET @Command = @Command + '' +IF EXISTS(SELECT 1 FROM sys.objects o WITH (NOLOCK) JOIN sys.schemas s ON s.schema_id = o.schema_id WHERE o.name = '''''' + @objectname + '''''' AND o.type IN (N''''U'''',''''P'''',''''V'''',''''FN'''',''''IF'''',''''TF'''') AND s.name = '''''' + @schemaid + '''''') +BEGIN + IF EXISTS(SELECT 1 FROM sys.fn_builtin_permissions(''''OBJECT'''') WHERE permission_name = '''''' + @rightsaction + '''''') + BEGIN + '' + @grantordeny + '' '' + @rightsaction + '' ON ['' + @schemaid + ''].['' + @objectname + ''] TO ['' + @RoleName + ''] + END +END + +'' + END +END + +IF @typeofobject = ''ASSEMBLIES'' +BEGIN + SET @Command = @Command + '' +IF EXISTS(SELECT 1 FROM sys.assemblies WHERE NAME = '''''' + @objectname + '''''') +BEGIN + IF EXISTS(SELECT 1 FROM sys.fn_builtin_permissions(''''ASSEMBLY'''') WHERE permission_name = '''''' + @rightsaction + '''''') + BEGIN + '' + @grantordeny + '' '' + @rightsaction + ''::['' + @objectname + ''] TO ['' + @RoleName + ''] + END +END + +'' +END + +IF @typeofobject = ''ROLE'' +BEGIN + SET @Command = @Command + '' +IF NOT EXISTS (SELECT 1 FROM sys.database_role_members JOIN sys.database_principals roles ON database_role_members.role_principal_id = roles.principal_id JOIN sys.database_principals members ON database_role_members.member_principal_id = members.principal_id WHERE roles.name = '''''' + @rightsaction + '''''' AND members.name = '''''' + @RoleName + '''''') +BEGIN + EXEC sp_addrolemember N'''''' + @rightsaction + '''''', N'''''' + @RoleName + '''''' +END + +'' +END + +FETCH NEXT FROM SecurablesCurs INTO @typeofobject, @grantordeny, @rightsaction, @objectname, @schemaid +END + +CLOSE SecurablesCurs +DEALLOCATE SecurablesCurs + +PRINT ''SET ALL SECURABLES ON ROLE ['' + @RoleName + '']'' +EXEC sp_executesql @Command + +/* ADD USER */ +DECLARE UsersCurs CURSOR FOR +SELECT username + FROM #UsersOnRole + +OPEN UsersCurs + +FETCH NEXT FROM UsersCurs INTO @Users +WHILE @@FETCH_STATUS = 0 +BEGIN + + SELECT @Command = '' +EXEC sp_addrolemember N'''''' + @RoleName + '''''', N'''''' + @Users + '''''' +PRINT ''''ADD USER ['' + @Users + ''] ON ROLE ['' + @RoleName + '']'''' +'' + +FETCH NEXT FROM UsersCurs INTO @Users +END + +CLOSE UsersCurs +DEALLOCATE UsersCurs + +EXEC sp_executesql @Command + + +/*============================================================================= + Drop temp tables +=============================================================================*/ +DROP TABLE #Securables +DROP TABLE #UsersOnRole +','ActiveSystemServer','Pharmacies') + +INSERT INTO #AllRoles(STR_Definition,STR_Database,STR_Product)VALUES(' + +/*============================================================================= + + Script to create dbRoleIttechUsr role. + + Role Name: dbRoleIttechUsr + TEMPLATE: N2 and PROD + + EXAMPLE OF SECURABLES TO SET: + + INSERT INTO #Securables + VALUES + (''DB'',''GRANT'',''VIEW DEFINITION'','''',''''), + (''SCHEMA'',''GRANT'',''SELECT,EXECUTE,INSERT,UPDATE,DELETE'','''',''AP''), + (''TABLE'',''GRANT'',''INSERT,UPDATE'',''Address'',''dbo''), + (''SP'',''GRANT'',''EXECUTE'',''sp_bmc_GetNextID'',''dbo''), + (''ROLE'',''GRANT'',''db_datareader'','''','''') + + ----------------------------------------------- + +Generate date : 2023-05-12 / up208700 + +=============================================================================*/ + +DECLARE @Type varchar(6), + @Command nvarchar(max), + @RoleName varchar(60), + @Users varchar(255), + @typeofobject varchar(50), + @grantordeny varchar(10), + @rightsaction varchar(255), + @objectname varchar(255), + @schemaid varchar(10), + @sysTarget varchar(255), + @sysType varchar(255) + +SET @RoleName = ''dbRoleIttechUsr'' +SET @Command = '''' + +SELECT @Type = [Type] FROM [master].[cfg].[InstanceContext] + +/* TEMP TABLES */ +CREATE TABLE #UsersOnRole(username varchar(255)) +CREATE TABLE #Securables(typeofobject varchar(50), grantordeny varchar(10), rightsaction varchar(255), objectname varchar(255), schemaid varchar(10),N2 bit) + +/* !!! LIST OF SECURABLES TO CHANGE !!! */ + +INSERT INTO #Securables +VALUES +(''DB'',''GRANT'',''EXECUTE'','''',''dbo'',0) +,(''ROLE'',''GRANT'',''DB_DATAREADER'','''',''dbo'',0) +,(''ROLE'',''GRANT'',''DB_DATAWRITER'','''',''dbo'',0) +,(''ROLE'',''GRANT'',''DB_OWNER'','''',''dbo'',1) + + +/* GET ALL USERS ON THIS ROLE */ +INSERT INTO #UsersOnRole +SELECT + members.name +FROM sys.database_role_members + JOIN sys.database_principals roles ON database_role_members.role_principal_id = roles.principal_id + JOIN sys.database_principals members ON database_role_members.member_principal_id = members.principal_id +WHERE roles.name = @RoleName + +/* CREATE ROLE */ +SELECT @Command = '' +IF NOT EXISTS (SELECT 1 FROM sys.database_principals WHERE name = '''''' + @RoleName + '''''' AND type = ''''R'''') +BEGIN + CREATE ROLE ['' + @RoleName + ''] AUTHORIZATION [dbo] + PRINT ''''CREATE ROLE ['' + @RoleName + '']'''' +END +'' +EXEC sp_executesql @Command + +SET @Command = '' +DECLARE @SP_Name varchar(255) + +'' + +/* SET ALL ROLE SECURABLES */ +IF @Type = ''DEVE'' +BEGIN + + DECLARE SecurablesCurs CURSOR FOR + SELECT typeofobject, grantordeny, rightsaction, objectname, schemaid + FROM #Securables + WHERE N2 = 1 + + OPEN SecurablesCurs + FETCH NEXT FROM SecurablesCurs INTO @typeofobject, @grantordeny, @rightsaction, @objectname, @schemaid + WHILE @@FETCH_STATUS = 0 + BEGIN + + IF @typeofobject = ''DB'' + BEGIN + IF EXISTS(SELECT 1 FROM sys.fn_builtin_permissions(''DATABASE'') WHERE permission_name = '''' + @rightsaction + '''') + BEGIN + SET @Command = @Command + @grantordeny + '' '' + @rightsaction + '' TO ['' + @RoleName + ''] +'' + END + END + + IF @typeofobject = ''SCHEMA'' + BEGIN + SET @Command = @Command + '' +IF EXISTS (SELECT 1 FROM sys.schemas WHERE name = '''''' + @schemaid + '''''') +BEGIN + IF EXISTS(SELECT 1 FROM sys.fn_builtin_permissions(''''SCHEMA'''') WHERE permission_name = '''''' + @rightsaction + '''''') + BEGIN + '' + @grantordeny + '' '' + @rightsaction + '' ON SCHEMA::'' + @schemaid + '' TO ['' + @RoleName + ''] + END +END + +'' + END + + IF @typeofobject in(''TABLE'',''SP'',''FUNCTIONS'',''VIEWS'') + BEGIN + + IF @objectname like ''%[%]%'' + BEGIN + IF @typeofobject = ''TABLE'' + BEGIN + SET @sysTarget = ''sys.tables'' + SET @sysType = '''' + END + + IF @typeofobject = ''SP'' + BEGIN + SET @sysTarget = ''sys.procedures'' + SET @sysType = '''' + END + + IF @typeofobject = ''FUNCTIONS'' + BEGIN + SET @sysTarget = ''sys.objects'' + SET @sysType = '' and p.Type IN ( N''''FN'''', N''''IF'''', N''''TF'''', N''''FS'''', N''''FT'''' )'' + END + + IF @typeofobject = ''VIEWS'' + BEGIN + SET @sysTarget = ''sys.views'' + SET @sysType = '''' + END + + SET @Command = @Command + '' +DECLARE SP_cursor CURSOR FOR +SELECT p.name FROM '' + @sysTarget + '' p JOIN sys.schemas s ON s.schema_id = p.schema_id WHERE (p.name like '''''' + @objectname + '''''') and s.name = '''''' + @schemaid + '''' + @sysType + '''''' + +OPEN SP_cursor +FETCH NEXT FROM SP_cursor INTO @SP_Name +WHILE @@FETCH_STATUS = 0 +BEGIN + IF EXISTS(SELECT 1 FROM sys.fn_builtin_permissions(''''OBJECT'''') WHERE permission_name = '''''' + @rightsaction + '''''') + BEGIN + EXEC('''''' + @grantordeny + '' '' + @rightsaction + '' ON ['' + @schemaid + ''].['''' + @SP_Name + ''''] TO ['' + @RoleName + '']'''') + END + FETCH NEXT FROM SP_cursor INTO @SP_Name +END + +CLOSE SP_cursor +DEALLOCATE SP_cursor + +'' + + END + ELSE + BEGIN + + SET @Command = @Command + '' +IF EXISTS(SELECT 1 FROM sys.objects o WITH (NOLOCK) JOIN sys.schemas s ON s.schema_id = o.schema_id WHERE o.name = '''''' + @objectname + '''''' AND o.type IN (N''''U'''',''''P'''',''''V'''',''''FN'''',''''IF'''',''''TF'''') AND s.name = '''''' + @schemaid + '''''') +BEGIN + IF EXISTS(SELECT 1 FROM sys.fn_builtin_permissions(''''OBJECT'''') WHERE permission_name = '''''' + @rightsaction + '''''') + BEGIN + '' + @grantordeny + '' '' + @rightsaction + '' ON ['' + @schemaid + ''].['' + @objectname + ''] TO ['' + @RoleName + ''] + END +END + +'' + END + END + + IF @typeofobject = ''ASSEMBLIES'' + BEGIN + SET @Command = @Command + '' +IF EXISTS(SELECT 1 FROM sys.assemblies WHERE NAME = '''''' + @objectname + '''''') +BEGIN + IF EXISTS(SELECT 1 FROM sys.fn_builtin_permissions(''''ASSEMBLY'''') WHERE permission_name = '''''' + @rightsaction + '''''') + BEGIN + '' + @grantordeny + '' '' + @rightsaction + ''::['' + @objectname + ''] TO ['' + @RoleName + ''] + END +END + +'' + END + + IF @typeofobject = ''ROLE'' + BEGIN + SET @Command = @Command + '' +IF NOT EXISTS (SELECT 1 FROM sys.database_role_members JOIN sys.database_principals roles ON database_role_members.role_principal_id = roles.principal_id JOIN sys.database_principals members ON database_role_members.member_principal_id = members.principal_id WHERE roles.name = '''''' + @rightsaction + '''''' AND members.name = '''''' + @RoleName + '''''') +BEGIN + EXEC sp_addrolemember N'''''' + @rightsaction + '''''', N'''''' + @RoleName + '''''' +END + +'' + END + + FETCH NEXT FROM SecurablesCurs INTO @typeofobject, @grantordeny, @rightsaction, @objectname, @schemaid + END + +CLOSE SecurablesCurs +DEALLOCATE SecurablesCurs + +PRINT ''SET ALL SECURABLES ON ROLE ['' + @RoleName + '']'' +EXEC sp_executesql @Command + +END +ELSE +BEGIN + + DECLARE SecurablesCurs CURSOR FOR + SELECT typeofobject, grantordeny, rightsaction, objectname, schemaid + FROM #Securables + WHERE N2 = 0 + + OPEN SecurablesCurs + FETCH NEXT FROM SecurablesCurs INTO @typeofobject, @grantordeny, @rightsaction, @objectname, @schemaid + WHILE @@FETCH_STATUS = 0 + BEGIN + + IF @typeofobject = ''DB'' + BEGIN + IF EXISTS(SELECT 1 FROM sys.fn_builtin_permissions(''DATABASE'') WHERE permission_name = '''' + @rightsaction + '''') + BEGIN + SET @Command = @Command + @grantordeny + '' '' + @rightsaction + '' TO ['' + @RoleName + ''] +'' + END + END + + IF @typeofobject = ''SCHEMA'' + BEGIN + SET @Command = @Command + '' +IF EXISTS (SELECT 1 FROM sys.schemas WHERE name = '''''' + @schemaid + '''''') +BEGIN + IF EXISTS(SELECT 1 FROM sys.fn_builtin_permissions(''''SCHEMA'''') WHERE permission_name = '''''' + @rightsaction + '''''') + BEGIN + '' + @grantordeny + '' '' + @rightsaction + '' ON SCHEMA::'' + @schemaid + '' TO ['' + @RoleName + ''] + END +END + +'' + END + + IF @typeofobject in(''TABLE'',''SP'',''FUNCTIONS'',''VIEWS'') + BEGIN + + IF @objectname like ''%[%]%'' + BEGIN + + IF @typeofobject = ''TABLE'' + BEGIN + SET @sysTarget = ''sys.tables'' + SET @sysType = '''' + END + + IF @typeofobject = ''SP'' + BEGIN + SET @sysTarget = ''sys.procedures'' + SET @sysType = '''' + END + + IF @typeofobject = ''FUNCTIONS'' + BEGIN + SET @sysTarget = ''sys.objects'' + SET @sysType = '' and p.Type IN ( N''''FN'''', N''''IF'''', N''''TF'''', N''''FS'''', N''''FT'''' )'' + END + + IF @typeofobject = ''VIEWS'' + BEGIN + SET @sysTarget = ''sys.views'' + SET @sysType = '''' + END + + SET @Command = @Command + '' +DECLARE SP_cursor CURSOR FOR +SELECT p.name FROM '' + @sysTarget + '' p JOIN sys.schemas s ON s.schema_id = p.schema_id WHERE (p.name like '''''' + @objectname + '''''') and s.name = '''''' + @schemaid + '''' + @sysType + '''''' + +OPEN SP_cursor +FETCH NEXT FROM SP_cursor INTO @SP_Name +WHILE @@FETCH_STATUS = 0 +BEGIN + IF EXISTS(SELECT 1 FROM sys.fn_builtin_permissions(''''OBJECT'''') WHERE permission_name = '''''' + @rightsaction + '''''') + BEGIN + EXEC('''''' + @grantordeny + '' '' + @rightsaction + '' ON ['' + @schemaid + ''].['''' + @SP_Name + ''''] TO ['' + @RoleName + '']'''') + END + FETCH NEXT FROM SP_cursor INTO @SP_Name +END + +CLOSE SP_cursor +DEALLOCATE SP_cursor + +'' + + END + ELSE + BEGIN + + SET @Command = @Command + '' +IF EXISTS(SELECT 1 FROM sys.objects o WITH (NOLOCK) JOIN sys.schemas s ON s.schema_id = o.schema_id WHERE o.name = '''''' + @objectname + '''''' AND o.type IN (N''''U'''',''''P'''',''''V'''',''''FN'''',''''IF'''',''''TF'''') AND s.name = '''''' + @schemaid + '''''') +BEGIN + IF EXISTS(SELECT 1 FROM sys.fn_builtin_permissions(''''OBJECT'''') WHERE permission_name = '''''' + @rightsaction + '''''') + BEGIN + '' + @grantordeny + '' '' + @rightsaction + '' ON ['' + @schemaid + ''].['' + @objectname + ''] TO ['' + @RoleName + ''] + END +END + +'' + END + END + + IF @typeofobject = ''ASSEMBLIES'' + BEGIN + SET @Command = @Command + '' +IF EXISTS(SELECT 1 FROM sys.assemblies WHERE NAME = '''''' + @objectname + '''''') +BEGIN + IF EXISTS(SELECT 1 FROM sys.fn_builtin_permissions(''''ASSEMBLY'''') WHERE permission_name = '''''' + @rightsaction + '''''') + BEGIN + '' + @grantordeny + '' '' + @rightsaction + ''::['' + @objectname + ''] TO ['' + @RoleName + ''] + END +END + +'' + END + + IF @typeofobject = ''ROLE'' + BEGIN + SET @Command = @Command + '' +IF NOT EXISTS (SELECT 1 FROM sys.database_role_members JOIN sys.database_principals roles ON database_role_members.role_principal_id = roles.principal_id JOIN sys.database_principals members ON database_role_members.member_principal_id = members.principal_id WHERE roles.name = '''''' + @rightsaction + '''''' AND members.name = '''''' + @RoleName + '''''') +BEGIN + EXEC sp_addrolemember N'''''' + @rightsaction + '''''', N'''''' + @RoleName + '''''' +END + +'' + END + + FETCH NEXT FROM SecurablesCurs INTO @typeofobject, @grantordeny, @rightsaction, @objectname, @schemaid + END + +CLOSE SecurablesCurs +DEALLOCATE SecurablesCurs + +PRINT ''SET ALL SECURABLES ON ROLE ['' + @RoleName + '']'' +EXEC sp_executesql @Command + +END + +/* ADD USER */ +DECLARE UsersCurs CURSOR FOR +SELECT username + FROM #UsersOnRole + +OPEN UsersCurs + +FETCH NEXT FROM UsersCurs INTO @Users +WHILE @@FETCH_STATUS = 0 +BEGIN + + SELECT @Command = '' +EXEC sp_addrolemember N'''''' + @RoleName + '''''', N'''''' + @Users + '''''' +PRINT ''''ADD USER ['' + @Users + ''] ON ROLE ['' + @RoleName + '']'''' +'' + +FETCH NEXT FROM UsersCurs INTO @Users +END + +CLOSE UsersCurs +DEALLOCATE UsersCurs + +EXEC sp_executesql @Command + +/*============================================================================= + Drop temp tables +=============================================================================*/ +DROP TABLE #Securables +DROP TABLE #UsersOnRole','ActiveSystemServer','Pharmacies') + +INSERT INTO #AllRoles(STR_Definition,STR_Database,STR_Product)VALUES(' + +/*============================================================================= + + Script to create dbRoleSupUsr role. + + Role Name: dbRoleSupUsr + TEMPLATE: N2 and PROD + + EXAMPLE OF SECURABLES TO SET: + + INSERT INTO #Securables + VALUES + (''DB'',''GRANT'',''VIEW DEFINITION'','''',''''), + (''SCHEMA'',''GRANT'',''SELECT,EXECUTE,INSERT,UPDATE,DELETE'','''',''AP''), + (''TABLE'',''GRANT'',''INSERT,UPDATE'',''Address'',''dbo''), + (''SP'',''GRANT'',''EXECUTE'',''sp_bmc_GetNextID'',''dbo''), + (''ROLE'',''GRANT'',''db_datareader'','''','''') + + ----------------------------------------------- + +Generate date : 2023-05-12 / up208700 + +=============================================================================*/ + +DECLARE @Type varchar(6), + @Command nvarchar(max), + @RoleName varchar(60), + @Users varchar(255), + @typeofobject varchar(50), + @grantordeny varchar(10), + @rightsaction varchar(255), + @objectname varchar(255), + @schemaid varchar(10), + @sysTarget varchar(255), + @sysType varchar(255) + +SET @RoleName = ''dbRoleSupUsr'' +SET @Command = '''' + +SELECT @Type = [Type] FROM [master].[cfg].[InstanceContext] + +/* TEMP TABLES */ +CREATE TABLE #UsersOnRole(username varchar(255)) +CREATE TABLE #Securables(typeofobject varchar(50), grantordeny varchar(10), rightsaction varchar(255), objectname varchar(255), schemaid varchar(10),N2 bit) + +/* !!! LIST OF SECURABLES TO CHANGE !!! */ + +INSERT INTO #Securables +VALUES +(''DB'',''GRANT'',''EXECUTE'','''',''dbo'',0) +,(''ROLE'',''GRANT'',''DB_DATAREADER'','''',''dbo'',0) +,(''ROLE'',''GRANT'',''DB_DATAWRITER'','''',''dbo'',0) +,(''ROLE'',''GRANT'',''DB_OWNER'','''',''dbo'',1) + + +/* GET ALL USERS ON THIS ROLE */ +INSERT INTO #UsersOnRole +SELECT + members.name +FROM sys.database_role_members + JOIN sys.database_principals roles ON database_role_members.role_principal_id = roles.principal_id + JOIN sys.database_principals members ON database_role_members.member_principal_id = members.principal_id +WHERE roles.name = @RoleName + +/* CREATE ROLE */ +SELECT @Command = '' +IF NOT EXISTS (SELECT 1 FROM sys.database_principals WHERE name = '''''' + @RoleName + '''''' AND type = ''''R'''') +BEGIN + CREATE ROLE ['' + @RoleName + ''] AUTHORIZATION [dbo] + PRINT ''''CREATE ROLE ['' + @RoleName + '']'''' +END +'' +EXEC sp_executesql @Command + +SET @Command = '' +DECLARE @SP_Name varchar(255) + +'' + +/* SET ALL ROLE SECURABLES */ +IF @Type = ''DEVE'' +BEGIN + + DECLARE SecurablesCurs CURSOR FOR + SELECT typeofobject, grantordeny, rightsaction, objectname, schemaid + FROM #Securables + WHERE N2 = 1 + + OPEN SecurablesCurs + FETCH NEXT FROM SecurablesCurs INTO @typeofobject, @grantordeny, @rightsaction, @objectname, @schemaid + WHILE @@FETCH_STATUS = 0 + BEGIN + + IF @typeofobject = ''DB'' + BEGIN + IF EXISTS(SELECT 1 FROM sys.fn_builtin_permissions(''DATABASE'') WHERE permission_name = '''' + @rightsaction + '''') + BEGIN + SET @Command = @Command + @grantordeny + '' '' + @rightsaction + '' TO ['' + @RoleName + ''] +'' + END + END + + IF @typeofobject = ''SCHEMA'' + BEGIN + SET @Command = @Command + '' +IF EXISTS (SELECT 1 FROM sys.schemas WHERE name = '''''' + @schemaid + '''''') +BEGIN + IF EXISTS(SELECT 1 FROM sys.fn_builtin_permissions(''''SCHEMA'''') WHERE permission_name = '''''' + @rightsaction + '''''') + BEGIN + '' + @grantordeny + '' '' + @rightsaction + '' ON SCHEMA::'' + @schemaid + '' TO ['' + @RoleName + ''] + END +END + +'' + END + + IF @typeofobject in(''TABLE'',''SP'',''FUNCTIONS'',''VIEWS'') + BEGIN + + IF @objectname like ''%[%]%'' + BEGIN + IF @typeofobject = ''TABLE'' + BEGIN + SET @sysTarget = ''sys.tables'' + SET @sysType = '''' + END + + IF @typeofobject = ''SP'' + BEGIN + SET @sysTarget = ''sys.procedures'' + SET @sysType = '''' + END + + IF @typeofobject = ''FUNCTIONS'' + BEGIN + SET @sysTarget = ''sys.objects'' + SET @sysType = '' and p.Type IN ( N''''FN'''', N''''IF'''', N''''TF'''', N''''FS'''', N''''FT'''' )'' + END + + IF @typeofobject = ''VIEWS'' + BEGIN + SET @sysTarget = ''sys.views'' + SET @sysType = '''' + END + + SET @Command = @Command + '' +DECLARE SP_cursor CURSOR FOR +SELECT p.name FROM '' + @sysTarget + '' p JOIN sys.schemas s ON s.schema_id = p.schema_id WHERE (p.name like '''''' + @objectname + '''''') and s.name = '''''' + @schemaid + '''' + @sysType + '''''' + +OPEN SP_cursor +FETCH NEXT FROM SP_cursor INTO @SP_Name +WHILE @@FETCH_STATUS = 0 +BEGIN + IF EXISTS(SELECT 1 FROM sys.fn_builtin_permissions(''''OBJECT'''') WHERE permission_name = '''''' + @rightsaction + '''''') + BEGIN + EXEC('''''' + @grantordeny + '' '' + @rightsaction + '' ON ['' + @schemaid + ''].['''' + @SP_Name + ''''] TO ['' + @RoleName + '']'''') + END + FETCH NEXT FROM SP_cursor INTO @SP_Name +END + +CLOSE SP_cursor +DEALLOCATE SP_cursor + +'' + + END + ELSE + BEGIN + + SET @Command = @Command + '' +IF EXISTS(SELECT 1 FROM sys.objects o WITH (NOLOCK) JOIN sys.schemas s ON s.schema_id = o.schema_id WHERE o.name = '''''' + @objectname + '''''' AND o.type IN (N''''U'''',''''P'''',''''V'''',''''FN'''',''''IF'''',''''TF'''') AND s.name = '''''' + @schemaid + '''''') +BEGIN + IF EXISTS(SELECT 1 FROM sys.fn_builtin_permissions(''''OBJECT'''') WHERE permission_name = '''''' + @rightsaction + '''''') + BEGIN + '' + @grantordeny + '' '' + @rightsaction + '' ON ['' + @schemaid + ''].['' + @objectname + ''] TO ['' + @RoleName + ''] + END +END + +'' + END + END + + IF @typeofobject = ''ASSEMBLIES'' + BEGIN + SET @Command = @Command + '' +IF EXISTS(SELECT 1 FROM sys.assemblies WHERE NAME = '''''' + @objectname + '''''') +BEGIN + IF EXISTS(SELECT 1 FROM sys.fn_builtin_permissions(''''ASSEMBLY'''') WHERE permission_name = '''''' + @rightsaction + '''''') + BEGIN + '' + @grantordeny + '' '' + @rightsaction + ''::['' + @objectname + ''] TO ['' + @RoleName + ''] + END +END + +'' + END + + IF @typeofobject = ''ROLE'' + BEGIN + SET @Command = @Command + '' +IF NOT EXISTS (SELECT 1 FROM sys.database_role_members JOIN sys.database_principals roles ON database_role_members.role_principal_id = roles.principal_id JOIN sys.database_principals members ON database_role_members.member_principal_id = members.principal_id WHERE roles.name = '''''' + @rightsaction + '''''' AND members.name = '''''' + @RoleName + '''''') +BEGIN + EXEC sp_addrolemember N'''''' + @rightsaction + '''''', N'''''' + @RoleName + '''''' +END + +'' + END + + FETCH NEXT FROM SecurablesCurs INTO @typeofobject, @grantordeny, @rightsaction, @objectname, @schemaid + END + +CLOSE SecurablesCurs +DEALLOCATE SecurablesCurs + +PRINT ''SET ALL SECURABLES ON ROLE ['' + @RoleName + '']'' +EXEC sp_executesql @Command + +END +ELSE +BEGIN + + DECLARE SecurablesCurs CURSOR FOR + SELECT typeofobject, grantordeny, rightsaction, objectname, schemaid + FROM #Securables + WHERE N2 = 0 + + OPEN SecurablesCurs + FETCH NEXT FROM SecurablesCurs INTO @typeofobject, @grantordeny, @rightsaction, @objectname, @schemaid + WHILE @@FETCH_STATUS = 0 + BEGIN + + IF @typeofobject = ''DB'' + BEGIN + IF EXISTS(SELECT 1 FROM sys.fn_builtin_permissions(''DATABASE'') WHERE permission_name = '''' + @rightsaction + '''') + BEGIN + SET @Command = @Command + @grantordeny + '' '' + @rightsaction + '' TO ['' + @RoleName + ''] +'' + END + END + + IF @typeofobject = ''SCHEMA'' + BEGIN + SET @Command = @Command + '' +IF EXISTS (SELECT 1 FROM sys.schemas WHERE name = '''''' + @schemaid + '''''') +BEGIN + IF EXISTS(SELECT 1 FROM sys.fn_builtin_permissions(''''SCHEMA'''') WHERE permission_name = '''''' + @rightsaction + '''''') + BEGIN + '' + @grantordeny + '' '' + @rightsaction + '' ON SCHEMA::'' + @schemaid + '' TO ['' + @RoleName + ''] + END +END + +'' + END + + IF @typeofobject in(''TABLE'',''SP'',''FUNCTIONS'',''VIEWS'') + BEGIN + + IF @objectname like ''%[%]%'' + BEGIN + + IF @typeofobject = ''TABLE'' + BEGIN + SET @sysTarget = ''sys.tables'' + SET @sysType = '''' + END + + IF @typeofobject = ''SP'' + BEGIN + SET @sysTarget = ''sys.procedures'' + SET @sysType = '''' + END + + IF @typeofobject = ''FUNCTIONS'' + BEGIN + SET @sysTarget = ''sys.objects'' + SET @sysType = '' and p.Type IN ( N''''FN'''', N''''IF'''', N''''TF'''', N''''FS'''', N''''FT'''' )'' + END + + IF @typeofobject = ''VIEWS'' + BEGIN + SET @sysTarget = ''sys.views'' + SET @sysType = '''' + END + + SET @Command = @Command + '' +DECLARE SP_cursor CURSOR FOR +SELECT p.name FROM '' + @sysTarget + '' p JOIN sys.schemas s ON s.schema_id = p.schema_id WHERE (p.name like '''''' + @objectname + '''''') and s.name = '''''' + @schemaid + '''' + @sysType + '''''' + +OPEN SP_cursor +FETCH NEXT FROM SP_cursor INTO @SP_Name +WHILE @@FETCH_STATUS = 0 +BEGIN + IF EXISTS(SELECT 1 FROM sys.fn_builtin_permissions(''''OBJECT'''') WHERE permission_name = '''''' + @rightsaction + '''''') + BEGIN + EXEC('''''' + @grantordeny + '' '' + @rightsaction + '' ON ['' + @schemaid + ''].['''' + @SP_Name + ''''] TO ['' + @RoleName + '']'''') + END + FETCH NEXT FROM SP_cursor INTO @SP_Name +END + +CLOSE SP_cursor +DEALLOCATE SP_cursor + +'' + + END + ELSE + BEGIN + + SET @Command = @Command + '' +IF EXISTS(SELECT 1 FROM sys.objects o WITH (NOLOCK) JOIN sys.schemas s ON s.schema_id = o.schema_id WHERE o.name = '''''' + @objectname + '''''' AND o.type IN (N''''U'''',''''P'''',''''V'''',''''FN'''',''''IF'''',''''TF'''') AND s.name = '''''' + @schemaid + '''''') +BEGIN + IF EXISTS(SELECT 1 FROM sys.fn_builtin_permissions(''''OBJECT'''') WHERE permission_name = '''''' + @rightsaction + '''''') + BEGIN + '' + @grantordeny + '' '' + @rightsaction + '' ON ['' + @schemaid + ''].['' + @objectname + ''] TO ['' + @RoleName + ''] + END +END + +'' + END + END + + IF @typeofobject = ''ASSEMBLIES'' + BEGIN + SET @Command = @Command + '' +IF EXISTS(SELECT 1 FROM sys.assemblies WHERE NAME = '''''' + @objectname + '''''') +BEGIN + IF EXISTS(SELECT 1 FROM sys.fn_builtin_permissions(''''ASSEMBLY'''') WHERE permission_name = '''''' + @rightsaction + '''''') + BEGIN + '' + @grantordeny + '' '' + @rightsaction + ''::['' + @objectname + ''] TO ['' + @RoleName + ''] + END +END + +'' + END + + IF @typeofobject = ''ROLE'' + BEGIN + SET @Command = @Command + '' +IF NOT EXISTS (SELECT 1 FROM sys.database_role_members JOIN sys.database_principals roles ON database_role_members.role_principal_id = roles.principal_id JOIN sys.database_principals members ON database_role_members.member_principal_id = members.principal_id WHERE roles.name = '''''' + @rightsaction + '''''' AND members.name = '''''' + @RoleName + '''''') +BEGIN + EXEC sp_addrolemember N'''''' + @rightsaction + '''''', N'''''' + @RoleName + '''''' +END + +'' + END + + FETCH NEXT FROM SecurablesCurs INTO @typeofobject, @grantordeny, @rightsaction, @objectname, @schemaid + END + +CLOSE SecurablesCurs +DEALLOCATE SecurablesCurs + +PRINT ''SET ALL SECURABLES ON ROLE ['' + @RoleName + '']'' +EXEC sp_executesql @Command + +END + +/* ADD USER */ +DECLARE UsersCurs CURSOR FOR +SELECT username + FROM #UsersOnRole + +OPEN UsersCurs + +FETCH NEXT FROM UsersCurs INTO @Users +WHILE @@FETCH_STATUS = 0 +BEGIN + + SELECT @Command = '' +EXEC sp_addrolemember N'''''' + @RoleName + '''''', N'''''' + @Users + '''''' +PRINT ''''ADD USER ['' + @Users + ''] ON ROLE ['' + @RoleName + '']'''' +'' + +FETCH NEXT FROM UsersCurs INTO @Users +END + +CLOSE UsersCurs +DEALLOCATE UsersCurs + +EXEC sp_executesql @Command + +/*============================================================================= + Drop temp tables +=============================================================================*/ +DROP TABLE #Securables +DROP TABLE #UsersOnRole','ActiveSystemServer','Pharmacies') + +INSERT INTO #AllRoles(STR_Definition,STR_Database,STR_Product)VALUES(' + +/*============================================================================= + + Script to create dbRoleTPPos role. + + Role Name: dbRoleTPPos + TEMPLATE: Default + + EXAMPLE OF SECURABLES TO SET: + + INSERT INTO #Securables + VALUES + (''DB'',''GRANT'',''VIEW DEFINITION'','''',''''), + (''SCHEMA'',''GRANT'',''SELECT,EXECUTE,INSERT,UPDATE,DELETE'','''',''AP''), + (''TABLE'',''GRANT'',''INSERT,UPDATE'',''Address'',''dbo''), + (''SP'',''GRANT'',''EXECUTE'',''sp_bmc_GetNextID'',''dbo''), + (''ROLE'',''GRANT'',''db_datareader'','''','''') + + ----------------------------------------------- + +Generate date : 2023-05-12 / up208700 + +=============================================================================*/ + +DECLARE @Command nvarchar(max), + @RoleName varchar(60), + @Users varchar(255), + @typeofobject varchar(50), + @grantordeny varchar(10), + @rightsaction varchar(255), + @objectname varchar(255), + @schemaid varchar(10), + @sysTarget varchar(255), + @sysType varchar(255) + +SET @RoleName = ''dbRoleTPPos'' +SET @Command = '''' + +/* TEMP TABLES */ +CREATE TABLE #UsersOnRole(username varchar(255)) +CREATE TABLE #Securables(typeofobject varchar(50), grantordeny varchar(10), rightsaction varchar(255), objectname varchar(255), schemaid varchar(10),N2 bit) + +/* !!! LIST OF SECURABLES TO CHANGE !!! */ + +INSERT INTO #Securables +VALUES +(''DB'',''GRANT'',''EXECUTE'','''',''dbo'',0) +,(''ROLE'',''GRANT'',''DB_DATAREADER'','''',''dbo'',0) +,(''ROLE'',''GRANT'',''DB_DATAWRITER'','''',''dbo'',0) +,(''ROLE'',''GRANT'',''DB_DDLADMIN'','''',''dbo'',0) + + +/* GET ALL USERS ON THIS ROLE */ +INSERT INTO #UsersOnRole +SELECT + members.name +FROM sys.database_role_members + JOIN sys.database_principals roles ON database_role_members.role_principal_id = roles.principal_id + JOIN sys.database_principals members ON database_role_members.member_principal_id = members.principal_id +WHERE roles.name = @RoleName + +/* CREATE ROLE */ +SELECT @Command = '' +IF NOT EXISTS (SELECT 1 FROM sys.database_principals WHERE name = '''''' + @RoleName + '''''' AND type = ''''R'''') +BEGIN + CREATE ROLE ['' + @RoleName + ''] AUTHORIZATION [dbo] + PRINT ''''CREATE ROLE ['' + @RoleName + '']'''' +END +'' +EXEC sp_executesql @Command + +SET @Command = '' +DECLARE @SP_Name varchar(255) + +'' + +/* SET ALL ROLE SECURABLES */ +DECLARE SecurablesCurs CURSOR FOR +SELECT typeofobject, grantordeny, rightsaction, objectname, schemaid +FROM #Securables +WHERE N2 = 0 + +OPEN SecurablesCurs +FETCH NEXT FROM SecurablesCurs INTO @typeofobject, @grantordeny, @rightsaction, @objectname, @schemaid +WHILE @@FETCH_STATUS = 0 +BEGIN + + IF @typeofobject = ''DB'' + BEGIN + IF EXISTS(SELECT 1 FROM sys.fn_builtin_permissions(''DATABASE'') WHERE permission_name = '''' + @rightsaction + '''') + BEGIN + SET @Command = @Command + @grantordeny + '' '' + @rightsaction + '' TO ['' + @RoleName + ''] +'' + END + END + + IF @typeofobject = ''SCHEMA'' + BEGIN + SET @Command = @Command + '' +IF EXISTS (SELECT 1 FROM sys.schemas WHERE name = '''''' + @schemaid + '''''') +BEGIN + IF EXISTS(SELECT 1 FROM sys.fn_builtin_permissions(''''SCHEMA'''') WHERE permission_name = '''''' + @rightsaction + '''''') + BEGIN + '' + @grantordeny + '' '' + @rightsaction + '' ON SCHEMA::'' + @schemaid + '' TO ['' + @RoleName + ''] + END +END + +'' + END + + IF @typeofobject in(''TABLE'',''SP'',''FUNCTIONS'',''VIEWS'') + BEGIN + + IF @objectname like ''%[%]%'' + BEGIN + + IF @typeofobject = ''TABLE'' + BEGIN + SET @sysTarget = ''sys.tables'' + SET @sysType = '''' + END + + IF @typeofobject = ''SP'' + BEGIN + SET @sysTarget = ''sys.procedures'' + SET @sysType = '''' + END + + IF @typeofobject = ''FUNCTIONS'' + BEGIN + SET @sysTarget = ''sys.objects'' + SET @sysType = '' and p.Type IN ( N''''FN'''', N''''IF'''', N''''TF'''', N''''FS'''', N''''FT'''' )'' + END + + IF @typeofobject = ''VIEWS'' + BEGIN + SET @sysTarget = ''sys.views'' + SET @sysType = '''' + END + + SET @Command = @Command + '' +DECLARE SP_cursor CURSOR FOR +SELECT p.name FROM '' + @sysTarget + '' p JOIN sys.schemas s ON s.schema_id = p.schema_id WHERE (p.name like '''''' + @objectname + '''''') and s.name = '''''' + @schemaid + '''' + @sysType + '''''' + +OPEN SP_cursor +FETCH NEXT FROM SP_cursor INTO @SP_Name +WHILE @@FETCH_STATUS = 0 +BEGIN + IF EXISTS(SELECT 1 FROM sys.fn_builtin_permissions(''''OBJECT'''') WHERE permission_name = '''''' + @rightsaction + '''''') + BEGIN + EXEC('''''' + @grantordeny + '' '' + @rightsaction + '' ON ['' + @schemaid + ''].['''' + @SP_Name + ''''] TO ['' + @RoleName + '']'''') + END + FETCH NEXT FROM SP_cursor INTO @SP_Name +END + +CLOSE SP_cursor +DEALLOCATE SP_cursor + +'' + + END + ELSE + BEGIN + + SET @Command = @Command + '' +IF EXISTS(SELECT 1 FROM sys.objects o WITH (NOLOCK) JOIN sys.schemas s ON s.schema_id = o.schema_id WHERE o.name = '''''' + @objectname + '''''' AND o.type IN (N''''U'''',''''P'''',''''V'''',''''FN'''',''''IF'''',''''TF'''') AND s.name = '''''' + @schemaid + '''''') +BEGIN + IF EXISTS(SELECT 1 FROM sys.fn_builtin_permissions(''''OBJECT'''') WHERE permission_name = '''''' + @rightsaction + '''''') + BEGIN + '' + @grantordeny + '' '' + @rightsaction + '' ON ['' + @schemaid + ''].['' + @objectname + ''] TO ['' + @RoleName + ''] + END +END + +'' + END +END + +IF @typeofobject = ''ASSEMBLIES'' +BEGIN + SET @Command = @Command + '' +IF EXISTS(SELECT 1 FROM sys.assemblies WHERE NAME = '''''' + @objectname + '''''') +BEGIN + IF EXISTS(SELECT 1 FROM sys.fn_builtin_permissions(''''ASSEMBLY'''') WHERE permission_name = '''''' + @rightsaction + '''''') + BEGIN + '' + @grantordeny + '' '' + @rightsaction + ''::['' + @objectname + ''] TO ['' + @RoleName + ''] + END +END + +'' +END + +IF @typeofobject = ''ROLE'' +BEGIN + SET @Command = @Command + '' +IF NOT EXISTS (SELECT 1 FROM sys.database_role_members JOIN sys.database_principals roles ON database_role_members.role_principal_id = roles.principal_id JOIN sys.database_principals members ON database_role_members.member_principal_id = members.principal_id WHERE roles.name = '''''' + @rightsaction + '''''' AND members.name = '''''' + @RoleName + '''''') +BEGIN + EXEC sp_addrolemember N'''''' + @rightsaction + '''''', N'''''' + @RoleName + '''''' +END + +'' +END + +FETCH NEXT FROM SecurablesCurs INTO @typeofobject, @grantordeny, @rightsaction, @objectname, @schemaid +END + +CLOSE SecurablesCurs +DEALLOCATE SecurablesCurs + +PRINT ''SET ALL SECURABLES ON ROLE ['' + @RoleName + '']'' +EXEC sp_executesql @Command + +/* ADD USER */ +DECLARE UsersCurs CURSOR FOR +SELECT username + FROM #UsersOnRole + +OPEN UsersCurs + +FETCH NEXT FROM UsersCurs INTO @Users +WHILE @@FETCH_STATUS = 0 +BEGIN + + SELECT @Command = '' +EXEC sp_addrolemember N'''''' + @RoleName + '''''', N'''''' + @Users + '''''' +PRINT ''''ADD USER ['' + @Users + ''] ON ROLE ['' + @RoleName + '']'''' +'' + +FETCH NEXT FROM UsersCurs INTO @Users +END + +CLOSE UsersCurs +DEALLOCATE UsersCurs + +EXEC sp_executesql @Command + + +/*============================================================================= + Drop temp tables +=============================================================================*/ +DROP TABLE #Securables +DROP TABLE #UsersOnRole +','ActiveSystemServer','Pharmacies') + +INSERT INTO #AllRoles(STR_Definition,STR_Database,STR_Product)VALUES(' + +/*============================================================================= + + Script to create dbRoleActivePharmacy role. + + Role Name: dbRoleActivePharmacy + TEMPLATE: Default + + EXAMPLE OF SECURABLES TO SET: + + INSERT INTO #Securables + VALUES + (''DB'',''GRANT'',''VIEW DEFINITION'','''',''''), + (''SCHEMA'',''GRANT'',''SELECT,EXECUTE,INSERT,UPDATE,DELETE'','''',''AP''), + (''TABLE'',''GRANT'',''INSERT,UPDATE'',''Address'',''dbo''), + (''SP'',''GRANT'',''EXECUTE'',''sp_bmc_GetNextID'',''dbo''), + (''ROLE'',''GRANT'',''db_datareader'','''','''') + + ----------------------------------------------- + +Generate date : 2023-05-12 / up208700 + +=============================================================================*/ + +DECLARE @Command nvarchar(max), + @RoleName varchar(60), + @Users varchar(255), + @typeofobject varchar(50), + @grantordeny varchar(10), + @rightsaction varchar(255), + @objectname varchar(255), + @schemaid varchar(10), + @sysTarget varchar(255), + @sysType varchar(255) + +SET @RoleName = ''dbRoleActivePharmacy'' +SET @Command = '''' + +/* TEMP TABLES */ +CREATE TABLE #UsersOnRole(username varchar(255)) +CREATE TABLE #Securables(typeofobject varchar(50), grantordeny varchar(10), rightsaction varchar(255), objectname varchar(255), schemaid varchar(10),N2 bit) + +/* !!! LIST OF SECURABLES TO CHANGE !!! */ + +INSERT INTO #Securables +VALUES +(''DB'',''GRANT'',''EXECUTE'','''',''dbo'',0) +,(''ROLE'',''GRANT'',''DB_DATAREADER'','''',''dbo'',0) +,(''ROLE'',''GRANT'',''DB_DATAWRITER'','''',''dbo'',0) + + +/* GET ALL USERS ON THIS ROLE */ +INSERT INTO #UsersOnRole +SELECT + members.name +FROM sys.database_role_members + JOIN sys.database_principals roles ON database_role_members.role_principal_id = roles.principal_id + JOIN sys.database_principals members ON database_role_members.member_principal_id = members.principal_id +WHERE roles.name = @RoleName + +/* CREATE ROLE */ +SELECT @Command = '' +IF NOT EXISTS (SELECT 1 FROM sys.database_principals WHERE name = '''''' + @RoleName + '''''' AND type = ''''R'''') +BEGIN + CREATE ROLE ['' + @RoleName + ''] AUTHORIZATION [dbo] + PRINT ''''CREATE ROLE ['' + @RoleName + '']'''' +END +'' +EXEC sp_executesql @Command + +SET @Command = '' +DECLARE @SP_Name varchar(255) + +'' + +/* SET ALL ROLE SECURABLES */ +DECLARE SecurablesCurs CURSOR FOR +SELECT typeofobject, grantordeny, rightsaction, objectname, schemaid +FROM #Securables +WHERE N2 = 0 + +OPEN SecurablesCurs +FETCH NEXT FROM SecurablesCurs INTO @typeofobject, @grantordeny, @rightsaction, @objectname, @schemaid +WHILE @@FETCH_STATUS = 0 +BEGIN + + IF @typeofobject = ''DB'' + BEGIN + IF EXISTS(SELECT 1 FROM sys.fn_builtin_permissions(''DATABASE'') WHERE permission_name = '''' + @rightsaction + '''') + BEGIN + SET @Command = @Command + @grantordeny + '' '' + @rightsaction + '' TO ['' + @RoleName + ''] +'' + END + END + + IF @typeofobject = ''SCHEMA'' + BEGIN + SET @Command = @Command + '' +IF EXISTS (SELECT 1 FROM sys.schemas WHERE name = '''''' + @schemaid + '''''') +BEGIN + IF EXISTS(SELECT 1 FROM sys.fn_builtin_permissions(''''SCHEMA'''') WHERE permission_name = '''''' + @rightsaction + '''''') + BEGIN + '' + @grantordeny + '' '' + @rightsaction + '' ON SCHEMA::'' + @schemaid + '' TO ['' + @RoleName + ''] + END +END + +'' + END + + IF @typeofobject in(''TABLE'',''SP'',''FUNCTIONS'',''VIEWS'') + BEGIN + + IF @objectname like ''%[%]%'' + BEGIN + + IF @typeofobject = ''TABLE'' + BEGIN + SET @sysTarget = ''sys.tables'' + SET @sysType = '''' + END + + IF @typeofobject = ''SP'' + BEGIN + SET @sysTarget = ''sys.procedures'' + SET @sysType = '''' + END + + IF @typeofobject = ''FUNCTIONS'' + BEGIN + SET @sysTarget = ''sys.objects'' + SET @sysType = '' and p.Type IN ( N''''FN'''', N''''IF'''', N''''TF'''', N''''FS'''', N''''FT'''' )'' + END + + IF @typeofobject = ''VIEWS'' + BEGIN + SET @sysTarget = ''sys.views'' + SET @sysType = '''' + END + + SET @Command = @Command + '' +DECLARE SP_cursor CURSOR FOR +SELECT p.name FROM '' + @sysTarget + '' p JOIN sys.schemas s ON s.schema_id = p.schema_id WHERE (p.name like '''''' + @objectname + '''''') and s.name = '''''' + @schemaid + '''' + @sysType + '''''' + +OPEN SP_cursor +FETCH NEXT FROM SP_cursor INTO @SP_Name +WHILE @@FETCH_STATUS = 0 +BEGIN + IF EXISTS(SELECT 1 FROM sys.fn_builtin_permissions(''''OBJECT'''') WHERE permission_name = '''''' + @rightsaction + '''''') + BEGIN + EXEC('''''' + @grantordeny + '' '' + @rightsaction + '' ON ['' + @schemaid + ''].['''' + @SP_Name + ''''] TO ['' + @RoleName + '']'''') + END + FETCH NEXT FROM SP_cursor INTO @SP_Name +END + +CLOSE SP_cursor +DEALLOCATE SP_cursor + +'' + + END + ELSE + BEGIN + + SET @Command = @Command + '' +IF EXISTS(SELECT 1 FROM sys.objects o WITH (NOLOCK) JOIN sys.schemas s ON s.schema_id = o.schema_id WHERE o.name = '''''' + @objectname + '''''' AND o.type IN (N''''U'''',''''P'''',''''V'''',''''FN'''',''''IF'''',''''TF'''') AND s.name = '''''' + @schemaid + '''''') +BEGIN + IF EXISTS(SELECT 1 FROM sys.fn_builtin_permissions(''''OBJECT'''') WHERE permission_name = '''''' + @rightsaction + '''''') + BEGIN + '' + @grantordeny + '' '' + @rightsaction + '' ON ['' + @schemaid + ''].['' + @objectname + ''] TO ['' + @RoleName + ''] + END +END + +'' + END +END + +IF @typeofobject = ''ASSEMBLIES'' +BEGIN + SET @Command = @Command + '' +IF EXISTS(SELECT 1 FROM sys.assemblies WHERE NAME = '''''' + @objectname + '''''') +BEGIN + IF EXISTS(SELECT 1 FROM sys.fn_builtin_permissions(''''ASSEMBLY'''') WHERE permission_name = '''''' + @rightsaction + '''''') + BEGIN + '' + @grantordeny + '' '' + @rightsaction + ''::['' + @objectname + ''] TO ['' + @RoleName + ''] + END +END + +'' +END + +IF @typeofobject = ''ROLE'' +BEGIN + SET @Command = @Command + '' +IF NOT EXISTS (SELECT 1 FROM sys.database_role_members JOIN sys.database_principals roles ON database_role_members.role_principal_id = roles.principal_id JOIN sys.database_principals members ON database_role_members.member_principal_id = members.principal_id WHERE roles.name = '''''' + @rightsaction + '''''' AND members.name = '''''' + @RoleName + '''''') +BEGIN + EXEC sp_addrolemember N'''''' + @rightsaction + '''''', N'''''' + @RoleName + '''''' +END + +'' +END + +FETCH NEXT FROM SecurablesCurs INTO @typeofobject, @grantordeny, @rightsaction, @objectname, @schemaid +END + +CLOSE SecurablesCurs +DEALLOCATE SecurablesCurs + +PRINT ''SET ALL SECURABLES ON ROLE ['' + @RoleName + '']'' +EXEC sp_executesql @Command + +/* ADD USER */ +DECLARE UsersCurs CURSOR FOR +SELECT username + FROM #UsersOnRole + +OPEN UsersCurs + +FETCH NEXT FROM UsersCurs INTO @Users +WHILE @@FETCH_STATUS = 0 +BEGIN + + SELECT @Command = '' +EXEC sp_addrolemember N'''''' + @RoleName + '''''', N'''''' + @Users + '''''' +PRINT ''''ADD USER ['' + @Users + ''] ON ROLE ['' + @RoleName + '']'''' +'' + +FETCH NEXT FROM UsersCurs INTO @Users +END + +CLOSE UsersCurs +DEALLOCATE UsersCurs + +EXEC sp_executesql @Command + + +/*============================================================================= + Drop temp tables +=============================================================================*/ +DROP TABLE #Securables +DROP TABLE #UsersOnRole +','Arizona','Pharmacies') + +INSERT INTO #AllRoles(STR_Definition,STR_Database,STR_Product)VALUES(' + +/*============================================================================= + + Script to create dbRoleArizonaCASH role. + + Role Name: dbRoleArizonaCASH + TEMPLATE: Default + + EXAMPLE OF SECURABLES TO SET: + + INSERT INTO #Securables + VALUES + (''DB'',''GRANT'',''VIEW DEFINITION'','''',''''), + (''SCHEMA'',''GRANT'',''SELECT,EXECUTE,INSERT,UPDATE,DELETE'','''',''AP''), + (''TABLE'',''GRANT'',''INSERT,UPDATE'',''Address'',''dbo''), + (''SP'',''GRANT'',''EXECUTE'',''sp_bmc_GetNextID'',''dbo''), + (''ROLE'',''GRANT'',''db_datareader'','''','''') + + ----------------------------------------------- + +Generate date : 2023-05-12 / up208700 + +=============================================================================*/ + +DECLARE @Command nvarchar(max), + @RoleName varchar(60), + @Users varchar(255), + @typeofobject varchar(50), + @grantordeny varchar(10), + @rightsaction varchar(255), + @objectname varchar(255), + @schemaid varchar(10), + @sysTarget varchar(255), + @sysType varchar(255) + +SET @RoleName = ''dbRoleArizonaCASH'' +SET @Command = '''' + +/* TEMP TABLES */ +CREATE TABLE #UsersOnRole(username varchar(255)) +CREATE TABLE #Securables(typeofobject varchar(50), grantordeny varchar(10), rightsaction varchar(255), objectname varchar(255), schemaid varchar(10),N2 bit) + +/* !!! LIST OF SECURABLES TO CHANGE !!! */ + +INSERT INTO #Securables +VALUES +(''SP'',''GRANT'',''EXECUTE'',''aps_Check_Database_Version'',''dbo'',0) +,(''SP'',''GRANT'',''EXECUTE'',''sp_bmc_Bmc_Applic_Default'',''dbo'',0) +,(''TABLE'',''GRANT'',''SELECT'',''Currency_Rate'',''dbo'',0) +,(''TABLE'',''GRANT'',''SELECT'',''Document_line'',''dbo'',0) +,(''TABLE'',''GRANT'',''SELECT'',''Item'',''dbo'',0) +,(''TABLE'',''GRANT'',''SELECT'',''item_key'',''dbo'',0) +,(''TABLE'',''GRANT'',''SELECT'',''Item_text'',''dbo'',0) +,(''TABLE'',''GRANT'',''SELECT'',''Language'',''dbo'',0) +,(''TABLE'',''GRANT'',''SELECT'',''PH_item'',''dbo'',0) +,(''TABLE'',''GRANT'',''SELECT'',''PH_refund_code'',''dbo'',0) +,(''TABLE'',''GRANT'',''SELECT'',''Sales_Tax_Rate'',''dbo'',0) +,(''TABLE'',''GRANT'',''SELECT'',''Stock_trans_effective_cost'',''dbo'',0) +,(''TABLE'',''GRANT'',''SELECT'',''Stock_transaction'',''dbo'',0) +,(''TABLE'',''GRANT'',''SELECT'',''Stock_transaction_master'',''dbo'',0) +,(''TABLE'',''GRANT'',''SELECT'',''TT_GetNext_ID'',''dbo'',0) +,(''TABLE'',''GRANT'',''UPDATE'',''TT_GetNext_ID'',''dbo'',0) + + +/* GET ALL USERS ON THIS ROLE */ +INSERT INTO #UsersOnRole +SELECT + members.name +FROM sys.database_role_members + JOIN sys.database_principals roles ON database_role_members.role_principal_id = roles.principal_id + JOIN sys.database_principals members ON database_role_members.member_principal_id = members.principal_id +WHERE roles.name = @RoleName + +/* CREATE ROLE */ +SELECT @Command = '' +IF NOT EXISTS (SELECT 1 FROM sys.database_principals WHERE name = '''''' + @RoleName + '''''' AND type = ''''R'''') +BEGIN + CREATE ROLE ['' + @RoleName + ''] AUTHORIZATION [dbo] + PRINT ''''CREATE ROLE ['' + @RoleName + '']'''' +END +'' +EXEC sp_executesql @Command + +SET @Command = '' +DECLARE @SP_Name varchar(255) + +'' + +/* SET ALL ROLE SECURABLES */ +DECLARE SecurablesCurs CURSOR FOR +SELECT typeofobject, grantordeny, rightsaction, objectname, schemaid +FROM #Securables +WHERE N2 = 0 + +OPEN SecurablesCurs +FETCH NEXT FROM SecurablesCurs INTO @typeofobject, @grantordeny, @rightsaction, @objectname, @schemaid +WHILE @@FETCH_STATUS = 0 +BEGIN + + IF @typeofobject = ''DB'' + BEGIN + IF EXISTS(SELECT 1 FROM sys.fn_builtin_permissions(''DATABASE'') WHERE permission_name = '''' + @rightsaction + '''') + BEGIN + SET @Command = @Command + @grantordeny + '' '' + @rightsaction + '' TO ['' + @RoleName + ''] +'' + END + END + + IF @typeofobject = ''SCHEMA'' + BEGIN + SET @Command = @Command + '' +IF EXISTS (SELECT 1 FROM sys.schemas WHERE name = '''''' + @schemaid + '''''') +BEGIN + IF EXISTS(SELECT 1 FROM sys.fn_builtin_permissions(''''SCHEMA'''') WHERE permission_name = '''''' + @rightsaction + '''''') + BEGIN + '' + @grantordeny + '' '' + @rightsaction + '' ON SCHEMA::'' + @schemaid + '' TO ['' + @RoleName + ''] + END +END + +'' + END + + IF @typeofobject in(''TABLE'',''SP'',''FUNCTIONS'',''VIEWS'') + BEGIN + + IF @objectname like ''%[%]%'' + BEGIN + + IF @typeofobject = ''TABLE'' + BEGIN + SET @sysTarget = ''sys.tables'' + SET @sysType = '''' + END + + IF @typeofobject = ''SP'' + BEGIN + SET @sysTarget = ''sys.procedures'' + SET @sysType = '''' + END + + IF @typeofobject = ''FUNCTIONS'' + BEGIN + SET @sysTarget = ''sys.objects'' + SET @sysType = '' and p.Type IN ( N''''FN'''', N''''IF'''', N''''TF'''', N''''FS'''', N''''FT'''' )'' + END + + IF @typeofobject = ''VIEWS'' + BEGIN + SET @sysTarget = ''sys.views'' + SET @sysType = '''' + END + + SET @Command = @Command + '' +DECLARE SP_cursor CURSOR FOR +SELECT p.name FROM '' + @sysTarget + '' p JOIN sys.schemas s ON s.schema_id = p.schema_id WHERE (p.name like '''''' + @objectname + '''''') and s.name = '''''' + @schemaid + '''' + @sysType + '''''' + +OPEN SP_cursor +FETCH NEXT FROM SP_cursor INTO @SP_Name +WHILE @@FETCH_STATUS = 0 +BEGIN + IF EXISTS(SELECT 1 FROM sys.fn_builtin_permissions(''''OBJECT'''') WHERE permission_name = '''''' + @rightsaction + '''''') + BEGIN + EXEC('''''' + @grantordeny + '' '' + @rightsaction + '' ON ['' + @schemaid + ''].['''' + @SP_Name + ''''] TO ['' + @RoleName + '']'''') + END + FETCH NEXT FROM SP_cursor INTO @SP_Name +END + +CLOSE SP_cursor +DEALLOCATE SP_cursor + +'' + + END + ELSE + BEGIN + + SET @Command = @Command + '' +IF EXISTS(SELECT 1 FROM sys.objects o WITH (NOLOCK) JOIN sys.schemas s ON s.schema_id = o.schema_id WHERE o.name = '''''' + @objectname + '''''' AND o.type IN (N''''U'''',''''P'''',''''V'''',''''FN'''',''''IF'''',''''TF'''') AND s.name = '''''' + @schemaid + '''''') +BEGIN + IF EXISTS(SELECT 1 FROM sys.fn_builtin_permissions(''''OBJECT'''') WHERE permission_name = '''''' + @rightsaction + '''''') + BEGIN + '' + @grantordeny + '' '' + @rightsaction + '' ON ['' + @schemaid + ''].['' + @objectname + ''] TO ['' + @RoleName + ''] + END +END + +'' + END +END + +IF @typeofobject = ''ASSEMBLIES'' +BEGIN + SET @Command = @Command + '' +IF EXISTS(SELECT 1 FROM sys.assemblies WHERE NAME = '''''' + @objectname + '''''') +BEGIN + IF EXISTS(SELECT 1 FROM sys.fn_builtin_permissions(''''ASSEMBLY'''') WHERE permission_name = '''''' + @rightsaction + '''''') + BEGIN + '' + @grantordeny + '' '' + @rightsaction + ''::['' + @objectname + ''] TO ['' + @RoleName + ''] + END +END + +'' +END + +IF @typeofobject = ''ROLE'' +BEGIN + SET @Command = @Command + '' +IF NOT EXISTS (SELECT 1 FROM sys.database_role_members JOIN sys.database_principals roles ON database_role_members.role_principal_id = roles.principal_id JOIN sys.database_principals members ON database_role_members.member_principal_id = members.principal_id WHERE roles.name = '''''' + @rightsaction + '''''' AND members.name = '''''' + @RoleName + '''''') +BEGIN + EXEC sp_addrolemember N'''''' + @rightsaction + '''''', N'''''' + @RoleName + '''''' +END + +'' +END + +FETCH NEXT FROM SecurablesCurs INTO @typeofobject, @grantordeny, @rightsaction, @objectname, @schemaid +END + +CLOSE SecurablesCurs +DEALLOCATE SecurablesCurs + +PRINT ''SET ALL SECURABLES ON ROLE ['' + @RoleName + '']'' +EXEC sp_executesql @Command + +/* ADD USER */ +DECLARE UsersCurs CURSOR FOR +SELECT username + FROM #UsersOnRole + +OPEN UsersCurs + +FETCH NEXT FROM UsersCurs INTO @Users +WHILE @@FETCH_STATUS = 0 +BEGIN + + SELECT @Command = '' +EXEC sp_addrolemember N'''''' + @RoleName + '''''', N'''''' + @Users + '''''' +PRINT ''''ADD USER ['' + @Users + ''] ON ROLE ['' + @RoleName + '']'''' +'' + +FETCH NEXT FROM UsersCurs INTO @Users +END + +CLOSE UsersCurs +DEALLOCATE UsersCurs + +EXEC sp_executesql @Command + + +/*============================================================================= + Drop temp tables +=============================================================================*/ +DROP TABLE #Securables +DROP TABLE #UsersOnRole +','Arizona','Pharmacies') + +INSERT INTO #AllRoles(STR_Definition,STR_Database,STR_Product)VALUES(' + +/*============================================================================= + + Script to create dbRoleAtlas role. + + Role Name: dbRoleAtlas + TEMPLATE: Default + + EXAMPLE OF SECURABLES TO SET: + + INSERT INTO #Securables + VALUES + (''DB'',''GRANT'',''VIEW DEFINITION'','''',''''), + (''SCHEMA'',''GRANT'',''SELECT,EXECUTE,INSERT,UPDATE,DELETE'','''',''AP''), + (''TABLE'',''GRANT'',''INSERT,UPDATE'',''Address'',''dbo''), + (''SP'',''GRANT'',''EXECUTE'',''sp_bmc_GetNextID'',''dbo''), + (''ROLE'',''GRANT'',''db_datareader'','''','''') + + ----------------------------------------------- + +Generate date : 2023-05-12 / up208700 + +=============================================================================*/ + +DECLARE @Command nvarchar(max), + @RoleName varchar(60), + @Users varchar(255), + @typeofobject varchar(50), + @grantordeny varchar(10), + @rightsaction varchar(255), + @objectname varchar(255), + @schemaid varchar(10), + @sysTarget varchar(255), + @sysType varchar(255) + +SET @RoleName = ''dbRoleAtlas'' +SET @Command = '''' + +/* TEMP TABLES */ +CREATE TABLE #UsersOnRole(username varchar(255)) +CREATE TABLE #Securables(typeofobject varchar(50), grantordeny varchar(10), rightsaction varchar(255), objectname varchar(255), schemaid varchar(10),N2 bit) + +/* !!! LIST OF SECURABLES TO CHANGE !!! */ + +INSERT INTO #Securables +VALUES +(''SCHEMA'',''GRANT'',''DELETE'',''Entire Schema'',''atl'',0) +,(''SCHEMA'',''GRANT'',''EXECUTE'',''Entire Schema'',''atl'',0) +,(''SCHEMA'',''GRANT'',''INSERT'',''Entire Schema'',''atl'',0) +,(''SCHEMA'',''GRANT'',''SELECT'',''Entire Schema'',''atl'',0) +,(''SCHEMA'',''GRANT'',''UPDATE'',''Entire Schema'',''atl'',0) +,(''SP'',''GRANT'',''EXECUTE'',''aps_Document_Flow'',''dbo'',0) +,(''SP'',''GRANT'',''EXECUTE'',''sp_bmc_Bmc_Applic_Default'',''dbo'',0) +,(''TABLE'',''GRANT'',''SELECT'',''Account_link'',''dbo'',0) +,(''TABLE'',''GRANT'',''SELECT'',''Address'',''dbo'',0) +,(''TABLE'',''GRANT'',''SELECT'',''Address_key'',''dbo'',0) +,(''TABLE'',''GRANT'',''SELECT'',''Bmc_application_default'',''dbo'',0) +,(''TABLE'',''GRANT'',''SELECT'',''Bmc_application_key'',''dbo'',0) +,(''TABLE'',''GRANT'',''SELECT'',''Bmc_user_profile'',''dbo'',0) +,(''TABLE'',''GRANT'',''SELECT'',''Customer'',''dbo'',0) +,(''TABLE'',''GRANT'',''SELECT'',''Document_header'',''dbo'',0) +,(''TABLE'',''GRANT'',''SELECT'',''Document_line'',''dbo'',0) +,(''TABLE'',''GRANT'',''SELECT'',''Document_line_link'',''dbo'',0) +,(''TABLE'',''GRANT'',''SELECT'',''Document_type'',''dbo'',0) +,(''TABLE'',''GRANT'',''SELECT'',''Entry'',''dbo'',0) +,(''TABLE'',''GRANT'',''SELECT'',''Entry_reconciliation'',''dbo'',0) +,(''TABLE'',''GRANT'',''SELECT'',''Item_key'',''dbo'',0) +,(''TABLE'',''GRANT'',''SELECT'',''Organizational_unit'',''dbo'',0) +,(''TABLE'',''GRANT'',''SELECT'',''OU_store_history'',''dbo'',0) +,(''TABLE'',''GRANT'',''SELECT'',''PH_insurance'',''dbo'',0) +,(''TABLE'',''GRANT'',''SELECT'',''PH_insurance_card'',''dbo'',0) +,(''TABLE'',''GRANT'',''SELECT'',''PH_insurance_plan'',''dbo'',0) +,(''TABLE'',''GRANT'',''SELECT'',''PH_prescriber'',''dbo'',0) +,(''TABLE'',''GRANT'',''SELECT'',''PH_prescription_header'',''dbo'',0) +,(''TABLE'',''GRANT'',''SELECT'',''PH_prescription_line'',''dbo'',0) +,(''TABLE'',''GRANT'',''SELECT'',''PHGD_AC'',''dbo'',0) +,(''TABLE'',''GRANT'',''SELECT'',''Predefined_entry'',''dbo'',0) +,(''TABLE'',''GRANT'',''SELECT'',''Sales_tax_code'',''dbo'',0) +,(''TABLE'',''GRANT'',''SELECT'',''Sales_tax_rate'',''dbo'',0) +,(''TABLE'',''GRANT'',''SELECT'',''Stock_transaction_master'',''dbo'',0) +,(''TABLE'',''GRANT'',''SELECT'',''Title_text'',''dbo'',0) +,(''TABLE'',''GRANT'',''UPDATE'',''Document_header'',''dbo'',0) +,(''TABLE'',''GRANT'',''UPDATE'',''Document_line'',''dbo'',0) +,(''TABLE'',''GRANT'',''UPDATE'',''PH_prescription_line'',''dbo'',0) + + +/* GET ALL USERS ON THIS ROLE */ +INSERT INTO #UsersOnRole +SELECT + members.name +FROM sys.database_role_members + JOIN sys.database_principals roles ON database_role_members.role_principal_id = roles.principal_id + JOIN sys.database_principals members ON database_role_members.member_principal_id = members.principal_id +WHERE roles.name = @RoleName + +/* CREATE ROLE */ +SELECT @Command = '' +IF NOT EXISTS (SELECT 1 FROM sys.database_principals WHERE name = '''''' + @RoleName + '''''' AND type = ''''R'''') +BEGIN + CREATE ROLE ['' + @RoleName + ''] AUTHORIZATION [dbo] + PRINT ''''CREATE ROLE ['' + @RoleName + '']'''' +END +'' +EXEC sp_executesql @Command + +SET @Command = '' +DECLARE @SP_Name varchar(255) + +'' + +/* SET ALL ROLE SECURABLES */ +DECLARE SecurablesCurs CURSOR FOR +SELECT typeofobject, grantordeny, rightsaction, objectname, schemaid +FROM #Securables +WHERE N2 = 0 + +OPEN SecurablesCurs +FETCH NEXT FROM SecurablesCurs INTO @typeofobject, @grantordeny, @rightsaction, @objectname, @schemaid +WHILE @@FETCH_STATUS = 0 +BEGIN + + IF @typeofobject = ''DB'' + BEGIN + IF EXISTS(SELECT 1 FROM sys.fn_builtin_permissions(''DATABASE'') WHERE permission_name = '''' + @rightsaction + '''') + BEGIN + SET @Command = @Command + @grantordeny + '' '' + @rightsaction + '' TO ['' + @RoleName + ''] +'' + END + END + + IF @typeofobject = ''SCHEMA'' + BEGIN + SET @Command = @Command + '' +IF EXISTS (SELECT 1 FROM sys.schemas WHERE name = '''''' + @schemaid + '''''') +BEGIN + IF EXISTS(SELECT 1 FROM sys.fn_builtin_permissions(''''SCHEMA'''') WHERE permission_name = '''''' + @rightsaction + '''''') + BEGIN + '' + @grantordeny + '' '' + @rightsaction + '' ON SCHEMA::'' + @schemaid + '' TO ['' + @RoleName + ''] + END +END + +'' + END + + IF @typeofobject in(''TABLE'',''SP'',''FUNCTIONS'',''VIEWS'') + BEGIN + + IF @objectname like ''%[%]%'' + BEGIN + + IF @typeofobject = ''TABLE'' + BEGIN + SET @sysTarget = ''sys.tables'' + SET @sysType = '''' + END + + IF @typeofobject = ''SP'' + BEGIN + SET @sysTarget = ''sys.procedures'' + SET @sysType = '''' + END + + IF @typeofobject = ''FUNCTIONS'' + BEGIN + SET @sysTarget = ''sys.objects'' + SET @sysType = '' and p.Type IN ( N''''FN'''', N''''IF'''', N''''TF'''', N''''FS'''', N''''FT'''' )'' + END + + IF @typeofobject = ''VIEWS'' + BEGIN + SET @sysTarget = ''sys.views'' + SET @sysType = '''' + END + + SET @Command = @Command + '' +DECLARE SP_cursor CURSOR FOR +SELECT p.name FROM '' + @sysTarget + '' p JOIN sys.schemas s ON s.schema_id = p.schema_id WHERE (p.name like '''''' + @objectname + '''''') and s.name = '''''' + @schemaid + '''' + @sysType + '''''' + +OPEN SP_cursor +FETCH NEXT FROM SP_cursor INTO @SP_Name +WHILE @@FETCH_STATUS = 0 +BEGIN + IF EXISTS(SELECT 1 FROM sys.fn_builtin_permissions(''''OBJECT'''') WHERE permission_name = '''''' + @rightsaction + '''''') + BEGIN + EXEC('''''' + @grantordeny + '' '' + @rightsaction + '' ON ['' + @schemaid + ''].['''' + @SP_Name + ''''] TO ['' + @RoleName + '']'''') + END + FETCH NEXT FROM SP_cursor INTO @SP_Name +END + +CLOSE SP_cursor +DEALLOCATE SP_cursor + +'' + + END + ELSE + BEGIN + + SET @Command = @Command + '' +IF EXISTS(SELECT 1 FROM sys.objects o WITH (NOLOCK) JOIN sys.schemas s ON s.schema_id = o.schema_id WHERE o.name = '''''' + @objectname + '''''' AND o.type IN (N''''U'''',''''P'''',''''V'''',''''FN'''',''''IF'''',''''TF'''') AND s.name = '''''' + @schemaid + '''''') +BEGIN + IF EXISTS(SELECT 1 FROM sys.fn_builtin_permissions(''''OBJECT'''') WHERE permission_name = '''''' + @rightsaction + '''''') + BEGIN + '' + @grantordeny + '' '' + @rightsaction + '' ON ['' + @schemaid + ''].['' + @objectname + ''] TO ['' + @RoleName + ''] + END +END + +'' + END +END + +IF @typeofobject = ''ASSEMBLIES'' +BEGIN + SET @Command = @Command + '' +IF EXISTS(SELECT 1 FROM sys.assemblies WHERE NAME = '''''' + @objectname + '''''') +BEGIN + IF EXISTS(SELECT 1 FROM sys.fn_builtin_permissions(''''ASSEMBLY'''') WHERE permission_name = '''''' + @rightsaction + '''''') + BEGIN + '' + @grantordeny + '' '' + @rightsaction + ''::['' + @objectname + ''] TO ['' + @RoleName + ''] + END +END + +'' +END + +IF @typeofobject = ''ROLE'' +BEGIN + SET @Command = @Command + '' +IF NOT EXISTS (SELECT 1 FROM sys.database_role_members JOIN sys.database_principals roles ON database_role_members.role_principal_id = roles.principal_id JOIN sys.database_principals members ON database_role_members.member_principal_id = members.principal_id WHERE roles.name = '''''' + @rightsaction + '''''' AND members.name = '''''' + @RoleName + '''''') +BEGIN + EXEC sp_addrolemember N'''''' + @rightsaction + '''''', N'''''' + @RoleName + '''''' +END + +'' +END + +FETCH NEXT FROM SecurablesCurs INTO @typeofobject, @grantordeny, @rightsaction, @objectname, @schemaid +END + +CLOSE SecurablesCurs +DEALLOCATE SecurablesCurs + +PRINT ''SET ALL SECURABLES ON ROLE ['' + @RoleName + '']'' +EXEC sp_executesql @Command + +/* ADD USER */ +DECLARE UsersCurs CURSOR FOR +SELECT username + FROM #UsersOnRole + +OPEN UsersCurs + +FETCH NEXT FROM UsersCurs INTO @Users +WHILE @@FETCH_STATUS = 0 +BEGIN + + SELECT @Command = '' +EXEC sp_addrolemember N'''''' + @RoleName + '''''', N'''''' + @Users + '''''' +PRINT ''''ADD USER ['' + @Users + ''] ON ROLE ['' + @RoleName + '']'''' +'' + +FETCH NEXT FROM UsersCurs INTO @Users +END + +CLOSE UsersCurs +DEALLOCATE UsersCurs + +EXEC sp_executesql @Command + + +/*============================================================================= + Drop temp tables +=============================================================================*/ +DROP TABLE #Securables +DROP TABLE #UsersOnRole +','Arizona','Pharmacies') + +INSERT INTO #AllRoles(STR_Definition,STR_Database,STR_Product)VALUES(' + +/*============================================================================= + + Script to create dbRoleCsltUsr role. + + Role Name: dbRoleCsltUsr + TEMPLATE: N2 and PROD + + EXAMPLE OF SECURABLES TO SET: + + INSERT INTO #Securables + VALUES + (''DB'',''GRANT'',''VIEW DEFINITION'','''',''''), + (''SCHEMA'',''GRANT'',''SELECT,EXECUTE,INSERT,UPDATE,DELETE'','''',''AP''), + (''TABLE'',''GRANT'',''INSERT,UPDATE'',''Address'',''dbo''), + (''SP'',''GRANT'',''EXECUTE'',''sp_bmc_GetNextID'',''dbo''), + (''ROLE'',''GRANT'',''db_datareader'','''','''') + + ----------------------------------------------- + +Generate date : 2023-05-12 / up208700 + +=============================================================================*/ + +DECLARE @Type varchar(6), + @Command nvarchar(max), + @RoleName varchar(60), + @Users varchar(255), + @typeofobject varchar(50), + @grantordeny varchar(10), + @rightsaction varchar(255), + @objectname varchar(255), + @schemaid varchar(10), + @sysTarget varchar(255), + @sysType varchar(255) + +SET @RoleName = ''dbRoleCsltUsr'' +SET @Command = '''' + +SELECT @Type = [Type] FROM [master].[cfg].[InstanceContext] + +/* TEMP TABLES */ +CREATE TABLE #UsersOnRole(username varchar(255)) +CREATE TABLE #Securables(typeofobject varchar(50), grantordeny varchar(10), rightsaction varchar(255), objectname varchar(255), schemaid varchar(10),N2 bit) + +/* !!! LIST OF SECURABLES TO CHANGE !!! */ + +INSERT INTO #Securables +VALUES +(''DB'',''GRANT'',''EXECUTE'','''',''dbo'',0) +,(''DB'',''GRANT'',''SHOWPLAN'','''',''dbo'',0) +,(''DB'',''GRANT'',''VIEW DEFINITION'','''',''dbo'',0) +,(''ROLE'',''GRANT'',''DB_DATAREADER'','''',''dbo'',0) +,(''ROLE'',''GRANT'',''DB_DATAWRITER'','''',''dbo'',0) +,(''ROLE'',''GRANT'',''DB_OWNER'','''',''dbo'',1) +,(''TABLE'',''DENY'',''DELETE'',''DocumentSignature'',''wkl'',0) +,(''TABLE'',''DENY'',''UPDATE'',''DocumentSignature'',''wkl'',0) + + +/* GET ALL USERS ON THIS ROLE */ +INSERT INTO #UsersOnRole +SELECT + members.name +FROM sys.database_role_members + JOIN sys.database_principals roles ON database_role_members.role_principal_id = roles.principal_id + JOIN sys.database_principals members ON database_role_members.member_principal_id = members.principal_id +WHERE roles.name = @RoleName + +/* CREATE ROLE */ +SELECT @Command = '' +IF NOT EXISTS (SELECT 1 FROM sys.database_principals WHERE name = '''''' + @RoleName + '''''' AND type = ''''R'''') +BEGIN + CREATE ROLE ['' + @RoleName + ''] AUTHORIZATION [dbo] + PRINT ''''CREATE ROLE ['' + @RoleName + '']'''' +END +'' +EXEC sp_executesql @Command + +SET @Command = '' +DECLARE @SP_Name varchar(255) + +'' + +/* SET ALL ROLE SECURABLES */ +IF @Type = ''DEVE'' +BEGIN + + DECLARE SecurablesCurs CURSOR FOR + SELECT typeofobject, grantordeny, rightsaction, objectname, schemaid + FROM #Securables + WHERE N2 = 1 + + OPEN SecurablesCurs + FETCH NEXT FROM SecurablesCurs INTO @typeofobject, @grantordeny, @rightsaction, @objectname, @schemaid + WHILE @@FETCH_STATUS = 0 + BEGIN + + IF @typeofobject = ''DB'' + BEGIN + IF EXISTS(SELECT 1 FROM sys.fn_builtin_permissions(''DATABASE'') WHERE permission_name = '''' + @rightsaction + '''') + BEGIN + SET @Command = @Command + @grantordeny + '' '' + @rightsaction + '' TO ['' + @RoleName + ''] +'' + END + END + + IF @typeofobject = ''SCHEMA'' + BEGIN + SET @Command = @Command + '' +IF EXISTS (SELECT 1 FROM sys.schemas WHERE name = '''''' + @schemaid + '''''') +BEGIN + IF EXISTS(SELECT 1 FROM sys.fn_builtin_permissions(''''SCHEMA'''') WHERE permission_name = '''''' + @rightsaction + '''''') + BEGIN + '' + @grantordeny + '' '' + @rightsaction + '' ON SCHEMA::'' + @schemaid + '' TO ['' + @RoleName + ''] + END +END + +'' + END + + IF @typeofobject in(''TABLE'',''SP'',''FUNCTIONS'',''VIEWS'') + BEGIN + + IF @objectname like ''%[%]%'' + BEGIN + IF @typeofobject = ''TABLE'' + BEGIN + SET @sysTarget = ''sys.tables'' + SET @sysType = '''' + END + + IF @typeofobject = ''SP'' + BEGIN + SET @sysTarget = ''sys.procedures'' + SET @sysType = '''' + END + + IF @typeofobject = ''FUNCTIONS'' + BEGIN + SET @sysTarget = ''sys.objects'' + SET @sysType = '' and p.Type IN ( N''''FN'''', N''''IF'''', N''''TF'''', N''''FS'''', N''''FT'''' )'' + END + + IF @typeofobject = ''VIEWS'' + BEGIN + SET @sysTarget = ''sys.views'' + SET @sysType = '''' + END + + SET @Command = @Command + '' +DECLARE SP_cursor CURSOR FOR +SELECT p.name FROM '' + @sysTarget + '' p JOIN sys.schemas s ON s.schema_id = p.schema_id WHERE (p.name like '''''' + @objectname + '''''') and s.name = '''''' + @schemaid + '''' + @sysType + '''''' + +OPEN SP_cursor +FETCH NEXT FROM SP_cursor INTO @SP_Name +WHILE @@FETCH_STATUS = 0 +BEGIN + IF EXISTS(SELECT 1 FROM sys.fn_builtin_permissions(''''OBJECT'''') WHERE permission_name = '''''' + @rightsaction + '''''') + BEGIN + EXEC('''''' + @grantordeny + '' '' + @rightsaction + '' ON ['' + @schemaid + ''].['''' + @SP_Name + ''''] TO ['' + @RoleName + '']'''') + END + FETCH NEXT FROM SP_cursor INTO @SP_Name +END + +CLOSE SP_cursor +DEALLOCATE SP_cursor + +'' + + END + ELSE + BEGIN + + SET @Command = @Command + '' +IF EXISTS(SELECT 1 FROM sys.objects o WITH (NOLOCK) JOIN sys.schemas s ON s.schema_id = o.schema_id WHERE o.name = '''''' + @objectname + '''''' AND o.type IN (N''''U'''',''''P'''',''''V'''',''''FN'''',''''IF'''',''''TF'''') AND s.name = '''''' + @schemaid + '''''') +BEGIN + IF EXISTS(SELECT 1 FROM sys.fn_builtin_permissions(''''OBJECT'''') WHERE permission_name = '''''' + @rightsaction + '''''') + BEGIN + '' + @grantordeny + '' '' + @rightsaction + '' ON ['' + @schemaid + ''].['' + @objectname + ''] TO ['' + @RoleName + ''] + END +END + +'' + END + END + + IF @typeofobject = ''ASSEMBLIES'' + BEGIN + SET @Command = @Command + '' +IF EXISTS(SELECT 1 FROM sys.assemblies WHERE NAME = '''''' + @objectname + '''''') +BEGIN + IF EXISTS(SELECT 1 FROM sys.fn_builtin_permissions(''''ASSEMBLY'''') WHERE permission_name = '''''' + @rightsaction + '''''') + BEGIN + '' + @grantordeny + '' '' + @rightsaction + ''::['' + @objectname + ''] TO ['' + @RoleName + ''] + END +END + +'' + END + + IF @typeofobject = ''ROLE'' + BEGIN + SET @Command = @Command + '' +IF NOT EXISTS (SELECT 1 FROM sys.database_role_members JOIN sys.database_principals roles ON database_role_members.role_principal_id = roles.principal_id JOIN sys.database_principals members ON database_role_members.member_principal_id = members.principal_id WHERE roles.name = '''''' + @rightsaction + '''''' AND members.name = '''''' + @RoleName + '''''') +BEGIN + EXEC sp_addrolemember N'''''' + @rightsaction + '''''', N'''''' + @RoleName + '''''' +END + +'' + END + + FETCH NEXT FROM SecurablesCurs INTO @typeofobject, @grantordeny, @rightsaction, @objectname, @schemaid + END + +CLOSE SecurablesCurs +DEALLOCATE SecurablesCurs + +PRINT ''SET ALL SECURABLES ON ROLE ['' + @RoleName + '']'' +EXEC sp_executesql @Command + +END +ELSE +BEGIN + + DECLARE SecurablesCurs CURSOR FOR + SELECT typeofobject, grantordeny, rightsaction, objectname, schemaid + FROM #Securables + WHERE N2 = 0 + + OPEN SecurablesCurs + FETCH NEXT FROM SecurablesCurs INTO @typeofobject, @grantordeny, @rightsaction, @objectname, @schemaid + WHILE @@FETCH_STATUS = 0 + BEGIN + + IF @typeofobject = ''DB'' + BEGIN + IF EXISTS(SELECT 1 FROM sys.fn_builtin_permissions(''DATABASE'') WHERE permission_name = '''' + @rightsaction + '''') + BEGIN + SET @Command = @Command + @grantordeny + '' '' + @rightsaction + '' TO ['' + @RoleName + ''] +'' + END + END + + IF @typeofobject = ''SCHEMA'' + BEGIN + SET @Command = @Command + '' +IF EXISTS (SELECT 1 FROM sys.schemas WHERE name = '''''' + @schemaid + '''''') +BEGIN + IF EXISTS(SELECT 1 FROM sys.fn_builtin_permissions(''''SCHEMA'''') WHERE permission_name = '''''' + @rightsaction + '''''') + BEGIN + '' + @grantordeny + '' '' + @rightsaction + '' ON SCHEMA::'' + @schemaid + '' TO ['' + @RoleName + ''] + END +END + +'' + END + + IF @typeofobject in(''TABLE'',''SP'',''FUNCTIONS'',''VIEWS'') + BEGIN + + IF @objectname like ''%[%]%'' + BEGIN + + IF @typeofobject = ''TABLE'' + BEGIN + SET @sysTarget = ''sys.tables'' + SET @sysType = '''' + END + + IF @typeofobject = ''SP'' + BEGIN + SET @sysTarget = ''sys.procedures'' + SET @sysType = '''' + END + + IF @typeofobject = ''FUNCTIONS'' + BEGIN + SET @sysTarget = ''sys.objects'' + SET @sysType = '' and p.Type IN ( N''''FN'''', N''''IF'''', N''''TF'''', N''''FS'''', N''''FT'''' )'' + END + + IF @typeofobject = ''VIEWS'' + BEGIN + SET @sysTarget = ''sys.views'' + SET @sysType = '''' + END + + SET @Command = @Command + '' +DECLARE SP_cursor CURSOR FOR +SELECT p.name FROM '' + @sysTarget + '' p JOIN sys.schemas s ON s.schema_id = p.schema_id WHERE (p.name like '''''' + @objectname + '''''') and s.name = '''''' + @schemaid + '''' + @sysType + '''''' + +OPEN SP_cursor +FETCH NEXT FROM SP_cursor INTO @SP_Name +WHILE @@FETCH_STATUS = 0 +BEGIN + IF EXISTS(SELECT 1 FROM sys.fn_builtin_permissions(''''OBJECT'''') WHERE permission_name = '''''' + @rightsaction + '''''') + BEGIN + EXEC('''''' + @grantordeny + '' '' + @rightsaction + '' ON ['' + @schemaid + ''].['''' + @SP_Name + ''''] TO ['' + @RoleName + '']'''') + END + FETCH NEXT FROM SP_cursor INTO @SP_Name +END + +CLOSE SP_cursor +DEALLOCATE SP_cursor + +'' + + END + ELSE + BEGIN + + SET @Command = @Command + '' +IF EXISTS(SELECT 1 FROM sys.objects o WITH (NOLOCK) JOIN sys.schemas s ON s.schema_id = o.schema_id WHERE o.name = '''''' + @objectname + '''''' AND o.type IN (N''''U'''',''''P'''',''''V'''',''''FN'''',''''IF'''',''''TF'''') AND s.name = '''''' + @schemaid + '''''') +BEGIN + IF EXISTS(SELECT 1 FROM sys.fn_builtin_permissions(''''OBJECT'''') WHERE permission_name = '''''' + @rightsaction + '''''') + BEGIN + '' + @grantordeny + '' '' + @rightsaction + '' ON ['' + @schemaid + ''].['' + @objectname + ''] TO ['' + @RoleName + ''] + END +END + +'' + END + END + + IF @typeofobject = ''ASSEMBLIES'' + BEGIN + SET @Command = @Command + '' +IF EXISTS(SELECT 1 FROM sys.assemblies WHERE NAME = '''''' + @objectname + '''''') +BEGIN + IF EXISTS(SELECT 1 FROM sys.fn_builtin_permissions(''''ASSEMBLY'''') WHERE permission_name = '''''' + @rightsaction + '''''') + BEGIN + '' + @grantordeny + '' '' + @rightsaction + ''::['' + @objectname + ''] TO ['' + @RoleName + ''] + END +END + +'' + END + + IF @typeofobject = ''ROLE'' + BEGIN + SET @Command = @Command + '' +IF NOT EXISTS (SELECT 1 FROM sys.database_role_members JOIN sys.database_principals roles ON database_role_members.role_principal_id = roles.principal_id JOIN sys.database_principals members ON database_role_members.member_principal_id = members.principal_id WHERE roles.name = '''''' + @rightsaction + '''''' AND members.name = '''''' + @RoleName + '''''') +BEGIN + EXEC sp_addrolemember N'''''' + @rightsaction + '''''', N'''''' + @RoleName + '''''' +END + +'' + END + + FETCH NEXT FROM SecurablesCurs INTO @typeofobject, @grantordeny, @rightsaction, @objectname, @schemaid + END + +CLOSE SecurablesCurs +DEALLOCATE SecurablesCurs + +PRINT ''SET ALL SECURABLES ON ROLE ['' + @RoleName + '']'' +EXEC sp_executesql @Command + +END + +/* ADD USER */ +DECLARE UsersCurs CURSOR FOR +SELECT username + FROM #UsersOnRole + +OPEN UsersCurs + +FETCH NEXT FROM UsersCurs INTO @Users +WHILE @@FETCH_STATUS = 0 +BEGIN + + SELECT @Command = '' +EXEC sp_addrolemember N'''''' + @RoleName + '''''', N'''''' + @Users + '''''' +PRINT ''''ADD USER ['' + @Users + ''] ON ROLE ['' + @RoleName + '']'''' +'' + +FETCH NEXT FROM UsersCurs INTO @Users +END + +CLOSE UsersCurs +DEALLOCATE UsersCurs + +EXEC sp_executesql @Command + +/*============================================================================= + Drop temp tables +=============================================================================*/ +DROP TABLE #Securables +DROP TABLE #UsersOnRole','Arizona','Pharmacies') + +INSERT INTO #AllRoles(STR_Definition,STR_Database,STR_Product)VALUES(' + +/*============================================================================= + + Script to create dbRoleDataMonitoring role. + + Role Name: dbRoleDataMonitoring + TEMPLATE: Default + + EXAMPLE OF SECURABLES TO SET: + + INSERT INTO #Securables + VALUES + (''DB'',''GRANT'',''VIEW DEFINITION'','''',''''), + (''SCHEMA'',''GRANT'',''SELECT,EXECUTE,INSERT,UPDATE,DELETE'','''',''AP''), + (''TABLE'',''GRANT'',''INSERT,UPDATE'',''Address'',''dbo''), + (''SP'',''GRANT'',''EXECUTE'',''sp_bmc_GetNextID'',''dbo''), + (''ROLE'',''GRANT'',''db_datareader'','''','''') + + ----------------------------------------------- + +Generate date : 2023-05-12 / up208700 + +=============================================================================*/ + +DECLARE @Command nvarchar(max), + @RoleName varchar(60), + @Users varchar(255), + @typeofobject varchar(50), + @grantordeny varchar(10), + @rightsaction varchar(255), + @objectname varchar(255), + @schemaid varchar(10), + @sysTarget varchar(255), + @sysType varchar(255) + +SET @RoleName = ''dbRoleDataMonitoring'' +SET @Command = '''' + +/* TEMP TABLES */ +CREATE TABLE #UsersOnRole(username varchar(255)) +CREATE TABLE #Securables(typeofobject varchar(50), grantordeny varchar(10), rightsaction varchar(255), objectname varchar(255), schemaid varchar(10),N2 bit) + +/* !!! LIST OF SECURABLES TO CHANGE !!! */ + +INSERT INTO #Securables +VALUES +(''ROLE'',''GRANT'',''DB_DATAREADER'','''',''dbo'',0) +,(''SCHEMA'',''GRANT'',''DELETE'',''Entire Schema'',''dam'',0) +,(''SCHEMA'',''GRANT'',''EXECUTE'',''Entire Schema'',''dam'',0) +,(''SCHEMA'',''GRANT'',''INSERT'',''Entire Schema'',''dam'',0) +,(''SCHEMA'',''GRANT'',''SELECT'',''Entire Schema'',''dam'',0) +,(''SCHEMA'',''GRANT'',''UPDATE'',''Entire Schema'',''dam'',0) +,(''SP'',''GRANT'',''EXECUTE'',''sp_bmc_Bmc_Applic_Default'',''dbo'',0) + + +/* GET ALL USERS ON THIS ROLE */ +INSERT INTO #UsersOnRole +SELECT + members.name +FROM sys.database_role_members + JOIN sys.database_principals roles ON database_role_members.role_principal_id = roles.principal_id + JOIN sys.database_principals members ON database_role_members.member_principal_id = members.principal_id +WHERE roles.name = @RoleName + +/* CREATE ROLE */ +SELECT @Command = '' +IF NOT EXISTS (SELECT 1 FROM sys.database_principals WHERE name = '''''' + @RoleName + '''''' AND type = ''''R'''') +BEGIN + CREATE ROLE ['' + @RoleName + ''] AUTHORIZATION [dbo] + PRINT ''''CREATE ROLE ['' + @RoleName + '']'''' +END +'' +EXEC sp_executesql @Command + +SET @Command = '' +DECLARE @SP_Name varchar(255) + +'' + +/* SET ALL ROLE SECURABLES */ +DECLARE SecurablesCurs CURSOR FOR +SELECT typeofobject, grantordeny, rightsaction, objectname, schemaid +FROM #Securables +WHERE N2 = 0 + +OPEN SecurablesCurs +FETCH NEXT FROM SecurablesCurs INTO @typeofobject, @grantordeny, @rightsaction, @objectname, @schemaid +WHILE @@FETCH_STATUS = 0 +BEGIN + + IF @typeofobject = ''DB'' + BEGIN + IF EXISTS(SELECT 1 FROM sys.fn_builtin_permissions(''DATABASE'') WHERE permission_name = '''' + @rightsaction + '''') + BEGIN + SET @Command = @Command + @grantordeny + '' '' + @rightsaction + '' TO ['' + @RoleName + ''] +'' + END + END + + IF @typeofobject = ''SCHEMA'' + BEGIN + SET @Command = @Command + '' +IF EXISTS (SELECT 1 FROM sys.schemas WHERE name = '''''' + @schemaid + '''''') +BEGIN + IF EXISTS(SELECT 1 FROM sys.fn_builtin_permissions(''''SCHEMA'''') WHERE permission_name = '''''' + @rightsaction + '''''') + BEGIN + '' + @grantordeny + '' '' + @rightsaction + '' ON SCHEMA::'' + @schemaid + '' TO ['' + @RoleName + ''] + END +END + +'' + END + + IF @typeofobject in(''TABLE'',''SP'',''FUNCTIONS'',''VIEWS'') + BEGIN + + IF @objectname like ''%[%]%'' + BEGIN + + IF @typeofobject = ''TABLE'' + BEGIN + SET @sysTarget = ''sys.tables'' + SET @sysType = '''' + END + + IF @typeofobject = ''SP'' + BEGIN + SET @sysTarget = ''sys.procedures'' + SET @sysType = '''' + END + + IF @typeofobject = ''FUNCTIONS'' + BEGIN + SET @sysTarget = ''sys.objects'' + SET @sysType = '' and p.Type IN ( N''''FN'''', N''''IF'''', N''''TF'''', N''''FS'''', N''''FT'''' )'' + END + + IF @typeofobject = ''VIEWS'' + BEGIN + SET @sysTarget = ''sys.views'' + SET @sysType = '''' + END + + SET @Command = @Command + '' +DECLARE SP_cursor CURSOR FOR +SELECT p.name FROM '' + @sysTarget + '' p JOIN sys.schemas s ON s.schema_id = p.schema_id WHERE (p.name like '''''' + @objectname + '''''') and s.name = '''''' + @schemaid + '''' + @sysType + '''''' + +OPEN SP_cursor +FETCH NEXT FROM SP_cursor INTO @SP_Name +WHILE @@FETCH_STATUS = 0 +BEGIN + IF EXISTS(SELECT 1 FROM sys.fn_builtin_permissions(''''OBJECT'''') WHERE permission_name = '''''' + @rightsaction + '''''') + BEGIN + EXEC('''''' + @grantordeny + '' '' + @rightsaction + '' ON ['' + @schemaid + ''].['''' + @SP_Name + ''''] TO ['' + @RoleName + '']'''') + END + FETCH NEXT FROM SP_cursor INTO @SP_Name +END + +CLOSE SP_cursor +DEALLOCATE SP_cursor + +'' + + END + ELSE + BEGIN + + SET @Command = @Command + '' +IF EXISTS(SELECT 1 FROM sys.objects o WITH (NOLOCK) JOIN sys.schemas s ON s.schema_id = o.schema_id WHERE o.name = '''''' + @objectname + '''''' AND o.type IN (N''''U'''',''''P'''',''''V'''',''''FN'''',''''IF'''',''''TF'''') AND s.name = '''''' + @schemaid + '''''') +BEGIN + IF EXISTS(SELECT 1 FROM sys.fn_builtin_permissions(''''OBJECT'''') WHERE permission_name = '''''' + @rightsaction + '''''') + BEGIN + '' + @grantordeny + '' '' + @rightsaction + '' ON ['' + @schemaid + ''].['' + @objectname + ''] TO ['' + @RoleName + ''] + END +END + +'' + END +END + +IF @typeofobject = ''ASSEMBLIES'' +BEGIN + SET @Command = @Command + '' +IF EXISTS(SELECT 1 FROM sys.assemblies WHERE NAME = '''''' + @objectname + '''''') +BEGIN + IF EXISTS(SELECT 1 FROM sys.fn_builtin_permissions(''''ASSEMBLY'''') WHERE permission_name = '''''' + @rightsaction + '''''') + BEGIN + '' + @grantordeny + '' '' + @rightsaction + ''::['' + @objectname + ''] TO ['' + @RoleName + ''] + END +END + +'' +END + +IF @typeofobject = ''ROLE'' +BEGIN + SET @Command = @Command + '' +IF NOT EXISTS (SELECT 1 FROM sys.database_role_members JOIN sys.database_principals roles ON database_role_members.role_principal_id = roles.principal_id JOIN sys.database_principals members ON database_role_members.member_principal_id = members.principal_id WHERE roles.name = '''''' + @rightsaction + '''''' AND members.name = '''''' + @RoleName + '''''') +BEGIN + EXEC sp_addrolemember N'''''' + @rightsaction + '''''', N'''''' + @RoleName + '''''' +END + +'' +END + +FETCH NEXT FROM SecurablesCurs INTO @typeofobject, @grantordeny, @rightsaction, @objectname, @schemaid +END + +CLOSE SecurablesCurs +DEALLOCATE SecurablesCurs + +PRINT ''SET ALL SECURABLES ON ROLE ['' + @RoleName + '']'' +EXEC sp_executesql @Command + +/* ADD USER */ +DECLARE UsersCurs CURSOR FOR +SELECT username + FROM #UsersOnRole + +OPEN UsersCurs + +FETCH NEXT FROM UsersCurs INTO @Users +WHILE @@FETCH_STATUS = 0 +BEGIN + + SELECT @Command = '' +EXEC sp_addrolemember N'''''' + @RoleName + '''''', N'''''' + @Users + '''''' +PRINT ''''ADD USER ['' + @Users + ''] ON ROLE ['' + @RoleName + '']'''' +'' + +FETCH NEXT FROM UsersCurs INTO @Users +END + +CLOSE UsersCurs +DEALLOCATE UsersCurs + +EXEC sp_executesql @Command + + +/*============================================================================= + Drop temp tables +=============================================================================*/ +DROP TABLE #Securables +DROP TABLE #UsersOnRole +','Arizona','Pharmacies') + +INSERT INTO #AllRoles(STR_Definition,STR_Database,STR_Product)VALUES(' + +/*============================================================================= + + Script to create dbRoleDevUsr role. + + Role Name: dbRoleDevUsr + TEMPLATE: Default + + EXAMPLE OF SECURABLES TO SET: + + INSERT INTO #Securables + VALUES + (''DB'',''GRANT'',''VIEW DEFINITION'','''',''''), + (''SCHEMA'',''GRANT'',''SELECT,EXECUTE,INSERT,UPDATE,DELETE'','''',''AP''), + (''TABLE'',''GRANT'',''INSERT,UPDATE'',''Address'',''dbo''), + (''SP'',''GRANT'',''EXECUTE'',''sp_bmc_GetNextID'',''dbo''), + (''ROLE'',''GRANT'',''db_datareader'','''','''') + + ----------------------------------------------- + +Generate date : 2023-05-12 / up208700 + +=============================================================================*/ + +DECLARE @Command nvarchar(max), + @RoleName varchar(60), + @Users varchar(255), + @typeofobject varchar(50), + @grantordeny varchar(10), + @rightsaction varchar(255), + @objectname varchar(255), + @schemaid varchar(10), + @sysTarget varchar(255), + @sysType varchar(255) + +SET @RoleName = ''dbRoleDevUsr'' +SET @Command = '''' + +/* TEMP TABLES */ +CREATE TABLE #UsersOnRole(username varchar(255)) +CREATE TABLE #Securables(typeofobject varchar(50), grantordeny varchar(10), rightsaction varchar(255), objectname varchar(255), schemaid varchar(10),N2 bit) + +/* !!! LIST OF SECURABLES TO CHANGE !!! */ + +INSERT INTO #Securables +VALUES +(''DB'',''GRANT'',''EXECUTE'','''',''dbo'',0) +,(''DB'',''GRANT'',''SHOWPLAN'','''',''dbo'',0) +,(''DB'',''GRANT'',''VIEW DEFINITION'','''',''dbo'',0) +,(''ROLE'',''GRANT'',''DB_DATAREADER'','''',''dbo'',0) +,(''ROLE'',''GRANT'',''DB_DATAWRITER'','''',''dbo'',0) +,(''SP'',''GRANT'',''ALTER'',''%PH_Invoice%'',''dbo'',0) +,(''SP'',''GRANT'',''ALTER'',''%PH_Streamfact%'',''dbo'',0) +,(''TABLE'',''DENY'',''SELECT'',''DocumentSignature'',''wkl'',0) +,(''TABLE'',''DENY'',''UPDATE'',''DocumentSignature'',''wkl'',0) +,(''TABLE'',''GRANT'',''VIEW CHANGE TRACKING'',''Document_header'',''dbo'',0) +,(''TABLE'',''GRANT'',''VIEW CHANGE TRACKING'',''Document_line'',''dbo'',0) +,(''TABLE'',''GRANT'',''VIEW CHANGE TRACKING'',''PH_prescription_line'',''dbo'',0) + + +/* GET ALL USERS ON THIS ROLE */ +INSERT INTO #UsersOnRole +SELECT + members.name +FROM sys.database_role_members + JOIN sys.database_principals roles ON database_role_members.role_principal_id = roles.principal_id + JOIN sys.database_principals members ON database_role_members.member_principal_id = members.principal_id +WHERE roles.name = @RoleName + +/* CREATE ROLE */ +SELECT @Command = '' +IF NOT EXISTS (SELECT 1 FROM sys.database_principals WHERE name = '''''' + @RoleName + '''''' AND type = ''''R'''') +BEGIN + CREATE ROLE ['' + @RoleName + ''] AUTHORIZATION [dbo] + PRINT ''''CREATE ROLE ['' + @RoleName + '']'''' +END +'' +EXEC sp_executesql @Command + +SET @Command = '' +DECLARE @SP_Name varchar(255) + +'' + +/* SET ALL ROLE SECURABLES */ +DECLARE SecurablesCurs CURSOR FOR +SELECT typeofobject, grantordeny, rightsaction, objectname, schemaid +FROM #Securables +WHERE N2 = 0 + +OPEN SecurablesCurs +FETCH NEXT FROM SecurablesCurs INTO @typeofobject, @grantordeny, @rightsaction, @objectname, @schemaid +WHILE @@FETCH_STATUS = 0 +BEGIN + + IF @typeofobject = ''DB'' + BEGIN + IF EXISTS(SELECT 1 FROM sys.fn_builtin_permissions(''DATABASE'') WHERE permission_name = '''' + @rightsaction + '''') + BEGIN + SET @Command = @Command + @grantordeny + '' '' + @rightsaction + '' TO ['' + @RoleName + ''] +'' + END + END + + IF @typeofobject = ''SCHEMA'' + BEGIN + SET @Command = @Command + '' +IF EXISTS (SELECT 1 FROM sys.schemas WHERE name = '''''' + @schemaid + '''''') +BEGIN + IF EXISTS(SELECT 1 FROM sys.fn_builtin_permissions(''''SCHEMA'''') WHERE permission_name = '''''' + @rightsaction + '''''') + BEGIN + '' + @grantordeny + '' '' + @rightsaction + '' ON SCHEMA::'' + @schemaid + '' TO ['' + @RoleName + ''] + END +END + +'' + END + + IF @typeofobject in(''TABLE'',''SP'',''FUNCTIONS'',''VIEWS'') + BEGIN + + IF @objectname like ''%[%]%'' + BEGIN + + IF @typeofobject = ''TABLE'' + BEGIN + SET @sysTarget = ''sys.tables'' + SET @sysType = '''' + END + + IF @typeofobject = ''SP'' + BEGIN + SET @sysTarget = ''sys.procedures'' + SET @sysType = '''' + END + + IF @typeofobject = ''FUNCTIONS'' + BEGIN + SET @sysTarget = ''sys.objects'' + SET @sysType = '' and p.Type IN ( N''''FN'''', N''''IF'''', N''''TF'''', N''''FS'''', N''''FT'''' )'' + END + + IF @typeofobject = ''VIEWS'' + BEGIN + SET @sysTarget = ''sys.views'' + SET @sysType = '''' + END + + SET @Command = @Command + '' +DECLARE SP_cursor CURSOR FOR +SELECT p.name FROM '' + @sysTarget + '' p JOIN sys.schemas s ON s.schema_id = p.schema_id WHERE (p.name like '''''' + @objectname + '''''') and s.name = '''''' + @schemaid + '''' + @sysType + '''''' + +OPEN SP_cursor +FETCH NEXT FROM SP_cursor INTO @SP_Name +WHILE @@FETCH_STATUS = 0 +BEGIN + IF EXISTS(SELECT 1 FROM sys.fn_builtin_permissions(''''OBJECT'''') WHERE permission_name = '''''' + @rightsaction + '''''') + BEGIN + EXEC('''''' + @grantordeny + '' '' + @rightsaction + '' ON ['' + @schemaid + ''].['''' + @SP_Name + ''''] TO ['' + @RoleName + '']'''') + END + FETCH NEXT FROM SP_cursor INTO @SP_Name +END + +CLOSE SP_cursor +DEALLOCATE SP_cursor + +'' + + END + ELSE + BEGIN + + SET @Command = @Command + '' +IF EXISTS(SELECT 1 FROM sys.objects o WITH (NOLOCK) JOIN sys.schemas s ON s.schema_id = o.schema_id WHERE o.name = '''''' + @objectname + '''''' AND o.type IN (N''''U'''',''''P'''',''''V'''',''''FN'''',''''IF'''',''''TF'''') AND s.name = '''''' + @schemaid + '''''') +BEGIN + IF EXISTS(SELECT 1 FROM sys.fn_builtin_permissions(''''OBJECT'''') WHERE permission_name = '''''' + @rightsaction + '''''') + BEGIN + '' + @grantordeny + '' '' + @rightsaction + '' ON ['' + @schemaid + ''].['' + @objectname + ''] TO ['' + @RoleName + ''] + END +END + +'' + END +END + +IF @typeofobject = ''ASSEMBLIES'' +BEGIN + SET @Command = @Command + '' +IF EXISTS(SELECT 1 FROM sys.assemblies WHERE NAME = '''''' + @objectname + '''''') +BEGIN + IF EXISTS(SELECT 1 FROM sys.fn_builtin_permissions(''''ASSEMBLY'''') WHERE permission_name = '''''' + @rightsaction + '''''') + BEGIN + '' + @grantordeny + '' '' + @rightsaction + ''::['' + @objectname + ''] TO ['' + @RoleName + ''] + END +END + +'' +END + +IF @typeofobject = ''ROLE'' +BEGIN + SET @Command = @Command + '' +IF NOT EXISTS (SELECT 1 FROM sys.database_role_members JOIN sys.database_principals roles ON database_role_members.role_principal_id = roles.principal_id JOIN sys.database_principals members ON database_role_members.member_principal_id = members.principal_id WHERE roles.name = '''''' + @rightsaction + '''''' AND members.name = '''''' + @RoleName + '''''') +BEGIN + EXEC sp_addrolemember N'''''' + @rightsaction + '''''', N'''''' + @RoleName + '''''' +END + +'' +END + +FETCH NEXT FROM SecurablesCurs INTO @typeofobject, @grantordeny, @rightsaction, @objectname, @schemaid +END + +CLOSE SecurablesCurs +DEALLOCATE SecurablesCurs + +PRINT ''SET ALL SECURABLES ON ROLE ['' + @RoleName + '']'' +EXEC sp_executesql @Command + +/* ADD USER */ +DECLARE UsersCurs CURSOR FOR +SELECT username + FROM #UsersOnRole + +OPEN UsersCurs + +FETCH NEXT FROM UsersCurs INTO @Users +WHILE @@FETCH_STATUS = 0 +BEGIN + + SELECT @Command = '' +EXEC sp_addrolemember N'''''' + @RoleName + '''''', N'''''' + @Users + '''''' +PRINT ''''ADD USER ['' + @Users + ''] ON ROLE ['' + @RoleName + '']'''' +'' + +FETCH NEXT FROM UsersCurs INTO @Users +END + +CLOSE UsersCurs +DEALLOCATE UsersCurs + +EXEC sp_executesql @Command + + +/*============================================================================= + Drop temp tables +=============================================================================*/ +DROP TABLE #Securables +DROP TABLE #UsersOnRole +','Arizona','Pharmacies') + +INSERT INTO #AllRoles(STR_Definition,STR_Database,STR_Product)VALUES(' + +/*============================================================================= + + Script to create dbRoleGcStock role. + + Role Name: dbRoleGcStock + TEMPLATE: Default + + EXAMPLE OF SECURABLES TO SET: + + INSERT INTO #Securables + VALUES + (''DB'',''GRANT'',''VIEW DEFINITION'','''',''''), + (''SCHEMA'',''GRANT'',''SELECT,EXECUTE,INSERT,UPDATE,DELETE'','''',''AP''), + (''TABLE'',''GRANT'',''INSERT,UPDATE'',''Address'',''dbo''), + (''SP'',''GRANT'',''EXECUTE'',''sp_bmc_GetNextID'',''dbo''), + (''ROLE'',''GRANT'',''db_datareader'','''','''') + + ----------------------------------------------- + +Generate date : 2023-05-12 / up208700 + +=============================================================================*/ + +DECLARE @Command nvarchar(max), + @RoleName varchar(60), + @Users varchar(255), + @typeofobject varchar(50), + @grantordeny varchar(10), + @rightsaction varchar(255), + @objectname varchar(255), + @schemaid varchar(10), + @sysTarget varchar(255), + @sysType varchar(255) + +SET @RoleName = ''dbRoleGcStock'' +SET @Command = '''' + +/* TEMP TABLES */ +CREATE TABLE #UsersOnRole(username varchar(255)) +CREATE TABLE #Securables(typeofobject varchar(50), grantordeny varchar(10), rightsaction varchar(255), objectname varchar(255), schemaid varchar(10),N2 bit) + +/* !!! LIST OF SECURABLES TO CHANGE !!! */ + +INSERT INTO #Securables +VALUES +(''SP'',''GRANT'',''EXECUTE'',''aps_Galenicare_Inventory_Detail'',''dbo'',0) +,(''SP'',''GRANT'',''EXECUTE'',''aps_PHID_Create_1_13'',''dbo'',0) +,(''SP'',''GRANT'',''EXECUTE'',''aps_PHID_Load'',''dbo'',0) +,(''SP'',''GRANT'',''EXECUTE'',''aps_TT_Physical_Inventory_Detail_Load'',''dbo'',0) +,(''SP'',''GRANT'',''EXECUTE'',''sp_bmc_PHID_Create'',''dbo'',0) +,(''SP'',''GRANT'',''EXECUTE'',''sp_bmc_PHID_Update'',''dbo'',0) +,(''SP'',''GRANT'',''EXECUTE'',''sp_bmc_PHIM_Processing'',''dbo'',0) +,(''SP'',''GRANT'',''EXECUTE'',''sp_bmc_Physical_Inv_Detail'',''dbo'',0) +,(''SP'',''GRANT'',''EXECUTE'',''sp_bmc_Physical_Inv_Master'',''dbo'',0) +,(''TABLE'',''GRANT'',''SELECT'',''v_Galenicare_OU_List'',''dbo'',0) + + +/* GET ALL USERS ON THIS ROLE */ +INSERT INTO #UsersOnRole +SELECT + members.name +FROM sys.database_role_members + JOIN sys.database_principals roles ON database_role_members.role_principal_id = roles.principal_id + JOIN sys.database_principals members ON database_role_members.member_principal_id = members.principal_id +WHERE roles.name = @RoleName + +/* CREATE ROLE */ +SELECT @Command = '' +IF NOT EXISTS (SELECT 1 FROM sys.database_principals WHERE name = '''''' + @RoleName + '''''' AND type = ''''R'''') +BEGIN + CREATE ROLE ['' + @RoleName + ''] AUTHORIZATION [dbo] + PRINT ''''CREATE ROLE ['' + @RoleName + '']'''' +END +'' +EXEC sp_executesql @Command + +SET @Command = '' +DECLARE @SP_Name varchar(255) + +'' + +/* SET ALL ROLE SECURABLES */ +DECLARE SecurablesCurs CURSOR FOR +SELECT typeofobject, grantordeny, rightsaction, objectname, schemaid +FROM #Securables +WHERE N2 = 0 + +OPEN SecurablesCurs +FETCH NEXT FROM SecurablesCurs INTO @typeofobject, @grantordeny, @rightsaction, @objectname, @schemaid +WHILE @@FETCH_STATUS = 0 +BEGIN + + IF @typeofobject = ''DB'' + BEGIN + IF EXISTS(SELECT 1 FROM sys.fn_builtin_permissions(''DATABASE'') WHERE permission_name = '''' + @rightsaction + '''') + BEGIN + SET @Command = @Command + @grantordeny + '' '' + @rightsaction + '' TO ['' + @RoleName + ''] +'' + END + END + + IF @typeofobject = ''SCHEMA'' + BEGIN + SET @Command = @Command + '' +IF EXISTS (SELECT 1 FROM sys.schemas WHERE name = '''''' + @schemaid + '''''') +BEGIN + IF EXISTS(SELECT 1 FROM sys.fn_builtin_permissions(''''SCHEMA'''') WHERE permission_name = '''''' + @rightsaction + '''''') + BEGIN + '' + @grantordeny + '' '' + @rightsaction + '' ON SCHEMA::'' + @schemaid + '' TO ['' + @RoleName + ''] + END +END + +'' + END + + IF @typeofobject in(''TABLE'',''SP'',''FUNCTIONS'',''VIEWS'') + BEGIN + + IF @objectname like ''%[%]%'' + BEGIN + + IF @typeofobject = ''TABLE'' + BEGIN + SET @sysTarget = ''sys.tables'' + SET @sysType = '''' + END + + IF @typeofobject = ''SP'' + BEGIN + SET @sysTarget = ''sys.procedures'' + SET @sysType = '''' + END + + IF @typeofobject = ''FUNCTIONS'' + BEGIN + SET @sysTarget = ''sys.objects'' + SET @sysType = '' and p.Type IN ( N''''FN'''', N''''IF'''', N''''TF'''', N''''FS'''', N''''FT'''' )'' + END + + IF @typeofobject = ''VIEWS'' + BEGIN + SET @sysTarget = ''sys.views'' + SET @sysType = '''' + END + + SET @Command = @Command + '' +DECLARE SP_cursor CURSOR FOR +SELECT p.name FROM '' + @sysTarget + '' p JOIN sys.schemas s ON s.schema_id = p.schema_id WHERE (p.name like '''''' + @objectname + '''''') and s.name = '''''' + @schemaid + '''' + @sysType + '''''' + +OPEN SP_cursor +FETCH NEXT FROM SP_cursor INTO @SP_Name +WHILE @@FETCH_STATUS = 0 +BEGIN + IF EXISTS(SELECT 1 FROM sys.fn_builtin_permissions(''''OBJECT'''') WHERE permission_name = '''''' + @rightsaction + '''''') + BEGIN + EXEC('''''' + @grantordeny + '' '' + @rightsaction + '' ON ['' + @schemaid + ''].['''' + @SP_Name + ''''] TO ['' + @RoleName + '']'''') + END + FETCH NEXT FROM SP_cursor INTO @SP_Name +END + +CLOSE SP_cursor +DEALLOCATE SP_cursor + +'' + + END + ELSE + BEGIN + + SET @Command = @Command + '' +IF EXISTS(SELECT 1 FROM sys.objects o WITH (NOLOCK) JOIN sys.schemas s ON s.schema_id = o.schema_id WHERE o.name = '''''' + @objectname + '''''' AND o.type IN (N''''U'''',''''P'''',''''V'''',''''FN'''',''''IF'''',''''TF'''') AND s.name = '''''' + @schemaid + '''''') +BEGIN + IF EXISTS(SELECT 1 FROM sys.fn_builtin_permissions(''''OBJECT'''') WHERE permission_name = '''''' + @rightsaction + '''''') + BEGIN + '' + @grantordeny + '' '' + @rightsaction + '' ON ['' + @schemaid + ''].['' + @objectname + ''] TO ['' + @RoleName + ''] + END +END + +'' + END +END + +IF @typeofobject = ''ASSEMBLIES'' +BEGIN + SET @Command = @Command + '' +IF EXISTS(SELECT 1 FROM sys.assemblies WHERE NAME = '''''' + @objectname + '''''') +BEGIN + IF EXISTS(SELECT 1 FROM sys.fn_builtin_permissions(''''ASSEMBLY'''') WHERE permission_name = '''''' + @rightsaction + '''''') + BEGIN + '' + @grantordeny + '' '' + @rightsaction + ''::['' + @objectname + ''] TO ['' + @RoleName + ''] + END +END + +'' +END + +IF @typeofobject = ''ROLE'' +BEGIN + SET @Command = @Command + '' +IF NOT EXISTS (SELECT 1 FROM sys.database_role_members JOIN sys.database_principals roles ON database_role_members.role_principal_id = roles.principal_id JOIN sys.database_principals members ON database_role_members.member_principal_id = members.principal_id WHERE roles.name = '''''' + @rightsaction + '''''' AND members.name = '''''' + @RoleName + '''''') +BEGIN + EXEC sp_addrolemember N'''''' + @rightsaction + '''''', N'''''' + @RoleName + '''''' +END + +'' +END + +FETCH NEXT FROM SecurablesCurs INTO @typeofobject, @grantordeny, @rightsaction, @objectname, @schemaid +END + +CLOSE SecurablesCurs +DEALLOCATE SecurablesCurs + +PRINT ''SET ALL SECURABLES ON ROLE ['' + @RoleName + '']'' +EXEC sp_executesql @Command + +/* ADD USER */ +DECLARE UsersCurs CURSOR FOR +SELECT username + FROM #UsersOnRole + +OPEN UsersCurs + +FETCH NEXT FROM UsersCurs INTO @Users +WHILE @@FETCH_STATUS = 0 +BEGIN + + SELECT @Command = '' +EXEC sp_addrolemember N'''''' + @RoleName + '''''', N'''''' + @Users + '''''' +PRINT ''''ADD USER ['' + @Users + ''] ON ROLE ['' + @RoleName + '']'''' +'' + +FETCH NEXT FROM UsersCurs INTO @Users +END + +CLOSE UsersCurs +DEALLOCATE UsersCurs + +EXEC sp_executesql @Command + + +/*============================================================================= + Drop temp tables +=============================================================================*/ +DROP TABLE #Securables +DROP TABLE #UsersOnRole +','Arizona','Pharmacies') + +INSERT INTO #AllRoles(STR_Definition,STR_Database,STR_Product)VALUES(' + +/*============================================================================= + + Script to create dbRoleGroupRepetition role. + + Role Name: dbRoleGroupRepetition + TEMPLATE: Default + + EXAMPLE OF SECURABLES TO SET: + + INSERT INTO #Securables + VALUES + (''DB'',''GRANT'',''VIEW DEFINITION'','''',''''), + (''SCHEMA'',''GRANT'',''SELECT,EXECUTE,INSERT,UPDATE,DELETE'','''',''AP''), + (''TABLE'',''GRANT'',''INSERT,UPDATE'',''Address'',''dbo''), + (''SP'',''GRANT'',''EXECUTE'',''sp_bmc_GetNextID'',''dbo''), + (''ROLE'',''GRANT'',''db_datareader'','''','''') + + ----------------------------------------------- + +Generate date : 2023-05-12 / up208700 + +=============================================================================*/ + +DECLARE @Command nvarchar(max), + @RoleName varchar(60), + @Users varchar(255), + @typeofobject varchar(50), + @grantordeny varchar(10), + @rightsaction varchar(255), + @objectname varchar(255), + @schemaid varchar(10), + @sysTarget varchar(255), + @sysType varchar(255) + +SET @RoleName = ''dbRoleGroupRepetition'' +SET @Command = '''' + +/* TEMP TABLES */ +CREATE TABLE #UsersOnRole(username varchar(255)) +CREATE TABLE #Securables(typeofobject varchar(50), grantordeny varchar(10), rightsaction varchar(255), objectname varchar(255), schemaid varchar(10),N2 bit) + +/* !!! LIST OF SECURABLES TO CHANGE !!! */ + +INSERT INTO #Securables +VALUES +(''SP'',''GRANT'',''EXECUTE'',''aps_Get_Sales_Detail'',''dbo'',0) + + +/* GET ALL USERS ON THIS ROLE */ +INSERT INTO #UsersOnRole +SELECT + members.name +FROM sys.database_role_members + JOIN sys.database_principals roles ON database_role_members.role_principal_id = roles.principal_id + JOIN sys.database_principals members ON database_role_members.member_principal_id = members.principal_id +WHERE roles.name = @RoleName + +/* CREATE ROLE */ +SELECT @Command = '' +IF NOT EXISTS (SELECT 1 FROM sys.database_principals WHERE name = '''''' + @RoleName + '''''' AND type = ''''R'''') +BEGIN + CREATE ROLE ['' + @RoleName + ''] AUTHORIZATION [dbo] + PRINT ''''CREATE ROLE ['' + @RoleName + '']'''' +END +'' +EXEC sp_executesql @Command + +SET @Command = '' +DECLARE @SP_Name varchar(255) + +'' + +/* SET ALL ROLE SECURABLES */ +DECLARE SecurablesCurs CURSOR FOR +SELECT typeofobject, grantordeny, rightsaction, objectname, schemaid +FROM #Securables +WHERE N2 = 0 + +OPEN SecurablesCurs +FETCH NEXT FROM SecurablesCurs INTO @typeofobject, @grantordeny, @rightsaction, @objectname, @schemaid +WHILE @@FETCH_STATUS = 0 +BEGIN + + IF @typeofobject = ''DB'' + BEGIN + IF EXISTS(SELECT 1 FROM sys.fn_builtin_permissions(''DATABASE'') WHERE permission_name = '''' + @rightsaction + '''') + BEGIN + SET @Command = @Command + @grantordeny + '' '' + @rightsaction + '' TO ['' + @RoleName + ''] +'' + END + END + + IF @typeofobject = ''SCHEMA'' + BEGIN + SET @Command = @Command + '' +IF EXISTS (SELECT 1 FROM sys.schemas WHERE name = '''''' + @schemaid + '''''') +BEGIN + IF EXISTS(SELECT 1 FROM sys.fn_builtin_permissions(''''SCHEMA'''') WHERE permission_name = '''''' + @rightsaction + '''''') + BEGIN + '' + @grantordeny + '' '' + @rightsaction + '' ON SCHEMA::'' + @schemaid + '' TO ['' + @RoleName + ''] + END +END + +'' + END + + IF @typeofobject in(''TABLE'',''SP'',''FUNCTIONS'',''VIEWS'') + BEGIN + + IF @objectname like ''%[%]%'' + BEGIN + + IF @typeofobject = ''TABLE'' + BEGIN + SET @sysTarget = ''sys.tables'' + SET @sysType = '''' + END + + IF @typeofobject = ''SP'' + BEGIN + SET @sysTarget = ''sys.procedures'' + SET @sysType = '''' + END + + IF @typeofobject = ''FUNCTIONS'' + BEGIN + SET @sysTarget = ''sys.objects'' + SET @sysType = '' and p.Type IN ( N''''FN'''', N''''IF'''', N''''TF'''', N''''FS'''', N''''FT'''' )'' + END + + IF @typeofobject = ''VIEWS'' + BEGIN + SET @sysTarget = ''sys.views'' + SET @sysType = '''' + END + + SET @Command = @Command + '' +DECLARE SP_cursor CURSOR FOR +SELECT p.name FROM '' + @sysTarget + '' p JOIN sys.schemas s ON s.schema_id = p.schema_id WHERE (p.name like '''''' + @objectname + '''''') and s.name = '''''' + @schemaid + '''' + @sysType + '''''' + +OPEN SP_cursor +FETCH NEXT FROM SP_cursor INTO @SP_Name +WHILE @@FETCH_STATUS = 0 +BEGIN + IF EXISTS(SELECT 1 FROM sys.fn_builtin_permissions(''''OBJECT'''') WHERE permission_name = '''''' + @rightsaction + '''''') + BEGIN + EXEC('''''' + @grantordeny + '' '' + @rightsaction + '' ON ['' + @schemaid + ''].['''' + @SP_Name + ''''] TO ['' + @RoleName + '']'''') + END + FETCH NEXT FROM SP_cursor INTO @SP_Name +END + +CLOSE SP_cursor +DEALLOCATE SP_cursor + +'' + + END + ELSE + BEGIN + + SET @Command = @Command + '' +IF EXISTS(SELECT 1 FROM sys.objects o WITH (NOLOCK) JOIN sys.schemas s ON s.schema_id = o.schema_id WHERE o.name = '''''' + @objectname + '''''' AND o.type IN (N''''U'''',''''P'''',''''V'''',''''FN'''',''''IF'''',''''TF'''') AND s.name = '''''' + @schemaid + '''''') +BEGIN + IF EXISTS(SELECT 1 FROM sys.fn_builtin_permissions(''''OBJECT'''') WHERE permission_name = '''''' + @rightsaction + '''''') + BEGIN + '' + @grantordeny + '' '' + @rightsaction + '' ON ['' + @schemaid + ''].['' + @objectname + ''] TO ['' + @RoleName + ''] + END +END + +'' + END +END + +IF @typeofobject = ''ASSEMBLIES'' +BEGIN + SET @Command = @Command + '' +IF EXISTS(SELECT 1 FROM sys.assemblies WHERE NAME = '''''' + @objectname + '''''') +BEGIN + IF EXISTS(SELECT 1 FROM sys.fn_builtin_permissions(''''ASSEMBLY'''') WHERE permission_name = '''''' + @rightsaction + '''''') + BEGIN + '' + @grantordeny + '' '' + @rightsaction + ''::['' + @objectname + ''] TO ['' + @RoleName + ''] + END +END + +'' +END + +IF @typeofobject = ''ROLE'' +BEGIN + SET @Command = @Command + '' +IF NOT EXISTS (SELECT 1 FROM sys.database_role_members JOIN sys.database_principals roles ON database_role_members.role_principal_id = roles.principal_id JOIN sys.database_principals members ON database_role_members.member_principal_id = members.principal_id WHERE roles.name = '''''' + @rightsaction + '''''' AND members.name = '''''' + @RoleName + '''''') +BEGIN + EXEC sp_addrolemember N'''''' + @rightsaction + '''''', N'''''' + @RoleName + '''''' +END + +'' +END + +FETCH NEXT FROM SecurablesCurs INTO @typeofobject, @grantordeny, @rightsaction, @objectname, @schemaid +END + +CLOSE SecurablesCurs +DEALLOCATE SecurablesCurs + +PRINT ''SET ALL SECURABLES ON ROLE ['' + @RoleName + '']'' +EXEC sp_executesql @Command + +/* ADD USER */ +DECLARE UsersCurs CURSOR FOR +SELECT username + FROM #UsersOnRole + +OPEN UsersCurs + +FETCH NEXT FROM UsersCurs INTO @Users +WHILE @@FETCH_STATUS = 0 +BEGIN + + SELECT @Command = '' +EXEC sp_addrolemember N'''''' + @RoleName + '''''', N'''''' + @Users + '''''' +PRINT ''''ADD USER ['' + @Users + ''] ON ROLE ['' + @RoleName + '']'''' +'' + +FETCH NEXT FROM UsersCurs INTO @Users +END + +CLOSE UsersCurs +DEALLOCATE UsersCurs + +EXEC sp_executesql @Command + + +/*============================================================================= + Drop temp tables +=============================================================================*/ +DROP TABLE #Securables +DROP TABLE #UsersOnRole +','Arizona','Pharmacies') + +INSERT INTO #AllRoles(STR_Definition,STR_Database,STR_Product)VALUES(' + +/*============================================================================= + + Script to create dbRoleIttechUsr role. + + Role Name: dbRoleIttechUsr + TEMPLATE: N2 and PROD + + EXAMPLE OF SECURABLES TO SET: + + INSERT INTO #Securables + VALUES + (''DB'',''GRANT'',''VIEW DEFINITION'','''',''''), + (''SCHEMA'',''GRANT'',''SELECT,EXECUTE,INSERT,UPDATE,DELETE'','''',''AP''), + (''TABLE'',''GRANT'',''INSERT,UPDATE'',''Address'',''dbo''), + (''SP'',''GRANT'',''EXECUTE'',''sp_bmc_GetNextID'',''dbo''), + (''ROLE'',''GRANT'',''db_datareader'','''','''') + + ----------------------------------------------- + +Generate date : 2023-05-12 / up208700 + +=============================================================================*/ + +DECLARE @Type varchar(6), + @Command nvarchar(max), + @RoleName varchar(60), + @Users varchar(255), + @typeofobject varchar(50), + @grantordeny varchar(10), + @rightsaction varchar(255), + @objectname varchar(255), + @schemaid varchar(10), + @sysTarget varchar(255), + @sysType varchar(255) + +SET @RoleName = ''dbRoleIttechUsr'' +SET @Command = '''' + +SELECT @Type = [Type] FROM [master].[cfg].[InstanceContext] + +/* TEMP TABLES */ +CREATE TABLE #UsersOnRole(username varchar(255)) +CREATE TABLE #Securables(typeofobject varchar(50), grantordeny varchar(10), rightsaction varchar(255), objectname varchar(255), schemaid varchar(10),N2 bit) + +/* !!! LIST OF SECURABLES TO CHANGE !!! */ + +INSERT INTO #Securables +VALUES +(''DB'',''GRANT'',''EXECUTE'','''',''dbo'',0) +,(''ROLE'',''GRANT'',''DB_DATAREADER'','''',''dbo'',0) +,(''ROLE'',''GRANT'',''DB_DATAWRITER'','''',''dbo'',0) +,(''ROLE'',''GRANT'',''DB_OWNER'','''',''dbo'',1) +,(''TABLE'',''DENY'',''DELETE'',''DocumentSignature'',''wkl'',0) +,(''TABLE'',''DENY'',''UPDATE'',''DocumentSignature'',''wkl'',0) + + +/* GET ALL USERS ON THIS ROLE */ +INSERT INTO #UsersOnRole +SELECT + members.name +FROM sys.database_role_members + JOIN sys.database_principals roles ON database_role_members.role_principal_id = roles.principal_id + JOIN sys.database_principals members ON database_role_members.member_principal_id = members.principal_id +WHERE roles.name = @RoleName + +/* CREATE ROLE */ +SELECT @Command = '' +IF NOT EXISTS (SELECT 1 FROM sys.database_principals WHERE name = '''''' + @RoleName + '''''' AND type = ''''R'''') +BEGIN + CREATE ROLE ['' + @RoleName + ''] AUTHORIZATION [dbo] + PRINT ''''CREATE ROLE ['' + @RoleName + '']'''' +END +'' +EXEC sp_executesql @Command + +SET @Command = '' +DECLARE @SP_Name varchar(255) + +'' + +/* SET ALL ROLE SECURABLES */ +IF @Type = ''DEVE'' +BEGIN + + DECLARE SecurablesCurs CURSOR FOR + SELECT typeofobject, grantordeny, rightsaction, objectname, schemaid + FROM #Securables + WHERE N2 = 1 + + OPEN SecurablesCurs + FETCH NEXT FROM SecurablesCurs INTO @typeofobject, @grantordeny, @rightsaction, @objectname, @schemaid + WHILE @@FETCH_STATUS = 0 + BEGIN + + IF @typeofobject = ''DB'' + BEGIN + IF EXISTS(SELECT 1 FROM sys.fn_builtin_permissions(''DATABASE'') WHERE permission_name = '''' + @rightsaction + '''') + BEGIN + SET @Command = @Command + @grantordeny + '' '' + @rightsaction + '' TO ['' + @RoleName + ''] +'' + END + END + + IF @typeofobject = ''SCHEMA'' + BEGIN + SET @Command = @Command + '' +IF EXISTS (SELECT 1 FROM sys.schemas WHERE name = '''''' + @schemaid + '''''') +BEGIN + IF EXISTS(SELECT 1 FROM sys.fn_builtin_permissions(''''SCHEMA'''') WHERE permission_name = '''''' + @rightsaction + '''''') + BEGIN + '' + @grantordeny + '' '' + @rightsaction + '' ON SCHEMA::'' + @schemaid + '' TO ['' + @RoleName + ''] + END +END + +'' + END + + IF @typeofobject in(''TABLE'',''SP'',''FUNCTIONS'',''VIEWS'') + BEGIN + + IF @objectname like ''%[%]%'' + BEGIN + IF @typeofobject = ''TABLE'' + BEGIN + SET @sysTarget = ''sys.tables'' + SET @sysType = '''' + END + + IF @typeofobject = ''SP'' + BEGIN + SET @sysTarget = ''sys.procedures'' + SET @sysType = '''' + END + + IF @typeofobject = ''FUNCTIONS'' + BEGIN + SET @sysTarget = ''sys.objects'' + SET @sysType = '' and p.Type IN ( N''''FN'''', N''''IF'''', N''''TF'''', N''''FS'''', N''''FT'''' )'' + END + + IF @typeofobject = ''VIEWS'' + BEGIN + SET @sysTarget = ''sys.views'' + SET @sysType = '''' + END + + SET @Command = @Command + '' +DECLARE SP_cursor CURSOR FOR +SELECT p.name FROM '' + @sysTarget + '' p JOIN sys.schemas s ON s.schema_id = p.schema_id WHERE (p.name like '''''' + @objectname + '''''') and s.name = '''''' + @schemaid + '''' + @sysType + '''''' + +OPEN SP_cursor +FETCH NEXT FROM SP_cursor INTO @SP_Name +WHILE @@FETCH_STATUS = 0 +BEGIN + IF EXISTS(SELECT 1 FROM sys.fn_builtin_permissions(''''OBJECT'''') WHERE permission_name = '''''' + @rightsaction + '''''') + BEGIN + EXEC('''''' + @grantordeny + '' '' + @rightsaction + '' ON ['' + @schemaid + ''].['''' + @SP_Name + ''''] TO ['' + @RoleName + '']'''') + END + FETCH NEXT FROM SP_cursor INTO @SP_Name +END + +CLOSE SP_cursor +DEALLOCATE SP_cursor + +'' + + END + ELSE + BEGIN + + SET @Command = @Command + '' +IF EXISTS(SELECT 1 FROM sys.objects o WITH (NOLOCK) JOIN sys.schemas s ON s.schema_id = o.schema_id WHERE o.name = '''''' + @objectname + '''''' AND o.type IN (N''''U'''',''''P'''',''''V'''',''''FN'''',''''IF'''',''''TF'''') AND s.name = '''''' + @schemaid + '''''') +BEGIN + IF EXISTS(SELECT 1 FROM sys.fn_builtin_permissions(''''OBJECT'''') WHERE permission_name = '''''' + @rightsaction + '''''') + BEGIN + '' + @grantordeny + '' '' + @rightsaction + '' ON ['' + @schemaid + ''].['' + @objectname + ''] TO ['' + @RoleName + ''] + END +END + +'' + END + END + + IF @typeofobject = ''ASSEMBLIES'' + BEGIN + SET @Command = @Command + '' +IF EXISTS(SELECT 1 FROM sys.assemblies WHERE NAME = '''''' + @objectname + '''''') +BEGIN + IF EXISTS(SELECT 1 FROM sys.fn_builtin_permissions(''''ASSEMBLY'''') WHERE permission_name = '''''' + @rightsaction + '''''') + BEGIN + '' + @grantordeny + '' '' + @rightsaction + ''::['' + @objectname + ''] TO ['' + @RoleName + ''] + END +END + +'' + END + + IF @typeofobject = ''ROLE'' + BEGIN + SET @Command = @Command + '' +IF NOT EXISTS (SELECT 1 FROM sys.database_role_members JOIN sys.database_principals roles ON database_role_members.role_principal_id = roles.principal_id JOIN sys.database_principals members ON database_role_members.member_principal_id = members.principal_id WHERE roles.name = '''''' + @rightsaction + '''''' AND members.name = '''''' + @RoleName + '''''') +BEGIN + EXEC sp_addrolemember N'''''' + @rightsaction + '''''', N'''''' + @RoleName + '''''' +END + +'' + END + + FETCH NEXT FROM SecurablesCurs INTO @typeofobject, @grantordeny, @rightsaction, @objectname, @schemaid + END + +CLOSE SecurablesCurs +DEALLOCATE SecurablesCurs + +PRINT ''SET ALL SECURABLES ON ROLE ['' + @RoleName + '']'' +EXEC sp_executesql @Command + +END +ELSE +BEGIN + + DECLARE SecurablesCurs CURSOR FOR + SELECT typeofobject, grantordeny, rightsaction, objectname, schemaid + FROM #Securables + WHERE N2 = 0 + + OPEN SecurablesCurs + FETCH NEXT FROM SecurablesCurs INTO @typeofobject, @grantordeny, @rightsaction, @objectname, @schemaid + WHILE @@FETCH_STATUS = 0 + BEGIN + + IF @typeofobject = ''DB'' + BEGIN + IF EXISTS(SELECT 1 FROM sys.fn_builtin_permissions(''DATABASE'') WHERE permission_name = '''' + @rightsaction + '''') + BEGIN + SET @Command = @Command + @grantordeny + '' '' + @rightsaction + '' TO ['' + @RoleName + ''] +'' + END + END + + IF @typeofobject = ''SCHEMA'' + BEGIN + SET @Command = @Command + '' +IF EXISTS (SELECT 1 FROM sys.schemas WHERE name = '''''' + @schemaid + '''''') +BEGIN + IF EXISTS(SELECT 1 FROM sys.fn_builtin_permissions(''''SCHEMA'''') WHERE permission_name = '''''' + @rightsaction + '''''') + BEGIN + '' + @grantordeny + '' '' + @rightsaction + '' ON SCHEMA::'' + @schemaid + '' TO ['' + @RoleName + ''] + END +END + +'' + END + + IF @typeofobject in(''TABLE'',''SP'',''FUNCTIONS'',''VIEWS'') + BEGIN + + IF @objectname like ''%[%]%'' + BEGIN + + IF @typeofobject = ''TABLE'' + BEGIN + SET @sysTarget = ''sys.tables'' + SET @sysType = '''' + END + + IF @typeofobject = ''SP'' + BEGIN + SET @sysTarget = ''sys.procedures'' + SET @sysType = '''' + END + + IF @typeofobject = ''FUNCTIONS'' + BEGIN + SET @sysTarget = ''sys.objects'' + SET @sysType = '' and p.Type IN ( N''''FN'''', N''''IF'''', N''''TF'''', N''''FS'''', N''''FT'''' )'' + END + + IF @typeofobject = ''VIEWS'' + BEGIN + SET @sysTarget = ''sys.views'' + SET @sysType = '''' + END + + SET @Command = @Command + '' +DECLARE SP_cursor CURSOR FOR +SELECT p.name FROM '' + @sysTarget + '' p JOIN sys.schemas s ON s.schema_id = p.schema_id WHERE (p.name like '''''' + @objectname + '''''') and s.name = '''''' + @schemaid + '''' + @sysType + '''''' + +OPEN SP_cursor +FETCH NEXT FROM SP_cursor INTO @SP_Name +WHILE @@FETCH_STATUS = 0 +BEGIN + IF EXISTS(SELECT 1 FROM sys.fn_builtin_permissions(''''OBJECT'''') WHERE permission_name = '''''' + @rightsaction + '''''') + BEGIN + EXEC('''''' + @grantordeny + '' '' + @rightsaction + '' ON ['' + @schemaid + ''].['''' + @SP_Name + ''''] TO ['' + @RoleName + '']'''') + END + FETCH NEXT FROM SP_cursor INTO @SP_Name +END + +CLOSE SP_cursor +DEALLOCATE SP_cursor + +'' + + END + ELSE + BEGIN + + SET @Command = @Command + '' +IF EXISTS(SELECT 1 FROM sys.objects o WITH (NOLOCK) JOIN sys.schemas s ON s.schema_id = o.schema_id WHERE o.name = '''''' + @objectname + '''''' AND o.type IN (N''''U'''',''''P'''',''''V'''',''''FN'''',''''IF'''',''''TF'''') AND s.name = '''''' + @schemaid + '''''') +BEGIN + IF EXISTS(SELECT 1 FROM sys.fn_builtin_permissions(''''OBJECT'''') WHERE permission_name = '''''' + @rightsaction + '''''') + BEGIN + '' + @grantordeny + '' '' + @rightsaction + '' ON ['' + @schemaid + ''].['' + @objectname + ''] TO ['' + @RoleName + ''] + END +END + +'' + END + END + + IF @typeofobject = ''ASSEMBLIES'' + BEGIN + SET @Command = @Command + '' +IF EXISTS(SELECT 1 FROM sys.assemblies WHERE NAME = '''''' + @objectname + '''''') +BEGIN + IF EXISTS(SELECT 1 FROM sys.fn_builtin_permissions(''''ASSEMBLY'''') WHERE permission_name = '''''' + @rightsaction + '''''') + BEGIN + '' + @grantordeny + '' '' + @rightsaction + ''::['' + @objectname + ''] TO ['' + @RoleName + ''] + END +END + +'' + END + + IF @typeofobject = ''ROLE'' + BEGIN + SET @Command = @Command + '' +IF NOT EXISTS (SELECT 1 FROM sys.database_role_members JOIN sys.database_principals roles ON database_role_members.role_principal_id = roles.principal_id JOIN sys.database_principals members ON database_role_members.member_principal_id = members.principal_id WHERE roles.name = '''''' + @rightsaction + '''''' AND members.name = '''''' + @RoleName + '''''') +BEGIN + EXEC sp_addrolemember N'''''' + @rightsaction + '''''', N'''''' + @RoleName + '''''' +END + +'' + END + + FETCH NEXT FROM SecurablesCurs INTO @typeofobject, @grantordeny, @rightsaction, @objectname, @schemaid + END + +CLOSE SecurablesCurs +DEALLOCATE SecurablesCurs + +PRINT ''SET ALL SECURABLES ON ROLE ['' + @RoleName + '']'' +EXEC sp_executesql @Command + +END + +/* ADD USER */ +DECLARE UsersCurs CURSOR FOR +SELECT username + FROM #UsersOnRole + +OPEN UsersCurs + +FETCH NEXT FROM UsersCurs INTO @Users +WHILE @@FETCH_STATUS = 0 +BEGIN + + SELECT @Command = '' +EXEC sp_addrolemember N'''''' + @RoleName + '''''', N'''''' + @Users + '''''' +PRINT ''''ADD USER ['' + @Users + ''] ON ROLE ['' + @RoleName + '']'''' +'' + +FETCH NEXT FROM UsersCurs INTO @Users +END + +CLOSE UsersCurs +DEALLOCATE UsersCurs + +EXEC sp_executesql @Command + +/*============================================================================= + Drop temp tables +=============================================================================*/ +DROP TABLE #Securables +DROP TABLE #UsersOnRole','Arizona','Pharmacies') + +INSERT INTO #AllRoles(STR_Definition,STR_Database,STR_Product)VALUES(' + +/*============================================================================= + + Script to create dbRoleSupUsr role. + + Role Name: dbRoleSupUsr + TEMPLATE: N2 and PROD + + EXAMPLE OF SECURABLES TO SET: + + INSERT INTO #Securables + VALUES + (''DB'',''GRANT'',''VIEW DEFINITION'','''',''''), + (''SCHEMA'',''GRANT'',''SELECT,EXECUTE,INSERT,UPDATE,DELETE'','''',''AP''), + (''TABLE'',''GRANT'',''INSERT,UPDATE'',''Address'',''dbo''), + (''SP'',''GRANT'',''EXECUTE'',''sp_bmc_GetNextID'',''dbo''), + (''ROLE'',''GRANT'',''db_datareader'','''','''') + + ----------------------------------------------- + +Generate date : 2023-05-12 / up208700 + +=============================================================================*/ + +DECLARE @Type varchar(6), + @Command nvarchar(max), + @RoleName varchar(60), + @Users varchar(255), + @typeofobject varchar(50), + @grantordeny varchar(10), + @rightsaction varchar(255), + @objectname varchar(255), + @schemaid varchar(10), + @sysTarget varchar(255), + @sysType varchar(255) + +SET @RoleName = ''dbRoleSupUsr'' +SET @Command = '''' + +SELECT @Type = [Type] FROM [master].[cfg].[InstanceContext] + +/* TEMP TABLES */ +CREATE TABLE #UsersOnRole(username varchar(255)) +CREATE TABLE #Securables(typeofobject varchar(50), grantordeny varchar(10), rightsaction varchar(255), objectname varchar(255), schemaid varchar(10),N2 bit) + +/* !!! LIST OF SECURABLES TO CHANGE !!! */ + +INSERT INTO #Securables +VALUES +(''DB'',''GRANT'',''EXECUTE'','''',''dbo'',0) +,(''ROLE'',''GRANT'',''DB_DATAREADER'','''',''dbo'',0) +,(''ROLE'',''GRANT'',''DB_DATAWRITER'','''',''dbo'',0) +,(''ROLE'',''GRANT'',''DB_OWNER'','''',''dbo'',1) + + +/* GET ALL USERS ON THIS ROLE */ +INSERT INTO #UsersOnRole +SELECT + members.name +FROM sys.database_role_members + JOIN sys.database_principals roles ON database_role_members.role_principal_id = roles.principal_id + JOIN sys.database_principals members ON database_role_members.member_principal_id = members.principal_id +WHERE roles.name = @RoleName + +/* CREATE ROLE */ +SELECT @Command = '' +IF NOT EXISTS (SELECT 1 FROM sys.database_principals WHERE name = '''''' + @RoleName + '''''' AND type = ''''R'''') +BEGIN + CREATE ROLE ['' + @RoleName + ''] AUTHORIZATION [dbo] + PRINT ''''CREATE ROLE ['' + @RoleName + '']'''' +END +'' +EXEC sp_executesql @Command + +SET @Command = '' +DECLARE @SP_Name varchar(255) + +'' + +/* SET ALL ROLE SECURABLES */ +IF @Type = ''DEVE'' +BEGIN + + DECLARE SecurablesCurs CURSOR FOR + SELECT typeofobject, grantordeny, rightsaction, objectname, schemaid + FROM #Securables + WHERE N2 = 1 + + OPEN SecurablesCurs + FETCH NEXT FROM SecurablesCurs INTO @typeofobject, @grantordeny, @rightsaction, @objectname, @schemaid + WHILE @@FETCH_STATUS = 0 + BEGIN + + IF @typeofobject = ''DB'' + BEGIN + IF EXISTS(SELECT 1 FROM sys.fn_builtin_permissions(''DATABASE'') WHERE permission_name = '''' + @rightsaction + '''') + BEGIN + SET @Command = @Command + @grantordeny + '' '' + @rightsaction + '' TO ['' + @RoleName + ''] +'' + END + END + + IF @typeofobject = ''SCHEMA'' + BEGIN + SET @Command = @Command + '' +IF EXISTS (SELECT 1 FROM sys.schemas WHERE name = '''''' + @schemaid + '''''') +BEGIN + IF EXISTS(SELECT 1 FROM sys.fn_builtin_permissions(''''SCHEMA'''') WHERE permission_name = '''''' + @rightsaction + '''''') + BEGIN + '' + @grantordeny + '' '' + @rightsaction + '' ON SCHEMA::'' + @schemaid + '' TO ['' + @RoleName + ''] + END +END + +'' + END + + IF @typeofobject in(''TABLE'',''SP'',''FUNCTIONS'',''VIEWS'') + BEGIN + + IF @objectname like ''%[%]%'' + BEGIN + IF @typeofobject = ''TABLE'' + BEGIN + SET @sysTarget = ''sys.tables'' + SET @sysType = '''' + END + + IF @typeofobject = ''SP'' + BEGIN + SET @sysTarget = ''sys.procedures'' + SET @sysType = '''' + END + + IF @typeofobject = ''FUNCTIONS'' + BEGIN + SET @sysTarget = ''sys.objects'' + SET @sysType = '' and p.Type IN ( N''''FN'''', N''''IF'''', N''''TF'''', N''''FS'''', N''''FT'''' )'' + END + + IF @typeofobject = ''VIEWS'' + BEGIN + SET @sysTarget = ''sys.views'' + SET @sysType = '''' + END + + SET @Command = @Command + '' +DECLARE SP_cursor CURSOR FOR +SELECT p.name FROM '' + @sysTarget + '' p JOIN sys.schemas s ON s.schema_id = p.schema_id WHERE (p.name like '''''' + @objectname + '''''') and s.name = '''''' + @schemaid + '''' + @sysType + '''''' + +OPEN SP_cursor +FETCH NEXT FROM SP_cursor INTO @SP_Name +WHILE @@FETCH_STATUS = 0 +BEGIN + IF EXISTS(SELECT 1 FROM sys.fn_builtin_permissions(''''OBJECT'''') WHERE permission_name = '''''' + @rightsaction + '''''') + BEGIN + EXEC('''''' + @grantordeny + '' '' + @rightsaction + '' ON ['' + @schemaid + ''].['''' + @SP_Name + ''''] TO ['' + @RoleName + '']'''') + END + FETCH NEXT FROM SP_cursor INTO @SP_Name +END + +CLOSE SP_cursor +DEALLOCATE SP_cursor + +'' + + END + ELSE + BEGIN + + SET @Command = @Command + '' +IF EXISTS(SELECT 1 FROM sys.objects o WITH (NOLOCK) JOIN sys.schemas s ON s.schema_id = o.schema_id WHERE o.name = '''''' + @objectname + '''''' AND o.type IN (N''''U'''',''''P'''',''''V'''',''''FN'''',''''IF'''',''''TF'''') AND s.name = '''''' + @schemaid + '''''') +BEGIN + IF EXISTS(SELECT 1 FROM sys.fn_builtin_permissions(''''OBJECT'''') WHERE permission_name = '''''' + @rightsaction + '''''') + BEGIN + '' + @grantordeny + '' '' + @rightsaction + '' ON ['' + @schemaid + ''].['' + @objectname + ''] TO ['' + @RoleName + ''] + END +END + +'' + END + END + + IF @typeofobject = ''ASSEMBLIES'' + BEGIN + SET @Command = @Command + '' +IF EXISTS(SELECT 1 FROM sys.assemblies WHERE NAME = '''''' + @objectname + '''''') +BEGIN + IF EXISTS(SELECT 1 FROM sys.fn_builtin_permissions(''''ASSEMBLY'''') WHERE permission_name = '''''' + @rightsaction + '''''') + BEGIN + '' + @grantordeny + '' '' + @rightsaction + ''::['' + @objectname + ''] TO ['' + @RoleName + ''] + END +END + +'' + END + + IF @typeofobject = ''ROLE'' + BEGIN + SET @Command = @Command + '' +IF NOT EXISTS (SELECT 1 FROM sys.database_role_members JOIN sys.database_principals roles ON database_role_members.role_principal_id = roles.principal_id JOIN sys.database_principals members ON database_role_members.member_principal_id = members.principal_id WHERE roles.name = '''''' + @rightsaction + '''''' AND members.name = '''''' + @RoleName + '''''') +BEGIN + EXEC sp_addrolemember N'''''' + @rightsaction + '''''', N'''''' + @RoleName + '''''' +END + +'' + END + + FETCH NEXT FROM SecurablesCurs INTO @typeofobject, @grantordeny, @rightsaction, @objectname, @schemaid + END + +CLOSE SecurablesCurs +DEALLOCATE SecurablesCurs + +PRINT ''SET ALL SECURABLES ON ROLE ['' + @RoleName + '']'' +EXEC sp_executesql @Command + +END +ELSE +BEGIN + + DECLARE SecurablesCurs CURSOR FOR + SELECT typeofobject, grantordeny, rightsaction, objectname, schemaid + FROM #Securables + WHERE N2 = 0 + + OPEN SecurablesCurs + FETCH NEXT FROM SecurablesCurs INTO @typeofobject, @grantordeny, @rightsaction, @objectname, @schemaid + WHILE @@FETCH_STATUS = 0 + BEGIN + + IF @typeofobject = ''DB'' + BEGIN + IF EXISTS(SELECT 1 FROM sys.fn_builtin_permissions(''DATABASE'') WHERE permission_name = '''' + @rightsaction + '''') + BEGIN + SET @Command = @Command + @grantordeny + '' '' + @rightsaction + '' TO ['' + @RoleName + ''] +'' + END + END + + IF @typeofobject = ''SCHEMA'' + BEGIN + SET @Command = @Command + '' +IF EXISTS (SELECT 1 FROM sys.schemas WHERE name = '''''' + @schemaid + '''''') +BEGIN + IF EXISTS(SELECT 1 FROM sys.fn_builtin_permissions(''''SCHEMA'''') WHERE permission_name = '''''' + @rightsaction + '''''') + BEGIN + '' + @grantordeny + '' '' + @rightsaction + '' ON SCHEMA::'' + @schemaid + '' TO ['' + @RoleName + ''] + END +END + +'' + END + + IF @typeofobject in(''TABLE'',''SP'',''FUNCTIONS'',''VIEWS'') + BEGIN + + IF @objectname like ''%[%]%'' + BEGIN + + IF @typeofobject = ''TABLE'' + BEGIN + SET @sysTarget = ''sys.tables'' + SET @sysType = '''' + END + + IF @typeofobject = ''SP'' + BEGIN + SET @sysTarget = ''sys.procedures'' + SET @sysType = '''' + END + + IF @typeofobject = ''FUNCTIONS'' + BEGIN + SET @sysTarget = ''sys.objects'' + SET @sysType = '' and p.Type IN ( N''''FN'''', N''''IF'''', N''''TF'''', N''''FS'''', N''''FT'''' )'' + END + + IF @typeofobject = ''VIEWS'' + BEGIN + SET @sysTarget = ''sys.views'' + SET @sysType = '''' + END + + SET @Command = @Command + '' +DECLARE SP_cursor CURSOR FOR +SELECT p.name FROM '' + @sysTarget + '' p JOIN sys.schemas s ON s.schema_id = p.schema_id WHERE (p.name like '''''' + @objectname + '''''') and s.name = '''''' + @schemaid + '''' + @sysType + '''''' + +OPEN SP_cursor +FETCH NEXT FROM SP_cursor INTO @SP_Name +WHILE @@FETCH_STATUS = 0 +BEGIN + IF EXISTS(SELECT 1 FROM sys.fn_builtin_permissions(''''OBJECT'''') WHERE permission_name = '''''' + @rightsaction + '''''') + BEGIN + EXEC('''''' + @grantordeny + '' '' + @rightsaction + '' ON ['' + @schemaid + ''].['''' + @SP_Name + ''''] TO ['' + @RoleName + '']'''') + END + FETCH NEXT FROM SP_cursor INTO @SP_Name +END + +CLOSE SP_cursor +DEALLOCATE SP_cursor + +'' + + END + ELSE + BEGIN + + SET @Command = @Command + '' +IF EXISTS(SELECT 1 FROM sys.objects o WITH (NOLOCK) JOIN sys.schemas s ON s.schema_id = o.schema_id WHERE o.name = '''''' + @objectname + '''''' AND o.type IN (N''''U'''',''''P'''',''''V'''',''''FN'''',''''IF'''',''''TF'''') AND s.name = '''''' + @schemaid + '''''') +BEGIN + IF EXISTS(SELECT 1 FROM sys.fn_builtin_permissions(''''OBJECT'''') WHERE permission_name = '''''' + @rightsaction + '''''') + BEGIN + '' + @grantordeny + '' '' + @rightsaction + '' ON ['' + @schemaid + ''].['' + @objectname + ''] TO ['' + @RoleName + ''] + END +END + +'' + END + END + + IF @typeofobject = ''ASSEMBLIES'' + BEGIN + SET @Command = @Command + '' +IF EXISTS(SELECT 1 FROM sys.assemblies WHERE NAME = '''''' + @objectname + '''''') +BEGIN + IF EXISTS(SELECT 1 FROM sys.fn_builtin_permissions(''''ASSEMBLY'''') WHERE permission_name = '''''' + @rightsaction + '''''') + BEGIN + '' + @grantordeny + '' '' + @rightsaction + ''::['' + @objectname + ''] TO ['' + @RoleName + ''] + END +END + +'' + END + + IF @typeofobject = ''ROLE'' + BEGIN + SET @Command = @Command + '' +IF NOT EXISTS (SELECT 1 FROM sys.database_role_members JOIN sys.database_principals roles ON database_role_members.role_principal_id = roles.principal_id JOIN sys.database_principals members ON database_role_members.member_principal_id = members.principal_id WHERE roles.name = '''''' + @rightsaction + '''''' AND members.name = '''''' + @RoleName + '''''') +BEGIN + EXEC sp_addrolemember N'''''' + @rightsaction + '''''', N'''''' + @RoleName + '''''' +END + +'' + END + + FETCH NEXT FROM SecurablesCurs INTO @typeofobject, @grantordeny, @rightsaction, @objectname, @schemaid + END + +CLOSE SecurablesCurs +DEALLOCATE SecurablesCurs + +PRINT ''SET ALL SECURABLES ON ROLE ['' + @RoleName + '']'' +EXEC sp_executesql @Command + +END + +/* ADD USER */ +DECLARE UsersCurs CURSOR FOR +SELECT username + FROM #UsersOnRole + +OPEN UsersCurs + +FETCH NEXT FROM UsersCurs INTO @Users +WHILE @@FETCH_STATUS = 0 +BEGIN + + SELECT @Command = '' +EXEC sp_addrolemember N'''''' + @RoleName + '''''', N'''''' + @Users + '''''' +PRINT ''''ADD USER ['' + @Users + ''] ON ROLE ['' + @RoleName + '']'''' +'' + +FETCH NEXT FROM UsersCurs INTO @Users +END + +CLOSE UsersCurs +DEALLOCATE UsersCurs + +EXEC sp_executesql @Command + +/*============================================================================= + Drop temp tables +=============================================================================*/ +DROP TABLE #Securables +DROP TABLE #UsersOnRole','Arizona','Pharmacies') + +INSERT INTO #AllRoles(STR_Definition,STR_Database,STR_Product)VALUES(' + +/*============================================================================= + + Script to create dbRoleSyncAccountingExtraction role. + + Role Name: dbRoleSyncAccountingExtraction + TEMPLATE: Default + + EXAMPLE OF SECURABLES TO SET: + + INSERT INTO #Securables + VALUES + (''DB'',''GRANT'',''VIEW DEFINITION'','''',''''), + (''SCHEMA'',''GRANT'',''SELECT,EXECUTE,INSERT,UPDATE,DELETE'','''',''AP''), + (''TABLE'',''GRANT'',''INSERT,UPDATE'',''Address'',''dbo''), + (''SP'',''GRANT'',''EXECUTE'',''sp_bmc_GetNextID'',''dbo''), + (''ROLE'',''GRANT'',''db_datareader'','''','''') + + ----------------------------------------------- + +Generate date : 2023-05-12 / up208700 + +=============================================================================*/ + +DECLARE @Command nvarchar(max), + @RoleName varchar(60), + @Users varchar(255), + @typeofobject varchar(50), + @grantordeny varchar(10), + @rightsaction varchar(255), + @objectname varchar(255), + @schemaid varchar(10), + @sysTarget varchar(255), + @sysType varchar(255) + +SET @RoleName = ''dbRoleSyncAccountingExtraction'' +SET @Command = '''' + +/* TEMP TABLES */ +CREATE TABLE #UsersOnRole(username varchar(255)) +CREATE TABLE #Securables(typeofobject varchar(50), grantordeny varchar(10), rightsaction varchar(255), objectname varchar(255), schemaid varchar(10),N2 bit) + +/* !!! LIST OF SECURABLES TO CHANGE !!! */ + +INSERT INTO #Securables +VALUES +(''DB'',''GRANT'',''EXECUTE'','''',''dbo'',0) +,(''DB'',''GRANT'',''VIEW DEFINITION'','''',''dbo'',0) +,(''ROLE'',''GRANT'',''DB_DATAREADER'','''',''dbo'',0) +,(''ROLE'',''GRANT'',''DB_DATAWRITER'','''',''dbo'',0) + + +/* GET ALL USERS ON THIS ROLE */ +INSERT INTO #UsersOnRole +SELECT + members.name +FROM sys.database_role_members + JOIN sys.database_principals roles ON database_role_members.role_principal_id = roles.principal_id + JOIN sys.database_principals members ON database_role_members.member_principal_id = members.principal_id +WHERE roles.name = @RoleName + +/* CREATE ROLE */ +SELECT @Command = '' +IF NOT EXISTS (SELECT 1 FROM sys.database_principals WHERE name = '''''' + @RoleName + '''''' AND type = ''''R'''') +BEGIN + CREATE ROLE ['' + @RoleName + ''] AUTHORIZATION [dbo] + PRINT ''''CREATE ROLE ['' + @RoleName + '']'''' +END +'' +EXEC sp_executesql @Command + +SET @Command = '' +DECLARE @SP_Name varchar(255) + +'' + +/* SET ALL ROLE SECURABLES */ +DECLARE SecurablesCurs CURSOR FOR +SELECT typeofobject, grantordeny, rightsaction, objectname, schemaid +FROM #Securables +WHERE N2 = 0 + +OPEN SecurablesCurs +FETCH NEXT FROM SecurablesCurs INTO @typeofobject, @grantordeny, @rightsaction, @objectname, @schemaid +WHILE @@FETCH_STATUS = 0 +BEGIN + + IF @typeofobject = ''DB'' + BEGIN + IF EXISTS(SELECT 1 FROM sys.fn_builtin_permissions(''DATABASE'') WHERE permission_name = '''' + @rightsaction + '''') + BEGIN + SET @Command = @Command + @grantordeny + '' '' + @rightsaction + '' TO ['' + @RoleName + ''] +'' + END + END + + IF @typeofobject = ''SCHEMA'' + BEGIN + SET @Command = @Command + '' +IF EXISTS (SELECT 1 FROM sys.schemas WHERE name = '''''' + @schemaid + '''''') +BEGIN + IF EXISTS(SELECT 1 FROM sys.fn_builtin_permissions(''''SCHEMA'''') WHERE permission_name = '''''' + @rightsaction + '''''') + BEGIN + '' + @grantordeny + '' '' + @rightsaction + '' ON SCHEMA::'' + @schemaid + '' TO ['' + @RoleName + ''] + END +END + +'' + END + + IF @typeofobject in(''TABLE'',''SP'',''FUNCTIONS'',''VIEWS'') + BEGIN + + IF @objectname like ''%[%]%'' + BEGIN + + IF @typeofobject = ''TABLE'' + BEGIN + SET @sysTarget = ''sys.tables'' + SET @sysType = '''' + END + + IF @typeofobject = ''SP'' + BEGIN + SET @sysTarget = ''sys.procedures'' + SET @sysType = '''' + END + + IF @typeofobject = ''FUNCTIONS'' + BEGIN + SET @sysTarget = ''sys.objects'' + SET @sysType = '' and p.Type IN ( N''''FN'''', N''''IF'''', N''''TF'''', N''''FS'''', N''''FT'''' )'' + END + + IF @typeofobject = ''VIEWS'' + BEGIN + SET @sysTarget = ''sys.views'' + SET @sysType = '''' + END + + SET @Command = @Command + '' +DECLARE SP_cursor CURSOR FOR +SELECT p.name FROM '' + @sysTarget + '' p JOIN sys.schemas s ON s.schema_id = p.schema_id WHERE (p.name like '''''' + @objectname + '''''') and s.name = '''''' + @schemaid + '''' + @sysType + '''''' + +OPEN SP_cursor +FETCH NEXT FROM SP_cursor INTO @SP_Name +WHILE @@FETCH_STATUS = 0 +BEGIN + IF EXISTS(SELECT 1 FROM sys.fn_builtin_permissions(''''OBJECT'''') WHERE permission_name = '''''' + @rightsaction + '''''') + BEGIN + EXEC('''''' + @grantordeny + '' '' + @rightsaction + '' ON ['' + @schemaid + ''].['''' + @SP_Name + ''''] TO ['' + @RoleName + '']'''') + END + FETCH NEXT FROM SP_cursor INTO @SP_Name +END + +CLOSE SP_cursor +DEALLOCATE SP_cursor + +'' + + END + ELSE + BEGIN + + SET @Command = @Command + '' +IF EXISTS(SELECT 1 FROM sys.objects o WITH (NOLOCK) JOIN sys.schemas s ON s.schema_id = o.schema_id WHERE o.name = '''''' + @objectname + '''''' AND o.type IN (N''''U'''',''''P'''',''''V'''',''''FN'''',''''IF'''',''''TF'''') AND s.name = '''''' + @schemaid + '''''') +BEGIN + IF EXISTS(SELECT 1 FROM sys.fn_builtin_permissions(''''OBJECT'''') WHERE permission_name = '''''' + @rightsaction + '''''') + BEGIN + '' + @grantordeny + '' '' + @rightsaction + '' ON ['' + @schemaid + ''].['' + @objectname + ''] TO ['' + @RoleName + ''] + END +END + +'' + END +END + +IF @typeofobject = ''ASSEMBLIES'' +BEGIN + SET @Command = @Command + '' +IF EXISTS(SELECT 1 FROM sys.assemblies WHERE NAME = '''''' + @objectname + '''''') +BEGIN + IF EXISTS(SELECT 1 FROM sys.fn_builtin_permissions(''''ASSEMBLY'''') WHERE permission_name = '''''' + @rightsaction + '''''') + BEGIN + '' + @grantordeny + '' '' + @rightsaction + ''::['' + @objectname + ''] TO ['' + @RoleName + ''] + END +END + +'' +END + +IF @typeofobject = ''ROLE'' +BEGIN + SET @Command = @Command + '' +IF NOT EXISTS (SELECT 1 FROM sys.database_role_members JOIN sys.database_principals roles ON database_role_members.role_principal_id = roles.principal_id JOIN sys.database_principals members ON database_role_members.member_principal_id = members.principal_id WHERE roles.name = '''''' + @rightsaction + '''''' AND members.name = '''''' + @RoleName + '''''') +BEGIN + EXEC sp_addrolemember N'''''' + @rightsaction + '''''', N'''''' + @RoleName + '''''' +END + +'' +END + +FETCH NEXT FROM SecurablesCurs INTO @typeofobject, @grantordeny, @rightsaction, @objectname, @schemaid +END + +CLOSE SecurablesCurs +DEALLOCATE SecurablesCurs + +PRINT ''SET ALL SECURABLES ON ROLE ['' + @RoleName + '']'' +EXEC sp_executesql @Command + +/* ADD USER */ +DECLARE UsersCurs CURSOR FOR +SELECT username + FROM #UsersOnRole + +OPEN UsersCurs + +FETCH NEXT FROM UsersCurs INTO @Users +WHILE @@FETCH_STATUS = 0 +BEGIN + + SELECT @Command = '' +EXEC sp_addrolemember N'''''' + @RoleName + '''''', N'''''' + @Users + '''''' +PRINT ''''ADD USER ['' + @Users + ''] ON ROLE ['' + @RoleName + '']'''' +'' + +FETCH NEXT FROM UsersCurs INTO @Users +END + +CLOSE UsersCurs +DEALLOCATE UsersCurs + +EXEC sp_executesql @Command + + +/*============================================================================= + Drop temp tables +=============================================================================*/ +DROP TABLE #Securables +DROP TABLE #UsersOnRole +','Arizona','Pharmacies') + +INSERT INTO #AllRoles(STR_Definition,STR_Database,STR_Product)VALUES(' + +/*============================================================================= + + Script to create dbRoleTPPos role. + + Role Name: dbRoleTPPos + TEMPLATE: Default + + EXAMPLE OF SECURABLES TO SET: + + INSERT INTO #Securables + VALUES + (''DB'',''GRANT'',''VIEW DEFINITION'','''',''''), + (''SCHEMA'',''GRANT'',''SELECT,EXECUTE,INSERT,UPDATE,DELETE'','''',''AP''), + (''TABLE'',''GRANT'',''INSERT,UPDATE'',''Address'',''dbo''), + (''SP'',''GRANT'',''EXECUTE'',''sp_bmc_GetNextID'',''dbo''), + (''ROLE'',''GRANT'',''db_datareader'','''','''') + + ----------------------------------------------- + +Generate date : 2023-05-12 / up208700 + +=============================================================================*/ + +DECLARE @Command nvarchar(max), + @RoleName varchar(60), + @Users varchar(255), + @typeofobject varchar(50), + @grantordeny varchar(10), + @rightsaction varchar(255), + @objectname varchar(255), + @schemaid varchar(10), + @sysTarget varchar(255), + @sysType varchar(255) + +SET @RoleName = ''dbRoleTPPos'' +SET @Command = '''' + +/* TEMP TABLES */ +CREATE TABLE #UsersOnRole(username varchar(255)) +CREATE TABLE #Securables(typeofobject varchar(50), grantordeny varchar(10), rightsaction varchar(255), objectname varchar(255), schemaid varchar(10),N2 bit) + +/* !!! LIST OF SECURABLES TO CHANGE !!! */ + +INSERT INTO #Securables +VALUES +(''TABLE'',''GRANT'',''INSERT'',''DocumentSignature'',''wkl'',0) +,(''TABLE'',''GRANT'',''SELECT'',''Bmc_application_default'',''dbo'',0) +,(''TABLE'',''GRANT'',''SELECT'',''Bmc_application_key'',''dbo'',0) +,(''TABLE'',''GRANT'',''SELECT'',''DocumentSignature'',''wkl'',0) +,(''TABLE'',''GRANT'',''SELECT'',''IT_config_setting'',''dbo'',0) +,(''TABLE'',''GRANT'',''SELECT'',''Organizational_unit'',''dbo'',0) +,(''TABLE'',''GRANT'',''UPDATE'',''Bmc_application_default'',''dbo'',0) +,(''TABLE'',''GRANT'',''UPDATE'',''Bmc_application_key'',''dbo'',0) +,(''TABLE'',''GRANT'',''UPDATE'',''IT_config_setting'',''dbo'',0) +,(''TABLE'',''GRANT'',''UPDATE'',''Organizational_unit'',''dbo'',0) + + +/* GET ALL USERS ON THIS ROLE */ +INSERT INTO #UsersOnRole +SELECT + members.name +FROM sys.database_role_members + JOIN sys.database_principals roles ON database_role_members.role_principal_id = roles.principal_id + JOIN sys.database_principals members ON database_role_members.member_principal_id = members.principal_id +WHERE roles.name = @RoleName + +/* CREATE ROLE */ +SELECT @Command = '' +IF NOT EXISTS (SELECT 1 FROM sys.database_principals WHERE name = '''''' + @RoleName + '''''' AND type = ''''R'''') +BEGIN + CREATE ROLE ['' + @RoleName + ''] AUTHORIZATION [dbo] + PRINT ''''CREATE ROLE ['' + @RoleName + '']'''' +END +'' +EXEC sp_executesql @Command + +SET @Command = '' +DECLARE @SP_Name varchar(255) + +'' + +/* SET ALL ROLE SECURABLES */ +DECLARE SecurablesCurs CURSOR FOR +SELECT typeofobject, grantordeny, rightsaction, objectname, schemaid +FROM #Securables +WHERE N2 = 0 + +OPEN SecurablesCurs +FETCH NEXT FROM SecurablesCurs INTO @typeofobject, @grantordeny, @rightsaction, @objectname, @schemaid +WHILE @@FETCH_STATUS = 0 +BEGIN + + IF @typeofobject = ''DB'' + BEGIN + IF EXISTS(SELECT 1 FROM sys.fn_builtin_permissions(''DATABASE'') WHERE permission_name = '''' + @rightsaction + '''') + BEGIN + SET @Command = @Command + @grantordeny + '' '' + @rightsaction + '' TO ['' + @RoleName + ''] +'' + END + END + + IF @typeofobject = ''SCHEMA'' + BEGIN + SET @Command = @Command + '' +IF EXISTS (SELECT 1 FROM sys.schemas WHERE name = '''''' + @schemaid + '''''') +BEGIN + IF EXISTS(SELECT 1 FROM sys.fn_builtin_permissions(''''SCHEMA'''') WHERE permission_name = '''''' + @rightsaction + '''''') + BEGIN + '' + @grantordeny + '' '' + @rightsaction + '' ON SCHEMA::'' + @schemaid + '' TO ['' + @RoleName + ''] + END +END + +'' + END + + IF @typeofobject in(''TABLE'',''SP'',''FUNCTIONS'',''VIEWS'') + BEGIN + + IF @objectname like ''%[%]%'' + BEGIN + + IF @typeofobject = ''TABLE'' + BEGIN + SET @sysTarget = ''sys.tables'' + SET @sysType = '''' + END + + IF @typeofobject = ''SP'' + BEGIN + SET @sysTarget = ''sys.procedures'' + SET @sysType = '''' + END + + IF @typeofobject = ''FUNCTIONS'' + BEGIN + SET @sysTarget = ''sys.objects'' + SET @sysType = '' and p.Type IN ( N''''FN'''', N''''IF'''', N''''TF'''', N''''FS'''', N''''FT'''' )'' + END + + IF @typeofobject = ''VIEWS'' + BEGIN + SET @sysTarget = ''sys.views'' + SET @sysType = '''' + END + + SET @Command = @Command + '' +DECLARE SP_cursor CURSOR FOR +SELECT p.name FROM '' + @sysTarget + '' p JOIN sys.schemas s ON s.schema_id = p.schema_id WHERE (p.name like '''''' + @objectname + '''''') and s.name = '''''' + @schemaid + '''' + @sysType + '''''' + +OPEN SP_cursor +FETCH NEXT FROM SP_cursor INTO @SP_Name +WHILE @@FETCH_STATUS = 0 +BEGIN + IF EXISTS(SELECT 1 FROM sys.fn_builtin_permissions(''''OBJECT'''') WHERE permission_name = '''''' + @rightsaction + '''''') + BEGIN + EXEC('''''' + @grantordeny + '' '' + @rightsaction + '' ON ['' + @schemaid + ''].['''' + @SP_Name + ''''] TO ['' + @RoleName + '']'''') + END + FETCH NEXT FROM SP_cursor INTO @SP_Name +END + +CLOSE SP_cursor +DEALLOCATE SP_cursor + +'' + + END + ELSE + BEGIN + + SET @Command = @Command + '' +IF EXISTS(SELECT 1 FROM sys.objects o WITH (NOLOCK) JOIN sys.schemas s ON s.schema_id = o.schema_id WHERE o.name = '''''' + @objectname + '''''' AND o.type IN (N''''U'''',''''P'''',''''V'''',''''FN'''',''''IF'''',''''TF'''') AND s.name = '''''' + @schemaid + '''''') +BEGIN + IF EXISTS(SELECT 1 FROM sys.fn_builtin_permissions(''''OBJECT'''') WHERE permission_name = '''''' + @rightsaction + '''''') + BEGIN + '' + @grantordeny + '' '' + @rightsaction + '' ON ['' + @schemaid + ''].['' + @objectname + ''] TO ['' + @RoleName + ''] + END +END + +'' + END +END + +IF @typeofobject = ''ASSEMBLIES'' +BEGIN + SET @Command = @Command + '' +IF EXISTS(SELECT 1 FROM sys.assemblies WHERE NAME = '''''' + @objectname + '''''') +BEGIN + IF EXISTS(SELECT 1 FROM sys.fn_builtin_permissions(''''ASSEMBLY'''') WHERE permission_name = '''''' + @rightsaction + '''''') + BEGIN + '' + @grantordeny + '' '' + @rightsaction + ''::['' + @objectname + ''] TO ['' + @RoleName + ''] + END +END + +'' +END + +IF @typeofobject = ''ROLE'' +BEGIN + SET @Command = @Command + '' +IF NOT EXISTS (SELECT 1 FROM sys.database_role_members JOIN sys.database_principals roles ON database_role_members.role_principal_id = roles.principal_id JOIN sys.database_principals members ON database_role_members.member_principal_id = members.principal_id WHERE roles.name = '''''' + @rightsaction + '''''' AND members.name = '''''' + @RoleName + '''''') +BEGIN + EXEC sp_addrolemember N'''''' + @rightsaction + '''''', N'''''' + @RoleName + '''''' +END + +'' +END + +FETCH NEXT FROM SecurablesCurs INTO @typeofobject, @grantordeny, @rightsaction, @objectname, @schemaid +END + +CLOSE SecurablesCurs +DEALLOCATE SecurablesCurs + +PRINT ''SET ALL SECURABLES ON ROLE ['' + @RoleName + '']'' +EXEC sp_executesql @Command + +/* ADD USER */ +DECLARE UsersCurs CURSOR FOR +SELECT username + FROM #UsersOnRole + +OPEN UsersCurs + +FETCH NEXT FROM UsersCurs INTO @Users +WHILE @@FETCH_STATUS = 0 +BEGIN + + SELECT @Command = '' +EXEC sp_addrolemember N'''''' + @RoleName + '''''', N'''''' + @Users + '''''' +PRINT ''''ADD USER ['' + @Users + ''] ON ROLE ['' + @RoleName + '']'''' +'' + +FETCH NEXT FROM UsersCurs INTO @Users +END + +CLOSE UsersCurs +DEALLOCATE UsersCurs + +EXEC sp_executesql @Command + + +/*============================================================================= + Drop temp tables +=============================================================================*/ +DROP TABLE #Securables +DROP TABLE #UsersOnRole +','Arizona','Pharmacies') + +INSERT INTO #AllRoles(STR_Definition,STR_Database,STR_Product)VALUES(' + +/*============================================================================= + + Script to create dbRoleTriapharmChangeTracking role. + + Role Name: dbRoleTriapharmChangeTracking + TEMPLATE: Default + + EXAMPLE OF SECURABLES TO SET: + + INSERT INTO #Securables + VALUES + (''DB'',''GRANT'',''VIEW DEFINITION'','''',''''), + (''SCHEMA'',''GRANT'',''SELECT,EXECUTE,INSERT,UPDATE,DELETE'','''',''AP''), + (''TABLE'',''GRANT'',''INSERT,UPDATE'',''Address'',''dbo''), + (''SP'',''GRANT'',''EXECUTE'',''sp_bmc_GetNextID'',''dbo''), + (''ROLE'',''GRANT'',''db_datareader'','''','''') + + ----------------------------------------------- + +Generate date : 2023-05-12 / up208700 + +=============================================================================*/ + +DECLARE @Command nvarchar(max), + @RoleName varchar(60), + @Users varchar(255), + @typeofobject varchar(50), + @grantordeny varchar(10), + @rightsaction varchar(255), + @objectname varchar(255), + @schemaid varchar(10), + @sysTarget varchar(255), + @sysType varchar(255) + +SET @RoleName = ''dbRoleTriapharmChangeTracking'' +SET @Command = '''' + +/* TEMP TABLES */ +CREATE TABLE #UsersOnRole(username varchar(255)) +CREATE TABLE #Securables(typeofobject varchar(50), grantordeny varchar(10), rightsaction varchar(255), objectname varchar(255), schemaid varchar(10),N2 bit) + +/* !!! LIST OF SECURABLES TO CHANGE !!! */ + +INSERT INTO #Securables +VALUES +(''SP'',''GRANT'',''EXECUTE'',''SP_TRIABI_GetData'',''dbo'',0) +,(''SP'',''GRANT'',''EXECUTE'',''SP_TRIABI_GetMeta'',''dbo'',0) +,(''TABLE'',''GRANT'',''SELECT'',''Address'',''dbo'',0) +,(''TABLE'',''GRANT'',''SELECT'',''Address_category'',''dbo'',0) +,(''TABLE'',''GRANT'',''SELECT'',''Address_category_text'',''dbo'',0) +,(''TABLE'',''GRANT'',''SELECT'',''Address_criteria'',''dbo'',0) +,(''TABLE'',''GRANT'',''SELECT'',''Address_group'',''dbo'',0) +,(''TABLE'',''GRANT'',''SELECT'',''Address_group_text'',''dbo'',0) +,(''TABLE'',''GRANT'',''SELECT'',''Address_key'',''dbo'',0) +,(''TABLE'',''GRANT'',''SELECT'',''Address_link'',''dbo'',0) +,(''TABLE'',''GRANT'',''SELECT'',''Address_type'',''dbo'',0) +,(''TABLE'',''GRANT'',''SELECT'',''Bmc_application_default'',''dbo'',0) +,(''TABLE'',''GRANT'',''SELECT'',''Bmc_application_key'',''dbo'',0) +,(''TABLE'',''GRANT'',''SELECT'',''Bmc_user_profile'',''dbo'',0) +,(''TABLE'',''GRANT'',''SELECT'',''Brand'',''dbo'',0) +,(''TABLE'',''GRANT'',''SELECT'',''Brand_OU_link'',''dbo'',0) +,(''TABLE'',''GRANT'',''SELECT'',''Brand_text'',''dbo'',0) +,(''TABLE'',''GRANT'',''SELECT'',''Change_tracking_monitor'',''upd'',0) +,(''TABLE'',''GRANT'',''SELECT'',''Company'',''dbo'',0) +,(''TABLE'',''GRANT'',''SELECT'',''Country'',''dbo'',0) +,(''TABLE'',''GRANT'',''SELECT'',''Criteria'',''dbo'',0) +,(''TABLE'',''GRANT'',''SELECT'',''Criteria_text'',''dbo'',0) +,(''TABLE'',''GRANT'',''SELECT'',''Criteria_type'',''dbo'',0) +,(''TABLE'',''GRANT'',''SELECT'',''Criteria_type_text'',''dbo'',0) +,(''TABLE'',''GRANT'',''SELECT'',''DBA_change_tracking'',''dbo'',0) +,(''TABLE'',''GRANT'',''SELECT'',''DiscountVoucher'',''dbo'',0) +,(''TABLE'',''GRANT'',''SELECT'',''DiscountVoucherCondition'',''dbo'',0) +,(''TABLE'',''GRANT'',''SELECT'',''DiscountVoucherText'',''dbo'',0) +,(''TABLE'',''GRANT'',''SELECT'',''DL_Posology'',''dbo'',0) +,(''TABLE'',''GRANT'',''SELECT'',''Document_header'',''dbo'',0) +,(''TABLE'',''GRANT'',''SELECT'',''Document_line'',''dbo'',0) +,(''TABLE'',''GRANT'',''SELECT'',''Document_line_link'',''dbo'',0) +,(''TABLE'',''GRANT'',''SELECT'',''Document_type'',''dbo'',0) +,(''TABLE'',''GRANT'',''SELECT'',''Document_type_text'',''dbo'',0) +,(''TABLE'',''GRANT'',''SELECT'',''Employment_contract'',''dbo'',0) +,(''TABLE'',''GRANT'',''SELECT'',''Employment_contract_history'',''dbo'',0) +,(''TABLE'',''GRANT'',''SELECT'',''Fiscal_year'',''dbo'',0) +,(''TABLE'',''GRANT'',''SELECT'',''Fixed_price'',''dbo'',0) +,(''TABLE'',''GRANT'',''SELECT'',''GoodsReceipt'',''wkl'',0) +,(''TABLE'',''GRANT'',''SELECT'',''GoodsReceiptLine'',''wkl'',0) +,(''TABLE'',''GRANT'',''SELECT'',''Item'',''dbo'',0) +,(''TABLE'',''GRANT'',''SELECT'',''Item_context'',''dbo'',0) +,(''TABLE'',''GRANT'',''SELECT'',''Item_context_status'',''dbo'',0) +,(''TABLE'',''GRANT'',''SELECT'',''Item_context_status_text'',''dbo'',0) +,(''TABLE'',''GRANT'',''SELECT'',''Item_criteria'',''dbo'',0) +,(''TABLE'',''GRANT'',''SELECT'',''Item_dispatch_header'',''dbo'',0) +,(''TABLE'',''GRANT'',''SELECT'',''Item_dispatch_line'',''dbo'',0) +,(''TABLE'',''GRANT'',''SELECT'',''Item_family'',''dbo'',0) +,(''TABLE'',''GRANT'',''SELECT'',''Item_family_text'',''dbo'',0) +,(''TABLE'',''GRANT'',''SELECT'',''Item_group'',''dbo'',0) +,(''TABLE'',''GRANT'',''SELECT'',''Item_group_text'',''dbo'',0) +,(''TABLE'',''GRANT'',''SELECT'',''Item_inventory'',''dbo'',0) +,(''TABLE'',''GRANT'',''SELECT'',''Item_key'',''dbo'',0) +,(''TABLE'',''GRANT'',''SELECT'',''item_link'',''dbo'',0) +,(''TABLE'',''GRANT'',''SELECT'',''Item_purchase'',''dbo'',0) +,(''TABLE'',''GRANT'',''SELECT'',''Item_quantity'',''dbo'',0) +,(''TABLE'',''GRANT'',''SELECT'',''Item_relation_info'',''dbo'',0) +,(''TABLE'',''GRANT'',''SELECT'',''Item_sale'',''dbo'',0) +,(''TABLE'',''GRANT'',''SELECT'',''Item_seasonal_stock_info'',''dbo'',0) +,(''TABLE'',''GRANT'',''SELECT'',''Item_shipping'',''dbo'',0) +,(''TABLE'',''GRANT'',''SELECT'',''Item_standard_cost'',''dbo'',0) +,(''TABLE'',''GRANT'',''SELECT'',''Item_status_history'',''dbo'',0) +,(''TABLE'',''GRANT'',''SELECT'',''Item_text'',''dbo'',0) +,(''TABLE'',''GRANT'',''SELECT'',''Item_unit_conversion'',''dbo'',0) +,(''TABLE'',''GRANT'',''SELECT'',''Job_function'',''dbo'',0) +,(''TABLE'',''GRANT'',''SELECT'',''Job_function_text'',''dbo'',0) +,(''TABLE'',''GRANT'',''SELECT'',''Language'',''dbo'',0) +,(''TABLE'',''GRANT'',''SELECT'',''LORE_item_ABC_code'',''dbo'',0) +,(''TABLE'',''GRANT'',''SELECT'',''LORE_supplying_procedure'',''dbo'',0) +,(''TABLE'',''GRANT'',''SELECT'',''Manufacturer'',''dbo'',0) +,(''TABLE'',''GRANT'',''SELECT'',''MissedSale'',''wkl'',0) +,(''TABLE'',''GRANT'',''SELECT'',''OrderRequest'',''wkl'',0) +,(''TABLE'',''GRANT'',''SELECT'',''OrderRequestLine'',''wkl'',0) +,(''TABLE'',''GRANT'',''SELECT'',''Organizational_unit'',''dbo'',0) +,(''TABLE'',''GRANT'',''SELECT'',''OU_store_history'',''dbo'',0) +,(''TABLE'',''GRANT'',''SELECT'',''OU_store_type'',''dbo'',0) +,(''TABLE'',''GRANT'',''SELECT'',''PH_insurance'',''dbo'',0) +,(''TABLE'',''GRANT'',''SELECT'',''PH_insurance_card'',''dbo'',0) +,(''TABLE'',''GRANT'',''SELECT'',''PH_insurance_plan'',''dbo'',0) +,(''TABLE'',''GRANT'',''SELECT'',''PH_insurance_recommendation'',''dbo'',0) +,(''TABLE'',''GRANT'',''SELECT'',''PH_item'',''dbo'',0) +,(''TABLE'',''GRANT'',''SELECT'',''PH_OICM_code'',''dbo'',0) +,(''TABLE'',''GRANT'',''SELECT'',''PH_OICM_code_text'',''dbo'',0) +,(''TABLE'',''GRANT'',''SELECT'',''PH_organizational_unit'',''dbo'',0) +,(''TABLE'',''GRANT'',''SELECT'',''PH_patient'',''dbo'',0) +,(''TABLE'',''GRANT'',''SELECT'',''PH_physician'',''dbo'',0) +,(''TABLE'',''GRANT'',''SELECT'',''PH_prescriber'',''dbo'',0) +,(''TABLE'',''GRANT'',''SELECT'',''PH_prescription_header'',''dbo'',0) +,(''TABLE'',''GRANT'',''SELECT'',''PH_prescription_line'',''dbo'',0) +,(''TABLE'',''GRANT'',''SELECT'',''PH_product'',''dbo'',0) +,(''TABLE'',''GRANT'',''SELECT'',''PH_qualification'',''dbo'',0) +,(''TABLE'',''GRANT'',''SELECT'',''PH_refund_code'',''dbo'',0) +,(''TABLE'',''GRANT'',''SELECT'',''PH_refund_code_text'',''dbo'',0) +,(''TABLE'',''GRANT'',''SELECT'',''PHGD_AC'',''dbo'',0) +,(''TABLE'',''GRANT'',''SELECT'',''PHGD_ACBARCODE'',''dbo'',0) +,(''TABLE'',''GRANT'',''SELECT'',''PHGD_ACCHAIN'',''dbo'',0) +,(''TABLE'',''GRANT'',''SELECT'',''PHGD_ACMED'',''dbo'',0) +,(''TABLE'',''GRANT'',''SELECT'',''PHGD_CODES'',''dbo'',0) +,(''TABLE'',''GRANT'',''SELECT'',''PHGD_CODETXT'',''dbo'',0) +,(''TABLE'',''GRANT'',''SELECT'',''Predefined_entry'',''dbo'',0) +,(''TABLE'',''GRANT'',''SELECT'',''Price_code'',''dbo'',0) +,(''TABLE'',''GRANT'',''SELECT'',''Price_modifier'',''dbo'',0) +,(''TABLE'',''GRANT'',''SELECT'',''Product_line'',''dbo'',0) +,(''TABLE'',''GRANT'',''SELECT'',''Product_line_text'',''dbo'',0) +,(''TABLE'',''GRANT'',''SELECT'',''Profit_cost_center'',''dbo'',0) +,(''TABLE'',''GRANT'',''SELECT'',''Profit_cost_center_key'',''dbo'',0) +,(''TABLE'',''GRANT'',''SELECT'',''PurchaseReturn'',''wkl'',0) +,(''TABLE'',''GRANT'',''SELECT'',''PurchaseReturnLine'',''wkl'',0) +,(''TABLE'',''GRANT'',''SELECT'',''Sales_tax_rate'',''dbo'',0) +,(''TABLE'',''GRANT'',''SELECT'',''Standard_text'',''dbo'',0) +,(''TABLE'',''GRANT'',''SELECT'',''Standard_text_text'',''dbo'',0) +,(''TABLE'',''GRANT'',''SELECT'',''Status_text'',''dbo'',0) +,(''TABLE'',''GRANT'',''SELECT'',''Subsidiary'',''dbo'',0) +,(''TABLE'',''GRANT'',''SELECT'',''Supplier'',''dbo'',0) +,(''TABLE'',''GRANT'',''SELECT'',''Tariff_type'',''dbo'',0) +,(''TABLE'',''GRANT'',''SELECT'',''VIP_card'',''dbo'',0) +,(''TABLE'',''GRANT'',''SELECT'',''VIP_card_type'',''dbo'',0) +,(''TABLE'',''GRANT'',''SELECT'',''VIP_card_type_link'',''dbo'',0) +,(''TABLE'',''GRANT'',''SELECT'',''WebShopStatusQueue'',''AP'',0) +,(''TABLE'',''GRANT'',''VIEW CHANGE TRACKING'',''Address'',''dbo'',0) +,(''TABLE'',''GRANT'',''VIEW CHANGE TRACKING'',''Address_category'',''dbo'',0) +,(''TABLE'',''GRANT'',''VIEW CHANGE TRACKING'',''Address_category_text'',''dbo'',0) +,(''TABLE'',''GRANT'',''VIEW CHANGE TRACKING'',''Address_criteria'',''dbo'',0) +,(''TABLE'',''GRANT'',''VIEW CHANGE TRACKING'',''Address_group'',''dbo'',0) +,(''TABLE'',''GRANT'',''VIEW CHANGE TRACKING'',''Address_group_text'',''dbo'',0) +,(''TABLE'',''GRANT'',''VIEW CHANGE TRACKING'',''Address_key'',''dbo'',0) +,(''TABLE'',''GRANT'',''VIEW CHANGE TRACKING'',''Address_link'',''dbo'',0) +,(''TABLE'',''GRANT'',''VIEW CHANGE TRACKING'',''Address_type'',''dbo'',0) +,(''TABLE'',''GRANT'',''VIEW CHANGE TRACKING'',''Bmc_application_default'',''dbo'',0) +,(''TABLE'',''GRANT'',''VIEW CHANGE TRACKING'',''Bmc_application_key'',''dbo'',0) +,(''TABLE'',''GRANT'',''VIEW CHANGE TRACKING'',''Bmc_user_profile'',''dbo'',0) +,(''TABLE'',''GRANT'',''VIEW CHANGE TRACKING'',''Brand'',''dbo'',0) +,(''TABLE'',''GRANT'',''VIEW CHANGE TRACKING'',''Brand_OU_link'',''dbo'',0) +,(''TABLE'',''GRANT'',''VIEW CHANGE TRACKING'',''Brand_text'',''dbo'',0) +,(''TABLE'',''GRANT'',''VIEW CHANGE TRACKING'',''Change_tracking_monitor'',''upd'',0) +,(''TABLE'',''GRANT'',''VIEW CHANGE TRACKING'',''Company'',''dbo'',0) +,(''TABLE'',''GRANT'',''VIEW CHANGE TRACKING'',''Country'',''dbo'',0) +,(''TABLE'',''GRANT'',''VIEW CHANGE TRACKING'',''Criteria'',''dbo'',0) +,(''TABLE'',''GRANT'',''VIEW CHANGE TRACKING'',''Criteria_text'',''dbo'',0) +,(''TABLE'',''GRANT'',''VIEW CHANGE TRACKING'',''Criteria_type'',''dbo'',0) +,(''TABLE'',''GRANT'',''VIEW CHANGE TRACKING'',''Criteria_type_text'',''dbo'',0) +,(''TABLE'',''GRANT'',''VIEW CHANGE TRACKING'',''DBA_change_tracking'',''dbo'',0) +,(''TABLE'',''GRANT'',''VIEW CHANGE TRACKING'',''DiscountVoucher'',''dbo'',0) +,(''TABLE'',''GRANT'',''VIEW CHANGE TRACKING'',''DiscountVoucherCondition'',''dbo'',0) +,(''TABLE'',''GRANT'',''VIEW CHANGE TRACKING'',''DiscountVoucherText'',''dbo'',0) +,(''TABLE'',''GRANT'',''VIEW CHANGE TRACKING'',''DL_Posology'',''dbo'',0) +,(''TABLE'',''GRANT'',''VIEW CHANGE TRACKING'',''Document_header'',''dbo'',0) +,(''TABLE'',''GRANT'',''VIEW CHANGE TRACKING'',''Document_line'',''dbo'',0) +,(''TABLE'',''GRANT'',''VIEW CHANGE TRACKING'',''Document_line_link'',''dbo'',0) +,(''TABLE'',''GRANT'',''VIEW CHANGE TRACKING'',''Document_type'',''dbo'',0) +,(''TABLE'',''GRANT'',''VIEW CHANGE TRACKING'',''Document_type_text'',''dbo'',0) +,(''TABLE'',''GRANT'',''VIEW CHANGE TRACKING'',''Employment_contract'',''dbo'',0) +,(''TABLE'',''GRANT'',''VIEW CHANGE TRACKING'',''Employment_contract_history'',''dbo'',0) +,(''TABLE'',''GRANT'',''VIEW CHANGE TRACKING'',''Fiscal_year'',''dbo'',0) +,(''TABLE'',''GRANT'',''VIEW CHANGE TRACKING'',''Fixed_price'',''dbo'',0) +,(''TABLE'',''GRANT'',''VIEW CHANGE TRACKING'',''GoodsReceipt'',''wkl'',0) +,(''TABLE'',''GRANT'',''VIEW CHANGE TRACKING'',''GoodsReceiptLine'',''wkl'',0) +,(''TABLE'',''GRANT'',''VIEW CHANGE TRACKING'',''Item'',''dbo'',0) +,(''TABLE'',''GRANT'',''VIEW CHANGE TRACKING'',''Item_context'',''dbo'',0) +,(''TABLE'',''GRANT'',''VIEW CHANGE TRACKING'',''Item_context_status'',''dbo'',0) +,(''TABLE'',''GRANT'',''VIEW CHANGE TRACKING'',''Item_context_status_text'',''dbo'',0) +,(''TABLE'',''GRANT'',''VIEW CHANGE TRACKING'',''Item_criteria'',''dbo'',0) +,(''TABLE'',''GRANT'',''VIEW CHANGE TRACKING'',''Item_dispatch_header'',''dbo'',0) +,(''TABLE'',''GRANT'',''VIEW CHANGE TRACKING'',''Item_dispatch_line'',''dbo'',0) +,(''TABLE'',''GRANT'',''VIEW CHANGE TRACKING'',''Item_family'',''dbo'',0) +,(''TABLE'',''GRANT'',''VIEW CHANGE TRACKING'',''Item_family_text'',''dbo'',0) +,(''TABLE'',''GRANT'',''VIEW CHANGE TRACKING'',''Item_group'',''dbo'',0) +,(''TABLE'',''GRANT'',''VIEW CHANGE TRACKING'',''Item_group_text'',''dbo'',0) +,(''TABLE'',''GRANT'',''VIEW CHANGE TRACKING'',''Item_inventory'',''dbo'',0) +,(''TABLE'',''GRANT'',''VIEW CHANGE TRACKING'',''Item_key'',''dbo'',0) +,(''TABLE'',''GRANT'',''VIEW CHANGE TRACKING'',''item_link'',''dbo'',0) +,(''TABLE'',''GRANT'',''VIEW CHANGE TRACKING'',''Item_purchase'',''dbo'',0) +,(''TABLE'',''GRANT'',''VIEW CHANGE TRACKING'',''Item_quantity'',''dbo'',0) +,(''TABLE'',''GRANT'',''VIEW CHANGE TRACKING'',''Item_relation_info'',''dbo'',0) +,(''TABLE'',''GRANT'',''VIEW CHANGE TRACKING'',''Item_sale'',''dbo'',0) +,(''TABLE'',''GRANT'',''VIEW CHANGE TRACKING'',''Item_seasonal_stock_info'',''dbo'',0) +,(''TABLE'',''GRANT'',''VIEW CHANGE TRACKING'',''Item_shipping'',''dbo'',0) +,(''TABLE'',''GRANT'',''VIEW CHANGE TRACKING'',''Item_standard_cost'',''dbo'',0) +,(''TABLE'',''GRANT'',''VIEW CHANGE TRACKING'',''Item_status_history'',''dbo'',0) +,(''TABLE'',''GRANT'',''VIEW CHANGE TRACKING'',''Item_text'',''dbo'',0) +,(''TABLE'',''GRANT'',''VIEW CHANGE TRACKING'',''Item_unit_conversion'',''dbo'',0) +,(''TABLE'',''GRANT'',''VIEW CHANGE TRACKING'',''Job_function'',''dbo'',0) +,(''TABLE'',''GRANT'',''VIEW CHANGE TRACKING'',''Job_function_text'',''dbo'',0) +,(''TABLE'',''GRANT'',''VIEW CHANGE TRACKING'',''Language'',''dbo'',0) +,(''TABLE'',''GRANT'',''VIEW CHANGE TRACKING'',''LORE_item_ABC_code'',''dbo'',0) +,(''TABLE'',''GRANT'',''VIEW CHANGE TRACKING'',''LORE_supplying_procedure'',''dbo'',0) +,(''TABLE'',''GRANT'',''VIEW CHANGE TRACKING'',''Manufacturer'',''dbo'',0) +,(''TABLE'',''GRANT'',''VIEW CHANGE TRACKING'',''MissedSale'',''wkl'',0) +,(''TABLE'',''GRANT'',''VIEW CHANGE TRACKING'',''OrderRequest'',''wkl'',0) +,(''TABLE'',''GRANT'',''VIEW CHANGE TRACKING'',''OrderRequestLine'',''wkl'',0) +,(''TABLE'',''GRANT'',''VIEW CHANGE TRACKING'',''Organizational_unit'',''dbo'',0) +,(''TABLE'',''GRANT'',''VIEW CHANGE TRACKING'',''OU_store_history'',''dbo'',0) +,(''TABLE'',''GRANT'',''VIEW CHANGE TRACKING'',''OU_store_type'',''dbo'',0) +,(''TABLE'',''GRANT'',''VIEW CHANGE TRACKING'',''PH_insurance'',''dbo'',0) +,(''TABLE'',''GRANT'',''VIEW CHANGE TRACKING'',''PH_insurance_card'',''dbo'',0) +,(''TABLE'',''GRANT'',''VIEW CHANGE TRACKING'',''PH_insurance_plan'',''dbo'',0) +,(''TABLE'',''GRANT'',''VIEW CHANGE TRACKING'',''PH_insurance_recommendation'',''dbo'',0) +,(''TABLE'',''GRANT'',''VIEW CHANGE TRACKING'',''PH_item'',''dbo'',0) +,(''TABLE'',''GRANT'',''VIEW CHANGE TRACKING'',''PH_OICM_code'',''dbo'',0) +,(''TABLE'',''GRANT'',''VIEW CHANGE TRACKING'',''PH_OICM_code_text'',''dbo'',0) +,(''TABLE'',''GRANT'',''VIEW CHANGE TRACKING'',''PH_organizational_unit'',''dbo'',0) +,(''TABLE'',''GRANT'',''VIEW CHANGE TRACKING'',''PH_patient'',''dbo'',0) +,(''TABLE'',''GRANT'',''VIEW CHANGE TRACKING'',''PH_physician'',''dbo'',0) +,(''TABLE'',''GRANT'',''VIEW CHANGE TRACKING'',''PH_prescriber'',''dbo'',0) +,(''TABLE'',''GRANT'',''VIEW CHANGE TRACKING'',''PH_prescription_header'',''dbo'',0) +,(''TABLE'',''GRANT'',''VIEW CHANGE TRACKING'',''PH_prescription_line'',''dbo'',0) +,(''TABLE'',''GRANT'',''VIEW CHANGE TRACKING'',''PH_product'',''dbo'',0) +,(''TABLE'',''GRANT'',''VIEW CHANGE TRACKING'',''PH_qualification'',''dbo'',0) +,(''TABLE'',''GRANT'',''VIEW CHANGE TRACKING'',''PH_refund_code'',''dbo'',0) +,(''TABLE'',''GRANT'',''VIEW CHANGE TRACKING'',''PH_refund_code_text'',''dbo'',0) +,(''TABLE'',''GRANT'',''VIEW CHANGE TRACKING'',''PHGD_AC'',''dbo'',0) +,(''TABLE'',''GRANT'',''VIEW CHANGE TRACKING'',''PHGD_ACBARCODE'',''dbo'',0) +,(''TABLE'',''GRANT'',''VIEW CHANGE TRACKING'',''PHGD_ACCHAIN'',''dbo'',0) +,(''TABLE'',''GRANT'',''VIEW CHANGE TRACKING'',''PHGD_ACMED'',''dbo'',0) +,(''TABLE'',''GRANT'',''VIEW CHANGE TRACKING'',''PHGD_CODES'',''dbo'',0) +,(''TABLE'',''GRANT'',''VIEW CHANGE TRACKING'',''PHGD_CODETXT'',''dbo'',0) +,(''TABLE'',''GRANT'',''VIEW CHANGE TRACKING'',''Predefined_entry'',''dbo'',0) +,(''TABLE'',''GRANT'',''VIEW CHANGE TRACKING'',''Price_code'',''dbo'',0) +,(''TABLE'',''GRANT'',''VIEW CHANGE TRACKING'',''Price_modifier'',''dbo'',0) +,(''TABLE'',''GRANT'',''VIEW CHANGE TRACKING'',''Product_line'',''dbo'',0) +,(''TABLE'',''GRANT'',''VIEW CHANGE TRACKING'',''Product_line_text'',''dbo'',0) +,(''TABLE'',''GRANT'',''VIEW CHANGE TRACKING'',''Profit_cost_center'',''dbo'',0) +,(''TABLE'',''GRANT'',''VIEW CHANGE TRACKING'',''Profit_cost_center_key'',''dbo'',0) +,(''TABLE'',''GRANT'',''VIEW CHANGE TRACKING'',''PurchaseReturn'',''wkl'',0) +,(''TABLE'',''GRANT'',''VIEW CHANGE TRACKING'',''PurchaseReturnLine'',''wkl'',0) +,(''TABLE'',''GRANT'',''VIEW CHANGE TRACKING'',''Sales_tax_rate'',''dbo'',0) +,(''TABLE'',''GRANT'',''VIEW CHANGE TRACKING'',''Standard_text'',''dbo'',0) +,(''TABLE'',''GRANT'',''VIEW CHANGE TRACKING'',''Standard_text_text'',''dbo'',0) +,(''TABLE'',''GRANT'',''VIEW CHANGE TRACKING'',''Status_text'',''dbo'',0) +,(''TABLE'',''GRANT'',''VIEW CHANGE TRACKING'',''Subsidiary'',''dbo'',0) +,(''TABLE'',''GRANT'',''VIEW CHANGE TRACKING'',''Supplier'',''dbo'',0) +,(''TABLE'',''GRANT'',''VIEW CHANGE TRACKING'',''Tariff_type'',''dbo'',0) +,(''TABLE'',''GRANT'',''VIEW CHANGE TRACKING'',''VIP_card'',''dbo'',0) +,(''TABLE'',''GRANT'',''VIEW CHANGE TRACKING'',''VIP_card_type'',''dbo'',0) +,(''TABLE'',''GRANT'',''VIEW CHANGE TRACKING'',''VIP_card_type_link'',''dbo'',0) +,(''TABLE'',''GRANT'',''VIEW CHANGE TRACKING'',''WebShopStatusQueue'',''AP'',0) + + +/* GET ALL USERS ON THIS ROLE */ +INSERT INTO #UsersOnRole +SELECT + members.name +FROM sys.database_role_members + JOIN sys.database_principals roles ON database_role_members.role_principal_id = roles.principal_id + JOIN sys.database_principals members ON database_role_members.member_principal_id = members.principal_id +WHERE roles.name = @RoleName + +/* CREATE ROLE */ +SELECT @Command = '' +IF NOT EXISTS (SELECT 1 FROM sys.database_principals WHERE name = '''''' + @RoleName + '''''' AND type = ''''R'''') +BEGIN + CREATE ROLE ['' + @RoleName + ''] AUTHORIZATION [dbo] + PRINT ''''CREATE ROLE ['' + @RoleName + '']'''' +END +'' +EXEC sp_executesql @Command + +SET @Command = '' +DECLARE @SP_Name varchar(255) + +'' + +/* SET ALL ROLE SECURABLES */ +DECLARE SecurablesCurs CURSOR FOR +SELECT typeofobject, grantordeny, rightsaction, objectname, schemaid +FROM #Securables +WHERE N2 = 0 + +OPEN SecurablesCurs +FETCH NEXT FROM SecurablesCurs INTO @typeofobject, @grantordeny, @rightsaction, @objectname, @schemaid +WHILE @@FETCH_STATUS = 0 +BEGIN + + IF @typeofobject = ''DB'' + BEGIN + IF EXISTS(SELECT 1 FROM sys.fn_builtin_permissions(''DATABASE'') WHERE permission_name = '''' + @rightsaction + '''') + BEGIN + SET @Command = @Command + @grantordeny + '' '' + @rightsaction + '' TO ['' + @RoleName + ''] +'' + END + END + + IF @typeofobject = ''SCHEMA'' + BEGIN + SET @Command = @Command + '' +IF EXISTS (SELECT 1 FROM sys.schemas WHERE name = '''''' + @schemaid + '''''') +BEGIN + IF EXISTS(SELECT 1 FROM sys.fn_builtin_permissions(''''SCHEMA'''') WHERE permission_name = '''''' + @rightsaction + '''''') + BEGIN + '' + @grantordeny + '' '' + @rightsaction + '' ON SCHEMA::'' + @schemaid + '' TO ['' + @RoleName + ''] + END +END + +'' + END + + IF @typeofobject in(''TABLE'',''SP'',''FUNCTIONS'',''VIEWS'') + BEGIN + + IF @objectname like ''%[%]%'' + BEGIN + + IF @typeofobject = ''TABLE'' + BEGIN + SET @sysTarget = ''sys.tables'' + SET @sysType = '''' + END + + IF @typeofobject = ''SP'' + BEGIN + SET @sysTarget = ''sys.procedures'' + SET @sysType = '''' + END + + IF @typeofobject = ''FUNCTIONS'' + BEGIN + SET @sysTarget = ''sys.objects'' + SET @sysType = '' and p.Type IN ( N''''FN'''', N''''IF'''', N''''TF'''', N''''FS'''', N''''FT'''' )'' + END + + IF @typeofobject = ''VIEWS'' + BEGIN + SET @sysTarget = ''sys.views'' + SET @sysType = '''' + END + + SET @Command = @Command + '' +DECLARE SP_cursor CURSOR FOR +SELECT p.name FROM '' + @sysTarget + '' p JOIN sys.schemas s ON s.schema_id = p.schema_id WHERE (p.name like '''''' + @objectname + '''''') and s.name = '''''' + @schemaid + '''' + @sysType + '''''' + +OPEN SP_cursor +FETCH NEXT FROM SP_cursor INTO @SP_Name +WHILE @@FETCH_STATUS = 0 +BEGIN + IF EXISTS(SELECT 1 FROM sys.fn_builtin_permissions(''''OBJECT'''') WHERE permission_name = '''''' + @rightsaction + '''''') + BEGIN + EXEC('''''' + @grantordeny + '' '' + @rightsaction + '' ON ['' + @schemaid + ''].['''' + @SP_Name + ''''] TO ['' + @RoleName + '']'''') + END + FETCH NEXT FROM SP_cursor INTO @SP_Name +END + +CLOSE SP_cursor +DEALLOCATE SP_cursor + +'' + + END + ELSE + BEGIN + + SET @Command = @Command + '' +IF EXISTS(SELECT 1 FROM sys.objects o WITH (NOLOCK) JOIN sys.schemas s ON s.schema_id = o.schema_id WHERE o.name = '''''' + @objectname + '''''' AND o.type IN (N''''U'''',''''P'''',''''V'''',''''FN'''',''''IF'''',''''TF'''') AND s.name = '''''' + @schemaid + '''''') +BEGIN + IF EXISTS(SELECT 1 FROM sys.fn_builtin_permissions(''''OBJECT'''') WHERE permission_name = '''''' + @rightsaction + '''''') + BEGIN + '' + @grantordeny + '' '' + @rightsaction + '' ON ['' + @schemaid + ''].['' + @objectname + ''] TO ['' + @RoleName + ''] + END +END + +'' + END +END + +IF @typeofobject = ''ASSEMBLIES'' +BEGIN + SET @Command = @Command + '' +IF EXISTS(SELECT 1 FROM sys.assemblies WHERE NAME = '''''' + @objectname + '''''') +BEGIN + IF EXISTS(SELECT 1 FROM sys.fn_builtin_permissions(''''ASSEMBLY'''') WHERE permission_name = '''''' + @rightsaction + '''''') + BEGIN + '' + @grantordeny + '' '' + @rightsaction + ''::['' + @objectname + ''] TO ['' + @RoleName + ''] + END +END + +'' +END + +IF @typeofobject = ''ROLE'' +BEGIN + SET @Command = @Command + '' +IF NOT EXISTS (SELECT 1 FROM sys.database_role_members JOIN sys.database_principals roles ON database_role_members.role_principal_id = roles.principal_id JOIN sys.database_principals members ON database_role_members.member_principal_id = members.principal_id WHERE roles.name = '''''' + @rightsaction + '''''' AND members.name = '''''' + @RoleName + '''''') +BEGIN + EXEC sp_addrolemember N'''''' + @rightsaction + '''''', N'''''' + @RoleName + '''''' +END + +'' +END + +FETCH NEXT FROM SecurablesCurs INTO @typeofobject, @grantordeny, @rightsaction, @objectname, @schemaid +END + +CLOSE SecurablesCurs +DEALLOCATE SecurablesCurs + +PRINT ''SET ALL SECURABLES ON ROLE ['' + @RoleName + '']'' +EXEC sp_executesql @Command + +/* ADD USER */ +DECLARE UsersCurs CURSOR FOR +SELECT username + FROM #UsersOnRole + +OPEN UsersCurs + +FETCH NEXT FROM UsersCurs INTO @Users +WHILE @@FETCH_STATUS = 0 +BEGIN + + SELECT @Command = '' +EXEC sp_addrolemember N'''''' + @RoleName + '''''', N'''''' + @Users + '''''' +PRINT ''''ADD USER ['' + @Users + ''] ON ROLE ['' + @RoleName + '']'''' +'' + +FETCH NEXT FROM UsersCurs INTO @Users +END + +CLOSE UsersCurs +DEALLOCATE UsersCurs + +EXEC sp_executesql @Command + + +/*============================================================================= + Drop temp tables +=============================================================================*/ +DROP TABLE #Securables +DROP TABLE #UsersOnRole +','Arizona','Pharmacies') + +INSERT INTO #AllRoles(STR_Definition,STR_Database,STR_Product)VALUES(' + +/*============================================================================= + + Script to create dbRoleTriapharmCounter role. + + Role Name: dbRoleTriapharmCounter + TEMPLATE: Default + + EXAMPLE OF SECURABLES TO SET: + + INSERT INTO #Securables + VALUES + (''DB'',''GRANT'',''VIEW DEFINITION'','''',''''), + (''SCHEMA'',''GRANT'',''SELECT,EXECUTE,INSERT,UPDATE,DELETE'','''',''AP''), + (''TABLE'',''GRANT'',''INSERT,UPDATE'',''Address'',''dbo''), + (''SP'',''GRANT'',''EXECUTE'',''sp_bmc_GetNextID'',''dbo''), + (''ROLE'',''GRANT'',''db_datareader'','''','''') + + ----------------------------------------------- + +Generate date : 2023-05-12 / up208700 + +=============================================================================*/ + +DECLARE @Command nvarchar(max), + @RoleName varchar(60), + @Users varchar(255), + @typeofobject varchar(50), + @grantordeny varchar(10), + @rightsaction varchar(255), + @objectname varchar(255), + @schemaid varchar(10), + @sysTarget varchar(255), + @sysType varchar(255) + +SET @RoleName = ''dbRoleTriapharmCounter'' +SET @Command = '''' + +/* TEMP TABLES */ +CREATE TABLE #UsersOnRole(username varchar(255)) +CREATE TABLE #Securables(typeofobject varchar(50), grantordeny varchar(10), rightsaction varchar(255), objectname varchar(255), schemaid varchar(10),N2 bit) + +/* !!! LIST OF SECURABLES TO CHANGE !!! */ + +INSERT INTO #Securables +VALUES +(''ROLE'',''GRANT'',''DB_DATAREADER'','''',''dbo'',0) +,(''SP'',''GRANT'',''EXECUTE'',''aps_Document_Counter_1'',''dbo'',0) +,(''SP'',''GRANT'',''EXECUTE'',''aps_GetNextID'',''dbo'',0) + + +/* GET ALL USERS ON THIS ROLE */ +INSERT INTO #UsersOnRole +SELECT + members.name +FROM sys.database_role_members + JOIN sys.database_principals roles ON database_role_members.role_principal_id = roles.principal_id + JOIN sys.database_principals members ON database_role_members.member_principal_id = members.principal_id +WHERE roles.name = @RoleName + +/* CREATE ROLE */ +SELECT @Command = '' +IF NOT EXISTS (SELECT 1 FROM sys.database_principals WHERE name = '''''' + @RoleName + '''''' AND type = ''''R'''') +BEGIN + CREATE ROLE ['' + @RoleName + ''] AUTHORIZATION [dbo] + PRINT ''''CREATE ROLE ['' + @RoleName + '']'''' +END +'' +EXEC sp_executesql @Command + +SET @Command = '' +DECLARE @SP_Name varchar(255) + +'' + +/* SET ALL ROLE SECURABLES */ +DECLARE SecurablesCurs CURSOR FOR +SELECT typeofobject, grantordeny, rightsaction, objectname, schemaid +FROM #Securables +WHERE N2 = 0 + +OPEN SecurablesCurs +FETCH NEXT FROM SecurablesCurs INTO @typeofobject, @grantordeny, @rightsaction, @objectname, @schemaid +WHILE @@FETCH_STATUS = 0 +BEGIN + + IF @typeofobject = ''DB'' + BEGIN + IF EXISTS(SELECT 1 FROM sys.fn_builtin_permissions(''DATABASE'') WHERE permission_name = '''' + @rightsaction + '''') + BEGIN + SET @Command = @Command + @grantordeny + '' '' + @rightsaction + '' TO ['' + @RoleName + ''] +'' + END + END + + IF @typeofobject = ''SCHEMA'' + BEGIN + SET @Command = @Command + '' +IF EXISTS (SELECT 1 FROM sys.schemas WHERE name = '''''' + @schemaid + '''''') +BEGIN + IF EXISTS(SELECT 1 FROM sys.fn_builtin_permissions(''''SCHEMA'''') WHERE permission_name = '''''' + @rightsaction + '''''') + BEGIN + '' + @grantordeny + '' '' + @rightsaction + '' ON SCHEMA::'' + @schemaid + '' TO ['' + @RoleName + ''] + END +END + +'' + END + + IF @typeofobject in(''TABLE'',''SP'',''FUNCTIONS'',''VIEWS'') + BEGIN + + IF @objectname like ''%[%]%'' + BEGIN + + IF @typeofobject = ''TABLE'' + BEGIN + SET @sysTarget = ''sys.tables'' + SET @sysType = '''' + END + + IF @typeofobject = ''SP'' + BEGIN + SET @sysTarget = ''sys.procedures'' + SET @sysType = '''' + END + + IF @typeofobject = ''FUNCTIONS'' + BEGIN + SET @sysTarget = ''sys.objects'' + SET @sysType = '' and p.Type IN ( N''''FN'''', N''''IF'''', N''''TF'''', N''''FS'''', N''''FT'''' )'' + END + + IF @typeofobject = ''VIEWS'' + BEGIN + SET @sysTarget = ''sys.views'' + SET @sysType = '''' + END + + SET @Command = @Command + '' +DECLARE SP_cursor CURSOR FOR +SELECT p.name FROM '' + @sysTarget + '' p JOIN sys.schemas s ON s.schema_id = p.schema_id WHERE (p.name like '''''' + @objectname + '''''') and s.name = '''''' + @schemaid + '''' + @sysType + '''''' + +OPEN SP_cursor +FETCH NEXT FROM SP_cursor INTO @SP_Name +WHILE @@FETCH_STATUS = 0 +BEGIN + IF EXISTS(SELECT 1 FROM sys.fn_builtin_permissions(''''OBJECT'''') WHERE permission_name = '''''' + @rightsaction + '''''') + BEGIN + EXEC('''''' + @grantordeny + '' '' + @rightsaction + '' ON ['' + @schemaid + ''].['''' + @SP_Name + ''''] TO ['' + @RoleName + '']'''') + END + FETCH NEXT FROM SP_cursor INTO @SP_Name +END + +CLOSE SP_cursor +DEALLOCATE SP_cursor + +'' + + END + ELSE + BEGIN + + SET @Command = @Command + '' +IF EXISTS(SELECT 1 FROM sys.objects o WITH (NOLOCK) JOIN sys.schemas s ON s.schema_id = o.schema_id WHERE o.name = '''''' + @objectname + '''''' AND o.type IN (N''''U'''',''''P'''',''''V'''',''''FN'''',''''IF'''',''''TF'''') AND s.name = '''''' + @schemaid + '''''') +BEGIN + IF EXISTS(SELECT 1 FROM sys.fn_builtin_permissions(''''OBJECT'''') WHERE permission_name = '''''' + @rightsaction + '''''') + BEGIN + '' + @grantordeny + '' '' + @rightsaction + '' ON ['' + @schemaid + ''].['' + @objectname + ''] TO ['' + @RoleName + ''] + END +END + +'' + END +END + +IF @typeofobject = ''ASSEMBLIES'' +BEGIN + SET @Command = @Command + '' +IF EXISTS(SELECT 1 FROM sys.assemblies WHERE NAME = '''''' + @objectname + '''''') +BEGIN + IF EXISTS(SELECT 1 FROM sys.fn_builtin_permissions(''''ASSEMBLY'''') WHERE permission_name = '''''' + @rightsaction + '''''') + BEGIN + '' + @grantordeny + '' '' + @rightsaction + ''::['' + @objectname + ''] TO ['' + @RoleName + ''] + END +END + +'' +END + +IF @typeofobject = ''ROLE'' +BEGIN + SET @Command = @Command + '' +IF NOT EXISTS (SELECT 1 FROM sys.database_role_members JOIN sys.database_principals roles ON database_role_members.role_principal_id = roles.principal_id JOIN sys.database_principals members ON database_role_members.member_principal_id = members.principal_id WHERE roles.name = '''''' + @rightsaction + '''''' AND members.name = '''''' + @RoleName + '''''') +BEGIN + EXEC sp_addrolemember N'''''' + @rightsaction + '''''', N'''''' + @RoleName + '''''' +END + +'' +END + +FETCH NEXT FROM SecurablesCurs INTO @typeofobject, @grantordeny, @rightsaction, @objectname, @schemaid +END + +CLOSE SecurablesCurs +DEALLOCATE SecurablesCurs + +PRINT ''SET ALL SECURABLES ON ROLE ['' + @RoleName + '']'' +EXEC sp_executesql @Command + +/* ADD USER */ +DECLARE UsersCurs CURSOR FOR +SELECT username + FROM #UsersOnRole + +OPEN UsersCurs + +FETCH NEXT FROM UsersCurs INTO @Users +WHILE @@FETCH_STATUS = 0 +BEGIN + + SELECT @Command = '' +EXEC sp_addrolemember N'''''' + @RoleName + '''''', N'''''' + @Users + '''''' +PRINT ''''ADD USER ['' + @Users + ''] ON ROLE ['' + @RoleName + '']'''' +'' + +FETCH NEXT FROM UsersCurs INTO @Users +END + +CLOSE UsersCurs +DEALLOCATE UsersCurs + +EXEC sp_executesql @Command + + +/*============================================================================= + Drop temp tables +=============================================================================*/ +DROP TABLE #Securables +DROP TABLE #UsersOnRole +','Arizona','Pharmacies') + +INSERT INTO #AllRoles(STR_Definition,STR_Database,STR_Product)VALUES(' + +/*============================================================================= + + Script to create dbRoleTriapharmUser role. + + Role Name: dbRoleTriapharmUser + TEMPLATE: Default + + EXAMPLE OF SECURABLES TO SET: + + INSERT INTO #Securables + VALUES + (''DB'',''GRANT'',''VIEW DEFINITION'','''',''''), + (''SCHEMA'',''GRANT'',''SELECT,EXECUTE,INSERT,UPDATE,DELETE'','''',''AP''), + (''TABLE'',''GRANT'',''INSERT,UPDATE'',''Address'',''dbo''), + (''SP'',''GRANT'',''EXECUTE'',''sp_bmc_GetNextID'',''dbo''), + (''ROLE'',''GRANT'',''db_datareader'','''','''') + + ----------------------------------------------- + +Generate date : 2023-05-12 / up208700 + +=============================================================================*/ + +DECLARE @Command nvarchar(max), + @RoleName varchar(60), + @Users varchar(255), + @typeofobject varchar(50), + @grantordeny varchar(10), + @rightsaction varchar(255), + @objectname varchar(255), + @schemaid varchar(10), + @sysTarget varchar(255), + @sysType varchar(255) + +SET @RoleName = ''dbRoleTriapharmUser'' +SET @Command = '''' + +/* TEMP TABLES */ +CREATE TABLE #UsersOnRole(username varchar(255)) +CREATE TABLE #Securables(typeofobject varchar(50), grantordeny varchar(10), rightsaction varchar(255), objectname varchar(255), schemaid varchar(10),N2 bit) + +/* !!! LIST OF SECURABLES TO CHANGE !!! */ + +INSERT INTO #Securables +VALUES +(''DB'',''GRANT'',''EXECUTE'','''',''dbo'',0) +,(''DB'',''GRANT'',''VIEW DEFINITION'','''',''dbo'',0) +,(''ROLE'',''GRANT'',''DB_DATAREADER'','''',''dbo'',0) +,(''ROLE'',''GRANT'',''DB_DATAWRITER'','''',''dbo'',0) + + +/* GET ALL USERS ON THIS ROLE */ +INSERT INTO #UsersOnRole +SELECT + members.name +FROM sys.database_role_members + JOIN sys.database_principals roles ON database_role_members.role_principal_id = roles.principal_id + JOIN sys.database_principals members ON database_role_members.member_principal_id = members.principal_id +WHERE roles.name = @RoleName + +/* CREATE ROLE */ +SELECT @Command = '' +IF NOT EXISTS (SELECT 1 FROM sys.database_principals WHERE name = '''''' + @RoleName + '''''' AND type = ''''R'''') +BEGIN + CREATE ROLE ['' + @RoleName + ''] AUTHORIZATION [dbo] + PRINT ''''CREATE ROLE ['' + @RoleName + '']'''' +END +'' +EXEC sp_executesql @Command + +SET @Command = '' +DECLARE @SP_Name varchar(255) + +'' + +/* SET ALL ROLE SECURABLES */ +DECLARE SecurablesCurs CURSOR FOR +SELECT typeofobject, grantordeny, rightsaction, objectname, schemaid +FROM #Securables +WHERE N2 = 0 + +OPEN SecurablesCurs +FETCH NEXT FROM SecurablesCurs INTO @typeofobject, @grantordeny, @rightsaction, @objectname, @schemaid +WHILE @@FETCH_STATUS = 0 +BEGIN + + IF @typeofobject = ''DB'' + BEGIN + IF EXISTS(SELECT 1 FROM sys.fn_builtin_permissions(''DATABASE'') WHERE permission_name = '''' + @rightsaction + '''') + BEGIN + SET @Command = @Command + @grantordeny + '' '' + @rightsaction + '' TO ['' + @RoleName + ''] +'' + END + END + + IF @typeofobject = ''SCHEMA'' + BEGIN + SET @Command = @Command + '' +IF EXISTS (SELECT 1 FROM sys.schemas WHERE name = '''''' + @schemaid + '''''') +BEGIN + IF EXISTS(SELECT 1 FROM sys.fn_builtin_permissions(''''SCHEMA'''') WHERE permission_name = '''''' + @rightsaction + '''''') + BEGIN + '' + @grantordeny + '' '' + @rightsaction + '' ON SCHEMA::'' + @schemaid + '' TO ['' + @RoleName + ''] + END +END + +'' + END + + IF @typeofobject in(''TABLE'',''SP'',''FUNCTIONS'',''VIEWS'') + BEGIN + + IF @objectname like ''%[%]%'' + BEGIN + + IF @typeofobject = ''TABLE'' + BEGIN + SET @sysTarget = ''sys.tables'' + SET @sysType = '''' + END + + IF @typeofobject = ''SP'' + BEGIN + SET @sysTarget = ''sys.procedures'' + SET @sysType = '''' + END + + IF @typeofobject = ''FUNCTIONS'' + BEGIN + SET @sysTarget = ''sys.objects'' + SET @sysType = '' and p.Type IN ( N''''FN'''', N''''IF'''', N''''TF'''', N''''FS'''', N''''FT'''' )'' + END + + IF @typeofobject = ''VIEWS'' + BEGIN + SET @sysTarget = ''sys.views'' + SET @sysType = '''' + END + + SET @Command = @Command + '' +DECLARE SP_cursor CURSOR FOR +SELECT p.name FROM '' + @sysTarget + '' p JOIN sys.schemas s ON s.schema_id = p.schema_id WHERE (p.name like '''''' + @objectname + '''''') and s.name = '''''' + @schemaid + '''' + @sysType + '''''' + +OPEN SP_cursor +FETCH NEXT FROM SP_cursor INTO @SP_Name +WHILE @@FETCH_STATUS = 0 +BEGIN + IF EXISTS(SELECT 1 FROM sys.fn_builtin_permissions(''''OBJECT'''') WHERE permission_name = '''''' + @rightsaction + '''''') + BEGIN + EXEC('''''' + @grantordeny + '' '' + @rightsaction + '' ON ['' + @schemaid + ''].['''' + @SP_Name + ''''] TO ['' + @RoleName + '']'''') + END + FETCH NEXT FROM SP_cursor INTO @SP_Name +END + +CLOSE SP_cursor +DEALLOCATE SP_cursor + +'' + + END + ELSE + BEGIN + + SET @Command = @Command + '' +IF EXISTS(SELECT 1 FROM sys.objects o WITH (NOLOCK) JOIN sys.schemas s ON s.schema_id = o.schema_id WHERE o.name = '''''' + @objectname + '''''' AND o.type IN (N''''U'''',''''P'''',''''V'''',''''FN'''',''''IF'''',''''TF'''') AND s.name = '''''' + @schemaid + '''''') +BEGIN + IF EXISTS(SELECT 1 FROM sys.fn_builtin_permissions(''''OBJECT'''') WHERE permission_name = '''''' + @rightsaction + '''''') + BEGIN + '' + @grantordeny + '' '' + @rightsaction + '' ON ['' + @schemaid + ''].['' + @objectname + ''] TO ['' + @RoleName + ''] + END +END + +'' + END +END + +IF @typeofobject = ''ASSEMBLIES'' +BEGIN + SET @Command = @Command + '' +IF EXISTS(SELECT 1 FROM sys.assemblies WHERE NAME = '''''' + @objectname + '''''') +BEGIN + IF EXISTS(SELECT 1 FROM sys.fn_builtin_permissions(''''ASSEMBLY'''') WHERE permission_name = '''''' + @rightsaction + '''''') + BEGIN + '' + @grantordeny + '' '' + @rightsaction + ''::['' + @objectname + ''] TO ['' + @RoleName + ''] + END +END + +'' +END + +IF @typeofobject = ''ROLE'' +BEGIN + SET @Command = @Command + '' +IF NOT EXISTS (SELECT 1 FROM sys.database_role_members JOIN sys.database_principals roles ON database_role_members.role_principal_id = roles.principal_id JOIN sys.database_principals members ON database_role_members.member_principal_id = members.principal_id WHERE roles.name = '''''' + @rightsaction + '''''' AND members.name = '''''' + @RoleName + '''''') +BEGIN + EXEC sp_addrolemember N'''''' + @rightsaction + '''''', N'''''' + @RoleName + '''''' +END + +'' +END + +FETCH NEXT FROM SecurablesCurs INTO @typeofobject, @grantordeny, @rightsaction, @objectname, @schemaid +END + +CLOSE SecurablesCurs +DEALLOCATE SecurablesCurs + +PRINT ''SET ALL SECURABLES ON ROLE ['' + @RoleName + '']'' +EXEC sp_executesql @Command + +/* ADD USER */ +DECLARE UsersCurs CURSOR FOR +SELECT username + FROM #UsersOnRole + +OPEN UsersCurs + +FETCH NEXT FROM UsersCurs INTO @Users +WHILE @@FETCH_STATUS = 0 +BEGIN + + SELECT @Command = '' +EXEC sp_addrolemember N'''''' + @RoleName + '''''', N'''''' + @Users + '''''' +PRINT ''''ADD USER ['' + @Users + ''] ON ROLE ['' + @RoleName + '']'''' +'' + +FETCH NEXT FROM UsersCurs INTO @Users +END + +CLOSE UsersCurs +DEALLOCATE UsersCurs + +EXEC sp_executesql @Command + + +/*============================================================================= + Drop temp tables +=============================================================================*/ +DROP TABLE #Securables +DROP TABLE #UsersOnRole +','Arizona','Pharmacies') + +INSERT INTO #AllRoles(STR_Definition,STR_Database,STR_Product)VALUES(' + +/*============================================================================= + + Script to create dbRoleActivePharmacy role. + + Role Name: dbRoleActivePharmacy + TEMPLATE: Default + + EXAMPLE OF SECURABLES TO SET: + + INSERT INTO #Securables + VALUES + (''DB'',''GRANT'',''VIEW DEFINITION'','''',''''), + (''SCHEMA'',''GRANT'',''SELECT,EXECUTE,INSERT,UPDATE,DELETE'','''',''AP''), + (''TABLE'',''GRANT'',''INSERT,UPDATE'',''Address'',''dbo''), + (''SP'',''GRANT'',''EXECUTE'',''sp_bmc_GetNextID'',''dbo''), + (''ROLE'',''GRANT'',''db_datareader'','''','''') + + ----------------------------------------------- + +Generate date : 2023-05-12 / up208700 + +=============================================================================*/ + +DECLARE @Command nvarchar(max), + @RoleName varchar(60), + @Users varchar(255), + @typeofobject varchar(50), + @grantordeny varchar(10), + @rightsaction varchar(255), + @objectname varchar(255), + @schemaid varchar(10), + @sysTarget varchar(255), + @sysType varchar(255) + +SET @RoleName = ''dbRoleActivePharmacy'' +SET @Command = '''' + +/* TEMP TABLES */ +CREATE TABLE #UsersOnRole(username varchar(255)) +CREATE TABLE #Securables(typeofobject varchar(50), grantordeny varchar(10), rightsaction varchar(255), objectname varchar(255), schemaid varchar(10),N2 bit) + +/* !!! LIST OF SECURABLES TO CHANGE !!! */ + +INSERT INTO #Securables +VALUES +(''DB'',''GRANT'',''EXECUTE'','''',''dbo'',0) +,(''ROLE'',''GRANT'',''DB_DATAREADER'','''',''dbo'',0) +,(''ROLE'',''GRANT'',''DB_DATAWRITER'','''',''dbo'',0) + + +/* GET ALL USERS ON THIS ROLE */ +INSERT INTO #UsersOnRole +SELECT + members.name +FROM sys.database_role_members + JOIN sys.database_principals roles ON database_role_members.role_principal_id = roles.principal_id + JOIN sys.database_principals members ON database_role_members.member_principal_id = members.principal_id +WHERE roles.name = @RoleName + +/* CREATE ROLE */ +SELECT @Command = '' +IF NOT EXISTS (SELECT 1 FROM sys.database_principals WHERE name = '''''' + @RoleName + '''''' AND type = ''''R'''') +BEGIN + CREATE ROLE ['' + @RoleName + ''] AUTHORIZATION [dbo] + PRINT ''''CREATE ROLE ['' + @RoleName + '']'''' +END +'' +EXEC sp_executesql @Command + +SET @Command = '' +DECLARE @SP_Name varchar(255) + +'' + +/* SET ALL ROLE SECURABLES */ +DECLARE SecurablesCurs CURSOR FOR +SELECT typeofobject, grantordeny, rightsaction, objectname, schemaid +FROM #Securables +WHERE N2 = 0 + +OPEN SecurablesCurs +FETCH NEXT FROM SecurablesCurs INTO @typeofobject, @grantordeny, @rightsaction, @objectname, @schemaid +WHILE @@FETCH_STATUS = 0 +BEGIN + + IF @typeofobject = ''DB'' + BEGIN + IF EXISTS(SELECT 1 FROM sys.fn_builtin_permissions(''DATABASE'') WHERE permission_name = '''' + @rightsaction + '''') + BEGIN + SET @Command = @Command + @grantordeny + '' '' + @rightsaction + '' TO ['' + @RoleName + ''] +'' + END + END + + IF @typeofobject = ''SCHEMA'' + BEGIN + SET @Command = @Command + '' +IF EXISTS (SELECT 1 FROM sys.schemas WHERE name = '''''' + @schemaid + '''''') +BEGIN + IF EXISTS(SELECT 1 FROM sys.fn_builtin_permissions(''''SCHEMA'''') WHERE permission_name = '''''' + @rightsaction + '''''') + BEGIN + '' + @grantordeny + '' '' + @rightsaction + '' ON SCHEMA::'' + @schemaid + '' TO ['' + @RoleName + ''] + END +END + +'' + END + + IF @typeofobject in(''TABLE'',''SP'',''FUNCTIONS'',''VIEWS'') + BEGIN + + IF @objectname like ''%[%]%'' + BEGIN + + IF @typeofobject = ''TABLE'' + BEGIN + SET @sysTarget = ''sys.tables'' + SET @sysType = '''' + END + + IF @typeofobject = ''SP'' + BEGIN + SET @sysTarget = ''sys.procedures'' + SET @sysType = '''' + END + + IF @typeofobject = ''FUNCTIONS'' + BEGIN + SET @sysTarget = ''sys.objects'' + SET @sysType = '' and p.Type IN ( N''''FN'''', N''''IF'''', N''''TF'''', N''''FS'''', N''''FT'''' )'' + END + + IF @typeofobject = ''VIEWS'' + BEGIN + SET @sysTarget = ''sys.views'' + SET @sysType = '''' + END + + SET @Command = @Command + '' +DECLARE SP_cursor CURSOR FOR +SELECT p.name FROM '' + @sysTarget + '' p JOIN sys.schemas s ON s.schema_id = p.schema_id WHERE (p.name like '''''' + @objectname + '''''') and s.name = '''''' + @schemaid + '''' + @sysType + '''''' + +OPEN SP_cursor +FETCH NEXT FROM SP_cursor INTO @SP_Name +WHILE @@FETCH_STATUS = 0 +BEGIN + IF EXISTS(SELECT 1 FROM sys.fn_builtin_permissions(''''OBJECT'''') WHERE permission_name = '''''' + @rightsaction + '''''') + BEGIN + EXEC('''''' + @grantordeny + '' '' + @rightsaction + '' ON ['' + @schemaid + ''].['''' + @SP_Name + ''''] TO ['' + @RoleName + '']'''') + END + FETCH NEXT FROM SP_cursor INTO @SP_Name +END + +CLOSE SP_cursor +DEALLOCATE SP_cursor + +'' + + END + ELSE + BEGIN + + SET @Command = @Command + '' +IF EXISTS(SELECT 1 FROM sys.objects o WITH (NOLOCK) JOIN sys.schemas s ON s.schema_id = o.schema_id WHERE o.name = '''''' + @objectname + '''''' AND o.type IN (N''''U'''',''''P'''',''''V'''',''''FN'''',''''IF'''',''''TF'''') AND s.name = '''''' + @schemaid + '''''') +BEGIN + IF EXISTS(SELECT 1 FROM sys.fn_builtin_permissions(''''OBJECT'''') WHERE permission_name = '''''' + @rightsaction + '''''') + BEGIN + '' + @grantordeny + '' '' + @rightsaction + '' ON ['' + @schemaid + ''].['' + @objectname + ''] TO ['' + @RoleName + ''] + END +END + +'' + END +END + +IF @typeofobject = ''ASSEMBLIES'' +BEGIN + SET @Command = @Command + '' +IF EXISTS(SELECT 1 FROM sys.assemblies WHERE NAME = '''''' + @objectname + '''''') +BEGIN + IF EXISTS(SELECT 1 FROM sys.fn_builtin_permissions(''''ASSEMBLY'''') WHERE permission_name = '''''' + @rightsaction + '''''') + BEGIN + '' + @grantordeny + '' '' + @rightsaction + ''::['' + @objectname + ''] TO ['' + @RoleName + ''] + END +END + +'' +END + +IF @typeofobject = ''ROLE'' +BEGIN + SET @Command = @Command + '' +IF NOT EXISTS (SELECT 1 FROM sys.database_role_members JOIN sys.database_principals roles ON database_role_members.role_principal_id = roles.principal_id JOIN sys.database_principals members ON database_role_members.member_principal_id = members.principal_id WHERE roles.name = '''''' + @rightsaction + '''''' AND members.name = '''''' + @RoleName + '''''') +BEGIN + EXEC sp_addrolemember N'''''' + @rightsaction + '''''', N'''''' + @RoleName + '''''' +END + +'' +END + +FETCH NEXT FROM SecurablesCurs INTO @typeofobject, @grantordeny, @rightsaction, @objectname, @schemaid +END + +CLOSE SecurablesCurs +DEALLOCATE SecurablesCurs + +PRINT ''SET ALL SECURABLES ON ROLE ['' + @RoleName + '']'' +EXEC sp_executesql @Command + +/* ADD USER */ +DECLARE UsersCurs CURSOR FOR +SELECT username + FROM #UsersOnRole + +OPEN UsersCurs + +FETCH NEXT FROM UsersCurs INTO @Users +WHILE @@FETCH_STATUS = 0 +BEGIN + + SELECT @Command = '' +EXEC sp_addrolemember N'''''' + @RoleName + '''''', N'''''' + @Users + '''''' +PRINT ''''ADD USER ['' + @Users + ''] ON ROLE ['' + @RoleName + '']'''' +'' + +FETCH NEXT FROM UsersCurs INTO @Users +END + +CLOSE UsersCurs +DEALLOCATE UsersCurs + +EXEC sp_executesql @Command + + +/*============================================================================= + Drop temp tables +=============================================================================*/ +DROP TABLE #Securables +DROP TABLE #UsersOnRole +','ArizonaCASH','Pharmacies') + +INSERT INTO #AllRoles(STR_Definition,STR_Database,STR_Product)VALUES(' + +/*============================================================================= + + Script to create dbRoleArizonaCASH role. + + Role Name: dbRoleArizonaCASH + TEMPLATE: Default + + EXAMPLE OF SECURABLES TO SET: + + INSERT INTO #Securables + VALUES + (''DB'',''GRANT'',''VIEW DEFINITION'','''',''''), + (''SCHEMA'',''GRANT'',''SELECT,EXECUTE,INSERT,UPDATE,DELETE'','''',''AP''), + (''TABLE'',''GRANT'',''INSERT,UPDATE'',''Address'',''dbo''), + (''SP'',''GRANT'',''EXECUTE'',''sp_bmc_GetNextID'',''dbo''), + (''ROLE'',''GRANT'',''db_datareader'','''','''') + + ----------------------------------------------- + +Generate date : 2023-05-12 / up208700 + +=============================================================================*/ + +DECLARE @Command nvarchar(max), + @RoleName varchar(60), + @Users varchar(255), + @typeofobject varchar(50), + @grantordeny varchar(10), + @rightsaction varchar(255), + @objectname varchar(255), + @schemaid varchar(10), + @sysTarget varchar(255), + @sysType varchar(255) + +SET @RoleName = ''dbRoleArizonaCASH'' +SET @Command = '''' + +/* TEMP TABLES */ +CREATE TABLE #UsersOnRole(username varchar(255)) +CREATE TABLE #Securables(typeofobject varchar(50), grantordeny varchar(10), rightsaction varchar(255), objectname varchar(255), schemaid varchar(10),N2 bit) + +/* !!! LIST OF SECURABLES TO CHANGE !!! */ + +INSERT INTO #Securables +VALUES +(''DB'',''GRANT'',''EXECUTE'','''',''dbo'',0) +,(''ROLE'',''GRANT'',''DB_DATAREADER'','''',''dbo'',0) +,(''ROLE'',''GRANT'',''DB_DATAWRITER'','''',''dbo'',0) +,(''TABLE'',''GRANT'',''ALTER'',''CR_cash_report_header'',''dbo'',0) +,(''TABLE'',''GRANT'',''ALTER'',''CR_internal_operation'',''dbo'',0) +,(''TABLE'',''GRANT'',''ALTER'',''CR_item_key'',''dbo'',0) +,(''TABLE'',''GRANT'',''ALTER'',''CR_operation'',''dbo'',0) +,(''TABLE'',''GRANT'',''ALTER'',''CR_point_of_sale'',''dbo'',0) +,(''TABLE'',''GRANT'',''ALTER'',''CR_POS_data'',''dbo'',0) +,(''TABLE'',''GRANT'',''ALTER'',''CR_print_report'',''dbo'',0) +,(''TABLE'',''GRANT'',''ALTER'',''CR_sales_header'',''dbo'',0) +,(''TABLE'',''GRANT'',''ALTER'',''CR_sales_item'',''dbo'',0) +,(''TABLE'',''GRANT'',''ALTER'',''CR_sales_operation'',''dbo'',0) +,(''TABLE'',''GRANT'',''ALTER'',''CR_sales_type'',''dbo'',0) + + +/* GET ALL USERS ON THIS ROLE */ +INSERT INTO #UsersOnRole +SELECT + members.name +FROM sys.database_role_members + JOIN sys.database_principals roles ON database_role_members.role_principal_id = roles.principal_id + JOIN sys.database_principals members ON database_role_members.member_principal_id = members.principal_id +WHERE roles.name = @RoleName + +/* CREATE ROLE */ +SELECT @Command = '' +IF NOT EXISTS (SELECT 1 FROM sys.database_principals WHERE name = '''''' + @RoleName + '''''' AND type = ''''R'''') +BEGIN + CREATE ROLE ['' + @RoleName + ''] AUTHORIZATION [dbo] + PRINT ''''CREATE ROLE ['' + @RoleName + '']'''' +END +'' +EXEC sp_executesql @Command + +SET @Command = '' +DECLARE @SP_Name varchar(255) + +'' + +/* SET ALL ROLE SECURABLES */ +DECLARE SecurablesCurs CURSOR FOR +SELECT typeofobject, grantordeny, rightsaction, objectname, schemaid +FROM #Securables +WHERE N2 = 0 + +OPEN SecurablesCurs +FETCH NEXT FROM SecurablesCurs INTO @typeofobject, @grantordeny, @rightsaction, @objectname, @schemaid +WHILE @@FETCH_STATUS = 0 +BEGIN + + IF @typeofobject = ''DB'' + BEGIN + IF EXISTS(SELECT 1 FROM sys.fn_builtin_permissions(''DATABASE'') WHERE permission_name = '''' + @rightsaction + '''') + BEGIN + SET @Command = @Command + @grantordeny + '' '' + @rightsaction + '' TO ['' + @RoleName + ''] +'' + END + END + + IF @typeofobject = ''SCHEMA'' + BEGIN + SET @Command = @Command + '' +IF EXISTS (SELECT 1 FROM sys.schemas WHERE name = '''''' + @schemaid + '''''') +BEGIN + IF EXISTS(SELECT 1 FROM sys.fn_builtin_permissions(''''SCHEMA'''') WHERE permission_name = '''''' + @rightsaction + '''''') + BEGIN + '' + @grantordeny + '' '' + @rightsaction + '' ON SCHEMA::'' + @schemaid + '' TO ['' + @RoleName + ''] + END +END + +'' + END + + IF @typeofobject in(''TABLE'',''SP'',''FUNCTIONS'',''VIEWS'') + BEGIN + + IF @objectname like ''%[%]%'' + BEGIN + + IF @typeofobject = ''TABLE'' + BEGIN + SET @sysTarget = ''sys.tables'' + SET @sysType = '''' + END + + IF @typeofobject = ''SP'' + BEGIN + SET @sysTarget = ''sys.procedures'' + SET @sysType = '''' + END + + IF @typeofobject = ''FUNCTIONS'' + BEGIN + SET @sysTarget = ''sys.objects'' + SET @sysType = '' and p.Type IN ( N''''FN'''', N''''IF'''', N''''TF'''', N''''FS'''', N''''FT'''' )'' + END + + IF @typeofobject = ''VIEWS'' + BEGIN + SET @sysTarget = ''sys.views'' + SET @sysType = '''' + END + + SET @Command = @Command + '' +DECLARE SP_cursor CURSOR FOR +SELECT p.name FROM '' + @sysTarget + '' p JOIN sys.schemas s ON s.schema_id = p.schema_id WHERE (p.name like '''''' + @objectname + '''''') and s.name = '''''' + @schemaid + '''' + @sysType + '''''' + +OPEN SP_cursor +FETCH NEXT FROM SP_cursor INTO @SP_Name +WHILE @@FETCH_STATUS = 0 +BEGIN + IF EXISTS(SELECT 1 FROM sys.fn_builtin_permissions(''''OBJECT'''') WHERE permission_name = '''''' + @rightsaction + '''''') + BEGIN + EXEC('''''' + @grantordeny + '' '' + @rightsaction + '' ON ['' + @schemaid + ''].['''' + @SP_Name + ''''] TO ['' + @RoleName + '']'''') + END + FETCH NEXT FROM SP_cursor INTO @SP_Name +END + +CLOSE SP_cursor +DEALLOCATE SP_cursor + +'' + + END + ELSE + BEGIN + + SET @Command = @Command + '' +IF EXISTS(SELECT 1 FROM sys.objects o WITH (NOLOCK) JOIN sys.schemas s ON s.schema_id = o.schema_id WHERE o.name = '''''' + @objectname + '''''' AND o.type IN (N''''U'''',''''P'''',''''V'''',''''FN'''',''''IF'''',''''TF'''') AND s.name = '''''' + @schemaid + '''''') +BEGIN + IF EXISTS(SELECT 1 FROM sys.fn_builtin_permissions(''''OBJECT'''') WHERE permission_name = '''''' + @rightsaction + '''''') + BEGIN + '' + @grantordeny + '' '' + @rightsaction + '' ON ['' + @schemaid + ''].['' + @objectname + ''] TO ['' + @RoleName + ''] + END +END + +'' + END +END + +IF @typeofobject = ''ASSEMBLIES'' +BEGIN + SET @Command = @Command + '' +IF EXISTS(SELECT 1 FROM sys.assemblies WHERE NAME = '''''' + @objectname + '''''') +BEGIN + IF EXISTS(SELECT 1 FROM sys.fn_builtin_permissions(''''ASSEMBLY'''') WHERE permission_name = '''''' + @rightsaction + '''''') + BEGIN + '' + @grantordeny + '' '' + @rightsaction + ''::['' + @objectname + ''] TO ['' + @RoleName + ''] + END +END + +'' +END + +IF @typeofobject = ''ROLE'' +BEGIN + SET @Command = @Command + '' +IF NOT EXISTS (SELECT 1 FROM sys.database_role_members JOIN sys.database_principals roles ON database_role_members.role_principal_id = roles.principal_id JOIN sys.database_principals members ON database_role_members.member_principal_id = members.principal_id WHERE roles.name = '''''' + @rightsaction + '''''' AND members.name = '''''' + @RoleName + '''''') +BEGIN + EXEC sp_addrolemember N'''''' + @rightsaction + '''''', N'''''' + @RoleName + '''''' +END + +'' +END + +FETCH NEXT FROM SecurablesCurs INTO @typeofobject, @grantordeny, @rightsaction, @objectname, @schemaid +END + +CLOSE SecurablesCurs +DEALLOCATE SecurablesCurs + +PRINT ''SET ALL SECURABLES ON ROLE ['' + @RoleName + '']'' +EXEC sp_executesql @Command + +/* ADD USER */ +DECLARE UsersCurs CURSOR FOR +SELECT username + FROM #UsersOnRole + +OPEN UsersCurs + +FETCH NEXT FROM UsersCurs INTO @Users +WHILE @@FETCH_STATUS = 0 +BEGIN + + SELECT @Command = '' +EXEC sp_addrolemember N'''''' + @RoleName + '''''', N'''''' + @Users + '''''' +PRINT ''''ADD USER ['' + @Users + ''] ON ROLE ['' + @RoleName + '']'''' +'' + +FETCH NEXT FROM UsersCurs INTO @Users +END + +CLOSE UsersCurs +DEALLOCATE UsersCurs + +EXEC sp_executesql @Command + + +/*============================================================================= + Drop temp tables +=============================================================================*/ +DROP TABLE #Securables +DROP TABLE #UsersOnRole +','ArizonaCASH','Pharmacies') + +INSERT INTO #AllRoles(STR_Definition,STR_Database,STR_Product)VALUES(' + +/*============================================================================= + + Script to create dbRoleAtlas role. + + Role Name: dbRoleAtlas + TEMPLATE: Default + + EXAMPLE OF SECURABLES TO SET: + + INSERT INTO #Securables + VALUES + (''DB'',''GRANT'',''VIEW DEFINITION'','''',''''), + (''SCHEMA'',''GRANT'',''SELECT,EXECUTE,INSERT,UPDATE,DELETE'','''',''AP''), + (''TABLE'',''GRANT'',''INSERT,UPDATE'',''Address'',''dbo''), + (''SP'',''GRANT'',''EXECUTE'',''sp_bmc_GetNextID'',''dbo''), + (''ROLE'',''GRANT'',''db_datareader'','''','''') + + ----------------------------------------------- + +Generate date : 2023-05-12 / up208700 + +=============================================================================*/ + +DECLARE @Command nvarchar(max), + @RoleName varchar(60), + @Users varchar(255), + @typeofobject varchar(50), + @grantordeny varchar(10), + @rightsaction varchar(255), + @objectname varchar(255), + @schemaid varchar(10), + @sysTarget varchar(255), + @sysType varchar(255) + +SET @RoleName = ''dbRoleAtlas'' +SET @Command = '''' + +/* TEMP TABLES */ +CREATE TABLE #UsersOnRole(username varchar(255)) +CREATE TABLE #Securables(typeofobject varchar(50), grantordeny varchar(10), rightsaction varchar(255), objectname varchar(255), schemaid varchar(10),N2 bit) + +/* !!! LIST OF SECURABLES TO CHANGE !!! */ + +INSERT INTO #Securables +VALUES +(''TABLE'',''GRANT'',''SELECT'',''CR_operation'',''dbo'',0) +,(''TABLE'',''GRANT'',''SELECT'',''CR_sales_header'',''dbo'',0) +,(''TABLE'',''GRANT'',''SELECT'',''CR_sales_operation'',''dbo'',0) +,(''TABLE'',''GRANT'',''SELECT'',''CR_sales_type'',''dbo'',0) + + +/* GET ALL USERS ON THIS ROLE */ +INSERT INTO #UsersOnRole +SELECT + members.name +FROM sys.database_role_members + JOIN sys.database_principals roles ON database_role_members.role_principal_id = roles.principal_id + JOIN sys.database_principals members ON database_role_members.member_principal_id = members.principal_id +WHERE roles.name = @RoleName + +/* CREATE ROLE */ +SELECT @Command = '' +IF NOT EXISTS (SELECT 1 FROM sys.database_principals WHERE name = '''''' + @RoleName + '''''' AND type = ''''R'''') +BEGIN + CREATE ROLE ['' + @RoleName + ''] AUTHORIZATION [dbo] + PRINT ''''CREATE ROLE ['' + @RoleName + '']'''' +END +'' +EXEC sp_executesql @Command + +SET @Command = '' +DECLARE @SP_Name varchar(255) + +'' + +/* SET ALL ROLE SECURABLES */ +DECLARE SecurablesCurs CURSOR FOR +SELECT typeofobject, grantordeny, rightsaction, objectname, schemaid +FROM #Securables +WHERE N2 = 0 + +OPEN SecurablesCurs +FETCH NEXT FROM SecurablesCurs INTO @typeofobject, @grantordeny, @rightsaction, @objectname, @schemaid +WHILE @@FETCH_STATUS = 0 +BEGIN + + IF @typeofobject = ''DB'' + BEGIN + IF EXISTS(SELECT 1 FROM sys.fn_builtin_permissions(''DATABASE'') WHERE permission_name = '''' + @rightsaction + '''') + BEGIN + SET @Command = @Command + @grantordeny + '' '' + @rightsaction + '' TO ['' + @RoleName + ''] +'' + END + END + + IF @typeofobject = ''SCHEMA'' + BEGIN + SET @Command = @Command + '' +IF EXISTS (SELECT 1 FROM sys.schemas WHERE name = '''''' + @schemaid + '''''') +BEGIN + IF EXISTS(SELECT 1 FROM sys.fn_builtin_permissions(''''SCHEMA'''') WHERE permission_name = '''''' + @rightsaction + '''''') + BEGIN + '' + @grantordeny + '' '' + @rightsaction + '' ON SCHEMA::'' + @schemaid + '' TO ['' + @RoleName + ''] + END +END + +'' + END + + IF @typeofobject in(''TABLE'',''SP'',''FUNCTIONS'',''VIEWS'') + BEGIN + + IF @objectname like ''%[%]%'' + BEGIN + + IF @typeofobject = ''TABLE'' + BEGIN + SET @sysTarget = ''sys.tables'' + SET @sysType = '''' + END + + IF @typeofobject = ''SP'' + BEGIN + SET @sysTarget = ''sys.procedures'' + SET @sysType = '''' + END + + IF @typeofobject = ''FUNCTIONS'' + BEGIN + SET @sysTarget = ''sys.objects'' + SET @sysType = '' and p.Type IN ( N''''FN'''', N''''IF'''', N''''TF'''', N''''FS'''', N''''FT'''' )'' + END + + IF @typeofobject = ''VIEWS'' + BEGIN + SET @sysTarget = ''sys.views'' + SET @sysType = '''' + END + + SET @Command = @Command + '' +DECLARE SP_cursor CURSOR FOR +SELECT p.name FROM '' + @sysTarget + '' p JOIN sys.schemas s ON s.schema_id = p.schema_id WHERE (p.name like '''''' + @objectname + '''''') and s.name = '''''' + @schemaid + '''' + @sysType + '''''' + +OPEN SP_cursor +FETCH NEXT FROM SP_cursor INTO @SP_Name +WHILE @@FETCH_STATUS = 0 +BEGIN + IF EXISTS(SELECT 1 FROM sys.fn_builtin_permissions(''''OBJECT'''') WHERE permission_name = '''''' + @rightsaction + '''''') + BEGIN + EXEC('''''' + @grantordeny + '' '' + @rightsaction + '' ON ['' + @schemaid + ''].['''' + @SP_Name + ''''] TO ['' + @RoleName + '']'''') + END + FETCH NEXT FROM SP_cursor INTO @SP_Name +END + +CLOSE SP_cursor +DEALLOCATE SP_cursor + +'' + + END + ELSE + BEGIN + + SET @Command = @Command + '' +IF EXISTS(SELECT 1 FROM sys.objects o WITH (NOLOCK) JOIN sys.schemas s ON s.schema_id = o.schema_id WHERE o.name = '''''' + @objectname + '''''' AND o.type IN (N''''U'''',''''P'''',''''V'''',''''FN'''',''''IF'''',''''TF'''') AND s.name = '''''' + @schemaid + '''''') +BEGIN + IF EXISTS(SELECT 1 FROM sys.fn_builtin_permissions(''''OBJECT'''') WHERE permission_name = '''''' + @rightsaction + '''''') + BEGIN + '' + @grantordeny + '' '' + @rightsaction + '' ON ['' + @schemaid + ''].['' + @objectname + ''] TO ['' + @RoleName + ''] + END +END + +'' + END +END + +IF @typeofobject = ''ASSEMBLIES'' +BEGIN + SET @Command = @Command + '' +IF EXISTS(SELECT 1 FROM sys.assemblies WHERE NAME = '''''' + @objectname + '''''') +BEGIN + IF EXISTS(SELECT 1 FROM sys.fn_builtin_permissions(''''ASSEMBLY'''') WHERE permission_name = '''''' + @rightsaction + '''''') + BEGIN + '' + @grantordeny + '' '' + @rightsaction + ''::['' + @objectname + ''] TO ['' + @RoleName + ''] + END +END + +'' +END + +IF @typeofobject = ''ROLE'' +BEGIN + SET @Command = @Command + '' +IF NOT EXISTS (SELECT 1 FROM sys.database_role_members JOIN sys.database_principals roles ON database_role_members.role_principal_id = roles.principal_id JOIN sys.database_principals members ON database_role_members.member_principal_id = members.principal_id WHERE roles.name = '''''' + @rightsaction + '''''' AND members.name = '''''' + @RoleName + '''''') +BEGIN + EXEC sp_addrolemember N'''''' + @rightsaction + '''''', N'''''' + @RoleName + '''''' +END + +'' +END + +FETCH NEXT FROM SecurablesCurs INTO @typeofobject, @grantordeny, @rightsaction, @objectname, @schemaid +END + +CLOSE SecurablesCurs +DEALLOCATE SecurablesCurs + +PRINT ''SET ALL SECURABLES ON ROLE ['' + @RoleName + '']'' +EXEC sp_executesql @Command + +/* ADD USER */ +DECLARE UsersCurs CURSOR FOR +SELECT username + FROM #UsersOnRole + +OPEN UsersCurs + +FETCH NEXT FROM UsersCurs INTO @Users +WHILE @@FETCH_STATUS = 0 +BEGIN + + SELECT @Command = '' +EXEC sp_addrolemember N'''''' + @RoleName + '''''', N'''''' + @Users + '''''' +PRINT ''''ADD USER ['' + @Users + ''] ON ROLE ['' + @RoleName + '']'''' +'' + +FETCH NEXT FROM UsersCurs INTO @Users +END + +CLOSE UsersCurs +DEALLOCATE UsersCurs + +EXEC sp_executesql @Command + + +/*============================================================================= + Drop temp tables +=============================================================================*/ +DROP TABLE #Securables +DROP TABLE #UsersOnRole +','ArizonaCASH','Pharmacies') + +INSERT INTO #AllRoles(STR_Definition,STR_Database,STR_Product)VALUES(' + +/*============================================================================= + + Script to create dbRoleCsltUsr role. + + Role Name: dbRoleCsltUsr + TEMPLATE: N2 and PROD + + EXAMPLE OF SECURABLES TO SET: + + INSERT INTO #Securables + VALUES + (''DB'',''GRANT'',''VIEW DEFINITION'','''',''''), + (''SCHEMA'',''GRANT'',''SELECT,EXECUTE,INSERT,UPDATE,DELETE'','''',''AP''), + (''TABLE'',''GRANT'',''INSERT,UPDATE'',''Address'',''dbo''), + (''SP'',''GRANT'',''EXECUTE'',''sp_bmc_GetNextID'',''dbo''), + (''ROLE'',''GRANT'',''db_datareader'','''','''') + + ----------------------------------------------- + +Generate date : 2023-05-12 / up208700 + +=============================================================================*/ + +DECLARE @Type varchar(6), + @Command nvarchar(max), + @RoleName varchar(60), + @Users varchar(255), + @typeofobject varchar(50), + @grantordeny varchar(10), + @rightsaction varchar(255), + @objectname varchar(255), + @schemaid varchar(10), + @sysTarget varchar(255), + @sysType varchar(255) + +SET @RoleName = ''dbRoleCsltUsr'' +SET @Command = '''' + +SELECT @Type = [Type] FROM [master].[cfg].[InstanceContext] + +/* TEMP TABLES */ +CREATE TABLE #UsersOnRole(username varchar(255)) +CREATE TABLE #Securables(typeofobject varchar(50), grantordeny varchar(10), rightsaction varchar(255), objectname varchar(255), schemaid varchar(10),N2 bit) + +/* !!! LIST OF SECURABLES TO CHANGE !!! */ + +INSERT INTO #Securables +VALUES +(''DB'',''GRANT'',''EXECUTE'','''',''dbo'',0) +,(''DB'',''GRANT'',''SHOWPLAN'','''',''dbo'',0) +,(''DB'',''GRANT'',''VIEW DEFINITION'','''',''dbo'',0) +,(''ROLE'',''GRANT'',''DB_DATAREADER'','''',''dbo'',0) +,(''ROLE'',''GRANT'',''DB_DATAWRITER'','''',''dbo'',0) +,(''ROLE'',''GRANT'',''DB_OWNER'','''',''dbo'',1) + + +/* GET ALL USERS ON THIS ROLE */ +INSERT INTO #UsersOnRole +SELECT + members.name +FROM sys.database_role_members + JOIN sys.database_principals roles ON database_role_members.role_principal_id = roles.principal_id + JOIN sys.database_principals members ON database_role_members.member_principal_id = members.principal_id +WHERE roles.name = @RoleName + +/* CREATE ROLE */ +SELECT @Command = '' +IF NOT EXISTS (SELECT 1 FROM sys.database_principals WHERE name = '''''' + @RoleName + '''''' AND type = ''''R'''') +BEGIN + CREATE ROLE ['' + @RoleName + ''] AUTHORIZATION [dbo] + PRINT ''''CREATE ROLE ['' + @RoleName + '']'''' +END +'' +EXEC sp_executesql @Command + +SET @Command = '' +DECLARE @SP_Name varchar(255) + +'' + +/* SET ALL ROLE SECURABLES */ +IF @Type = ''DEVE'' +BEGIN + + DECLARE SecurablesCurs CURSOR FOR + SELECT typeofobject, grantordeny, rightsaction, objectname, schemaid + FROM #Securables + WHERE N2 = 1 + + OPEN SecurablesCurs + FETCH NEXT FROM SecurablesCurs INTO @typeofobject, @grantordeny, @rightsaction, @objectname, @schemaid + WHILE @@FETCH_STATUS = 0 + BEGIN + + IF @typeofobject = ''DB'' + BEGIN + IF EXISTS(SELECT 1 FROM sys.fn_builtin_permissions(''DATABASE'') WHERE permission_name = '''' + @rightsaction + '''') + BEGIN + SET @Command = @Command + @grantordeny + '' '' + @rightsaction + '' TO ['' + @RoleName + ''] +'' + END + END + + IF @typeofobject = ''SCHEMA'' + BEGIN + SET @Command = @Command + '' +IF EXISTS (SELECT 1 FROM sys.schemas WHERE name = '''''' + @schemaid + '''''') +BEGIN + IF EXISTS(SELECT 1 FROM sys.fn_builtin_permissions(''''SCHEMA'''') WHERE permission_name = '''''' + @rightsaction + '''''') + BEGIN + '' + @grantordeny + '' '' + @rightsaction + '' ON SCHEMA::'' + @schemaid + '' TO ['' + @RoleName + ''] + END +END + +'' + END + + IF @typeofobject in(''TABLE'',''SP'',''FUNCTIONS'',''VIEWS'') + BEGIN + + IF @objectname like ''%[%]%'' + BEGIN + IF @typeofobject = ''TABLE'' + BEGIN + SET @sysTarget = ''sys.tables'' + SET @sysType = '''' + END + + IF @typeofobject = ''SP'' + BEGIN + SET @sysTarget = ''sys.procedures'' + SET @sysType = '''' + END + + IF @typeofobject = ''FUNCTIONS'' + BEGIN + SET @sysTarget = ''sys.objects'' + SET @sysType = '' and p.Type IN ( N''''FN'''', N''''IF'''', N''''TF'''', N''''FS'''', N''''FT'''' )'' + END + + IF @typeofobject = ''VIEWS'' + BEGIN + SET @sysTarget = ''sys.views'' + SET @sysType = '''' + END + + SET @Command = @Command + '' +DECLARE SP_cursor CURSOR FOR +SELECT p.name FROM '' + @sysTarget + '' p JOIN sys.schemas s ON s.schema_id = p.schema_id WHERE (p.name like '''''' + @objectname + '''''') and s.name = '''''' + @schemaid + '''' + @sysType + '''''' + +OPEN SP_cursor +FETCH NEXT FROM SP_cursor INTO @SP_Name +WHILE @@FETCH_STATUS = 0 +BEGIN + IF EXISTS(SELECT 1 FROM sys.fn_builtin_permissions(''''OBJECT'''') WHERE permission_name = '''''' + @rightsaction + '''''') + BEGIN + EXEC('''''' + @grantordeny + '' '' + @rightsaction + '' ON ['' + @schemaid + ''].['''' + @SP_Name + ''''] TO ['' + @RoleName + '']'''') + END + FETCH NEXT FROM SP_cursor INTO @SP_Name +END + +CLOSE SP_cursor +DEALLOCATE SP_cursor + +'' + + END + ELSE + BEGIN + + SET @Command = @Command + '' +IF EXISTS(SELECT 1 FROM sys.objects o WITH (NOLOCK) JOIN sys.schemas s ON s.schema_id = o.schema_id WHERE o.name = '''''' + @objectname + '''''' AND o.type IN (N''''U'''',''''P'''',''''V'''',''''FN'''',''''IF'''',''''TF'''') AND s.name = '''''' + @schemaid + '''''') +BEGIN + IF EXISTS(SELECT 1 FROM sys.fn_builtin_permissions(''''OBJECT'''') WHERE permission_name = '''''' + @rightsaction + '''''') + BEGIN + '' + @grantordeny + '' '' + @rightsaction + '' ON ['' + @schemaid + ''].['' + @objectname + ''] TO ['' + @RoleName + ''] + END +END + +'' + END + END + + IF @typeofobject = ''ASSEMBLIES'' + BEGIN + SET @Command = @Command + '' +IF EXISTS(SELECT 1 FROM sys.assemblies WHERE NAME = '''''' + @objectname + '''''') +BEGIN + IF EXISTS(SELECT 1 FROM sys.fn_builtin_permissions(''''ASSEMBLY'''') WHERE permission_name = '''''' + @rightsaction + '''''') + BEGIN + '' + @grantordeny + '' '' + @rightsaction + ''::['' + @objectname + ''] TO ['' + @RoleName + ''] + END +END + +'' + END + + IF @typeofobject = ''ROLE'' + BEGIN + SET @Command = @Command + '' +IF NOT EXISTS (SELECT 1 FROM sys.database_role_members JOIN sys.database_principals roles ON database_role_members.role_principal_id = roles.principal_id JOIN sys.database_principals members ON database_role_members.member_principal_id = members.principal_id WHERE roles.name = '''''' + @rightsaction + '''''' AND members.name = '''''' + @RoleName + '''''') +BEGIN + EXEC sp_addrolemember N'''''' + @rightsaction + '''''', N'''''' + @RoleName + '''''' +END + +'' + END + + FETCH NEXT FROM SecurablesCurs INTO @typeofobject, @grantordeny, @rightsaction, @objectname, @schemaid + END + +CLOSE SecurablesCurs +DEALLOCATE SecurablesCurs + +PRINT ''SET ALL SECURABLES ON ROLE ['' + @RoleName + '']'' +EXEC sp_executesql @Command + +END +ELSE +BEGIN + + DECLARE SecurablesCurs CURSOR FOR + SELECT typeofobject, grantordeny, rightsaction, objectname, schemaid + FROM #Securables + WHERE N2 = 0 + + OPEN SecurablesCurs + FETCH NEXT FROM SecurablesCurs INTO @typeofobject, @grantordeny, @rightsaction, @objectname, @schemaid + WHILE @@FETCH_STATUS = 0 + BEGIN + + IF @typeofobject = ''DB'' + BEGIN + IF EXISTS(SELECT 1 FROM sys.fn_builtin_permissions(''DATABASE'') WHERE permission_name = '''' + @rightsaction + '''') + BEGIN + SET @Command = @Command + @grantordeny + '' '' + @rightsaction + '' TO ['' + @RoleName + ''] +'' + END + END + + IF @typeofobject = ''SCHEMA'' + BEGIN + SET @Command = @Command + '' +IF EXISTS (SELECT 1 FROM sys.schemas WHERE name = '''''' + @schemaid + '''''') +BEGIN + IF EXISTS(SELECT 1 FROM sys.fn_builtin_permissions(''''SCHEMA'''') WHERE permission_name = '''''' + @rightsaction + '''''') + BEGIN + '' + @grantordeny + '' '' + @rightsaction + '' ON SCHEMA::'' + @schemaid + '' TO ['' + @RoleName + ''] + END +END + +'' + END + + IF @typeofobject in(''TABLE'',''SP'',''FUNCTIONS'',''VIEWS'') + BEGIN + + IF @objectname like ''%[%]%'' + BEGIN + + IF @typeofobject = ''TABLE'' + BEGIN + SET @sysTarget = ''sys.tables'' + SET @sysType = '''' + END + + IF @typeofobject = ''SP'' + BEGIN + SET @sysTarget = ''sys.procedures'' + SET @sysType = '''' + END + + IF @typeofobject = ''FUNCTIONS'' + BEGIN + SET @sysTarget = ''sys.objects'' + SET @sysType = '' and p.Type IN ( N''''FN'''', N''''IF'''', N''''TF'''', N''''FS'''', N''''FT'''' )'' + END + + IF @typeofobject = ''VIEWS'' + BEGIN + SET @sysTarget = ''sys.views'' + SET @sysType = '''' + END + + SET @Command = @Command + '' +DECLARE SP_cursor CURSOR FOR +SELECT p.name FROM '' + @sysTarget + '' p JOIN sys.schemas s ON s.schema_id = p.schema_id WHERE (p.name like '''''' + @objectname + '''''') and s.name = '''''' + @schemaid + '''' + @sysType + '''''' + +OPEN SP_cursor +FETCH NEXT FROM SP_cursor INTO @SP_Name +WHILE @@FETCH_STATUS = 0 +BEGIN + IF EXISTS(SELECT 1 FROM sys.fn_builtin_permissions(''''OBJECT'''') WHERE permission_name = '''''' + @rightsaction + '''''') + BEGIN + EXEC('''''' + @grantordeny + '' '' + @rightsaction + '' ON ['' + @schemaid + ''].['''' + @SP_Name + ''''] TO ['' + @RoleName + '']'''') + END + FETCH NEXT FROM SP_cursor INTO @SP_Name +END + +CLOSE SP_cursor +DEALLOCATE SP_cursor + +'' + + END + ELSE + BEGIN + + SET @Command = @Command + '' +IF EXISTS(SELECT 1 FROM sys.objects o WITH (NOLOCK) JOIN sys.schemas s ON s.schema_id = o.schema_id WHERE o.name = '''''' + @objectname + '''''' AND o.type IN (N''''U'''',''''P'''',''''V'''',''''FN'''',''''IF'''',''''TF'''') AND s.name = '''''' + @schemaid + '''''') +BEGIN + IF EXISTS(SELECT 1 FROM sys.fn_builtin_permissions(''''OBJECT'''') WHERE permission_name = '''''' + @rightsaction + '''''') + BEGIN + '' + @grantordeny + '' '' + @rightsaction + '' ON ['' + @schemaid + ''].['' + @objectname + ''] TO ['' + @RoleName + ''] + END +END + +'' + END + END + + IF @typeofobject = ''ASSEMBLIES'' + BEGIN + SET @Command = @Command + '' +IF EXISTS(SELECT 1 FROM sys.assemblies WHERE NAME = '''''' + @objectname + '''''') +BEGIN + IF EXISTS(SELECT 1 FROM sys.fn_builtin_permissions(''''ASSEMBLY'''') WHERE permission_name = '''''' + @rightsaction + '''''') + BEGIN + '' + @grantordeny + '' '' + @rightsaction + ''::['' + @objectname + ''] TO ['' + @RoleName + ''] + END +END + +'' + END + + IF @typeofobject = ''ROLE'' + BEGIN + SET @Command = @Command + '' +IF NOT EXISTS (SELECT 1 FROM sys.database_role_members JOIN sys.database_principals roles ON database_role_members.role_principal_id = roles.principal_id JOIN sys.database_principals members ON database_role_members.member_principal_id = members.principal_id WHERE roles.name = '''''' + @rightsaction + '''''' AND members.name = '''''' + @RoleName + '''''') +BEGIN + EXEC sp_addrolemember N'''''' + @rightsaction + '''''', N'''''' + @RoleName + '''''' +END + +'' + END + + FETCH NEXT FROM SecurablesCurs INTO @typeofobject, @grantordeny, @rightsaction, @objectname, @schemaid + END + +CLOSE SecurablesCurs +DEALLOCATE SecurablesCurs + +PRINT ''SET ALL SECURABLES ON ROLE ['' + @RoleName + '']'' +EXEC sp_executesql @Command + +END + +/* ADD USER */ +DECLARE UsersCurs CURSOR FOR +SELECT username + FROM #UsersOnRole + +OPEN UsersCurs + +FETCH NEXT FROM UsersCurs INTO @Users +WHILE @@FETCH_STATUS = 0 +BEGIN + + SELECT @Command = '' +EXEC sp_addrolemember N'''''' + @RoleName + '''''', N'''''' + @Users + '''''' +PRINT ''''ADD USER ['' + @Users + ''] ON ROLE ['' + @RoleName + '']'''' +'' + +FETCH NEXT FROM UsersCurs INTO @Users +END + +CLOSE UsersCurs +DEALLOCATE UsersCurs + +EXEC sp_executesql @Command + +/*============================================================================= + Drop temp tables +=============================================================================*/ +DROP TABLE #Securables +DROP TABLE #UsersOnRole','ArizonaCASH','Pharmacies') + +INSERT INTO #AllRoles(STR_Definition,STR_Database,STR_Product)VALUES(' + +/*============================================================================= + + Script to create dbRoleDevUsr role. + + Role Name: dbRoleDevUsr + TEMPLATE: Default + + EXAMPLE OF SECURABLES TO SET: + + INSERT INTO #Securables + VALUES + (''DB'',''GRANT'',''VIEW DEFINITION'','''',''''), + (''SCHEMA'',''GRANT'',''SELECT,EXECUTE,INSERT,UPDATE,DELETE'','''',''AP''), + (''TABLE'',''GRANT'',''INSERT,UPDATE'',''Address'',''dbo''), + (''SP'',''GRANT'',''EXECUTE'',''sp_bmc_GetNextID'',''dbo''), + (''ROLE'',''GRANT'',''db_datareader'','''','''') + + ----------------------------------------------- + +Generate date : 2023-05-12 / up208700 + +=============================================================================*/ + +DECLARE @Command nvarchar(max), + @RoleName varchar(60), + @Users varchar(255), + @typeofobject varchar(50), + @grantordeny varchar(10), + @rightsaction varchar(255), + @objectname varchar(255), + @schemaid varchar(10), + @sysTarget varchar(255), + @sysType varchar(255) + +SET @RoleName = ''dbRoleDevUsr'' +SET @Command = '''' + +/* TEMP TABLES */ +CREATE TABLE #UsersOnRole(username varchar(255)) +CREATE TABLE #Securables(typeofobject varchar(50), grantordeny varchar(10), rightsaction varchar(255), objectname varchar(255), schemaid varchar(10),N2 bit) + +/* !!! LIST OF SECURABLES TO CHANGE !!! */ + +INSERT INTO #Securables +VALUES +(''DB'',''GRANT'',''EXECUTE'','''',''dbo'',0) +,(''DB'',''GRANT'',''SHOWPLAN'','''',''dbo'',0) +,(''DB'',''GRANT'',''VIEW DEFINITION'','''',''dbo'',0) +,(''ROLE'',''GRANT'',''DB_DATAREADER'','''',''dbo'',0) +,(''ROLE'',''GRANT'',''DB_DATAWRITER'','''',''dbo'',0) + + +/* GET ALL USERS ON THIS ROLE */ +INSERT INTO #UsersOnRole +SELECT + members.name +FROM sys.database_role_members + JOIN sys.database_principals roles ON database_role_members.role_principal_id = roles.principal_id + JOIN sys.database_principals members ON database_role_members.member_principal_id = members.principal_id +WHERE roles.name = @RoleName + +/* CREATE ROLE */ +SELECT @Command = '' +IF NOT EXISTS (SELECT 1 FROM sys.database_principals WHERE name = '''''' + @RoleName + '''''' AND type = ''''R'''') +BEGIN + CREATE ROLE ['' + @RoleName + ''] AUTHORIZATION [dbo] + PRINT ''''CREATE ROLE ['' + @RoleName + '']'''' +END +'' +EXEC sp_executesql @Command + +SET @Command = '' +DECLARE @SP_Name varchar(255) + +'' + +/* SET ALL ROLE SECURABLES */ +DECLARE SecurablesCurs CURSOR FOR +SELECT typeofobject, grantordeny, rightsaction, objectname, schemaid +FROM #Securables +WHERE N2 = 0 + +OPEN SecurablesCurs +FETCH NEXT FROM SecurablesCurs INTO @typeofobject, @grantordeny, @rightsaction, @objectname, @schemaid +WHILE @@FETCH_STATUS = 0 +BEGIN + + IF @typeofobject = ''DB'' + BEGIN + IF EXISTS(SELECT 1 FROM sys.fn_builtin_permissions(''DATABASE'') WHERE permission_name = '''' + @rightsaction + '''') + BEGIN + SET @Command = @Command + @grantordeny + '' '' + @rightsaction + '' TO ['' + @RoleName + ''] +'' + END + END + + IF @typeofobject = ''SCHEMA'' + BEGIN + SET @Command = @Command + '' +IF EXISTS (SELECT 1 FROM sys.schemas WHERE name = '''''' + @schemaid + '''''') +BEGIN + IF EXISTS(SELECT 1 FROM sys.fn_builtin_permissions(''''SCHEMA'''') WHERE permission_name = '''''' + @rightsaction + '''''') + BEGIN + '' + @grantordeny + '' '' + @rightsaction + '' ON SCHEMA::'' + @schemaid + '' TO ['' + @RoleName + ''] + END +END + +'' + END + + IF @typeofobject in(''TABLE'',''SP'',''FUNCTIONS'',''VIEWS'') + BEGIN + + IF @objectname like ''%[%]%'' + BEGIN + + IF @typeofobject = ''TABLE'' + BEGIN + SET @sysTarget = ''sys.tables'' + SET @sysType = '''' + END + + IF @typeofobject = ''SP'' + BEGIN + SET @sysTarget = ''sys.procedures'' + SET @sysType = '''' + END + + IF @typeofobject = ''FUNCTIONS'' + BEGIN + SET @sysTarget = ''sys.objects'' + SET @sysType = '' and p.Type IN ( N''''FN'''', N''''IF'''', N''''TF'''', N''''FS'''', N''''FT'''' )'' + END + + IF @typeofobject = ''VIEWS'' + BEGIN + SET @sysTarget = ''sys.views'' + SET @sysType = '''' + END + + SET @Command = @Command + '' +DECLARE SP_cursor CURSOR FOR +SELECT p.name FROM '' + @sysTarget + '' p JOIN sys.schemas s ON s.schema_id = p.schema_id WHERE (p.name like '''''' + @objectname + '''''') and s.name = '''''' + @schemaid + '''' + @sysType + '''''' + +OPEN SP_cursor +FETCH NEXT FROM SP_cursor INTO @SP_Name +WHILE @@FETCH_STATUS = 0 +BEGIN + IF EXISTS(SELECT 1 FROM sys.fn_builtin_permissions(''''OBJECT'''') WHERE permission_name = '''''' + @rightsaction + '''''') + BEGIN + EXEC('''''' + @grantordeny + '' '' + @rightsaction + '' ON ['' + @schemaid + ''].['''' + @SP_Name + ''''] TO ['' + @RoleName + '']'''') + END + FETCH NEXT FROM SP_cursor INTO @SP_Name +END + +CLOSE SP_cursor +DEALLOCATE SP_cursor + +'' + + END + ELSE + BEGIN + + SET @Command = @Command + '' +IF EXISTS(SELECT 1 FROM sys.objects o WITH (NOLOCK) JOIN sys.schemas s ON s.schema_id = o.schema_id WHERE o.name = '''''' + @objectname + '''''' AND o.type IN (N''''U'''',''''P'''',''''V'''',''''FN'''',''''IF'''',''''TF'''') AND s.name = '''''' + @schemaid + '''''') +BEGIN + IF EXISTS(SELECT 1 FROM sys.fn_builtin_permissions(''''OBJECT'''') WHERE permission_name = '''''' + @rightsaction + '''''') + BEGIN + '' + @grantordeny + '' '' + @rightsaction + '' ON ['' + @schemaid + ''].['' + @objectname + ''] TO ['' + @RoleName + ''] + END +END + +'' + END +END + +IF @typeofobject = ''ASSEMBLIES'' +BEGIN + SET @Command = @Command + '' +IF EXISTS(SELECT 1 FROM sys.assemblies WHERE NAME = '''''' + @objectname + '''''') +BEGIN + IF EXISTS(SELECT 1 FROM sys.fn_builtin_permissions(''''ASSEMBLY'''') WHERE permission_name = '''''' + @rightsaction + '''''') + BEGIN + '' + @grantordeny + '' '' + @rightsaction + ''::['' + @objectname + ''] TO ['' + @RoleName + ''] + END +END + +'' +END + +IF @typeofobject = ''ROLE'' +BEGIN + SET @Command = @Command + '' +IF NOT EXISTS (SELECT 1 FROM sys.database_role_members JOIN sys.database_principals roles ON database_role_members.role_principal_id = roles.principal_id JOIN sys.database_principals members ON database_role_members.member_principal_id = members.principal_id WHERE roles.name = '''''' + @rightsaction + '''''' AND members.name = '''''' + @RoleName + '''''') +BEGIN + EXEC sp_addrolemember N'''''' + @rightsaction + '''''', N'''''' + @RoleName + '''''' +END + +'' +END + +FETCH NEXT FROM SecurablesCurs INTO @typeofobject, @grantordeny, @rightsaction, @objectname, @schemaid +END + +CLOSE SecurablesCurs +DEALLOCATE SecurablesCurs + +PRINT ''SET ALL SECURABLES ON ROLE ['' + @RoleName + '']'' +EXEC sp_executesql @Command + +/* ADD USER */ +DECLARE UsersCurs CURSOR FOR +SELECT username + FROM #UsersOnRole + +OPEN UsersCurs + +FETCH NEXT FROM UsersCurs INTO @Users +WHILE @@FETCH_STATUS = 0 +BEGIN + + SELECT @Command = '' +EXEC sp_addrolemember N'''''' + @RoleName + '''''', N'''''' + @Users + '''''' +PRINT ''''ADD USER ['' + @Users + ''] ON ROLE ['' + @RoleName + '']'''' +'' + +FETCH NEXT FROM UsersCurs INTO @Users +END + +CLOSE UsersCurs +DEALLOCATE UsersCurs + +EXEC sp_executesql @Command + + +/*============================================================================= + Drop temp tables +=============================================================================*/ +DROP TABLE #Securables +DROP TABLE #UsersOnRole +','ArizonaCASH','Pharmacies') + +INSERT INTO #AllRoles(STR_Definition,STR_Database,STR_Product)VALUES(' + +/*============================================================================= + + Script to create dbRoleIttechUsr role. + + Role Name: dbRoleIttechUsr + TEMPLATE: N2 and PROD + + EXAMPLE OF SECURABLES TO SET: + + INSERT INTO #Securables + VALUES + (''DB'',''GRANT'',''VIEW DEFINITION'','''',''''), + (''SCHEMA'',''GRANT'',''SELECT,EXECUTE,INSERT,UPDATE,DELETE'','''',''AP''), + (''TABLE'',''GRANT'',''INSERT,UPDATE'',''Address'',''dbo''), + (''SP'',''GRANT'',''EXECUTE'',''sp_bmc_GetNextID'',''dbo''), + (''ROLE'',''GRANT'',''db_datareader'','''','''') + + ----------------------------------------------- + +Generate date : 2023-05-12 / up208700 + +=============================================================================*/ + +DECLARE @Type varchar(6), + @Command nvarchar(max), + @RoleName varchar(60), + @Users varchar(255), + @typeofobject varchar(50), + @grantordeny varchar(10), + @rightsaction varchar(255), + @objectname varchar(255), + @schemaid varchar(10), + @sysTarget varchar(255), + @sysType varchar(255) + +SET @RoleName = ''dbRoleIttechUsr'' +SET @Command = '''' + +SELECT @Type = [Type] FROM [master].[cfg].[InstanceContext] + +/* TEMP TABLES */ +CREATE TABLE #UsersOnRole(username varchar(255)) +CREATE TABLE #Securables(typeofobject varchar(50), grantordeny varchar(10), rightsaction varchar(255), objectname varchar(255), schemaid varchar(10),N2 bit) + +/* !!! LIST OF SECURABLES TO CHANGE !!! */ + +INSERT INTO #Securables +VALUES +(''DB'',''GRANT'',''EXECUTE'','''',''dbo'',0) +,(''ROLE'',''GRANT'',''DB_DATAREADER'','''',''dbo'',0) +,(''ROLE'',''GRANT'',''DB_DATAWRITER'','''',''dbo'',0) +,(''ROLE'',''GRANT'',''DB_OWNER'','''',''dbo'',1) + + +/* GET ALL USERS ON THIS ROLE */ +INSERT INTO #UsersOnRole +SELECT + members.name +FROM sys.database_role_members + JOIN sys.database_principals roles ON database_role_members.role_principal_id = roles.principal_id + JOIN sys.database_principals members ON database_role_members.member_principal_id = members.principal_id +WHERE roles.name = @RoleName + +/* CREATE ROLE */ +SELECT @Command = '' +IF NOT EXISTS (SELECT 1 FROM sys.database_principals WHERE name = '''''' + @RoleName + '''''' AND type = ''''R'''') +BEGIN + CREATE ROLE ['' + @RoleName + ''] AUTHORIZATION [dbo] + PRINT ''''CREATE ROLE ['' + @RoleName + '']'''' +END +'' +EXEC sp_executesql @Command + +SET @Command = '' +DECLARE @SP_Name varchar(255) + +'' + +/* SET ALL ROLE SECURABLES */ +IF @Type = ''DEVE'' +BEGIN + + DECLARE SecurablesCurs CURSOR FOR + SELECT typeofobject, grantordeny, rightsaction, objectname, schemaid + FROM #Securables + WHERE N2 = 1 + + OPEN SecurablesCurs + FETCH NEXT FROM SecurablesCurs INTO @typeofobject, @grantordeny, @rightsaction, @objectname, @schemaid + WHILE @@FETCH_STATUS = 0 + BEGIN + + IF @typeofobject = ''DB'' + BEGIN + IF EXISTS(SELECT 1 FROM sys.fn_builtin_permissions(''DATABASE'') WHERE permission_name = '''' + @rightsaction + '''') + BEGIN + SET @Command = @Command + @grantordeny + '' '' + @rightsaction + '' TO ['' + @RoleName + ''] +'' + END + END + + IF @typeofobject = ''SCHEMA'' + BEGIN + SET @Command = @Command + '' +IF EXISTS (SELECT 1 FROM sys.schemas WHERE name = '''''' + @schemaid + '''''') +BEGIN + IF EXISTS(SELECT 1 FROM sys.fn_builtin_permissions(''''SCHEMA'''') WHERE permission_name = '''''' + @rightsaction + '''''') + BEGIN + '' + @grantordeny + '' '' + @rightsaction + '' ON SCHEMA::'' + @schemaid + '' TO ['' + @RoleName + ''] + END +END + +'' + END + + IF @typeofobject in(''TABLE'',''SP'',''FUNCTIONS'',''VIEWS'') + BEGIN + + IF @objectname like ''%[%]%'' + BEGIN + IF @typeofobject = ''TABLE'' + BEGIN + SET @sysTarget = ''sys.tables'' + SET @sysType = '''' + END + + IF @typeofobject = ''SP'' + BEGIN + SET @sysTarget = ''sys.procedures'' + SET @sysType = '''' + END + + IF @typeofobject = ''FUNCTIONS'' + BEGIN + SET @sysTarget = ''sys.objects'' + SET @sysType = '' and p.Type IN ( N''''FN'''', N''''IF'''', N''''TF'''', N''''FS'''', N''''FT'''' )'' + END + + IF @typeofobject = ''VIEWS'' + BEGIN + SET @sysTarget = ''sys.views'' + SET @sysType = '''' + END + + SET @Command = @Command + '' +DECLARE SP_cursor CURSOR FOR +SELECT p.name FROM '' + @sysTarget + '' p JOIN sys.schemas s ON s.schema_id = p.schema_id WHERE (p.name like '''''' + @objectname + '''''') and s.name = '''''' + @schemaid + '''' + @sysType + '''''' + +OPEN SP_cursor +FETCH NEXT FROM SP_cursor INTO @SP_Name +WHILE @@FETCH_STATUS = 0 +BEGIN + IF EXISTS(SELECT 1 FROM sys.fn_builtin_permissions(''''OBJECT'''') WHERE permission_name = '''''' + @rightsaction + '''''') + BEGIN + EXEC('''''' + @grantordeny + '' '' + @rightsaction + '' ON ['' + @schemaid + ''].['''' + @SP_Name + ''''] TO ['' + @RoleName + '']'''') + END + FETCH NEXT FROM SP_cursor INTO @SP_Name +END + +CLOSE SP_cursor +DEALLOCATE SP_cursor + +'' + + END + ELSE + BEGIN + + SET @Command = @Command + '' +IF EXISTS(SELECT 1 FROM sys.objects o WITH (NOLOCK) JOIN sys.schemas s ON s.schema_id = o.schema_id WHERE o.name = '''''' + @objectname + '''''' AND o.type IN (N''''U'''',''''P'''',''''V'''',''''FN'''',''''IF'''',''''TF'''') AND s.name = '''''' + @schemaid + '''''') +BEGIN + IF EXISTS(SELECT 1 FROM sys.fn_builtin_permissions(''''OBJECT'''') WHERE permission_name = '''''' + @rightsaction + '''''') + BEGIN + '' + @grantordeny + '' '' + @rightsaction + '' ON ['' + @schemaid + ''].['' + @objectname + ''] TO ['' + @RoleName + ''] + END +END + +'' + END + END + + IF @typeofobject = ''ASSEMBLIES'' + BEGIN + SET @Command = @Command + '' +IF EXISTS(SELECT 1 FROM sys.assemblies WHERE NAME = '''''' + @objectname + '''''') +BEGIN + IF EXISTS(SELECT 1 FROM sys.fn_builtin_permissions(''''ASSEMBLY'''') WHERE permission_name = '''''' + @rightsaction + '''''') + BEGIN + '' + @grantordeny + '' '' + @rightsaction + ''::['' + @objectname + ''] TO ['' + @RoleName + ''] + END +END + +'' + END + + IF @typeofobject = ''ROLE'' + BEGIN + SET @Command = @Command + '' +IF NOT EXISTS (SELECT 1 FROM sys.database_role_members JOIN sys.database_principals roles ON database_role_members.role_principal_id = roles.principal_id JOIN sys.database_principals members ON database_role_members.member_principal_id = members.principal_id WHERE roles.name = '''''' + @rightsaction + '''''' AND members.name = '''''' + @RoleName + '''''') +BEGIN + EXEC sp_addrolemember N'''''' + @rightsaction + '''''', N'''''' + @RoleName + '''''' +END + +'' + END + + FETCH NEXT FROM SecurablesCurs INTO @typeofobject, @grantordeny, @rightsaction, @objectname, @schemaid + END + +CLOSE SecurablesCurs +DEALLOCATE SecurablesCurs + +PRINT ''SET ALL SECURABLES ON ROLE ['' + @RoleName + '']'' +EXEC sp_executesql @Command + +END +ELSE +BEGIN + + DECLARE SecurablesCurs CURSOR FOR + SELECT typeofobject, grantordeny, rightsaction, objectname, schemaid + FROM #Securables + WHERE N2 = 0 + + OPEN SecurablesCurs + FETCH NEXT FROM SecurablesCurs INTO @typeofobject, @grantordeny, @rightsaction, @objectname, @schemaid + WHILE @@FETCH_STATUS = 0 + BEGIN + + IF @typeofobject = ''DB'' + BEGIN + IF EXISTS(SELECT 1 FROM sys.fn_builtin_permissions(''DATABASE'') WHERE permission_name = '''' + @rightsaction + '''') + BEGIN + SET @Command = @Command + @grantordeny + '' '' + @rightsaction + '' TO ['' + @RoleName + ''] +'' + END + END + + IF @typeofobject = ''SCHEMA'' + BEGIN + SET @Command = @Command + '' +IF EXISTS (SELECT 1 FROM sys.schemas WHERE name = '''''' + @schemaid + '''''') +BEGIN + IF EXISTS(SELECT 1 FROM sys.fn_builtin_permissions(''''SCHEMA'''') WHERE permission_name = '''''' + @rightsaction + '''''') + BEGIN + '' + @grantordeny + '' '' + @rightsaction + '' ON SCHEMA::'' + @schemaid + '' TO ['' + @RoleName + ''] + END +END + +'' + END + + IF @typeofobject in(''TABLE'',''SP'',''FUNCTIONS'',''VIEWS'') + BEGIN + + IF @objectname like ''%[%]%'' + BEGIN + + IF @typeofobject = ''TABLE'' + BEGIN + SET @sysTarget = ''sys.tables'' + SET @sysType = '''' + END + + IF @typeofobject = ''SP'' + BEGIN + SET @sysTarget = ''sys.procedures'' + SET @sysType = '''' + END + + IF @typeofobject = ''FUNCTIONS'' + BEGIN + SET @sysTarget = ''sys.objects'' + SET @sysType = '' and p.Type IN ( N''''FN'''', N''''IF'''', N''''TF'''', N''''FS'''', N''''FT'''' )'' + END + + IF @typeofobject = ''VIEWS'' + BEGIN + SET @sysTarget = ''sys.views'' + SET @sysType = '''' + END + + SET @Command = @Command + '' +DECLARE SP_cursor CURSOR FOR +SELECT p.name FROM '' + @sysTarget + '' p JOIN sys.schemas s ON s.schema_id = p.schema_id WHERE (p.name like '''''' + @objectname + '''''') and s.name = '''''' + @schemaid + '''' + @sysType + '''''' + +OPEN SP_cursor +FETCH NEXT FROM SP_cursor INTO @SP_Name +WHILE @@FETCH_STATUS = 0 +BEGIN + IF EXISTS(SELECT 1 FROM sys.fn_builtin_permissions(''''OBJECT'''') WHERE permission_name = '''''' + @rightsaction + '''''') + BEGIN + EXEC('''''' + @grantordeny + '' '' + @rightsaction + '' ON ['' + @schemaid + ''].['''' + @SP_Name + ''''] TO ['' + @RoleName + '']'''') + END + FETCH NEXT FROM SP_cursor INTO @SP_Name +END + +CLOSE SP_cursor +DEALLOCATE SP_cursor + +'' + + END + ELSE + BEGIN + + SET @Command = @Command + '' +IF EXISTS(SELECT 1 FROM sys.objects o WITH (NOLOCK) JOIN sys.schemas s ON s.schema_id = o.schema_id WHERE o.name = '''''' + @objectname + '''''' AND o.type IN (N''''U'''',''''P'''',''''V'''',''''FN'''',''''IF'''',''''TF'''') AND s.name = '''''' + @schemaid + '''''') +BEGIN + IF EXISTS(SELECT 1 FROM sys.fn_builtin_permissions(''''OBJECT'''') WHERE permission_name = '''''' + @rightsaction + '''''') + BEGIN + '' + @grantordeny + '' '' + @rightsaction + '' ON ['' + @schemaid + ''].['' + @objectname + ''] TO ['' + @RoleName + ''] + END +END + +'' + END + END + + IF @typeofobject = ''ASSEMBLIES'' + BEGIN + SET @Command = @Command + '' +IF EXISTS(SELECT 1 FROM sys.assemblies WHERE NAME = '''''' + @objectname + '''''') +BEGIN + IF EXISTS(SELECT 1 FROM sys.fn_builtin_permissions(''''ASSEMBLY'''') WHERE permission_name = '''''' + @rightsaction + '''''') + BEGIN + '' + @grantordeny + '' '' + @rightsaction + ''::['' + @objectname + ''] TO ['' + @RoleName + ''] + END +END + +'' + END + + IF @typeofobject = ''ROLE'' + BEGIN + SET @Command = @Command + '' +IF NOT EXISTS (SELECT 1 FROM sys.database_role_members JOIN sys.database_principals roles ON database_role_members.role_principal_id = roles.principal_id JOIN sys.database_principals members ON database_role_members.member_principal_id = members.principal_id WHERE roles.name = '''''' + @rightsaction + '''''' AND members.name = '''''' + @RoleName + '''''') +BEGIN + EXEC sp_addrolemember N'''''' + @rightsaction + '''''', N'''''' + @RoleName + '''''' +END + +'' + END + + FETCH NEXT FROM SecurablesCurs INTO @typeofobject, @grantordeny, @rightsaction, @objectname, @schemaid + END + +CLOSE SecurablesCurs +DEALLOCATE SecurablesCurs + +PRINT ''SET ALL SECURABLES ON ROLE ['' + @RoleName + '']'' +EXEC sp_executesql @Command + +END + +/* ADD USER */ +DECLARE UsersCurs CURSOR FOR +SELECT username + FROM #UsersOnRole + +OPEN UsersCurs + +FETCH NEXT FROM UsersCurs INTO @Users +WHILE @@FETCH_STATUS = 0 +BEGIN + + SELECT @Command = '' +EXEC sp_addrolemember N'''''' + @RoleName + '''''', N'''''' + @Users + '''''' +PRINT ''''ADD USER ['' + @Users + ''] ON ROLE ['' + @RoleName + '']'''' +'' + +FETCH NEXT FROM UsersCurs INTO @Users +END + +CLOSE UsersCurs +DEALLOCATE UsersCurs + +EXEC sp_executesql @Command + +/*============================================================================= + Drop temp tables +=============================================================================*/ +DROP TABLE #Securables +DROP TABLE #UsersOnRole','ArizonaCASH','Pharmacies') + +INSERT INTO #AllRoles(STR_Definition,STR_Database,STR_Product)VALUES(' + +/*============================================================================= + + Script to create dbRoleSupUsr role. + + Role Name: dbRoleSupUsr + TEMPLATE: N2 and PROD + + EXAMPLE OF SECURABLES TO SET: + + INSERT INTO #Securables + VALUES + (''DB'',''GRANT'',''VIEW DEFINITION'','''',''''), + (''SCHEMA'',''GRANT'',''SELECT,EXECUTE,INSERT,UPDATE,DELETE'','''',''AP''), + (''TABLE'',''GRANT'',''INSERT,UPDATE'',''Address'',''dbo''), + (''SP'',''GRANT'',''EXECUTE'',''sp_bmc_GetNextID'',''dbo''), + (''ROLE'',''GRANT'',''db_datareader'','''','''') + + ----------------------------------------------- + +Generate date : 2023-05-12 / up208700 + +=============================================================================*/ + +DECLARE @Type varchar(6), + @Command nvarchar(max), + @RoleName varchar(60), + @Users varchar(255), + @typeofobject varchar(50), + @grantordeny varchar(10), + @rightsaction varchar(255), + @objectname varchar(255), + @schemaid varchar(10), + @sysTarget varchar(255), + @sysType varchar(255) + +SET @RoleName = ''dbRoleSupUsr'' +SET @Command = '''' + +SELECT @Type = [Type] FROM [master].[cfg].[InstanceContext] + +/* TEMP TABLES */ +CREATE TABLE #UsersOnRole(username varchar(255)) +CREATE TABLE #Securables(typeofobject varchar(50), grantordeny varchar(10), rightsaction varchar(255), objectname varchar(255), schemaid varchar(10),N2 bit) + +/* !!! LIST OF SECURABLES TO CHANGE !!! */ + +INSERT INTO #Securables +VALUES +(''DB'',''GRANT'',''EXECUTE'','''',''dbo'',0) +,(''ROLE'',''GRANT'',''DB_DATAREADER'','''',''dbo'',0) +,(''ROLE'',''GRANT'',''DB_DATAWRITER'','''',''dbo'',0) +,(''ROLE'',''GRANT'',''DB_OWNER'','''',''dbo'',1) + + +/* GET ALL USERS ON THIS ROLE */ +INSERT INTO #UsersOnRole +SELECT + members.name +FROM sys.database_role_members + JOIN sys.database_principals roles ON database_role_members.role_principal_id = roles.principal_id + JOIN sys.database_principals members ON database_role_members.member_principal_id = members.principal_id +WHERE roles.name = @RoleName + +/* CREATE ROLE */ +SELECT @Command = '' +IF NOT EXISTS (SELECT 1 FROM sys.database_principals WHERE name = '''''' + @RoleName + '''''' AND type = ''''R'''') +BEGIN + CREATE ROLE ['' + @RoleName + ''] AUTHORIZATION [dbo] + PRINT ''''CREATE ROLE ['' + @RoleName + '']'''' +END +'' +EXEC sp_executesql @Command + +SET @Command = '' +DECLARE @SP_Name varchar(255) + +'' + +/* SET ALL ROLE SECURABLES */ +IF @Type = ''DEVE'' +BEGIN + + DECLARE SecurablesCurs CURSOR FOR + SELECT typeofobject, grantordeny, rightsaction, objectname, schemaid + FROM #Securables + WHERE N2 = 1 + + OPEN SecurablesCurs + FETCH NEXT FROM SecurablesCurs INTO @typeofobject, @grantordeny, @rightsaction, @objectname, @schemaid + WHILE @@FETCH_STATUS = 0 + BEGIN + + IF @typeofobject = ''DB'' + BEGIN + IF EXISTS(SELECT 1 FROM sys.fn_builtin_permissions(''DATABASE'') WHERE permission_name = '''' + @rightsaction + '''') + BEGIN + SET @Command = @Command + @grantordeny + '' '' + @rightsaction + '' TO ['' + @RoleName + ''] +'' + END + END + + IF @typeofobject = ''SCHEMA'' + BEGIN + SET @Command = @Command + '' +IF EXISTS (SELECT 1 FROM sys.schemas WHERE name = '''''' + @schemaid + '''''') +BEGIN + IF EXISTS(SELECT 1 FROM sys.fn_builtin_permissions(''''SCHEMA'''') WHERE permission_name = '''''' + @rightsaction + '''''') + BEGIN + '' + @grantordeny + '' '' + @rightsaction + '' ON SCHEMA::'' + @schemaid + '' TO ['' + @RoleName + ''] + END +END + +'' + END + + IF @typeofobject in(''TABLE'',''SP'',''FUNCTIONS'',''VIEWS'') + BEGIN + + IF @objectname like ''%[%]%'' + BEGIN + IF @typeofobject = ''TABLE'' + BEGIN + SET @sysTarget = ''sys.tables'' + SET @sysType = '''' + END + + IF @typeofobject = ''SP'' + BEGIN + SET @sysTarget = ''sys.procedures'' + SET @sysType = '''' + END + + IF @typeofobject = ''FUNCTIONS'' + BEGIN + SET @sysTarget = ''sys.objects'' + SET @sysType = '' and p.Type IN ( N''''FN'''', N''''IF'''', N''''TF'''', N''''FS'''', N''''FT'''' )'' + END + + IF @typeofobject = ''VIEWS'' + BEGIN + SET @sysTarget = ''sys.views'' + SET @sysType = '''' + END + + SET @Command = @Command + '' +DECLARE SP_cursor CURSOR FOR +SELECT p.name FROM '' + @sysTarget + '' p JOIN sys.schemas s ON s.schema_id = p.schema_id WHERE (p.name like '''''' + @objectname + '''''') and s.name = '''''' + @schemaid + '''' + @sysType + '''''' + +OPEN SP_cursor +FETCH NEXT FROM SP_cursor INTO @SP_Name +WHILE @@FETCH_STATUS = 0 +BEGIN + IF EXISTS(SELECT 1 FROM sys.fn_builtin_permissions(''''OBJECT'''') WHERE permission_name = '''''' + @rightsaction + '''''') + BEGIN + EXEC('''''' + @grantordeny + '' '' + @rightsaction + '' ON ['' + @schemaid + ''].['''' + @SP_Name + ''''] TO ['' + @RoleName + '']'''') + END + FETCH NEXT FROM SP_cursor INTO @SP_Name +END + +CLOSE SP_cursor +DEALLOCATE SP_cursor + +'' + + END + ELSE + BEGIN + + SET @Command = @Command + '' +IF EXISTS(SELECT 1 FROM sys.objects o WITH (NOLOCK) JOIN sys.schemas s ON s.schema_id = o.schema_id WHERE o.name = '''''' + @objectname + '''''' AND o.type IN (N''''U'''',''''P'''',''''V'''',''''FN'''',''''IF'''',''''TF'''') AND s.name = '''''' + @schemaid + '''''') +BEGIN + IF EXISTS(SELECT 1 FROM sys.fn_builtin_permissions(''''OBJECT'''') WHERE permission_name = '''''' + @rightsaction + '''''') + BEGIN + '' + @grantordeny + '' '' + @rightsaction + '' ON ['' + @schemaid + ''].['' + @objectname + ''] TO ['' + @RoleName + ''] + END +END + +'' + END + END + + IF @typeofobject = ''ASSEMBLIES'' + BEGIN + SET @Command = @Command + '' +IF EXISTS(SELECT 1 FROM sys.assemblies WHERE NAME = '''''' + @objectname + '''''') +BEGIN + IF EXISTS(SELECT 1 FROM sys.fn_builtin_permissions(''''ASSEMBLY'''') WHERE permission_name = '''''' + @rightsaction + '''''') + BEGIN + '' + @grantordeny + '' '' + @rightsaction + ''::['' + @objectname + ''] TO ['' + @RoleName + ''] + END +END + +'' + END + + IF @typeofobject = ''ROLE'' + BEGIN + SET @Command = @Command + '' +IF NOT EXISTS (SELECT 1 FROM sys.database_role_members JOIN sys.database_principals roles ON database_role_members.role_principal_id = roles.principal_id JOIN sys.database_principals members ON database_role_members.member_principal_id = members.principal_id WHERE roles.name = '''''' + @rightsaction + '''''' AND members.name = '''''' + @RoleName + '''''') +BEGIN + EXEC sp_addrolemember N'''''' + @rightsaction + '''''', N'''''' + @RoleName + '''''' +END + +'' + END + + FETCH NEXT FROM SecurablesCurs INTO @typeofobject, @grantordeny, @rightsaction, @objectname, @schemaid + END + +CLOSE SecurablesCurs +DEALLOCATE SecurablesCurs + +PRINT ''SET ALL SECURABLES ON ROLE ['' + @RoleName + '']'' +EXEC sp_executesql @Command + +END +ELSE +BEGIN + + DECLARE SecurablesCurs CURSOR FOR + SELECT typeofobject, grantordeny, rightsaction, objectname, schemaid + FROM #Securables + WHERE N2 = 0 + + OPEN SecurablesCurs + FETCH NEXT FROM SecurablesCurs INTO @typeofobject, @grantordeny, @rightsaction, @objectname, @schemaid + WHILE @@FETCH_STATUS = 0 + BEGIN + + IF @typeofobject = ''DB'' + BEGIN + IF EXISTS(SELECT 1 FROM sys.fn_builtin_permissions(''DATABASE'') WHERE permission_name = '''' + @rightsaction + '''') + BEGIN + SET @Command = @Command + @grantordeny + '' '' + @rightsaction + '' TO ['' + @RoleName + ''] +'' + END + END + + IF @typeofobject = ''SCHEMA'' + BEGIN + SET @Command = @Command + '' +IF EXISTS (SELECT 1 FROM sys.schemas WHERE name = '''''' + @schemaid + '''''') +BEGIN + IF EXISTS(SELECT 1 FROM sys.fn_builtin_permissions(''''SCHEMA'''') WHERE permission_name = '''''' + @rightsaction + '''''') + BEGIN + '' + @grantordeny + '' '' + @rightsaction + '' ON SCHEMA::'' + @schemaid + '' TO ['' + @RoleName + ''] + END +END + +'' + END + + IF @typeofobject in(''TABLE'',''SP'',''FUNCTIONS'',''VIEWS'') + BEGIN + + IF @objectname like ''%[%]%'' + BEGIN + + IF @typeofobject = ''TABLE'' + BEGIN + SET @sysTarget = ''sys.tables'' + SET @sysType = '''' + END + + IF @typeofobject = ''SP'' + BEGIN + SET @sysTarget = ''sys.procedures'' + SET @sysType = '''' + END + + IF @typeofobject = ''FUNCTIONS'' + BEGIN + SET @sysTarget = ''sys.objects'' + SET @sysType = '' and p.Type IN ( N''''FN'''', N''''IF'''', N''''TF'''', N''''FS'''', N''''FT'''' )'' + END + + IF @typeofobject = ''VIEWS'' + BEGIN + SET @sysTarget = ''sys.views'' + SET @sysType = '''' + END + + SET @Command = @Command + '' +DECLARE SP_cursor CURSOR FOR +SELECT p.name FROM '' + @sysTarget + '' p JOIN sys.schemas s ON s.schema_id = p.schema_id WHERE (p.name like '''''' + @objectname + '''''') and s.name = '''''' + @schemaid + '''' + @sysType + '''''' + +OPEN SP_cursor +FETCH NEXT FROM SP_cursor INTO @SP_Name +WHILE @@FETCH_STATUS = 0 +BEGIN + IF EXISTS(SELECT 1 FROM sys.fn_builtin_permissions(''''OBJECT'''') WHERE permission_name = '''''' + @rightsaction + '''''') + BEGIN + EXEC('''''' + @grantordeny + '' '' + @rightsaction + '' ON ['' + @schemaid + ''].['''' + @SP_Name + ''''] TO ['' + @RoleName + '']'''') + END + FETCH NEXT FROM SP_cursor INTO @SP_Name +END + +CLOSE SP_cursor +DEALLOCATE SP_cursor + +'' + + END + ELSE + BEGIN + + SET @Command = @Command + '' +IF EXISTS(SELECT 1 FROM sys.objects o WITH (NOLOCK) JOIN sys.schemas s ON s.schema_id = o.schema_id WHERE o.name = '''''' + @objectname + '''''' AND o.type IN (N''''U'''',''''P'''',''''V'''',''''FN'''',''''IF'''',''''TF'''') AND s.name = '''''' + @schemaid + '''''') +BEGIN + IF EXISTS(SELECT 1 FROM sys.fn_builtin_permissions(''''OBJECT'''') WHERE permission_name = '''''' + @rightsaction + '''''') + BEGIN + '' + @grantordeny + '' '' + @rightsaction + '' ON ['' + @schemaid + ''].['' + @objectname + ''] TO ['' + @RoleName + ''] + END +END + +'' + END + END + + IF @typeofobject = ''ASSEMBLIES'' + BEGIN + SET @Command = @Command + '' +IF EXISTS(SELECT 1 FROM sys.assemblies WHERE NAME = '''''' + @objectname + '''''') +BEGIN + IF EXISTS(SELECT 1 FROM sys.fn_builtin_permissions(''''ASSEMBLY'''') WHERE permission_name = '''''' + @rightsaction + '''''') + BEGIN + '' + @grantordeny + '' '' + @rightsaction + ''::['' + @objectname + ''] TO ['' + @RoleName + ''] + END +END + +'' + END + + IF @typeofobject = ''ROLE'' + BEGIN + SET @Command = @Command + '' +IF NOT EXISTS (SELECT 1 FROM sys.database_role_members JOIN sys.database_principals roles ON database_role_members.role_principal_id = roles.principal_id JOIN sys.database_principals members ON database_role_members.member_principal_id = members.principal_id WHERE roles.name = '''''' + @rightsaction + '''''' AND members.name = '''''' + @RoleName + '''''') +BEGIN + EXEC sp_addrolemember N'''''' + @rightsaction + '''''', N'''''' + @RoleName + '''''' +END + +'' + END + + FETCH NEXT FROM SecurablesCurs INTO @typeofobject, @grantordeny, @rightsaction, @objectname, @schemaid + END + +CLOSE SecurablesCurs +DEALLOCATE SecurablesCurs + +PRINT ''SET ALL SECURABLES ON ROLE ['' + @RoleName + '']'' +EXEC sp_executesql @Command + +END + +/* ADD USER */ +DECLARE UsersCurs CURSOR FOR +SELECT username + FROM #UsersOnRole + +OPEN UsersCurs + +FETCH NEXT FROM UsersCurs INTO @Users +WHILE @@FETCH_STATUS = 0 +BEGIN + + SELECT @Command = '' +EXEC sp_addrolemember N'''''' + @RoleName + '''''', N'''''' + @Users + '''''' +PRINT ''''ADD USER ['' + @Users + ''] ON ROLE ['' + @RoleName + '']'''' +'' + +FETCH NEXT FROM UsersCurs INTO @Users +END + +CLOSE UsersCurs +DEALLOCATE UsersCurs + +EXEC sp_executesql @Command + +/*============================================================================= + Drop temp tables +=============================================================================*/ +DROP TABLE #Securables +DROP TABLE #UsersOnRole','ArizonaCASH','Pharmacies') + +INSERT INTO #AllRoles(STR_Definition,STR_Database,STR_Product)VALUES(' + +/*============================================================================= + + Script to create dbRoleSyncAccountingExtraction role. + + Role Name: dbRoleSyncAccountingExtraction + TEMPLATE: Default + + EXAMPLE OF SECURABLES TO SET: + + INSERT INTO #Securables + VALUES + (''DB'',''GRANT'',''VIEW DEFINITION'','''',''''), + (''SCHEMA'',''GRANT'',''SELECT,EXECUTE,INSERT,UPDATE,DELETE'','''',''AP''), + (''TABLE'',''GRANT'',''INSERT,UPDATE'',''Address'',''dbo''), + (''SP'',''GRANT'',''EXECUTE'',''sp_bmc_GetNextID'',''dbo''), + (''ROLE'',''GRANT'',''db_datareader'','''','''') + + ----------------------------------------------- + +Generate date : 2023-05-12 / up208700 + +=============================================================================*/ + +DECLARE @Command nvarchar(max), + @RoleName varchar(60), + @Users varchar(255), + @typeofobject varchar(50), + @grantordeny varchar(10), + @rightsaction varchar(255), + @objectname varchar(255), + @schemaid varchar(10), + @sysTarget varchar(255), + @sysType varchar(255) + +SET @RoleName = ''dbRoleSyncAccountingExtraction'' +SET @Command = '''' + +/* TEMP TABLES */ +CREATE TABLE #UsersOnRole(username varchar(255)) +CREATE TABLE #Securables(typeofobject varchar(50), grantordeny varchar(10), rightsaction varchar(255), objectname varchar(255), schemaid varchar(10),N2 bit) + +/* !!! LIST OF SECURABLES TO CHANGE !!! */ + +INSERT INTO #Securables +VALUES +(''DB'',''GRANT'',''EXECUTE'','''',''dbo'',0) +,(''DB'',''GRANT'',''VIEW DEFINITION'','''',''dbo'',0) +,(''ROLE'',''GRANT'',''DB_DATAREADER'','''',''dbo'',0) +,(''ROLE'',''GRANT'',''DB_DATAWRITER'','''',''dbo'',0) + + +/* GET ALL USERS ON THIS ROLE */ +INSERT INTO #UsersOnRole +SELECT + members.name +FROM sys.database_role_members + JOIN sys.database_principals roles ON database_role_members.role_principal_id = roles.principal_id + JOIN sys.database_principals members ON database_role_members.member_principal_id = members.principal_id +WHERE roles.name = @RoleName + +/* CREATE ROLE */ +SELECT @Command = '' +IF NOT EXISTS (SELECT 1 FROM sys.database_principals WHERE name = '''''' + @RoleName + '''''' AND type = ''''R'''') +BEGIN + CREATE ROLE ['' + @RoleName + ''] AUTHORIZATION [dbo] + PRINT ''''CREATE ROLE ['' + @RoleName + '']'''' +END +'' +EXEC sp_executesql @Command + +SET @Command = '' +DECLARE @SP_Name varchar(255) + +'' + +/* SET ALL ROLE SECURABLES */ +DECLARE SecurablesCurs CURSOR FOR +SELECT typeofobject, grantordeny, rightsaction, objectname, schemaid +FROM #Securables +WHERE N2 = 0 + +OPEN SecurablesCurs +FETCH NEXT FROM SecurablesCurs INTO @typeofobject, @grantordeny, @rightsaction, @objectname, @schemaid +WHILE @@FETCH_STATUS = 0 +BEGIN + + IF @typeofobject = ''DB'' + BEGIN + IF EXISTS(SELECT 1 FROM sys.fn_builtin_permissions(''DATABASE'') WHERE permission_name = '''' + @rightsaction + '''') + BEGIN + SET @Command = @Command + @grantordeny + '' '' + @rightsaction + '' TO ['' + @RoleName + ''] +'' + END + END + + IF @typeofobject = ''SCHEMA'' + BEGIN + SET @Command = @Command + '' +IF EXISTS (SELECT 1 FROM sys.schemas WHERE name = '''''' + @schemaid + '''''') +BEGIN + IF EXISTS(SELECT 1 FROM sys.fn_builtin_permissions(''''SCHEMA'''') WHERE permission_name = '''''' + @rightsaction + '''''') + BEGIN + '' + @grantordeny + '' '' + @rightsaction + '' ON SCHEMA::'' + @schemaid + '' TO ['' + @RoleName + ''] + END +END + +'' + END + + IF @typeofobject in(''TABLE'',''SP'',''FUNCTIONS'',''VIEWS'') + BEGIN + + IF @objectname like ''%[%]%'' + BEGIN + + IF @typeofobject = ''TABLE'' + BEGIN + SET @sysTarget = ''sys.tables'' + SET @sysType = '''' + END + + IF @typeofobject = ''SP'' + BEGIN + SET @sysTarget = ''sys.procedures'' + SET @sysType = '''' + END + + IF @typeofobject = ''FUNCTIONS'' + BEGIN + SET @sysTarget = ''sys.objects'' + SET @sysType = '' and p.Type IN ( N''''FN'''', N''''IF'''', N''''TF'''', N''''FS'''', N''''FT'''' )'' + END + + IF @typeofobject = ''VIEWS'' + BEGIN + SET @sysTarget = ''sys.views'' + SET @sysType = '''' + END + + SET @Command = @Command + '' +DECLARE SP_cursor CURSOR FOR +SELECT p.name FROM '' + @sysTarget + '' p JOIN sys.schemas s ON s.schema_id = p.schema_id WHERE (p.name like '''''' + @objectname + '''''') and s.name = '''''' + @schemaid + '''' + @sysType + '''''' + +OPEN SP_cursor +FETCH NEXT FROM SP_cursor INTO @SP_Name +WHILE @@FETCH_STATUS = 0 +BEGIN + IF EXISTS(SELECT 1 FROM sys.fn_builtin_permissions(''''OBJECT'''') WHERE permission_name = '''''' + @rightsaction + '''''') + BEGIN + EXEC('''''' + @grantordeny + '' '' + @rightsaction + '' ON ['' + @schemaid + ''].['''' + @SP_Name + ''''] TO ['' + @RoleName + '']'''') + END + FETCH NEXT FROM SP_cursor INTO @SP_Name +END + +CLOSE SP_cursor +DEALLOCATE SP_cursor + +'' + + END + ELSE + BEGIN + + SET @Command = @Command + '' +IF EXISTS(SELECT 1 FROM sys.objects o WITH (NOLOCK) JOIN sys.schemas s ON s.schema_id = o.schema_id WHERE o.name = '''''' + @objectname + '''''' AND o.type IN (N''''U'''',''''P'''',''''V'''',''''FN'''',''''IF'''',''''TF'''') AND s.name = '''''' + @schemaid + '''''') +BEGIN + IF EXISTS(SELECT 1 FROM sys.fn_builtin_permissions(''''OBJECT'''') WHERE permission_name = '''''' + @rightsaction + '''''') + BEGIN + '' + @grantordeny + '' '' + @rightsaction + '' ON ['' + @schemaid + ''].['' + @objectname + ''] TO ['' + @RoleName + ''] + END +END + +'' + END +END + +IF @typeofobject = ''ASSEMBLIES'' +BEGIN + SET @Command = @Command + '' +IF EXISTS(SELECT 1 FROM sys.assemblies WHERE NAME = '''''' + @objectname + '''''') +BEGIN + IF EXISTS(SELECT 1 FROM sys.fn_builtin_permissions(''''ASSEMBLY'''') WHERE permission_name = '''''' + @rightsaction + '''''') + BEGIN + '' + @grantordeny + '' '' + @rightsaction + ''::['' + @objectname + ''] TO ['' + @RoleName + ''] + END +END + +'' +END + +IF @typeofobject = ''ROLE'' +BEGIN + SET @Command = @Command + '' +IF NOT EXISTS (SELECT 1 FROM sys.database_role_members JOIN sys.database_principals roles ON database_role_members.role_principal_id = roles.principal_id JOIN sys.database_principals members ON database_role_members.member_principal_id = members.principal_id WHERE roles.name = '''''' + @rightsaction + '''''' AND members.name = '''''' + @RoleName + '''''') +BEGIN + EXEC sp_addrolemember N'''''' + @rightsaction + '''''', N'''''' + @RoleName + '''''' +END + +'' +END + +FETCH NEXT FROM SecurablesCurs INTO @typeofobject, @grantordeny, @rightsaction, @objectname, @schemaid +END + +CLOSE SecurablesCurs +DEALLOCATE SecurablesCurs + +PRINT ''SET ALL SECURABLES ON ROLE ['' + @RoleName + '']'' +EXEC sp_executesql @Command + +/* ADD USER */ +DECLARE UsersCurs CURSOR FOR +SELECT username + FROM #UsersOnRole + +OPEN UsersCurs + +FETCH NEXT FROM UsersCurs INTO @Users +WHILE @@FETCH_STATUS = 0 +BEGIN + + SELECT @Command = '' +EXEC sp_addrolemember N'''''' + @RoleName + '''''', N'''''' + @Users + '''''' +PRINT ''''ADD USER ['' + @Users + ''] ON ROLE ['' + @RoleName + '']'''' +'' + +FETCH NEXT FROM UsersCurs INTO @Users +END + +CLOSE UsersCurs +DEALLOCATE UsersCurs + +EXEC sp_executesql @Command + + +/*============================================================================= + Drop temp tables +=============================================================================*/ +DROP TABLE #Securables +DROP TABLE #UsersOnRole +','ArizonaCASH','Pharmacies') + +INSERT INTO #AllRoles(STR_Definition,STR_Database,STR_Product)VALUES(' + +/*============================================================================= + + Script to create dbRoleTPPos role. + + Role Name: dbRoleTPPos + TEMPLATE: Default + + EXAMPLE OF SECURABLES TO SET: + + INSERT INTO #Securables + VALUES + (''DB'',''GRANT'',''VIEW DEFINITION'','''',''''), + (''SCHEMA'',''GRANT'',''SELECT,EXECUTE,INSERT,UPDATE,DELETE'','''',''AP''), + (''TABLE'',''GRANT'',''INSERT,UPDATE'',''Address'',''dbo''), + (''SP'',''GRANT'',''EXECUTE'',''sp_bmc_GetNextID'',''dbo''), + (''ROLE'',''GRANT'',''db_datareader'','''','''') + + ----------------------------------------------- + +Generate date : 2023-05-12 / up208700 + +=============================================================================*/ + +DECLARE @Command nvarchar(max), + @RoleName varchar(60), + @Users varchar(255), + @typeofobject varchar(50), + @grantordeny varchar(10), + @rightsaction varchar(255), + @objectname varchar(255), + @schemaid varchar(10), + @sysTarget varchar(255), + @sysType varchar(255) + +SET @RoleName = ''dbRoleTPPos'' +SET @Command = '''' + +/* TEMP TABLES */ +CREATE TABLE #UsersOnRole(username varchar(255)) +CREATE TABLE #Securables(typeofobject varchar(50), grantordeny varchar(10), rightsaction varchar(255), objectname varchar(255), schemaid varchar(10),N2 bit) + +/* !!! LIST OF SECURABLES TO CHANGE !!! */ + +INSERT INTO #Securables +VALUES +(''DB'',''GRANT'',''EXECUTE'','''',''dbo'',0) +,(''ROLE'',''GRANT'',''DB_DATAREADER'','''',''dbo'',0) +,(''ROLE'',''GRANT'',''DB_DATAWRITER'','''',''dbo'',0) +,(''ROLE'',''GRANT'',''DB_DDLADMIN'','''',''dbo'',0) + + +/* GET ALL USERS ON THIS ROLE */ +INSERT INTO #UsersOnRole +SELECT + members.name +FROM sys.database_role_members + JOIN sys.database_principals roles ON database_role_members.role_principal_id = roles.principal_id + JOIN sys.database_principals members ON database_role_members.member_principal_id = members.principal_id +WHERE roles.name = @RoleName + +/* CREATE ROLE */ +SELECT @Command = '' +IF NOT EXISTS (SELECT 1 FROM sys.database_principals WHERE name = '''''' + @RoleName + '''''' AND type = ''''R'''') +BEGIN + CREATE ROLE ['' + @RoleName + ''] AUTHORIZATION [dbo] + PRINT ''''CREATE ROLE ['' + @RoleName + '']'''' +END +'' +EXEC sp_executesql @Command + +SET @Command = '' +DECLARE @SP_Name varchar(255) + +'' + +/* SET ALL ROLE SECURABLES */ +DECLARE SecurablesCurs CURSOR FOR +SELECT typeofobject, grantordeny, rightsaction, objectname, schemaid +FROM #Securables +WHERE N2 = 0 + +OPEN SecurablesCurs +FETCH NEXT FROM SecurablesCurs INTO @typeofobject, @grantordeny, @rightsaction, @objectname, @schemaid +WHILE @@FETCH_STATUS = 0 +BEGIN + + IF @typeofobject = ''DB'' + BEGIN + IF EXISTS(SELECT 1 FROM sys.fn_builtin_permissions(''DATABASE'') WHERE permission_name = '''' + @rightsaction + '''') + BEGIN + SET @Command = @Command + @grantordeny + '' '' + @rightsaction + '' TO ['' + @RoleName + ''] +'' + END + END + + IF @typeofobject = ''SCHEMA'' + BEGIN + SET @Command = @Command + '' +IF EXISTS (SELECT 1 FROM sys.schemas WHERE name = '''''' + @schemaid + '''''') +BEGIN + IF EXISTS(SELECT 1 FROM sys.fn_builtin_permissions(''''SCHEMA'''') WHERE permission_name = '''''' + @rightsaction + '''''') + BEGIN + '' + @grantordeny + '' '' + @rightsaction + '' ON SCHEMA::'' + @schemaid + '' TO ['' + @RoleName + ''] + END +END + +'' + END + + IF @typeofobject in(''TABLE'',''SP'',''FUNCTIONS'',''VIEWS'') + BEGIN + + IF @objectname like ''%[%]%'' + BEGIN + + IF @typeofobject = ''TABLE'' + BEGIN + SET @sysTarget = ''sys.tables'' + SET @sysType = '''' + END + + IF @typeofobject = ''SP'' + BEGIN + SET @sysTarget = ''sys.procedures'' + SET @sysType = '''' + END + + IF @typeofobject = ''FUNCTIONS'' + BEGIN + SET @sysTarget = ''sys.objects'' + SET @sysType = '' and p.Type IN ( N''''FN'''', N''''IF'''', N''''TF'''', N''''FS'''', N''''FT'''' )'' + END + + IF @typeofobject = ''VIEWS'' + BEGIN + SET @sysTarget = ''sys.views'' + SET @sysType = '''' + END + + SET @Command = @Command + '' +DECLARE SP_cursor CURSOR FOR +SELECT p.name FROM '' + @sysTarget + '' p JOIN sys.schemas s ON s.schema_id = p.schema_id WHERE (p.name like '''''' + @objectname + '''''') and s.name = '''''' + @schemaid + '''' + @sysType + '''''' + +OPEN SP_cursor +FETCH NEXT FROM SP_cursor INTO @SP_Name +WHILE @@FETCH_STATUS = 0 +BEGIN + IF EXISTS(SELECT 1 FROM sys.fn_builtin_permissions(''''OBJECT'''') WHERE permission_name = '''''' + @rightsaction + '''''') + BEGIN + EXEC('''''' + @grantordeny + '' '' + @rightsaction + '' ON ['' + @schemaid + ''].['''' + @SP_Name + ''''] TO ['' + @RoleName + '']'''') + END + FETCH NEXT FROM SP_cursor INTO @SP_Name +END + +CLOSE SP_cursor +DEALLOCATE SP_cursor + +'' + + END + ELSE + BEGIN + + SET @Command = @Command + '' +IF EXISTS(SELECT 1 FROM sys.objects o WITH (NOLOCK) JOIN sys.schemas s ON s.schema_id = o.schema_id WHERE o.name = '''''' + @objectname + '''''' AND o.type IN (N''''U'''',''''P'''',''''V'''',''''FN'''',''''IF'''',''''TF'''') AND s.name = '''''' + @schemaid + '''''') +BEGIN + IF EXISTS(SELECT 1 FROM sys.fn_builtin_permissions(''''OBJECT'''') WHERE permission_name = '''''' + @rightsaction + '''''') + BEGIN + '' + @grantordeny + '' '' + @rightsaction + '' ON ['' + @schemaid + ''].['' + @objectname + ''] TO ['' + @RoleName + ''] + END +END + +'' + END +END + +IF @typeofobject = ''ASSEMBLIES'' +BEGIN + SET @Command = @Command + '' +IF EXISTS(SELECT 1 FROM sys.assemblies WHERE NAME = '''''' + @objectname + '''''') +BEGIN + IF EXISTS(SELECT 1 FROM sys.fn_builtin_permissions(''''ASSEMBLY'''') WHERE permission_name = '''''' + @rightsaction + '''''') + BEGIN + '' + @grantordeny + '' '' + @rightsaction + ''::['' + @objectname + ''] TO ['' + @RoleName + ''] + END +END + +'' +END + +IF @typeofobject = ''ROLE'' +BEGIN + SET @Command = @Command + '' +IF NOT EXISTS (SELECT 1 FROM sys.database_role_members JOIN sys.database_principals roles ON database_role_members.role_principal_id = roles.principal_id JOIN sys.database_principals members ON database_role_members.member_principal_id = members.principal_id WHERE roles.name = '''''' + @rightsaction + '''''' AND members.name = '''''' + @RoleName + '''''') +BEGIN + EXEC sp_addrolemember N'''''' + @rightsaction + '''''', N'''''' + @RoleName + '''''' +END + +'' +END + +FETCH NEXT FROM SecurablesCurs INTO @typeofobject, @grantordeny, @rightsaction, @objectname, @schemaid +END + +CLOSE SecurablesCurs +DEALLOCATE SecurablesCurs + +PRINT ''SET ALL SECURABLES ON ROLE ['' + @RoleName + '']'' +EXEC sp_executesql @Command + +/* ADD USER */ +DECLARE UsersCurs CURSOR FOR +SELECT username + FROM #UsersOnRole + +OPEN UsersCurs + +FETCH NEXT FROM UsersCurs INTO @Users +WHILE @@FETCH_STATUS = 0 +BEGIN + + SELECT @Command = '' +EXEC sp_addrolemember N'''''' + @RoleName + '''''', N'''''' + @Users + '''''' +PRINT ''''ADD USER ['' + @Users + ''] ON ROLE ['' + @RoleName + '']'''' +'' + +FETCH NEXT FROM UsersCurs INTO @Users +END + +CLOSE UsersCurs +DEALLOCATE UsersCurs + +EXEC sp_executesql @Command + + +/*============================================================================= + Drop temp tables +=============================================================================*/ +DROP TABLE #Securables +DROP TABLE #UsersOnRole +','ArizonaCASH','Pharmacies') + +INSERT INTO #AllRoles(STR_Definition,STR_Database,STR_Product)VALUES(' + +/*============================================================================= + + Script to create dbRoleTriapharmUser role. + + Role Name: dbRoleTriapharmUser + TEMPLATE: Default + + EXAMPLE OF SECURABLES TO SET: + + INSERT INTO #Securables + VALUES + (''DB'',''GRANT'',''VIEW DEFINITION'','''',''''), + (''SCHEMA'',''GRANT'',''SELECT,EXECUTE,INSERT,UPDATE,DELETE'','''',''AP''), + (''TABLE'',''GRANT'',''INSERT,UPDATE'',''Address'',''dbo''), + (''SP'',''GRANT'',''EXECUTE'',''sp_bmc_GetNextID'',''dbo''), + (''ROLE'',''GRANT'',''db_datareader'','''','''') + + ----------------------------------------------- + +Generate date : 2023-05-12 / up208700 + +=============================================================================*/ + +DECLARE @Command nvarchar(max), + @RoleName varchar(60), + @Users varchar(255), + @typeofobject varchar(50), + @grantordeny varchar(10), + @rightsaction varchar(255), + @objectname varchar(255), + @schemaid varchar(10), + @sysTarget varchar(255), + @sysType varchar(255) + +SET @RoleName = ''dbRoleTriapharmUser'' +SET @Command = '''' + +/* TEMP TABLES */ +CREATE TABLE #UsersOnRole(username varchar(255)) +CREATE TABLE #Securables(typeofobject varchar(50), grantordeny varchar(10), rightsaction varchar(255), objectname varchar(255), schemaid varchar(10),N2 bit) + +/* !!! LIST OF SECURABLES TO CHANGE !!! */ + +INSERT INTO #Securables +VALUES +(''DB'',''GRANT'',''EXECUTE'','''',''dbo'',0) +,(''ROLE'',''GRANT'',''DB_DATAREADER'','''',''dbo'',0) +,(''ROLE'',''GRANT'',''DB_DATAWRITER'','''',''dbo'',0) + + +/* GET ALL USERS ON THIS ROLE */ +INSERT INTO #UsersOnRole +SELECT + members.name +FROM sys.database_role_members + JOIN sys.database_principals roles ON database_role_members.role_principal_id = roles.principal_id + JOIN sys.database_principals members ON database_role_members.member_principal_id = members.principal_id +WHERE roles.name = @RoleName + +/* CREATE ROLE */ +SELECT @Command = '' +IF NOT EXISTS (SELECT 1 FROM sys.database_principals WHERE name = '''''' + @RoleName + '''''' AND type = ''''R'''') +BEGIN + CREATE ROLE ['' + @RoleName + ''] AUTHORIZATION [dbo] + PRINT ''''CREATE ROLE ['' + @RoleName + '']'''' +END +'' +EXEC sp_executesql @Command + +SET @Command = '' +DECLARE @SP_Name varchar(255) + +'' + +/* SET ALL ROLE SECURABLES */ +DECLARE SecurablesCurs CURSOR FOR +SELECT typeofobject, grantordeny, rightsaction, objectname, schemaid +FROM #Securables +WHERE N2 = 0 + +OPEN SecurablesCurs +FETCH NEXT FROM SecurablesCurs INTO @typeofobject, @grantordeny, @rightsaction, @objectname, @schemaid +WHILE @@FETCH_STATUS = 0 +BEGIN + + IF @typeofobject = ''DB'' + BEGIN + IF EXISTS(SELECT 1 FROM sys.fn_builtin_permissions(''DATABASE'') WHERE permission_name = '''' + @rightsaction + '''') + BEGIN + SET @Command = @Command + @grantordeny + '' '' + @rightsaction + '' TO ['' + @RoleName + ''] +'' + END + END + + IF @typeofobject = ''SCHEMA'' + BEGIN + SET @Command = @Command + '' +IF EXISTS (SELECT 1 FROM sys.schemas WHERE name = '''''' + @schemaid + '''''') +BEGIN + IF EXISTS(SELECT 1 FROM sys.fn_builtin_permissions(''''SCHEMA'''') WHERE permission_name = '''''' + @rightsaction + '''''') + BEGIN + '' + @grantordeny + '' '' + @rightsaction + '' ON SCHEMA::'' + @schemaid + '' TO ['' + @RoleName + ''] + END +END + +'' + END + + IF @typeofobject in(''TABLE'',''SP'',''FUNCTIONS'',''VIEWS'') + BEGIN + + IF @objectname like ''%[%]%'' + BEGIN + + IF @typeofobject = ''TABLE'' + BEGIN + SET @sysTarget = ''sys.tables'' + SET @sysType = '''' + END + + IF @typeofobject = ''SP'' + BEGIN + SET @sysTarget = ''sys.procedures'' + SET @sysType = '''' + END + + IF @typeofobject = ''FUNCTIONS'' + BEGIN + SET @sysTarget = ''sys.objects'' + SET @sysType = '' and p.Type IN ( N''''FN'''', N''''IF'''', N''''TF'''', N''''FS'''', N''''FT'''' )'' + END + + IF @typeofobject = ''VIEWS'' + BEGIN + SET @sysTarget = ''sys.views'' + SET @sysType = '''' + END + + SET @Command = @Command + '' +DECLARE SP_cursor CURSOR FOR +SELECT p.name FROM '' + @sysTarget + '' p JOIN sys.schemas s ON s.schema_id = p.schema_id WHERE (p.name like '''''' + @objectname + '''''') and s.name = '''''' + @schemaid + '''' + @sysType + '''''' + +OPEN SP_cursor +FETCH NEXT FROM SP_cursor INTO @SP_Name +WHILE @@FETCH_STATUS = 0 +BEGIN + IF EXISTS(SELECT 1 FROM sys.fn_builtin_permissions(''''OBJECT'''') WHERE permission_name = '''''' + @rightsaction + '''''') + BEGIN + EXEC('''''' + @grantordeny + '' '' + @rightsaction + '' ON ['' + @schemaid + ''].['''' + @SP_Name + ''''] TO ['' + @RoleName + '']'''') + END + FETCH NEXT FROM SP_cursor INTO @SP_Name +END + +CLOSE SP_cursor +DEALLOCATE SP_cursor + +'' + + END + ELSE + BEGIN + + SET @Command = @Command + '' +IF EXISTS(SELECT 1 FROM sys.objects o WITH (NOLOCK) JOIN sys.schemas s ON s.schema_id = o.schema_id WHERE o.name = '''''' + @objectname + '''''' AND o.type IN (N''''U'''',''''P'''',''''V'''',''''FN'''',''''IF'''',''''TF'''') AND s.name = '''''' + @schemaid + '''''') +BEGIN + IF EXISTS(SELECT 1 FROM sys.fn_builtin_permissions(''''OBJECT'''') WHERE permission_name = '''''' + @rightsaction + '''''') + BEGIN + '' + @grantordeny + '' '' + @rightsaction + '' ON ['' + @schemaid + ''].['' + @objectname + ''] TO ['' + @RoleName + ''] + END +END + +'' + END +END + +IF @typeofobject = ''ASSEMBLIES'' +BEGIN + SET @Command = @Command + '' +IF EXISTS(SELECT 1 FROM sys.assemblies WHERE NAME = '''''' + @objectname + '''''') +BEGIN + IF EXISTS(SELECT 1 FROM sys.fn_builtin_permissions(''''ASSEMBLY'''') WHERE permission_name = '''''' + @rightsaction + '''''') + BEGIN + '' + @grantordeny + '' '' + @rightsaction + ''::['' + @objectname + ''] TO ['' + @RoleName + ''] + END +END + +'' +END + +IF @typeofobject = ''ROLE'' +BEGIN + SET @Command = @Command + '' +IF NOT EXISTS (SELECT 1 FROM sys.database_role_members JOIN sys.database_principals roles ON database_role_members.role_principal_id = roles.principal_id JOIN sys.database_principals members ON database_role_members.member_principal_id = members.principal_id WHERE roles.name = '''''' + @rightsaction + '''''' AND members.name = '''''' + @RoleName + '''''') +BEGIN + EXEC sp_addrolemember N'''''' + @rightsaction + '''''', N'''''' + @RoleName + '''''' +END + +'' +END + +FETCH NEXT FROM SecurablesCurs INTO @typeofobject, @grantordeny, @rightsaction, @objectname, @schemaid +END + +CLOSE SecurablesCurs +DEALLOCATE SecurablesCurs + +PRINT ''SET ALL SECURABLES ON ROLE ['' + @RoleName + '']'' +EXEC sp_executesql @Command + +/* ADD USER */ +DECLARE UsersCurs CURSOR FOR +SELECT username + FROM #UsersOnRole + +OPEN UsersCurs + +FETCH NEXT FROM UsersCurs INTO @Users +WHILE @@FETCH_STATUS = 0 +BEGIN + + SELECT @Command = '' +EXEC sp_addrolemember N'''''' + @RoleName + '''''', N'''''' + @Users + '''''' +PRINT ''''ADD USER ['' + @Users + ''] ON ROLE ['' + @RoleName + '']'''' +'' + +FETCH NEXT FROM UsersCurs INTO @Users +END + +CLOSE UsersCurs +DEALLOCATE UsersCurs + +EXEC sp_executesql @Command + + +/*============================================================================= + Drop temp tables +=============================================================================*/ +DROP TABLE #Securables +DROP TABLE #UsersOnRole +','ArizonaCASH','Pharmacies') + +INSERT INTO #AllRoles(STR_Definition,STR_Database,STR_Product)VALUES(' + +/*============================================================================= + + Script to create dbRoleCsltUsr role. + + Role Name: dbRoleCsltUsr + TEMPLATE: N2 and PROD + + EXAMPLE OF SECURABLES TO SET: + + INSERT INTO #Securables + VALUES + (''DB'',''GRANT'',''VIEW DEFINITION'','''',''''), + (''SCHEMA'',''GRANT'',''SELECT,EXECUTE,INSERT,UPDATE,DELETE'','''',''AP''), + (''TABLE'',''GRANT'',''INSERT,UPDATE'',''Address'',''dbo''), + (''SP'',''GRANT'',''EXECUTE'',''sp_bmc_GetNextID'',''dbo''), + (''ROLE'',''GRANT'',''db_datareader'','''','''') + + ----------------------------------------------- + +Generate date : 2023-05-12 / up208700 + +=============================================================================*/ + +DECLARE @Type varchar(6), + @Command nvarchar(max), + @RoleName varchar(60), + @Users varchar(255), + @typeofobject varchar(50), + @grantordeny varchar(10), + @rightsaction varchar(255), + @objectname varchar(255), + @schemaid varchar(10), + @sysTarget varchar(255), + @sysType varchar(255) + +SET @RoleName = ''dbRoleCsltUsr'' +SET @Command = '''' + +SELECT @Type = [Type] FROM [master].[cfg].[InstanceContext] + +/* TEMP TABLES */ +CREATE TABLE #UsersOnRole(username varchar(255)) +CREATE TABLE #Securables(typeofobject varchar(50), grantordeny varchar(10), rightsaction varchar(255), objectname varchar(255), schemaid varchar(10),N2 bit) + +/* !!! LIST OF SECURABLES TO CHANGE !!! */ + +INSERT INTO #Securables +VALUES +(''ROLE'',''GRANT'',''DB_OWNER'','''',''dbo'',0) +,(''ROLE'',''GRANT'',''DB_OWNER'','''',''dbo'',1) + + +/* GET ALL USERS ON THIS ROLE */ +INSERT INTO #UsersOnRole +SELECT + members.name +FROM sys.database_role_members + JOIN sys.database_principals roles ON database_role_members.role_principal_id = roles.principal_id + JOIN sys.database_principals members ON database_role_members.member_principal_id = members.principal_id +WHERE roles.name = @RoleName + +/* CREATE ROLE */ +SELECT @Command = '' +IF NOT EXISTS (SELECT 1 FROM sys.database_principals WHERE name = '''''' + @RoleName + '''''' AND type = ''''R'''') +BEGIN + CREATE ROLE ['' + @RoleName + ''] AUTHORIZATION [dbo] + PRINT ''''CREATE ROLE ['' + @RoleName + '']'''' +END +'' +EXEC sp_executesql @Command + +SET @Command = '' +DECLARE @SP_Name varchar(255) + +'' + +/* SET ALL ROLE SECURABLES */ +IF @Type = ''DEVE'' +BEGIN + + DECLARE SecurablesCurs CURSOR FOR + SELECT typeofobject, grantordeny, rightsaction, objectname, schemaid + FROM #Securables + WHERE N2 = 1 + + OPEN SecurablesCurs + FETCH NEXT FROM SecurablesCurs INTO @typeofobject, @grantordeny, @rightsaction, @objectname, @schemaid + WHILE @@FETCH_STATUS = 0 + BEGIN + + IF @typeofobject = ''DB'' + BEGIN + IF EXISTS(SELECT 1 FROM sys.fn_builtin_permissions(''DATABASE'') WHERE permission_name = '''' + @rightsaction + '''') + BEGIN + SET @Command = @Command + @grantordeny + '' '' + @rightsaction + '' TO ['' + @RoleName + ''] +'' + END + END + + IF @typeofobject = ''SCHEMA'' + BEGIN + SET @Command = @Command + '' +IF EXISTS (SELECT 1 FROM sys.schemas WHERE name = '''''' + @schemaid + '''''') +BEGIN + IF EXISTS(SELECT 1 FROM sys.fn_builtin_permissions(''''SCHEMA'''') WHERE permission_name = '''''' + @rightsaction + '''''') + BEGIN + '' + @grantordeny + '' '' + @rightsaction + '' ON SCHEMA::'' + @schemaid + '' TO ['' + @RoleName + ''] + END +END + +'' + END + + IF @typeofobject in(''TABLE'',''SP'',''FUNCTIONS'',''VIEWS'') + BEGIN + + IF @objectname like ''%[%]%'' + BEGIN + IF @typeofobject = ''TABLE'' + BEGIN + SET @sysTarget = ''sys.tables'' + SET @sysType = '''' + END + + IF @typeofobject = ''SP'' + BEGIN + SET @sysTarget = ''sys.procedures'' + SET @sysType = '''' + END + + IF @typeofobject = ''FUNCTIONS'' + BEGIN + SET @sysTarget = ''sys.objects'' + SET @sysType = '' and p.Type IN ( N''''FN'''', N''''IF'''', N''''TF'''', N''''FS'''', N''''FT'''' )'' + END + + IF @typeofobject = ''VIEWS'' + BEGIN + SET @sysTarget = ''sys.views'' + SET @sysType = '''' + END + + SET @Command = @Command + '' +DECLARE SP_cursor CURSOR FOR +SELECT p.name FROM '' + @sysTarget + '' p JOIN sys.schemas s ON s.schema_id = p.schema_id WHERE (p.name like '''''' + @objectname + '''''') and s.name = '''''' + @schemaid + '''' + @sysType + '''''' + +OPEN SP_cursor +FETCH NEXT FROM SP_cursor INTO @SP_Name +WHILE @@FETCH_STATUS = 0 +BEGIN + IF EXISTS(SELECT 1 FROM sys.fn_builtin_permissions(''''OBJECT'''') WHERE permission_name = '''''' + @rightsaction + '''''') + BEGIN + EXEC('''''' + @grantordeny + '' '' + @rightsaction + '' ON ['' + @schemaid + ''].['''' + @SP_Name + ''''] TO ['' + @RoleName + '']'''') + END + FETCH NEXT FROM SP_cursor INTO @SP_Name +END + +CLOSE SP_cursor +DEALLOCATE SP_cursor + +'' + + END + ELSE + BEGIN + + SET @Command = @Command + '' +IF EXISTS(SELECT 1 FROM sys.objects o WITH (NOLOCK) JOIN sys.schemas s ON s.schema_id = o.schema_id WHERE o.name = '''''' + @objectname + '''''' AND o.type IN (N''''U'''',''''P'''',''''V'''',''''FN'''',''''IF'''',''''TF'''') AND s.name = '''''' + @schemaid + '''''') +BEGIN + IF EXISTS(SELECT 1 FROM sys.fn_builtin_permissions(''''OBJECT'''') WHERE permission_name = '''''' + @rightsaction + '''''') + BEGIN + '' + @grantordeny + '' '' + @rightsaction + '' ON ['' + @schemaid + ''].['' + @objectname + ''] TO ['' + @RoleName + ''] + END +END + +'' + END + END + + IF @typeofobject = ''ASSEMBLIES'' + BEGIN + SET @Command = @Command + '' +IF EXISTS(SELECT 1 FROM sys.assemblies WHERE NAME = '''''' + @objectname + '''''') +BEGIN + IF EXISTS(SELECT 1 FROM sys.fn_builtin_permissions(''''ASSEMBLY'''') WHERE permission_name = '''''' + @rightsaction + '''''') + BEGIN + '' + @grantordeny + '' '' + @rightsaction + ''::['' + @objectname + ''] TO ['' + @RoleName + ''] + END +END + +'' + END + + IF @typeofobject = ''ROLE'' + BEGIN + SET @Command = @Command + '' +IF NOT EXISTS (SELECT 1 FROM sys.database_role_members JOIN sys.database_principals roles ON database_role_members.role_principal_id = roles.principal_id JOIN sys.database_principals members ON database_role_members.member_principal_id = members.principal_id WHERE roles.name = '''''' + @rightsaction + '''''' AND members.name = '''''' + @RoleName + '''''') +BEGIN + EXEC sp_addrolemember N'''''' + @rightsaction + '''''', N'''''' + @RoleName + '''''' +END + +'' + END + + FETCH NEXT FROM SecurablesCurs INTO @typeofobject, @grantordeny, @rightsaction, @objectname, @schemaid + END + +CLOSE SecurablesCurs +DEALLOCATE SecurablesCurs + +PRINT ''SET ALL SECURABLES ON ROLE ['' + @RoleName + '']'' +EXEC sp_executesql @Command + +END +ELSE +BEGIN + + DECLARE SecurablesCurs CURSOR FOR + SELECT typeofobject, grantordeny, rightsaction, objectname, schemaid + FROM #Securables + WHERE N2 = 0 + + OPEN SecurablesCurs + FETCH NEXT FROM SecurablesCurs INTO @typeofobject, @grantordeny, @rightsaction, @objectname, @schemaid + WHILE @@FETCH_STATUS = 0 + BEGIN + + IF @typeofobject = ''DB'' + BEGIN + IF EXISTS(SELECT 1 FROM sys.fn_builtin_permissions(''DATABASE'') WHERE permission_name = '''' + @rightsaction + '''') + BEGIN + SET @Command = @Command + @grantordeny + '' '' + @rightsaction + '' TO ['' + @RoleName + ''] +'' + END + END + + IF @typeofobject = ''SCHEMA'' + BEGIN + SET @Command = @Command + '' +IF EXISTS (SELECT 1 FROM sys.schemas WHERE name = '''''' + @schemaid + '''''') +BEGIN + IF EXISTS(SELECT 1 FROM sys.fn_builtin_permissions(''''SCHEMA'''') WHERE permission_name = '''''' + @rightsaction + '''''') + BEGIN + '' + @grantordeny + '' '' + @rightsaction + '' ON SCHEMA::'' + @schemaid + '' TO ['' + @RoleName + ''] + END +END + +'' + END + + IF @typeofobject in(''TABLE'',''SP'',''FUNCTIONS'',''VIEWS'') + BEGIN + + IF @objectname like ''%[%]%'' + BEGIN + + IF @typeofobject = ''TABLE'' + BEGIN + SET @sysTarget = ''sys.tables'' + SET @sysType = '''' + END + + IF @typeofobject = ''SP'' + BEGIN + SET @sysTarget = ''sys.procedures'' + SET @sysType = '''' + END + + IF @typeofobject = ''FUNCTIONS'' + BEGIN + SET @sysTarget = ''sys.objects'' + SET @sysType = '' and p.Type IN ( N''''FN'''', N''''IF'''', N''''TF'''', N''''FS'''', N''''FT'''' )'' + END + + IF @typeofobject = ''VIEWS'' + BEGIN + SET @sysTarget = ''sys.views'' + SET @sysType = '''' + END + + SET @Command = @Command + '' +DECLARE SP_cursor CURSOR FOR +SELECT p.name FROM '' + @sysTarget + '' p JOIN sys.schemas s ON s.schema_id = p.schema_id WHERE (p.name like '''''' + @objectname + '''''') and s.name = '''''' + @schemaid + '''' + @sysType + '''''' + +OPEN SP_cursor +FETCH NEXT FROM SP_cursor INTO @SP_Name +WHILE @@FETCH_STATUS = 0 +BEGIN + IF EXISTS(SELECT 1 FROM sys.fn_builtin_permissions(''''OBJECT'''') WHERE permission_name = '''''' + @rightsaction + '''''') + BEGIN + EXEC('''''' + @grantordeny + '' '' + @rightsaction + '' ON ['' + @schemaid + ''].['''' + @SP_Name + ''''] TO ['' + @RoleName + '']'''') + END + FETCH NEXT FROM SP_cursor INTO @SP_Name +END + +CLOSE SP_cursor +DEALLOCATE SP_cursor + +'' + + END + ELSE + BEGIN + + SET @Command = @Command + '' +IF EXISTS(SELECT 1 FROM sys.objects o WITH (NOLOCK) JOIN sys.schemas s ON s.schema_id = o.schema_id WHERE o.name = '''''' + @objectname + '''''' AND o.type IN (N''''U'''',''''P'''',''''V'''',''''FN'''',''''IF'''',''''TF'''') AND s.name = '''''' + @schemaid + '''''') +BEGIN + IF EXISTS(SELECT 1 FROM sys.fn_builtin_permissions(''''OBJECT'''') WHERE permission_name = '''''' + @rightsaction + '''''') + BEGIN + '' + @grantordeny + '' '' + @rightsaction + '' ON ['' + @schemaid + ''].['' + @objectname + ''] TO ['' + @RoleName + ''] + END +END + +'' + END + END + + IF @typeofobject = ''ASSEMBLIES'' + BEGIN + SET @Command = @Command + '' +IF EXISTS(SELECT 1 FROM sys.assemblies WHERE NAME = '''''' + @objectname + '''''') +BEGIN + IF EXISTS(SELECT 1 FROM sys.fn_builtin_permissions(''''ASSEMBLY'''') WHERE permission_name = '''''' + @rightsaction + '''''') + BEGIN + '' + @grantordeny + '' '' + @rightsaction + ''::['' + @objectname + ''] TO ['' + @RoleName + ''] + END +END + +'' + END + + IF @typeofobject = ''ROLE'' + BEGIN + SET @Command = @Command + '' +IF NOT EXISTS (SELECT 1 FROM sys.database_role_members JOIN sys.database_principals roles ON database_role_members.role_principal_id = roles.principal_id JOIN sys.database_principals members ON database_role_members.member_principal_id = members.principal_id WHERE roles.name = '''''' + @rightsaction + '''''' AND members.name = '''''' + @RoleName + '''''') +BEGIN + EXEC sp_addrolemember N'''''' + @rightsaction + '''''', N'''''' + @RoleName + '''''' +END + +'' + END + + FETCH NEXT FROM SecurablesCurs INTO @typeofobject, @grantordeny, @rightsaction, @objectname, @schemaid + END + +CLOSE SecurablesCurs +DEALLOCATE SecurablesCurs + +PRINT ''SET ALL SECURABLES ON ROLE ['' + @RoleName + '']'' +EXEC sp_executesql @Command + +END + +/* ADD USER */ +DECLARE UsersCurs CURSOR FOR +SELECT username + FROM #UsersOnRole + +OPEN UsersCurs + +FETCH NEXT FROM UsersCurs INTO @Users +WHILE @@FETCH_STATUS = 0 +BEGIN + + SELECT @Command = '' +EXEC sp_addrolemember N'''''' + @RoleName + '''''', N'''''' + @Users + '''''' +PRINT ''''ADD USER ['' + @Users + ''] ON ROLE ['' + @RoleName + '']'''' +'' + +FETCH NEXT FROM UsersCurs INTO @Users +END + +CLOSE UsersCurs +DEALLOCATE UsersCurs + +EXEC sp_executesql @Command + +/*============================================================================= + Drop temp tables +=============================================================================*/ +DROP TABLE #Securables +DROP TABLE #UsersOnRole','ArizonaCUST','Pharmacies') + +INSERT INTO #AllRoles(STR_Definition,STR_Database,STR_Product)VALUES(' + +/*============================================================================= + + Script to create dbRoleDevUsr role. + + Role Name: dbRoleDevUsr + TEMPLATE: Default + + EXAMPLE OF SECURABLES TO SET: + + INSERT INTO #Securables + VALUES + (''DB'',''GRANT'',''VIEW DEFINITION'','''',''''), + (''SCHEMA'',''GRANT'',''SELECT,EXECUTE,INSERT,UPDATE,DELETE'','''',''AP''), + (''TABLE'',''GRANT'',''INSERT,UPDATE'',''Address'',''dbo''), + (''SP'',''GRANT'',''EXECUTE'',''sp_bmc_GetNextID'',''dbo''), + (''ROLE'',''GRANT'',''db_datareader'','''','''') + + ----------------------------------------------- + +Generate date : 2023-05-12 / up208700 + +=============================================================================*/ + +DECLARE @Command nvarchar(max), + @RoleName varchar(60), + @Users varchar(255), + @typeofobject varchar(50), + @grantordeny varchar(10), + @rightsaction varchar(255), + @objectname varchar(255), + @schemaid varchar(10), + @sysTarget varchar(255), + @sysType varchar(255) + +SET @RoleName = ''dbRoleDevUsr'' +SET @Command = '''' + +/* TEMP TABLES */ +CREATE TABLE #UsersOnRole(username varchar(255)) +CREATE TABLE #Securables(typeofobject varchar(50), grantordeny varchar(10), rightsaction varchar(255), objectname varchar(255), schemaid varchar(10),N2 bit) + +/* !!! LIST OF SECURABLES TO CHANGE !!! */ + +INSERT INTO #Securables +VALUES +(''DB'',''GRANT'',''EXECUTE'','''',''dbo'',0) +,(''DB'',''GRANT'',''SHOWPLAN'','''',''dbo'',0) +,(''DB'',''GRANT'',''VIEW DEFINITION'','''',''dbo'',0) +,(''ROLE'',''GRANT'',''DB_DATAREADER'','''',''dbo'',0) + + +/* GET ALL USERS ON THIS ROLE */ +INSERT INTO #UsersOnRole +SELECT + members.name +FROM sys.database_role_members + JOIN sys.database_principals roles ON database_role_members.role_principal_id = roles.principal_id + JOIN sys.database_principals members ON database_role_members.member_principal_id = members.principal_id +WHERE roles.name = @RoleName + +/* CREATE ROLE */ +SELECT @Command = '' +IF NOT EXISTS (SELECT 1 FROM sys.database_principals WHERE name = '''''' + @RoleName + '''''' AND type = ''''R'''') +BEGIN + CREATE ROLE ['' + @RoleName + ''] AUTHORIZATION [dbo] + PRINT ''''CREATE ROLE ['' + @RoleName + '']'''' +END +'' +EXEC sp_executesql @Command + +SET @Command = '' +DECLARE @SP_Name varchar(255) + +'' + +/* SET ALL ROLE SECURABLES */ +DECLARE SecurablesCurs CURSOR FOR +SELECT typeofobject, grantordeny, rightsaction, objectname, schemaid +FROM #Securables +WHERE N2 = 0 + +OPEN SecurablesCurs +FETCH NEXT FROM SecurablesCurs INTO @typeofobject, @grantordeny, @rightsaction, @objectname, @schemaid +WHILE @@FETCH_STATUS = 0 +BEGIN + + IF @typeofobject = ''DB'' + BEGIN + IF EXISTS(SELECT 1 FROM sys.fn_builtin_permissions(''DATABASE'') WHERE permission_name = '''' + @rightsaction + '''') + BEGIN + SET @Command = @Command + @grantordeny + '' '' + @rightsaction + '' TO ['' + @RoleName + ''] +'' + END + END + + IF @typeofobject = ''SCHEMA'' + BEGIN + SET @Command = @Command + '' +IF EXISTS (SELECT 1 FROM sys.schemas WHERE name = '''''' + @schemaid + '''''') +BEGIN + IF EXISTS(SELECT 1 FROM sys.fn_builtin_permissions(''''SCHEMA'''') WHERE permission_name = '''''' + @rightsaction + '''''') + BEGIN + '' + @grantordeny + '' '' + @rightsaction + '' ON SCHEMA::'' + @schemaid + '' TO ['' + @RoleName + ''] + END +END + +'' + END + + IF @typeofobject in(''TABLE'',''SP'',''FUNCTIONS'',''VIEWS'') + BEGIN + + IF @objectname like ''%[%]%'' + BEGIN + + IF @typeofobject = ''TABLE'' + BEGIN + SET @sysTarget = ''sys.tables'' + SET @sysType = '''' + END + + IF @typeofobject = ''SP'' + BEGIN + SET @sysTarget = ''sys.procedures'' + SET @sysType = '''' + END + + IF @typeofobject = ''FUNCTIONS'' + BEGIN + SET @sysTarget = ''sys.objects'' + SET @sysType = '' and p.Type IN ( N''''FN'''', N''''IF'''', N''''TF'''', N''''FS'''', N''''FT'''' )'' + END + + IF @typeofobject = ''VIEWS'' + BEGIN + SET @sysTarget = ''sys.views'' + SET @sysType = '''' + END + + SET @Command = @Command + '' +DECLARE SP_cursor CURSOR FOR +SELECT p.name FROM '' + @sysTarget + '' p JOIN sys.schemas s ON s.schema_id = p.schema_id WHERE (p.name like '''''' + @objectname + '''''') and s.name = '''''' + @schemaid + '''' + @sysType + '''''' + +OPEN SP_cursor +FETCH NEXT FROM SP_cursor INTO @SP_Name +WHILE @@FETCH_STATUS = 0 +BEGIN + IF EXISTS(SELECT 1 FROM sys.fn_builtin_permissions(''''OBJECT'''') WHERE permission_name = '''''' + @rightsaction + '''''') + BEGIN + EXEC('''''' + @grantordeny + '' '' + @rightsaction + '' ON ['' + @schemaid + ''].['''' + @SP_Name + ''''] TO ['' + @RoleName + '']'''') + END + FETCH NEXT FROM SP_cursor INTO @SP_Name +END + +CLOSE SP_cursor +DEALLOCATE SP_cursor + +'' + + END + ELSE + BEGIN + + SET @Command = @Command + '' +IF EXISTS(SELECT 1 FROM sys.objects o WITH (NOLOCK) JOIN sys.schemas s ON s.schema_id = o.schema_id WHERE o.name = '''''' + @objectname + '''''' AND o.type IN (N''''U'''',''''P'''',''''V'''',''''FN'''',''''IF'''',''''TF'''') AND s.name = '''''' + @schemaid + '''''') +BEGIN + IF EXISTS(SELECT 1 FROM sys.fn_builtin_permissions(''''OBJECT'''') WHERE permission_name = '''''' + @rightsaction + '''''') + BEGIN + '' + @grantordeny + '' '' + @rightsaction + '' ON ['' + @schemaid + ''].['' + @objectname + ''] TO ['' + @RoleName + ''] + END +END + +'' + END +END + +IF @typeofobject = ''ASSEMBLIES'' +BEGIN + SET @Command = @Command + '' +IF EXISTS(SELECT 1 FROM sys.assemblies WHERE NAME = '''''' + @objectname + '''''') +BEGIN + IF EXISTS(SELECT 1 FROM sys.fn_builtin_permissions(''''ASSEMBLY'''') WHERE permission_name = '''''' + @rightsaction + '''''') + BEGIN + '' + @grantordeny + '' '' + @rightsaction + ''::['' + @objectname + ''] TO ['' + @RoleName + ''] + END +END + +'' +END + +IF @typeofobject = ''ROLE'' +BEGIN + SET @Command = @Command + '' +IF NOT EXISTS (SELECT 1 FROM sys.database_role_members JOIN sys.database_principals roles ON database_role_members.role_principal_id = roles.principal_id JOIN sys.database_principals members ON database_role_members.member_principal_id = members.principal_id WHERE roles.name = '''''' + @rightsaction + '''''' AND members.name = '''''' + @RoleName + '''''') +BEGIN + EXEC sp_addrolemember N'''''' + @rightsaction + '''''', N'''''' + @RoleName + '''''' +END + +'' +END + +FETCH NEXT FROM SecurablesCurs INTO @typeofobject, @grantordeny, @rightsaction, @objectname, @schemaid +END + +CLOSE SecurablesCurs +DEALLOCATE SecurablesCurs + +PRINT ''SET ALL SECURABLES ON ROLE ['' + @RoleName + '']'' +EXEC sp_executesql @Command + +/* ADD USER */ +DECLARE UsersCurs CURSOR FOR +SELECT username + FROM #UsersOnRole + +OPEN UsersCurs + +FETCH NEXT FROM UsersCurs INTO @Users +WHILE @@FETCH_STATUS = 0 +BEGIN + + SELECT @Command = '' +EXEC sp_addrolemember N'''''' + @RoleName + '''''', N'''''' + @Users + '''''' +PRINT ''''ADD USER ['' + @Users + ''] ON ROLE ['' + @RoleName + '']'''' +'' + +FETCH NEXT FROM UsersCurs INTO @Users +END + +CLOSE UsersCurs +DEALLOCATE UsersCurs + +EXEC sp_executesql @Command + + +/*============================================================================= + Drop temp tables +=============================================================================*/ +DROP TABLE #Securables +DROP TABLE #UsersOnRole +','ArizonaCUST','Pharmacies') + +INSERT INTO #AllRoles(STR_Definition,STR_Database,STR_Product)VALUES(' + +/*============================================================================= + + Script to create dbRoleIttechUsr role. + + Role Name: dbRoleIttechUsr + TEMPLATE: N2 and PROD + + EXAMPLE OF SECURABLES TO SET: + + INSERT INTO #Securables + VALUES + (''DB'',''GRANT'',''VIEW DEFINITION'','''',''''), + (''SCHEMA'',''GRANT'',''SELECT,EXECUTE,INSERT,UPDATE,DELETE'','''',''AP''), + (''TABLE'',''GRANT'',''INSERT,UPDATE'',''Address'',''dbo''), + (''SP'',''GRANT'',''EXECUTE'',''sp_bmc_GetNextID'',''dbo''), + (''ROLE'',''GRANT'',''db_datareader'','''','''') + + ----------------------------------------------- + +Generate date : 2023-05-12 / up208700 + +=============================================================================*/ + +DECLARE @Type varchar(6), + @Command nvarchar(max), + @RoleName varchar(60), + @Users varchar(255), + @typeofobject varchar(50), + @grantordeny varchar(10), + @rightsaction varchar(255), + @objectname varchar(255), + @schemaid varchar(10), + @sysTarget varchar(255), + @sysType varchar(255) + +SET @RoleName = ''dbRoleIttechUsr'' +SET @Command = '''' + +SELECT @Type = [Type] FROM [master].[cfg].[InstanceContext] + +/* TEMP TABLES */ +CREATE TABLE #UsersOnRole(username varchar(255)) +CREATE TABLE #Securables(typeofobject varchar(50), grantordeny varchar(10), rightsaction varchar(255), objectname varchar(255), schemaid varchar(10),N2 bit) + +/* !!! LIST OF SECURABLES TO CHANGE !!! */ + +INSERT INTO #Securables +VALUES +(''DB'',''GRANT'',''EXECUTE'','''',''dbo'',0) +,(''ROLE'',''GRANT'',''DB_DATAREADER'','''',''dbo'',0) +,(''ROLE'',''GRANT'',''DB_OWNER'','''',''dbo'',1) + + +/* GET ALL USERS ON THIS ROLE */ +INSERT INTO #UsersOnRole +SELECT + members.name +FROM sys.database_role_members + JOIN sys.database_principals roles ON database_role_members.role_principal_id = roles.principal_id + JOIN sys.database_principals members ON database_role_members.member_principal_id = members.principal_id +WHERE roles.name = @RoleName + +/* CREATE ROLE */ +SELECT @Command = '' +IF NOT EXISTS (SELECT 1 FROM sys.database_principals WHERE name = '''''' + @RoleName + '''''' AND type = ''''R'''') +BEGIN + CREATE ROLE ['' + @RoleName + ''] AUTHORIZATION [dbo] + PRINT ''''CREATE ROLE ['' + @RoleName + '']'''' +END +'' +EXEC sp_executesql @Command + +SET @Command = '' +DECLARE @SP_Name varchar(255) + +'' + +/* SET ALL ROLE SECURABLES */ +IF @Type = ''DEVE'' +BEGIN + + DECLARE SecurablesCurs CURSOR FOR + SELECT typeofobject, grantordeny, rightsaction, objectname, schemaid + FROM #Securables + WHERE N2 = 1 + + OPEN SecurablesCurs + FETCH NEXT FROM SecurablesCurs INTO @typeofobject, @grantordeny, @rightsaction, @objectname, @schemaid + WHILE @@FETCH_STATUS = 0 + BEGIN + + IF @typeofobject = ''DB'' + BEGIN + IF EXISTS(SELECT 1 FROM sys.fn_builtin_permissions(''DATABASE'') WHERE permission_name = '''' + @rightsaction + '''') + BEGIN + SET @Command = @Command + @grantordeny + '' '' + @rightsaction + '' TO ['' + @RoleName + ''] +'' + END + END + + IF @typeofobject = ''SCHEMA'' + BEGIN + SET @Command = @Command + '' +IF EXISTS (SELECT 1 FROM sys.schemas WHERE name = '''''' + @schemaid + '''''') +BEGIN + IF EXISTS(SELECT 1 FROM sys.fn_builtin_permissions(''''SCHEMA'''') WHERE permission_name = '''''' + @rightsaction + '''''') + BEGIN + '' + @grantordeny + '' '' + @rightsaction + '' ON SCHEMA::'' + @schemaid + '' TO ['' + @RoleName + ''] + END +END + +'' + END + + IF @typeofobject in(''TABLE'',''SP'',''FUNCTIONS'',''VIEWS'') + BEGIN + + IF @objectname like ''%[%]%'' + BEGIN + IF @typeofobject = ''TABLE'' + BEGIN + SET @sysTarget = ''sys.tables'' + SET @sysType = '''' + END + + IF @typeofobject = ''SP'' + BEGIN + SET @sysTarget = ''sys.procedures'' + SET @sysType = '''' + END + + IF @typeofobject = ''FUNCTIONS'' + BEGIN + SET @sysTarget = ''sys.objects'' + SET @sysType = '' and p.Type IN ( N''''FN'''', N''''IF'''', N''''TF'''', N''''FS'''', N''''FT'''' )'' + END + + IF @typeofobject = ''VIEWS'' + BEGIN + SET @sysTarget = ''sys.views'' + SET @sysType = '''' + END + + SET @Command = @Command + '' +DECLARE SP_cursor CURSOR FOR +SELECT p.name FROM '' + @sysTarget + '' p JOIN sys.schemas s ON s.schema_id = p.schema_id WHERE (p.name like '''''' + @objectname + '''''') and s.name = '''''' + @schemaid + '''' + @sysType + '''''' + +OPEN SP_cursor +FETCH NEXT FROM SP_cursor INTO @SP_Name +WHILE @@FETCH_STATUS = 0 +BEGIN + IF EXISTS(SELECT 1 FROM sys.fn_builtin_permissions(''''OBJECT'''') WHERE permission_name = '''''' + @rightsaction + '''''') + BEGIN + EXEC('''''' + @grantordeny + '' '' + @rightsaction + '' ON ['' + @schemaid + ''].['''' + @SP_Name + ''''] TO ['' + @RoleName + '']'''') + END + FETCH NEXT FROM SP_cursor INTO @SP_Name +END + +CLOSE SP_cursor +DEALLOCATE SP_cursor + +'' + + END + ELSE + BEGIN + + SET @Command = @Command + '' +IF EXISTS(SELECT 1 FROM sys.objects o WITH (NOLOCK) JOIN sys.schemas s ON s.schema_id = o.schema_id WHERE o.name = '''''' + @objectname + '''''' AND o.type IN (N''''U'''',''''P'''',''''V'''',''''FN'''',''''IF'''',''''TF'''') AND s.name = '''''' + @schemaid + '''''') +BEGIN + IF EXISTS(SELECT 1 FROM sys.fn_builtin_permissions(''''OBJECT'''') WHERE permission_name = '''''' + @rightsaction + '''''') + BEGIN + '' + @grantordeny + '' '' + @rightsaction + '' ON ['' + @schemaid + ''].['' + @objectname + ''] TO ['' + @RoleName + ''] + END +END + +'' + END + END + + IF @typeofobject = ''ASSEMBLIES'' + BEGIN + SET @Command = @Command + '' +IF EXISTS(SELECT 1 FROM sys.assemblies WHERE NAME = '''''' + @objectname + '''''') +BEGIN + IF EXISTS(SELECT 1 FROM sys.fn_builtin_permissions(''''ASSEMBLY'''') WHERE permission_name = '''''' + @rightsaction + '''''') + BEGIN + '' + @grantordeny + '' '' + @rightsaction + ''::['' + @objectname + ''] TO ['' + @RoleName + ''] + END +END + +'' + END + + IF @typeofobject = ''ROLE'' + BEGIN + SET @Command = @Command + '' +IF NOT EXISTS (SELECT 1 FROM sys.database_role_members JOIN sys.database_principals roles ON database_role_members.role_principal_id = roles.principal_id JOIN sys.database_principals members ON database_role_members.member_principal_id = members.principal_id WHERE roles.name = '''''' + @rightsaction + '''''' AND members.name = '''''' + @RoleName + '''''') +BEGIN + EXEC sp_addrolemember N'''''' + @rightsaction + '''''', N'''''' + @RoleName + '''''' +END + +'' + END + + FETCH NEXT FROM SecurablesCurs INTO @typeofobject, @grantordeny, @rightsaction, @objectname, @schemaid + END + +CLOSE SecurablesCurs +DEALLOCATE SecurablesCurs + +PRINT ''SET ALL SECURABLES ON ROLE ['' + @RoleName + '']'' +EXEC sp_executesql @Command + +END +ELSE +BEGIN + + DECLARE SecurablesCurs CURSOR FOR + SELECT typeofobject, grantordeny, rightsaction, objectname, schemaid + FROM #Securables + WHERE N2 = 0 + + OPEN SecurablesCurs + FETCH NEXT FROM SecurablesCurs INTO @typeofobject, @grantordeny, @rightsaction, @objectname, @schemaid + WHILE @@FETCH_STATUS = 0 + BEGIN + + IF @typeofobject = ''DB'' + BEGIN + IF EXISTS(SELECT 1 FROM sys.fn_builtin_permissions(''DATABASE'') WHERE permission_name = '''' + @rightsaction + '''') + BEGIN + SET @Command = @Command + @grantordeny + '' '' + @rightsaction + '' TO ['' + @RoleName + ''] +'' + END + END + + IF @typeofobject = ''SCHEMA'' + BEGIN + SET @Command = @Command + '' +IF EXISTS (SELECT 1 FROM sys.schemas WHERE name = '''''' + @schemaid + '''''') +BEGIN + IF EXISTS(SELECT 1 FROM sys.fn_builtin_permissions(''''SCHEMA'''') WHERE permission_name = '''''' + @rightsaction + '''''') + BEGIN + '' + @grantordeny + '' '' + @rightsaction + '' ON SCHEMA::'' + @schemaid + '' TO ['' + @RoleName + ''] + END +END + +'' + END + + IF @typeofobject in(''TABLE'',''SP'',''FUNCTIONS'',''VIEWS'') + BEGIN + + IF @objectname like ''%[%]%'' + BEGIN + + IF @typeofobject = ''TABLE'' + BEGIN + SET @sysTarget = ''sys.tables'' + SET @sysType = '''' + END + + IF @typeofobject = ''SP'' + BEGIN + SET @sysTarget = ''sys.procedures'' + SET @sysType = '''' + END + + IF @typeofobject = ''FUNCTIONS'' + BEGIN + SET @sysTarget = ''sys.objects'' + SET @sysType = '' and p.Type IN ( N''''FN'''', N''''IF'''', N''''TF'''', N''''FS'''', N''''FT'''' )'' + END + + IF @typeofobject = ''VIEWS'' + BEGIN + SET @sysTarget = ''sys.views'' + SET @sysType = '''' + END + + SET @Command = @Command + '' +DECLARE SP_cursor CURSOR FOR +SELECT p.name FROM '' + @sysTarget + '' p JOIN sys.schemas s ON s.schema_id = p.schema_id WHERE (p.name like '''''' + @objectname + '''''') and s.name = '''''' + @schemaid + '''' + @sysType + '''''' + +OPEN SP_cursor +FETCH NEXT FROM SP_cursor INTO @SP_Name +WHILE @@FETCH_STATUS = 0 +BEGIN + IF EXISTS(SELECT 1 FROM sys.fn_builtin_permissions(''''OBJECT'''') WHERE permission_name = '''''' + @rightsaction + '''''') + BEGIN + EXEC('''''' + @grantordeny + '' '' + @rightsaction + '' ON ['' + @schemaid + ''].['''' + @SP_Name + ''''] TO ['' + @RoleName + '']'''') + END + FETCH NEXT FROM SP_cursor INTO @SP_Name +END + +CLOSE SP_cursor +DEALLOCATE SP_cursor + +'' + + END + ELSE + BEGIN + + SET @Command = @Command + '' +IF EXISTS(SELECT 1 FROM sys.objects o WITH (NOLOCK) JOIN sys.schemas s ON s.schema_id = o.schema_id WHERE o.name = '''''' + @objectname + '''''' AND o.type IN (N''''U'''',''''P'''',''''V'''',''''FN'''',''''IF'''',''''TF'''') AND s.name = '''''' + @schemaid + '''''') +BEGIN + IF EXISTS(SELECT 1 FROM sys.fn_builtin_permissions(''''OBJECT'''') WHERE permission_name = '''''' + @rightsaction + '''''') + BEGIN + '' + @grantordeny + '' '' + @rightsaction + '' ON ['' + @schemaid + ''].['' + @objectname + ''] TO ['' + @RoleName + ''] + END +END + +'' + END + END + + IF @typeofobject = ''ASSEMBLIES'' + BEGIN + SET @Command = @Command + '' +IF EXISTS(SELECT 1 FROM sys.assemblies WHERE NAME = '''''' + @objectname + '''''') +BEGIN + IF EXISTS(SELECT 1 FROM sys.fn_builtin_permissions(''''ASSEMBLY'''') WHERE permission_name = '''''' + @rightsaction + '''''') + BEGIN + '' + @grantordeny + '' '' + @rightsaction + ''::['' + @objectname + ''] TO ['' + @RoleName + ''] + END +END + +'' + END + + IF @typeofobject = ''ROLE'' + BEGIN + SET @Command = @Command + '' +IF NOT EXISTS (SELECT 1 FROM sys.database_role_members JOIN sys.database_principals roles ON database_role_members.role_principal_id = roles.principal_id JOIN sys.database_principals members ON database_role_members.member_principal_id = members.principal_id WHERE roles.name = '''''' + @rightsaction + '''''' AND members.name = '''''' + @RoleName + '''''') +BEGIN + EXEC sp_addrolemember N'''''' + @rightsaction + '''''', N'''''' + @RoleName + '''''' +END + +'' + END + + FETCH NEXT FROM SecurablesCurs INTO @typeofobject, @grantordeny, @rightsaction, @objectname, @schemaid + END + +CLOSE SecurablesCurs +DEALLOCATE SecurablesCurs + +PRINT ''SET ALL SECURABLES ON ROLE ['' + @RoleName + '']'' +EXEC sp_executesql @Command + +END + +/* ADD USER */ +DECLARE UsersCurs CURSOR FOR +SELECT username + FROM #UsersOnRole + +OPEN UsersCurs + +FETCH NEXT FROM UsersCurs INTO @Users +WHILE @@FETCH_STATUS = 0 +BEGIN + + SELECT @Command = '' +EXEC sp_addrolemember N'''''' + @RoleName + '''''', N'''''' + @Users + '''''' +PRINT ''''ADD USER ['' + @Users + ''] ON ROLE ['' + @RoleName + '']'''' +'' + +FETCH NEXT FROM UsersCurs INTO @Users +END + +CLOSE UsersCurs +DEALLOCATE UsersCurs + +EXEC sp_executesql @Command + +/*============================================================================= + Drop temp tables +=============================================================================*/ +DROP TABLE #Securables +DROP TABLE #UsersOnRole','ArizonaCUST','Pharmacies') + +INSERT INTO #AllRoles(STR_Definition,STR_Database,STR_Product)VALUES(' + +/*============================================================================= + + Script to create dbRoleSupUsr role. + + Role Name: dbRoleSupUsr + TEMPLATE: N2 and PROD + + EXAMPLE OF SECURABLES TO SET: + + INSERT INTO #Securables + VALUES + (''DB'',''GRANT'',''VIEW DEFINITION'','''',''''), + (''SCHEMA'',''GRANT'',''SELECT,EXECUTE,INSERT,UPDATE,DELETE'','''',''AP''), + (''TABLE'',''GRANT'',''INSERT,UPDATE'',''Address'',''dbo''), + (''SP'',''GRANT'',''EXECUTE'',''sp_bmc_GetNextID'',''dbo''), + (''ROLE'',''GRANT'',''db_datareader'','''','''') + + ----------------------------------------------- + +Generate date : 2023-05-12 / up208700 + +=============================================================================*/ + +DECLARE @Type varchar(6), + @Command nvarchar(max), + @RoleName varchar(60), + @Users varchar(255), + @typeofobject varchar(50), + @grantordeny varchar(10), + @rightsaction varchar(255), + @objectname varchar(255), + @schemaid varchar(10), + @sysTarget varchar(255), + @sysType varchar(255) + +SET @RoleName = ''dbRoleSupUsr'' +SET @Command = '''' + +SELECT @Type = [Type] FROM [master].[cfg].[InstanceContext] + +/* TEMP TABLES */ +CREATE TABLE #UsersOnRole(username varchar(255)) +CREATE TABLE #Securables(typeofobject varchar(50), grantordeny varchar(10), rightsaction varchar(255), objectname varchar(255), schemaid varchar(10),N2 bit) + +/* !!! LIST OF SECURABLES TO CHANGE !!! */ + +INSERT INTO #Securables +VALUES +(''DB'',''GRANT'',''EXECUTE'','''',''dbo'',0) +,(''ROLE'',''GRANT'',''DB_DATAREADER'','''',''dbo'',0) +,(''ROLE'',''GRANT'',''DB_OWNER'','''',''dbo'',1) + + +/* GET ALL USERS ON THIS ROLE */ +INSERT INTO #UsersOnRole +SELECT + members.name +FROM sys.database_role_members + JOIN sys.database_principals roles ON database_role_members.role_principal_id = roles.principal_id + JOIN sys.database_principals members ON database_role_members.member_principal_id = members.principal_id +WHERE roles.name = @RoleName + +/* CREATE ROLE */ +SELECT @Command = '' +IF NOT EXISTS (SELECT 1 FROM sys.database_principals WHERE name = '''''' + @RoleName + '''''' AND type = ''''R'''') +BEGIN + CREATE ROLE ['' + @RoleName + ''] AUTHORIZATION [dbo] + PRINT ''''CREATE ROLE ['' + @RoleName + '']'''' +END +'' +EXEC sp_executesql @Command + +SET @Command = '' +DECLARE @SP_Name varchar(255) + +'' + +/* SET ALL ROLE SECURABLES */ +IF @Type = ''DEVE'' +BEGIN + + DECLARE SecurablesCurs CURSOR FOR + SELECT typeofobject, grantordeny, rightsaction, objectname, schemaid + FROM #Securables + WHERE N2 = 1 + + OPEN SecurablesCurs + FETCH NEXT FROM SecurablesCurs INTO @typeofobject, @grantordeny, @rightsaction, @objectname, @schemaid + WHILE @@FETCH_STATUS = 0 + BEGIN + + IF @typeofobject = ''DB'' + BEGIN + IF EXISTS(SELECT 1 FROM sys.fn_builtin_permissions(''DATABASE'') WHERE permission_name = '''' + @rightsaction + '''') + BEGIN + SET @Command = @Command + @grantordeny + '' '' + @rightsaction + '' TO ['' + @RoleName + ''] +'' + END + END + + IF @typeofobject = ''SCHEMA'' + BEGIN + SET @Command = @Command + '' +IF EXISTS (SELECT 1 FROM sys.schemas WHERE name = '''''' + @schemaid + '''''') +BEGIN + IF EXISTS(SELECT 1 FROM sys.fn_builtin_permissions(''''SCHEMA'''') WHERE permission_name = '''''' + @rightsaction + '''''') + BEGIN + '' + @grantordeny + '' '' + @rightsaction + '' ON SCHEMA::'' + @schemaid + '' TO ['' + @RoleName + ''] + END +END + +'' + END + + IF @typeofobject in(''TABLE'',''SP'',''FUNCTIONS'',''VIEWS'') + BEGIN + + IF @objectname like ''%[%]%'' + BEGIN + IF @typeofobject = ''TABLE'' + BEGIN + SET @sysTarget = ''sys.tables'' + SET @sysType = '''' + END + + IF @typeofobject = ''SP'' + BEGIN + SET @sysTarget = ''sys.procedures'' + SET @sysType = '''' + END + + IF @typeofobject = ''FUNCTIONS'' + BEGIN + SET @sysTarget = ''sys.objects'' + SET @sysType = '' and p.Type IN ( N''''FN'''', N''''IF'''', N''''TF'''', N''''FS'''', N''''FT'''' )'' + END + + IF @typeofobject = ''VIEWS'' + BEGIN + SET @sysTarget = ''sys.views'' + SET @sysType = '''' + END + + SET @Command = @Command + '' +DECLARE SP_cursor CURSOR FOR +SELECT p.name FROM '' + @sysTarget + '' p JOIN sys.schemas s ON s.schema_id = p.schema_id WHERE (p.name like '''''' + @objectname + '''''') and s.name = '''''' + @schemaid + '''' + @sysType + '''''' + +OPEN SP_cursor +FETCH NEXT FROM SP_cursor INTO @SP_Name +WHILE @@FETCH_STATUS = 0 +BEGIN + IF EXISTS(SELECT 1 FROM sys.fn_builtin_permissions(''''OBJECT'''') WHERE permission_name = '''''' + @rightsaction + '''''') + BEGIN + EXEC('''''' + @grantordeny + '' '' + @rightsaction + '' ON ['' + @schemaid + ''].['''' + @SP_Name + ''''] TO ['' + @RoleName + '']'''') + END + FETCH NEXT FROM SP_cursor INTO @SP_Name +END + +CLOSE SP_cursor +DEALLOCATE SP_cursor + +'' + + END + ELSE + BEGIN + + SET @Command = @Command + '' +IF EXISTS(SELECT 1 FROM sys.objects o WITH (NOLOCK) JOIN sys.schemas s ON s.schema_id = o.schema_id WHERE o.name = '''''' + @objectname + '''''' AND o.type IN (N''''U'''',''''P'''',''''V'''',''''FN'''',''''IF'''',''''TF'''') AND s.name = '''''' + @schemaid + '''''') +BEGIN + IF EXISTS(SELECT 1 FROM sys.fn_builtin_permissions(''''OBJECT'''') WHERE permission_name = '''''' + @rightsaction + '''''') + BEGIN + '' + @grantordeny + '' '' + @rightsaction + '' ON ['' + @schemaid + ''].['' + @objectname + ''] TO ['' + @RoleName + ''] + END +END + +'' + END + END + + IF @typeofobject = ''ASSEMBLIES'' + BEGIN + SET @Command = @Command + '' +IF EXISTS(SELECT 1 FROM sys.assemblies WHERE NAME = '''''' + @objectname + '''''') +BEGIN + IF EXISTS(SELECT 1 FROM sys.fn_builtin_permissions(''''ASSEMBLY'''') WHERE permission_name = '''''' + @rightsaction + '''''') + BEGIN + '' + @grantordeny + '' '' + @rightsaction + ''::['' + @objectname + ''] TO ['' + @RoleName + ''] + END +END + +'' + END + + IF @typeofobject = ''ROLE'' + BEGIN + SET @Command = @Command + '' +IF NOT EXISTS (SELECT 1 FROM sys.database_role_members JOIN sys.database_principals roles ON database_role_members.role_principal_id = roles.principal_id JOIN sys.database_principals members ON database_role_members.member_principal_id = members.principal_id WHERE roles.name = '''''' + @rightsaction + '''''' AND members.name = '''''' + @RoleName + '''''') +BEGIN + EXEC sp_addrolemember N'''''' + @rightsaction + '''''', N'''''' + @RoleName + '''''' +END + +'' + END + + FETCH NEXT FROM SecurablesCurs INTO @typeofobject, @grantordeny, @rightsaction, @objectname, @schemaid + END + +CLOSE SecurablesCurs +DEALLOCATE SecurablesCurs + +PRINT ''SET ALL SECURABLES ON ROLE ['' + @RoleName + '']'' +EXEC sp_executesql @Command + +END +ELSE +BEGIN + + DECLARE SecurablesCurs CURSOR FOR + SELECT typeofobject, grantordeny, rightsaction, objectname, schemaid + FROM #Securables + WHERE N2 = 0 + + OPEN SecurablesCurs + FETCH NEXT FROM SecurablesCurs INTO @typeofobject, @grantordeny, @rightsaction, @objectname, @schemaid + WHILE @@FETCH_STATUS = 0 + BEGIN + + IF @typeofobject = ''DB'' + BEGIN + IF EXISTS(SELECT 1 FROM sys.fn_builtin_permissions(''DATABASE'') WHERE permission_name = '''' + @rightsaction + '''') + BEGIN + SET @Command = @Command + @grantordeny + '' '' + @rightsaction + '' TO ['' + @RoleName + ''] +'' + END + END + + IF @typeofobject = ''SCHEMA'' + BEGIN + SET @Command = @Command + '' +IF EXISTS (SELECT 1 FROM sys.schemas WHERE name = '''''' + @schemaid + '''''') +BEGIN + IF EXISTS(SELECT 1 FROM sys.fn_builtin_permissions(''''SCHEMA'''') WHERE permission_name = '''''' + @rightsaction + '''''') + BEGIN + '' + @grantordeny + '' '' + @rightsaction + '' ON SCHEMA::'' + @schemaid + '' TO ['' + @RoleName + ''] + END +END + +'' + END + + IF @typeofobject in(''TABLE'',''SP'',''FUNCTIONS'',''VIEWS'') + BEGIN + + IF @objectname like ''%[%]%'' + BEGIN + + IF @typeofobject = ''TABLE'' + BEGIN + SET @sysTarget = ''sys.tables'' + SET @sysType = '''' + END + + IF @typeofobject = ''SP'' + BEGIN + SET @sysTarget = ''sys.procedures'' + SET @sysType = '''' + END + + IF @typeofobject = ''FUNCTIONS'' + BEGIN + SET @sysTarget = ''sys.objects'' + SET @sysType = '' and p.Type IN ( N''''FN'''', N''''IF'''', N''''TF'''', N''''FS'''', N''''FT'''' )'' + END + + IF @typeofobject = ''VIEWS'' + BEGIN + SET @sysTarget = ''sys.views'' + SET @sysType = '''' + END + + SET @Command = @Command + '' +DECLARE SP_cursor CURSOR FOR +SELECT p.name FROM '' + @sysTarget + '' p JOIN sys.schemas s ON s.schema_id = p.schema_id WHERE (p.name like '''''' + @objectname + '''''') and s.name = '''''' + @schemaid + '''' + @sysType + '''''' + +OPEN SP_cursor +FETCH NEXT FROM SP_cursor INTO @SP_Name +WHILE @@FETCH_STATUS = 0 +BEGIN + IF EXISTS(SELECT 1 FROM sys.fn_builtin_permissions(''''OBJECT'''') WHERE permission_name = '''''' + @rightsaction + '''''') + BEGIN + EXEC('''''' + @grantordeny + '' '' + @rightsaction + '' ON ['' + @schemaid + ''].['''' + @SP_Name + ''''] TO ['' + @RoleName + '']'''') + END + FETCH NEXT FROM SP_cursor INTO @SP_Name +END + +CLOSE SP_cursor +DEALLOCATE SP_cursor + +'' + + END + ELSE + BEGIN + + SET @Command = @Command + '' +IF EXISTS(SELECT 1 FROM sys.objects o WITH (NOLOCK) JOIN sys.schemas s ON s.schema_id = o.schema_id WHERE o.name = '''''' + @objectname + '''''' AND o.type IN (N''''U'''',''''P'''',''''V'''',''''FN'''',''''IF'''',''''TF'''') AND s.name = '''''' + @schemaid + '''''') +BEGIN + IF EXISTS(SELECT 1 FROM sys.fn_builtin_permissions(''''OBJECT'''') WHERE permission_name = '''''' + @rightsaction + '''''') + BEGIN + '' + @grantordeny + '' '' + @rightsaction + '' ON ['' + @schemaid + ''].['' + @objectname + ''] TO ['' + @RoleName + ''] + END +END + +'' + END + END + + IF @typeofobject = ''ASSEMBLIES'' + BEGIN + SET @Command = @Command + '' +IF EXISTS(SELECT 1 FROM sys.assemblies WHERE NAME = '''''' + @objectname + '''''') +BEGIN + IF EXISTS(SELECT 1 FROM sys.fn_builtin_permissions(''''ASSEMBLY'''') WHERE permission_name = '''''' + @rightsaction + '''''') + BEGIN + '' + @grantordeny + '' '' + @rightsaction + ''::['' + @objectname + ''] TO ['' + @RoleName + ''] + END +END + +'' + END + + IF @typeofobject = ''ROLE'' + BEGIN + SET @Command = @Command + '' +IF NOT EXISTS (SELECT 1 FROM sys.database_role_members JOIN sys.database_principals roles ON database_role_members.role_principal_id = roles.principal_id JOIN sys.database_principals members ON database_role_members.member_principal_id = members.principal_id WHERE roles.name = '''''' + @rightsaction + '''''' AND members.name = '''''' + @RoleName + '''''') +BEGIN + EXEC sp_addrolemember N'''''' + @rightsaction + '''''', N'''''' + @RoleName + '''''' +END + +'' + END + + FETCH NEXT FROM SecurablesCurs INTO @typeofobject, @grantordeny, @rightsaction, @objectname, @schemaid + END + +CLOSE SecurablesCurs +DEALLOCATE SecurablesCurs + +PRINT ''SET ALL SECURABLES ON ROLE ['' + @RoleName + '']'' +EXEC sp_executesql @Command + +END + +/* ADD USER */ +DECLARE UsersCurs CURSOR FOR +SELECT username + FROM #UsersOnRole + +OPEN UsersCurs + +FETCH NEXT FROM UsersCurs INTO @Users +WHILE @@FETCH_STATUS = 0 +BEGIN + + SELECT @Command = '' +EXEC sp_addrolemember N'''''' + @RoleName + '''''', N'''''' + @Users + '''''' +PRINT ''''ADD USER ['' + @Users + ''] ON ROLE ['' + @RoleName + '']'''' +'' + +FETCH NEXT FROM UsersCurs INTO @Users +END + +CLOSE UsersCurs +DEALLOCATE UsersCurs + +EXEC sp_executesql @Command + +/*============================================================================= + Drop temp tables +=============================================================================*/ +DROP TABLE #Securables +DROP TABLE #UsersOnRole','ArizonaCUST','Pharmacies') + +INSERT INTO #AllRoles(STR_Definition,STR_Database,STR_Product)VALUES(' + +/*============================================================================= + + Script to create dbRoleSyncAccountingExtraction role. + + Role Name: dbRoleSyncAccountingExtraction + TEMPLATE: Default + + EXAMPLE OF SECURABLES TO SET: + + INSERT INTO #Securables + VALUES + (''DB'',''GRANT'',''VIEW DEFINITION'','''',''''), + (''SCHEMA'',''GRANT'',''SELECT,EXECUTE,INSERT,UPDATE,DELETE'','''',''AP''), + (''TABLE'',''GRANT'',''INSERT,UPDATE'',''Address'',''dbo''), + (''SP'',''GRANT'',''EXECUTE'',''sp_bmc_GetNextID'',''dbo''), + (''ROLE'',''GRANT'',''db_datareader'','''','''') + + ----------------------------------------------- + +Generate date : 2023-05-12 / up208700 + +=============================================================================*/ + +DECLARE @Command nvarchar(max), + @RoleName varchar(60), + @Users varchar(255), + @typeofobject varchar(50), + @grantordeny varchar(10), + @rightsaction varchar(255), + @objectname varchar(255), + @schemaid varchar(10), + @sysTarget varchar(255), + @sysType varchar(255) + +SET @RoleName = ''dbRoleSyncAccountingExtraction'' +SET @Command = '''' + +/* TEMP TABLES */ +CREATE TABLE #UsersOnRole(username varchar(255)) +CREATE TABLE #Securables(typeofobject varchar(50), grantordeny varchar(10), rightsaction varchar(255), objectname varchar(255), schemaid varchar(10),N2 bit) + +/* !!! LIST OF SECURABLES TO CHANGE !!! */ + +INSERT INTO #Securables +VALUES +(''DB'',''GRANT'',''EXECUTE'','''',''dbo'',0) +,(''DB'',''GRANT'',''VIEW DEFINITION'','''',''dbo'',0) +,(''ROLE'',''GRANT'',''DB_DATAREADER'','''',''dbo'',0) +,(''ROLE'',''GRANT'',''DB_DATAWRITER'','''',''dbo'',0) + + +/* GET ALL USERS ON THIS ROLE */ +INSERT INTO #UsersOnRole +SELECT + members.name +FROM sys.database_role_members + JOIN sys.database_principals roles ON database_role_members.role_principal_id = roles.principal_id + JOIN sys.database_principals members ON database_role_members.member_principal_id = members.principal_id +WHERE roles.name = @RoleName + +/* CREATE ROLE */ +SELECT @Command = '' +IF NOT EXISTS (SELECT 1 FROM sys.database_principals WHERE name = '''''' + @RoleName + '''''' AND type = ''''R'''') +BEGIN + CREATE ROLE ['' + @RoleName + ''] AUTHORIZATION [dbo] + PRINT ''''CREATE ROLE ['' + @RoleName + '']'''' +END +'' +EXEC sp_executesql @Command + +SET @Command = '' +DECLARE @SP_Name varchar(255) + +'' + +/* SET ALL ROLE SECURABLES */ +DECLARE SecurablesCurs CURSOR FOR +SELECT typeofobject, grantordeny, rightsaction, objectname, schemaid +FROM #Securables +WHERE N2 = 0 + +OPEN SecurablesCurs +FETCH NEXT FROM SecurablesCurs INTO @typeofobject, @grantordeny, @rightsaction, @objectname, @schemaid +WHILE @@FETCH_STATUS = 0 +BEGIN + + IF @typeofobject = ''DB'' + BEGIN + IF EXISTS(SELECT 1 FROM sys.fn_builtin_permissions(''DATABASE'') WHERE permission_name = '''' + @rightsaction + '''') + BEGIN + SET @Command = @Command + @grantordeny + '' '' + @rightsaction + '' TO ['' + @RoleName + ''] +'' + END + END + + IF @typeofobject = ''SCHEMA'' + BEGIN + SET @Command = @Command + '' +IF EXISTS (SELECT 1 FROM sys.schemas WHERE name = '''''' + @schemaid + '''''') +BEGIN + IF EXISTS(SELECT 1 FROM sys.fn_builtin_permissions(''''SCHEMA'''') WHERE permission_name = '''''' + @rightsaction + '''''') + BEGIN + '' + @grantordeny + '' '' + @rightsaction + '' ON SCHEMA::'' + @schemaid + '' TO ['' + @RoleName + ''] + END +END + +'' + END + + IF @typeofobject in(''TABLE'',''SP'',''FUNCTIONS'',''VIEWS'') + BEGIN + + IF @objectname like ''%[%]%'' + BEGIN + + IF @typeofobject = ''TABLE'' + BEGIN + SET @sysTarget = ''sys.tables'' + SET @sysType = '''' + END + + IF @typeofobject = ''SP'' + BEGIN + SET @sysTarget = ''sys.procedures'' + SET @sysType = '''' + END + + IF @typeofobject = ''FUNCTIONS'' + BEGIN + SET @sysTarget = ''sys.objects'' + SET @sysType = '' and p.Type IN ( N''''FN'''', N''''IF'''', N''''TF'''', N''''FS'''', N''''FT'''' )'' + END + + IF @typeofobject = ''VIEWS'' + BEGIN + SET @sysTarget = ''sys.views'' + SET @sysType = '''' + END + + SET @Command = @Command + '' +DECLARE SP_cursor CURSOR FOR +SELECT p.name FROM '' + @sysTarget + '' p JOIN sys.schemas s ON s.schema_id = p.schema_id WHERE (p.name like '''''' + @objectname + '''''') and s.name = '''''' + @schemaid + '''' + @sysType + '''''' + +OPEN SP_cursor +FETCH NEXT FROM SP_cursor INTO @SP_Name +WHILE @@FETCH_STATUS = 0 +BEGIN + IF EXISTS(SELECT 1 FROM sys.fn_builtin_permissions(''''OBJECT'''') WHERE permission_name = '''''' + @rightsaction + '''''') + BEGIN + EXEC('''''' + @grantordeny + '' '' + @rightsaction + '' ON ['' + @schemaid + ''].['''' + @SP_Name + ''''] TO ['' + @RoleName + '']'''') + END + FETCH NEXT FROM SP_cursor INTO @SP_Name +END + +CLOSE SP_cursor +DEALLOCATE SP_cursor + +'' + + END + ELSE + BEGIN + + SET @Command = @Command + '' +IF EXISTS(SELECT 1 FROM sys.objects o WITH (NOLOCK) JOIN sys.schemas s ON s.schema_id = o.schema_id WHERE o.name = '''''' + @objectname + '''''' AND o.type IN (N''''U'''',''''P'''',''''V'''',''''FN'''',''''IF'''',''''TF'''') AND s.name = '''''' + @schemaid + '''''') +BEGIN + IF EXISTS(SELECT 1 FROM sys.fn_builtin_permissions(''''OBJECT'''') WHERE permission_name = '''''' + @rightsaction + '''''') + BEGIN + '' + @grantordeny + '' '' + @rightsaction + '' ON ['' + @schemaid + ''].['' + @objectname + ''] TO ['' + @RoleName + ''] + END +END + +'' + END +END + +IF @typeofobject = ''ASSEMBLIES'' +BEGIN + SET @Command = @Command + '' +IF EXISTS(SELECT 1 FROM sys.assemblies WHERE NAME = '''''' + @objectname + '''''') +BEGIN + IF EXISTS(SELECT 1 FROM sys.fn_builtin_permissions(''''ASSEMBLY'''') WHERE permission_name = '''''' + @rightsaction + '''''') + BEGIN + '' + @grantordeny + '' '' + @rightsaction + ''::['' + @objectname + ''] TO ['' + @RoleName + ''] + END +END + +'' +END + +IF @typeofobject = ''ROLE'' +BEGIN + SET @Command = @Command + '' +IF NOT EXISTS (SELECT 1 FROM sys.database_role_members JOIN sys.database_principals roles ON database_role_members.role_principal_id = roles.principal_id JOIN sys.database_principals members ON database_role_members.member_principal_id = members.principal_id WHERE roles.name = '''''' + @rightsaction + '''''' AND members.name = '''''' + @RoleName + '''''') +BEGIN + EXEC sp_addrolemember N'''''' + @rightsaction + '''''', N'''''' + @RoleName + '''''' +END + +'' +END + +FETCH NEXT FROM SecurablesCurs INTO @typeofobject, @grantordeny, @rightsaction, @objectname, @schemaid +END + +CLOSE SecurablesCurs +DEALLOCATE SecurablesCurs + +PRINT ''SET ALL SECURABLES ON ROLE ['' + @RoleName + '']'' +EXEC sp_executesql @Command + +/* ADD USER */ +DECLARE UsersCurs CURSOR FOR +SELECT username + FROM #UsersOnRole + +OPEN UsersCurs + +FETCH NEXT FROM UsersCurs INTO @Users +WHILE @@FETCH_STATUS = 0 +BEGIN + + SELECT @Command = '' +EXEC sp_addrolemember N'''''' + @RoleName + '''''', N'''''' + @Users + '''''' +PRINT ''''ADD USER ['' + @Users + ''] ON ROLE ['' + @RoleName + '']'''' +'' + +FETCH NEXT FROM UsersCurs INTO @Users +END + +CLOSE UsersCurs +DEALLOCATE UsersCurs + +EXEC sp_executesql @Command + + +/*============================================================================= + Drop temp tables +=============================================================================*/ +DROP TABLE #Securables +DROP TABLE #UsersOnRole +','ArizonaCUST','Pharmacies') + +INSERT INTO #AllRoles(STR_Definition,STR_Database,STR_Product)VALUES(' + +/*============================================================================= + + Script to create dbRoleCsltUsr role. + + Role Name: dbRoleCsltUsr + TEMPLATE: N2 and PROD + + EXAMPLE OF SECURABLES TO SET: + + INSERT INTO #Securables + VALUES + (''DB'',''GRANT'',''VIEW DEFINITION'','''',''''), + (''SCHEMA'',''GRANT'',''SELECT,EXECUTE,INSERT,UPDATE,DELETE'','''',''AP''), + (''TABLE'',''GRANT'',''INSERT,UPDATE'',''Address'',''dbo''), + (''SP'',''GRANT'',''EXECUTE'',''sp_bmc_GetNextID'',''dbo''), + (''ROLE'',''GRANT'',''db_datareader'','''','''') + + ----------------------------------------------- + +Generate date : 2023-05-12 / up208700 + +=============================================================================*/ + +DECLARE @Type varchar(6), + @Command nvarchar(max), + @RoleName varchar(60), + @Users varchar(255), + @typeofobject varchar(50), + @grantordeny varchar(10), + @rightsaction varchar(255), + @objectname varchar(255), + @schemaid varchar(10), + @sysTarget varchar(255), + @sysType varchar(255) + +SET @RoleName = ''dbRoleCsltUsr'' +SET @Command = '''' + +SELECT @Type = [Type] FROM [master].[cfg].[InstanceContext] + +/* TEMP TABLES */ +CREATE TABLE #UsersOnRole(username varchar(255)) +CREATE TABLE #Securables(typeofobject varchar(50), grantordeny varchar(10), rightsaction varchar(255), objectname varchar(255), schemaid varchar(10),N2 bit) + +/* !!! LIST OF SECURABLES TO CHANGE !!! */ + +INSERT INTO #Securables +VALUES +(''ROLE'',''GRANT'',''DB_OWNER'','''',''dbo'',0) +,(''ROLE'',''GRANT'',''DB_OWNER'','''',''dbo'',1) + + +/* GET ALL USERS ON THIS ROLE */ +INSERT INTO #UsersOnRole +SELECT + members.name +FROM sys.database_role_members + JOIN sys.database_principals roles ON database_role_members.role_principal_id = roles.principal_id + JOIN sys.database_principals members ON database_role_members.member_principal_id = members.principal_id +WHERE roles.name = @RoleName + +/* CREATE ROLE */ +SELECT @Command = '' +IF NOT EXISTS (SELECT 1 FROM sys.database_principals WHERE name = '''''' + @RoleName + '''''' AND type = ''''R'''') +BEGIN + CREATE ROLE ['' + @RoleName + ''] AUTHORIZATION [dbo] + PRINT ''''CREATE ROLE ['' + @RoleName + '']'''' +END +'' +EXEC sp_executesql @Command + +SET @Command = '' +DECLARE @SP_Name varchar(255) + +'' + +/* SET ALL ROLE SECURABLES */ +IF @Type = ''DEVE'' +BEGIN + + DECLARE SecurablesCurs CURSOR FOR + SELECT typeofobject, grantordeny, rightsaction, objectname, schemaid + FROM #Securables + WHERE N2 = 1 + + OPEN SecurablesCurs + FETCH NEXT FROM SecurablesCurs INTO @typeofobject, @grantordeny, @rightsaction, @objectname, @schemaid + WHILE @@FETCH_STATUS = 0 + BEGIN + + IF @typeofobject = ''DB'' + BEGIN + IF EXISTS(SELECT 1 FROM sys.fn_builtin_permissions(''DATABASE'') WHERE permission_name = '''' + @rightsaction + '''') + BEGIN + SET @Command = @Command + @grantordeny + '' '' + @rightsaction + '' TO ['' + @RoleName + ''] +'' + END + END + + IF @typeofobject = ''SCHEMA'' + BEGIN + SET @Command = @Command + '' +IF EXISTS (SELECT 1 FROM sys.schemas WHERE name = '''''' + @schemaid + '''''') +BEGIN + IF EXISTS(SELECT 1 FROM sys.fn_builtin_permissions(''''SCHEMA'''') WHERE permission_name = '''''' + @rightsaction + '''''') + BEGIN + '' + @grantordeny + '' '' + @rightsaction + '' ON SCHEMA::'' + @schemaid + '' TO ['' + @RoleName + ''] + END +END + +'' + END + + IF @typeofobject in(''TABLE'',''SP'',''FUNCTIONS'',''VIEWS'') + BEGIN + + IF @objectname like ''%[%]%'' + BEGIN + IF @typeofobject = ''TABLE'' + BEGIN + SET @sysTarget = ''sys.tables'' + SET @sysType = '''' + END + + IF @typeofobject = ''SP'' + BEGIN + SET @sysTarget = ''sys.procedures'' + SET @sysType = '''' + END + + IF @typeofobject = ''FUNCTIONS'' + BEGIN + SET @sysTarget = ''sys.objects'' + SET @sysType = '' and p.Type IN ( N''''FN'''', N''''IF'''', N''''TF'''', N''''FS'''', N''''FT'''' )'' + END + + IF @typeofobject = ''VIEWS'' + BEGIN + SET @sysTarget = ''sys.views'' + SET @sysType = '''' + END + + SET @Command = @Command + '' +DECLARE SP_cursor CURSOR FOR +SELECT p.name FROM '' + @sysTarget + '' p JOIN sys.schemas s ON s.schema_id = p.schema_id WHERE (p.name like '''''' + @objectname + '''''') and s.name = '''''' + @schemaid + '''' + @sysType + '''''' + +OPEN SP_cursor +FETCH NEXT FROM SP_cursor INTO @SP_Name +WHILE @@FETCH_STATUS = 0 +BEGIN + IF EXISTS(SELECT 1 FROM sys.fn_builtin_permissions(''''OBJECT'''') WHERE permission_name = '''''' + @rightsaction + '''''') + BEGIN + EXEC('''''' + @grantordeny + '' '' + @rightsaction + '' ON ['' + @schemaid + ''].['''' + @SP_Name + ''''] TO ['' + @RoleName + '']'''') + END + FETCH NEXT FROM SP_cursor INTO @SP_Name +END + +CLOSE SP_cursor +DEALLOCATE SP_cursor + +'' + + END + ELSE + BEGIN + + SET @Command = @Command + '' +IF EXISTS(SELECT 1 FROM sys.objects o WITH (NOLOCK) JOIN sys.schemas s ON s.schema_id = o.schema_id WHERE o.name = '''''' + @objectname + '''''' AND o.type IN (N''''U'''',''''P'''',''''V'''',''''FN'''',''''IF'''',''''TF'''') AND s.name = '''''' + @schemaid + '''''') +BEGIN + IF EXISTS(SELECT 1 FROM sys.fn_builtin_permissions(''''OBJECT'''') WHERE permission_name = '''''' + @rightsaction + '''''') + BEGIN + '' + @grantordeny + '' '' + @rightsaction + '' ON ['' + @schemaid + ''].['' + @objectname + ''] TO ['' + @RoleName + ''] + END +END + +'' + END + END + + IF @typeofobject = ''ASSEMBLIES'' + BEGIN + SET @Command = @Command + '' +IF EXISTS(SELECT 1 FROM sys.assemblies WHERE NAME = '''''' + @objectname + '''''') +BEGIN + IF EXISTS(SELECT 1 FROM sys.fn_builtin_permissions(''''ASSEMBLY'''') WHERE permission_name = '''''' + @rightsaction + '''''') + BEGIN + '' + @grantordeny + '' '' + @rightsaction + ''::['' + @objectname + ''] TO ['' + @RoleName + ''] + END +END + +'' + END + + IF @typeofobject = ''ROLE'' + BEGIN + SET @Command = @Command + '' +IF NOT EXISTS (SELECT 1 FROM sys.database_role_members JOIN sys.database_principals roles ON database_role_members.role_principal_id = roles.principal_id JOIN sys.database_principals members ON database_role_members.member_principal_id = members.principal_id WHERE roles.name = '''''' + @rightsaction + '''''' AND members.name = '''''' + @RoleName + '''''') +BEGIN + EXEC sp_addrolemember N'''''' + @rightsaction + '''''', N'''''' + @RoleName + '''''' +END + +'' + END + + FETCH NEXT FROM SecurablesCurs INTO @typeofobject, @grantordeny, @rightsaction, @objectname, @schemaid + END + +CLOSE SecurablesCurs +DEALLOCATE SecurablesCurs + +PRINT ''SET ALL SECURABLES ON ROLE ['' + @RoleName + '']'' +EXEC sp_executesql @Command + +END +ELSE +BEGIN + + DECLARE SecurablesCurs CURSOR FOR + SELECT typeofobject, grantordeny, rightsaction, objectname, schemaid + FROM #Securables + WHERE N2 = 0 + + OPEN SecurablesCurs + FETCH NEXT FROM SecurablesCurs INTO @typeofobject, @grantordeny, @rightsaction, @objectname, @schemaid + WHILE @@FETCH_STATUS = 0 + BEGIN + + IF @typeofobject = ''DB'' + BEGIN + IF EXISTS(SELECT 1 FROM sys.fn_builtin_permissions(''DATABASE'') WHERE permission_name = '''' + @rightsaction + '''') + BEGIN + SET @Command = @Command + @grantordeny + '' '' + @rightsaction + '' TO ['' + @RoleName + ''] +'' + END + END + + IF @typeofobject = ''SCHEMA'' + BEGIN + SET @Command = @Command + '' +IF EXISTS (SELECT 1 FROM sys.schemas WHERE name = '''''' + @schemaid + '''''') +BEGIN + IF EXISTS(SELECT 1 FROM sys.fn_builtin_permissions(''''SCHEMA'''') WHERE permission_name = '''''' + @rightsaction + '''''') + BEGIN + '' + @grantordeny + '' '' + @rightsaction + '' ON SCHEMA::'' + @schemaid + '' TO ['' + @RoleName + ''] + END +END + +'' + END + + IF @typeofobject in(''TABLE'',''SP'',''FUNCTIONS'',''VIEWS'') + BEGIN + + IF @objectname like ''%[%]%'' + BEGIN + + IF @typeofobject = ''TABLE'' + BEGIN + SET @sysTarget = ''sys.tables'' + SET @sysType = '''' + END + + IF @typeofobject = ''SP'' + BEGIN + SET @sysTarget = ''sys.procedures'' + SET @sysType = '''' + END + + IF @typeofobject = ''FUNCTIONS'' + BEGIN + SET @sysTarget = ''sys.objects'' + SET @sysType = '' and p.Type IN ( N''''FN'''', N''''IF'''', N''''TF'''', N''''FS'''', N''''FT'''' )'' + END + + IF @typeofobject = ''VIEWS'' + BEGIN + SET @sysTarget = ''sys.views'' + SET @sysType = '''' + END + + SET @Command = @Command + '' +DECLARE SP_cursor CURSOR FOR +SELECT p.name FROM '' + @sysTarget + '' p JOIN sys.schemas s ON s.schema_id = p.schema_id WHERE (p.name like '''''' + @objectname + '''''') and s.name = '''''' + @schemaid + '''' + @sysType + '''''' + +OPEN SP_cursor +FETCH NEXT FROM SP_cursor INTO @SP_Name +WHILE @@FETCH_STATUS = 0 +BEGIN + IF EXISTS(SELECT 1 FROM sys.fn_builtin_permissions(''''OBJECT'''') WHERE permission_name = '''''' + @rightsaction + '''''') + BEGIN + EXEC('''''' + @grantordeny + '' '' + @rightsaction + '' ON ['' + @schemaid + ''].['''' + @SP_Name + ''''] TO ['' + @RoleName + '']'''') + END + FETCH NEXT FROM SP_cursor INTO @SP_Name +END + +CLOSE SP_cursor +DEALLOCATE SP_cursor + +'' + + END + ELSE + BEGIN + + SET @Command = @Command + '' +IF EXISTS(SELECT 1 FROM sys.objects o WITH (NOLOCK) JOIN sys.schemas s ON s.schema_id = o.schema_id WHERE o.name = '''''' + @objectname + '''''' AND o.type IN (N''''U'''',''''P'''',''''V'''',''''FN'''',''''IF'''',''''TF'''') AND s.name = '''''' + @schemaid + '''''') +BEGIN + IF EXISTS(SELECT 1 FROM sys.fn_builtin_permissions(''''OBJECT'''') WHERE permission_name = '''''' + @rightsaction + '''''') + BEGIN + '' + @grantordeny + '' '' + @rightsaction + '' ON ['' + @schemaid + ''].['' + @objectname + ''] TO ['' + @RoleName + ''] + END +END + +'' + END + END + + IF @typeofobject = ''ASSEMBLIES'' + BEGIN + SET @Command = @Command + '' +IF EXISTS(SELECT 1 FROM sys.assemblies WHERE NAME = '''''' + @objectname + '''''') +BEGIN + IF EXISTS(SELECT 1 FROM sys.fn_builtin_permissions(''''ASSEMBLY'''') WHERE permission_name = '''''' + @rightsaction + '''''') + BEGIN + '' + @grantordeny + '' '' + @rightsaction + ''::['' + @objectname + ''] TO ['' + @RoleName + ''] + END +END + +'' + END + + IF @typeofobject = ''ROLE'' + BEGIN + SET @Command = @Command + '' +IF NOT EXISTS (SELECT 1 FROM sys.database_role_members JOIN sys.database_principals roles ON database_role_members.role_principal_id = roles.principal_id JOIN sys.database_principals members ON database_role_members.member_principal_id = members.principal_id WHERE roles.name = '''''' + @rightsaction + '''''' AND members.name = '''''' + @RoleName + '''''') +BEGIN + EXEC sp_addrolemember N'''''' + @rightsaction + '''''', N'''''' + @RoleName + '''''' +END + +'' + END + + FETCH NEXT FROM SecurablesCurs INTO @typeofobject, @grantordeny, @rightsaction, @objectname, @schemaid + END + +CLOSE SecurablesCurs +DEALLOCATE SecurablesCurs + +PRINT ''SET ALL SECURABLES ON ROLE ['' + @RoleName + '']'' +EXEC sp_executesql @Command + +END + +/* ADD USER */ +DECLARE UsersCurs CURSOR FOR +SELECT username + FROM #UsersOnRole + +OPEN UsersCurs + +FETCH NEXT FROM UsersCurs INTO @Users +WHILE @@FETCH_STATUS = 0 +BEGIN + + SELECT @Command = '' +EXEC sp_addrolemember N'''''' + @RoleName + '''''', N'''''' + @Users + '''''' +PRINT ''''ADD USER ['' + @Users + ''] ON ROLE ['' + @RoleName + '']'''' +'' + +FETCH NEXT FROM UsersCurs INTO @Users +END + +CLOSE UsersCurs +DEALLOCATE UsersCurs + +EXEC sp_executesql @Command + +/*============================================================================= + Drop temp tables +=============================================================================*/ +DROP TABLE #Securables +DROP TABLE #UsersOnRole','ArizonaLD','Pharmacies') + +INSERT INTO #AllRoles(STR_Definition,STR_Database,STR_Product)VALUES(' + +/*============================================================================= + + Script to create dbRoleDevUsr role. + + Role Name: dbRoleDevUsr + TEMPLATE: Default + + EXAMPLE OF SECURABLES TO SET: + + INSERT INTO #Securables + VALUES + (''DB'',''GRANT'',''VIEW DEFINITION'','''',''''), + (''SCHEMA'',''GRANT'',''SELECT,EXECUTE,INSERT,UPDATE,DELETE'','''',''AP''), + (''TABLE'',''GRANT'',''INSERT,UPDATE'',''Address'',''dbo''), + (''SP'',''GRANT'',''EXECUTE'',''sp_bmc_GetNextID'',''dbo''), + (''ROLE'',''GRANT'',''db_datareader'','''','''') + + ----------------------------------------------- + +Generate date : 2023-05-12 / up208700 + +=============================================================================*/ + +DECLARE @Command nvarchar(max), + @RoleName varchar(60), + @Users varchar(255), + @typeofobject varchar(50), + @grantordeny varchar(10), + @rightsaction varchar(255), + @objectname varchar(255), + @schemaid varchar(10), + @sysTarget varchar(255), + @sysType varchar(255) + +SET @RoleName = ''dbRoleDevUsr'' +SET @Command = '''' + +/* TEMP TABLES */ +CREATE TABLE #UsersOnRole(username varchar(255)) +CREATE TABLE #Securables(typeofobject varchar(50), grantordeny varchar(10), rightsaction varchar(255), objectname varchar(255), schemaid varchar(10),N2 bit) + +/* !!! LIST OF SECURABLES TO CHANGE !!! */ + +INSERT INTO #Securables +VALUES +(''DB'',''GRANT'',''EXECUTE'','''',''dbo'',0) +,(''DB'',''GRANT'',''SHOWPLAN'','''',''dbo'',0) +,(''DB'',''GRANT'',''VIEW DEFINITION'','''',''dbo'',0) +,(''ROLE'',''GRANT'',''DB_DATAREADER'','''',''dbo'',0) +,(''ROLE'',''GRANT'',''DB_DATAWRITER'','''',''dbo'',0) + + +/* GET ALL USERS ON THIS ROLE */ +INSERT INTO #UsersOnRole +SELECT + members.name +FROM sys.database_role_members + JOIN sys.database_principals roles ON database_role_members.role_principal_id = roles.principal_id + JOIN sys.database_principals members ON database_role_members.member_principal_id = members.principal_id +WHERE roles.name = @RoleName + +/* CREATE ROLE */ +SELECT @Command = '' +IF NOT EXISTS (SELECT 1 FROM sys.database_principals WHERE name = '''''' + @RoleName + '''''' AND type = ''''R'''') +BEGIN + CREATE ROLE ['' + @RoleName + ''] AUTHORIZATION [dbo] + PRINT ''''CREATE ROLE ['' + @RoleName + '']'''' +END +'' +EXEC sp_executesql @Command + +SET @Command = '' +DECLARE @SP_Name varchar(255) + +'' + +/* SET ALL ROLE SECURABLES */ +DECLARE SecurablesCurs CURSOR FOR +SELECT typeofobject, grantordeny, rightsaction, objectname, schemaid +FROM #Securables +WHERE N2 = 0 + +OPEN SecurablesCurs +FETCH NEXT FROM SecurablesCurs INTO @typeofobject, @grantordeny, @rightsaction, @objectname, @schemaid +WHILE @@FETCH_STATUS = 0 +BEGIN + + IF @typeofobject = ''DB'' + BEGIN + IF EXISTS(SELECT 1 FROM sys.fn_builtin_permissions(''DATABASE'') WHERE permission_name = '''' + @rightsaction + '''') + BEGIN + SET @Command = @Command + @grantordeny + '' '' + @rightsaction + '' TO ['' + @RoleName + ''] +'' + END + END + + IF @typeofobject = ''SCHEMA'' + BEGIN + SET @Command = @Command + '' +IF EXISTS (SELECT 1 FROM sys.schemas WHERE name = '''''' + @schemaid + '''''') +BEGIN + IF EXISTS(SELECT 1 FROM sys.fn_builtin_permissions(''''SCHEMA'''') WHERE permission_name = '''''' + @rightsaction + '''''') + BEGIN + '' + @grantordeny + '' '' + @rightsaction + '' ON SCHEMA::'' + @schemaid + '' TO ['' + @RoleName + ''] + END +END + +'' + END + + IF @typeofobject in(''TABLE'',''SP'',''FUNCTIONS'',''VIEWS'') + BEGIN + + IF @objectname like ''%[%]%'' + BEGIN + + IF @typeofobject = ''TABLE'' + BEGIN + SET @sysTarget = ''sys.tables'' + SET @sysType = '''' + END + + IF @typeofobject = ''SP'' + BEGIN + SET @sysTarget = ''sys.procedures'' + SET @sysType = '''' + END + + IF @typeofobject = ''FUNCTIONS'' + BEGIN + SET @sysTarget = ''sys.objects'' + SET @sysType = '' and p.Type IN ( N''''FN'''', N''''IF'''', N''''TF'''', N''''FS'''', N''''FT'''' )'' + END + + IF @typeofobject = ''VIEWS'' + BEGIN + SET @sysTarget = ''sys.views'' + SET @sysType = '''' + END + + SET @Command = @Command + '' +DECLARE SP_cursor CURSOR FOR +SELECT p.name FROM '' + @sysTarget + '' p JOIN sys.schemas s ON s.schema_id = p.schema_id WHERE (p.name like '''''' + @objectname + '''''') and s.name = '''''' + @schemaid + '''' + @sysType + '''''' + +OPEN SP_cursor +FETCH NEXT FROM SP_cursor INTO @SP_Name +WHILE @@FETCH_STATUS = 0 +BEGIN + IF EXISTS(SELECT 1 FROM sys.fn_builtin_permissions(''''OBJECT'''') WHERE permission_name = '''''' + @rightsaction + '''''') + BEGIN + EXEC('''''' + @grantordeny + '' '' + @rightsaction + '' ON ['' + @schemaid + ''].['''' + @SP_Name + ''''] TO ['' + @RoleName + '']'''') + END + FETCH NEXT FROM SP_cursor INTO @SP_Name +END + +CLOSE SP_cursor +DEALLOCATE SP_cursor + +'' + + END + ELSE + BEGIN + + SET @Command = @Command + '' +IF EXISTS(SELECT 1 FROM sys.objects o WITH (NOLOCK) JOIN sys.schemas s ON s.schema_id = o.schema_id WHERE o.name = '''''' + @objectname + '''''' AND o.type IN (N''''U'''',''''P'''',''''V'''',''''FN'''',''''IF'''',''''TF'''') AND s.name = '''''' + @schemaid + '''''') +BEGIN + IF EXISTS(SELECT 1 FROM sys.fn_builtin_permissions(''''OBJECT'''') WHERE permission_name = '''''' + @rightsaction + '''''') + BEGIN + '' + @grantordeny + '' '' + @rightsaction + '' ON ['' + @schemaid + ''].['' + @objectname + ''] TO ['' + @RoleName + ''] + END +END + +'' + END +END + +IF @typeofobject = ''ASSEMBLIES'' +BEGIN + SET @Command = @Command + '' +IF EXISTS(SELECT 1 FROM sys.assemblies WHERE NAME = '''''' + @objectname + '''''') +BEGIN + IF EXISTS(SELECT 1 FROM sys.fn_builtin_permissions(''''ASSEMBLY'''') WHERE permission_name = '''''' + @rightsaction + '''''') + BEGIN + '' + @grantordeny + '' '' + @rightsaction + ''::['' + @objectname + ''] TO ['' + @RoleName + ''] + END +END + +'' +END + +IF @typeofobject = ''ROLE'' +BEGIN + SET @Command = @Command + '' +IF NOT EXISTS (SELECT 1 FROM sys.database_role_members JOIN sys.database_principals roles ON database_role_members.role_principal_id = roles.principal_id JOIN sys.database_principals members ON database_role_members.member_principal_id = members.principal_id WHERE roles.name = '''''' + @rightsaction + '''''' AND members.name = '''''' + @RoleName + '''''') +BEGIN + EXEC sp_addrolemember N'''''' + @rightsaction + '''''', N'''''' + @RoleName + '''''' +END + +'' +END + +FETCH NEXT FROM SecurablesCurs INTO @typeofobject, @grantordeny, @rightsaction, @objectname, @schemaid +END + +CLOSE SecurablesCurs +DEALLOCATE SecurablesCurs + +PRINT ''SET ALL SECURABLES ON ROLE ['' + @RoleName + '']'' +EXEC sp_executesql @Command + +/* ADD USER */ +DECLARE UsersCurs CURSOR FOR +SELECT username + FROM #UsersOnRole + +OPEN UsersCurs + +FETCH NEXT FROM UsersCurs INTO @Users +WHILE @@FETCH_STATUS = 0 +BEGIN + + SELECT @Command = '' +EXEC sp_addrolemember N'''''' + @RoleName + '''''', N'''''' + @Users + '''''' +PRINT ''''ADD USER ['' + @Users + ''] ON ROLE ['' + @RoleName + '']'''' +'' + +FETCH NEXT FROM UsersCurs INTO @Users +END + +CLOSE UsersCurs +DEALLOCATE UsersCurs + +EXEC sp_executesql @Command + + +/*============================================================================= + Drop temp tables +=============================================================================*/ +DROP TABLE #Securables +DROP TABLE #UsersOnRole +','ArizonaLD','Pharmacies') + +INSERT INTO #AllRoles(STR_Definition,STR_Database,STR_Product)VALUES(' + +/*============================================================================= + + Script to create dbRoleIttechUsr role. + + Role Name: dbRoleIttechUsr + TEMPLATE: N2 and PROD + + EXAMPLE OF SECURABLES TO SET: + + INSERT INTO #Securables + VALUES + (''DB'',''GRANT'',''VIEW DEFINITION'','''',''''), + (''SCHEMA'',''GRANT'',''SELECT,EXECUTE,INSERT,UPDATE,DELETE'','''',''AP''), + (''TABLE'',''GRANT'',''INSERT,UPDATE'',''Address'',''dbo''), + (''SP'',''GRANT'',''EXECUTE'',''sp_bmc_GetNextID'',''dbo''), + (''ROLE'',''GRANT'',''db_datareader'','''','''') + + ----------------------------------------------- + +Generate date : 2023-05-12 / up208700 + +=============================================================================*/ + +DECLARE @Type varchar(6), + @Command nvarchar(max), + @RoleName varchar(60), + @Users varchar(255), + @typeofobject varchar(50), + @grantordeny varchar(10), + @rightsaction varchar(255), + @objectname varchar(255), + @schemaid varchar(10), + @sysTarget varchar(255), + @sysType varchar(255) + +SET @RoleName = ''dbRoleIttechUsr'' +SET @Command = '''' + +SELECT @Type = [Type] FROM [master].[cfg].[InstanceContext] + +/* TEMP TABLES */ +CREATE TABLE #UsersOnRole(username varchar(255)) +CREATE TABLE #Securables(typeofobject varchar(50), grantordeny varchar(10), rightsaction varchar(255), objectname varchar(255), schemaid varchar(10),N2 bit) + +/* !!! LIST OF SECURABLES TO CHANGE !!! */ + +INSERT INTO #Securables +VALUES +(''DB'',''GRANT'',''EXECUTE'','''',''dbo'',0) +,(''ROLE'',''GRANT'',''DB_DATAREADER'','''',''dbo'',0) +,(''ROLE'',''GRANT'',''DB_DATAWRITER'','''',''dbo'',0) +,(''ROLE'',''GRANT'',''DB_OWNER'','''',''dbo'',1) + + +/* GET ALL USERS ON THIS ROLE */ +INSERT INTO #UsersOnRole +SELECT + members.name +FROM sys.database_role_members + JOIN sys.database_principals roles ON database_role_members.role_principal_id = roles.principal_id + JOIN sys.database_principals members ON database_role_members.member_principal_id = members.principal_id +WHERE roles.name = @RoleName + +/* CREATE ROLE */ +SELECT @Command = '' +IF NOT EXISTS (SELECT 1 FROM sys.database_principals WHERE name = '''''' + @RoleName + '''''' AND type = ''''R'''') +BEGIN + CREATE ROLE ['' + @RoleName + ''] AUTHORIZATION [dbo] + PRINT ''''CREATE ROLE ['' + @RoleName + '']'''' +END +'' +EXEC sp_executesql @Command + +SET @Command = '' +DECLARE @SP_Name varchar(255) + +'' + +/* SET ALL ROLE SECURABLES */ +IF @Type = ''DEVE'' +BEGIN + + DECLARE SecurablesCurs CURSOR FOR + SELECT typeofobject, grantordeny, rightsaction, objectname, schemaid + FROM #Securables + WHERE N2 = 1 + + OPEN SecurablesCurs + FETCH NEXT FROM SecurablesCurs INTO @typeofobject, @grantordeny, @rightsaction, @objectname, @schemaid + WHILE @@FETCH_STATUS = 0 + BEGIN + + IF @typeofobject = ''DB'' + BEGIN + IF EXISTS(SELECT 1 FROM sys.fn_builtin_permissions(''DATABASE'') WHERE permission_name = '''' + @rightsaction + '''') + BEGIN + SET @Command = @Command + @grantordeny + '' '' + @rightsaction + '' TO ['' + @RoleName + ''] +'' + END + END + + IF @typeofobject = ''SCHEMA'' + BEGIN + SET @Command = @Command + '' +IF EXISTS (SELECT 1 FROM sys.schemas WHERE name = '''''' + @schemaid + '''''') +BEGIN + IF EXISTS(SELECT 1 FROM sys.fn_builtin_permissions(''''SCHEMA'''') WHERE permission_name = '''''' + @rightsaction + '''''') + BEGIN + '' + @grantordeny + '' '' + @rightsaction + '' ON SCHEMA::'' + @schemaid + '' TO ['' + @RoleName + ''] + END +END + +'' + END + + IF @typeofobject in(''TABLE'',''SP'',''FUNCTIONS'',''VIEWS'') + BEGIN + + IF @objectname like ''%[%]%'' + BEGIN + IF @typeofobject = ''TABLE'' + BEGIN + SET @sysTarget = ''sys.tables'' + SET @sysType = '''' + END + + IF @typeofobject = ''SP'' + BEGIN + SET @sysTarget = ''sys.procedures'' + SET @sysType = '''' + END + + IF @typeofobject = ''FUNCTIONS'' + BEGIN + SET @sysTarget = ''sys.objects'' + SET @sysType = '' and p.Type IN ( N''''FN'''', N''''IF'''', N''''TF'''', N''''FS'''', N''''FT'''' )'' + END + + IF @typeofobject = ''VIEWS'' + BEGIN + SET @sysTarget = ''sys.views'' + SET @sysType = '''' + END + + SET @Command = @Command + '' +DECLARE SP_cursor CURSOR FOR +SELECT p.name FROM '' + @sysTarget + '' p JOIN sys.schemas s ON s.schema_id = p.schema_id WHERE (p.name like '''''' + @objectname + '''''') and s.name = '''''' + @schemaid + '''' + @sysType + '''''' + +OPEN SP_cursor +FETCH NEXT FROM SP_cursor INTO @SP_Name +WHILE @@FETCH_STATUS = 0 +BEGIN + IF EXISTS(SELECT 1 FROM sys.fn_builtin_permissions(''''OBJECT'''') WHERE permission_name = '''''' + @rightsaction + '''''') + BEGIN + EXEC('''''' + @grantordeny + '' '' + @rightsaction + '' ON ['' + @schemaid + ''].['''' + @SP_Name + ''''] TO ['' + @RoleName + '']'''') + END + FETCH NEXT FROM SP_cursor INTO @SP_Name +END + +CLOSE SP_cursor +DEALLOCATE SP_cursor + +'' + + END + ELSE + BEGIN + + SET @Command = @Command + '' +IF EXISTS(SELECT 1 FROM sys.objects o WITH (NOLOCK) JOIN sys.schemas s ON s.schema_id = o.schema_id WHERE o.name = '''''' + @objectname + '''''' AND o.type IN (N''''U'''',''''P'''',''''V'''',''''FN'''',''''IF'''',''''TF'''') AND s.name = '''''' + @schemaid + '''''') +BEGIN + IF EXISTS(SELECT 1 FROM sys.fn_builtin_permissions(''''OBJECT'''') WHERE permission_name = '''''' + @rightsaction + '''''') + BEGIN + '' + @grantordeny + '' '' + @rightsaction + '' ON ['' + @schemaid + ''].['' + @objectname + ''] TO ['' + @RoleName + ''] + END +END + +'' + END + END + + IF @typeofobject = ''ASSEMBLIES'' + BEGIN + SET @Command = @Command + '' +IF EXISTS(SELECT 1 FROM sys.assemblies WHERE NAME = '''''' + @objectname + '''''') +BEGIN + IF EXISTS(SELECT 1 FROM sys.fn_builtin_permissions(''''ASSEMBLY'''') WHERE permission_name = '''''' + @rightsaction + '''''') + BEGIN + '' + @grantordeny + '' '' + @rightsaction + ''::['' + @objectname + ''] TO ['' + @RoleName + ''] + END +END + +'' + END + + IF @typeofobject = ''ROLE'' + BEGIN + SET @Command = @Command + '' +IF NOT EXISTS (SELECT 1 FROM sys.database_role_members JOIN sys.database_principals roles ON database_role_members.role_principal_id = roles.principal_id JOIN sys.database_principals members ON database_role_members.member_principal_id = members.principal_id WHERE roles.name = '''''' + @rightsaction + '''''' AND members.name = '''''' + @RoleName + '''''') +BEGIN + EXEC sp_addrolemember N'''''' + @rightsaction + '''''', N'''''' + @RoleName + '''''' +END + +'' + END + + FETCH NEXT FROM SecurablesCurs INTO @typeofobject, @grantordeny, @rightsaction, @objectname, @schemaid + END + +CLOSE SecurablesCurs +DEALLOCATE SecurablesCurs + +PRINT ''SET ALL SECURABLES ON ROLE ['' + @RoleName + '']'' +EXEC sp_executesql @Command + +END +ELSE +BEGIN + + DECLARE SecurablesCurs CURSOR FOR + SELECT typeofobject, grantordeny, rightsaction, objectname, schemaid + FROM #Securables + WHERE N2 = 0 + + OPEN SecurablesCurs + FETCH NEXT FROM SecurablesCurs INTO @typeofobject, @grantordeny, @rightsaction, @objectname, @schemaid + WHILE @@FETCH_STATUS = 0 + BEGIN + + IF @typeofobject = ''DB'' + BEGIN + IF EXISTS(SELECT 1 FROM sys.fn_builtin_permissions(''DATABASE'') WHERE permission_name = '''' + @rightsaction + '''') + BEGIN + SET @Command = @Command + @grantordeny + '' '' + @rightsaction + '' TO ['' + @RoleName + ''] +'' + END + END + + IF @typeofobject = ''SCHEMA'' + BEGIN + SET @Command = @Command + '' +IF EXISTS (SELECT 1 FROM sys.schemas WHERE name = '''''' + @schemaid + '''''') +BEGIN + IF EXISTS(SELECT 1 FROM sys.fn_builtin_permissions(''''SCHEMA'''') WHERE permission_name = '''''' + @rightsaction + '''''') + BEGIN + '' + @grantordeny + '' '' + @rightsaction + '' ON SCHEMA::'' + @schemaid + '' TO ['' + @RoleName + ''] + END +END + +'' + END + + IF @typeofobject in(''TABLE'',''SP'',''FUNCTIONS'',''VIEWS'') + BEGIN + + IF @objectname like ''%[%]%'' + BEGIN + + IF @typeofobject = ''TABLE'' + BEGIN + SET @sysTarget = ''sys.tables'' + SET @sysType = '''' + END + + IF @typeofobject = ''SP'' + BEGIN + SET @sysTarget = ''sys.procedures'' + SET @sysType = '''' + END + + IF @typeofobject = ''FUNCTIONS'' + BEGIN + SET @sysTarget = ''sys.objects'' + SET @sysType = '' and p.Type IN ( N''''FN'''', N''''IF'''', N''''TF'''', N''''FS'''', N''''FT'''' )'' + END + + IF @typeofobject = ''VIEWS'' + BEGIN + SET @sysTarget = ''sys.views'' + SET @sysType = '''' + END + + SET @Command = @Command + '' +DECLARE SP_cursor CURSOR FOR +SELECT p.name FROM '' + @sysTarget + '' p JOIN sys.schemas s ON s.schema_id = p.schema_id WHERE (p.name like '''''' + @objectname + '''''') and s.name = '''''' + @schemaid + '''' + @sysType + '''''' + +OPEN SP_cursor +FETCH NEXT FROM SP_cursor INTO @SP_Name +WHILE @@FETCH_STATUS = 0 +BEGIN + IF EXISTS(SELECT 1 FROM sys.fn_builtin_permissions(''''OBJECT'''') WHERE permission_name = '''''' + @rightsaction + '''''') + BEGIN + EXEC('''''' + @grantordeny + '' '' + @rightsaction + '' ON ['' + @schemaid + ''].['''' + @SP_Name + ''''] TO ['' + @RoleName + '']'''') + END + FETCH NEXT FROM SP_cursor INTO @SP_Name +END + +CLOSE SP_cursor +DEALLOCATE SP_cursor + +'' + + END + ELSE + BEGIN + + SET @Command = @Command + '' +IF EXISTS(SELECT 1 FROM sys.objects o WITH (NOLOCK) JOIN sys.schemas s ON s.schema_id = o.schema_id WHERE o.name = '''''' + @objectname + '''''' AND o.type IN (N''''U'''',''''P'''',''''V'''',''''FN'''',''''IF'''',''''TF'''') AND s.name = '''''' + @schemaid + '''''') +BEGIN + IF EXISTS(SELECT 1 FROM sys.fn_builtin_permissions(''''OBJECT'''') WHERE permission_name = '''''' + @rightsaction + '''''') + BEGIN + '' + @grantordeny + '' '' + @rightsaction + '' ON ['' + @schemaid + ''].['' + @objectname + ''] TO ['' + @RoleName + ''] + END +END + +'' + END + END + + IF @typeofobject = ''ASSEMBLIES'' + BEGIN + SET @Command = @Command + '' +IF EXISTS(SELECT 1 FROM sys.assemblies WHERE NAME = '''''' + @objectname + '''''') +BEGIN + IF EXISTS(SELECT 1 FROM sys.fn_builtin_permissions(''''ASSEMBLY'''') WHERE permission_name = '''''' + @rightsaction + '''''') + BEGIN + '' + @grantordeny + '' '' + @rightsaction + ''::['' + @objectname + ''] TO ['' + @RoleName + ''] + END +END + +'' + END + + IF @typeofobject = ''ROLE'' + BEGIN + SET @Command = @Command + '' +IF NOT EXISTS (SELECT 1 FROM sys.database_role_members JOIN sys.database_principals roles ON database_role_members.role_principal_id = roles.principal_id JOIN sys.database_principals members ON database_role_members.member_principal_id = members.principal_id WHERE roles.name = '''''' + @rightsaction + '''''' AND members.name = '''''' + @RoleName + '''''') +BEGIN + EXEC sp_addrolemember N'''''' + @rightsaction + '''''', N'''''' + @RoleName + '''''' +END + +'' + END + + FETCH NEXT FROM SecurablesCurs INTO @typeofobject, @grantordeny, @rightsaction, @objectname, @schemaid + END + +CLOSE SecurablesCurs +DEALLOCATE SecurablesCurs + +PRINT ''SET ALL SECURABLES ON ROLE ['' + @RoleName + '']'' +EXEC sp_executesql @Command + +END + +/* ADD USER */ +DECLARE UsersCurs CURSOR FOR +SELECT username + FROM #UsersOnRole + +OPEN UsersCurs + +FETCH NEXT FROM UsersCurs INTO @Users +WHILE @@FETCH_STATUS = 0 +BEGIN + + SELECT @Command = '' +EXEC sp_addrolemember N'''''' + @RoleName + '''''', N'''''' + @Users + '''''' +PRINT ''''ADD USER ['' + @Users + ''] ON ROLE ['' + @RoleName + '']'''' +'' + +FETCH NEXT FROM UsersCurs INTO @Users +END + +CLOSE UsersCurs +DEALLOCATE UsersCurs + +EXEC sp_executesql @Command + +/*============================================================================= + Drop temp tables +=============================================================================*/ +DROP TABLE #Securables +DROP TABLE #UsersOnRole','ArizonaLD','Pharmacies') + +INSERT INTO #AllRoles(STR_Definition,STR_Database,STR_Product)VALUES(' + +/*============================================================================= + + Script to create dbRoleSupUsr role. + + Role Name: dbRoleSupUsr + TEMPLATE: N2 and PROD + + EXAMPLE OF SECURABLES TO SET: + + INSERT INTO #Securables + VALUES + (''DB'',''GRANT'',''VIEW DEFINITION'','''',''''), + (''SCHEMA'',''GRANT'',''SELECT,EXECUTE,INSERT,UPDATE,DELETE'','''',''AP''), + (''TABLE'',''GRANT'',''INSERT,UPDATE'',''Address'',''dbo''), + (''SP'',''GRANT'',''EXECUTE'',''sp_bmc_GetNextID'',''dbo''), + (''ROLE'',''GRANT'',''db_datareader'','''','''') + + ----------------------------------------------- + +Generate date : 2023-05-12 / up208700 + +=============================================================================*/ + +DECLARE @Type varchar(6), + @Command nvarchar(max), + @RoleName varchar(60), + @Users varchar(255), + @typeofobject varchar(50), + @grantordeny varchar(10), + @rightsaction varchar(255), + @objectname varchar(255), + @schemaid varchar(10), + @sysTarget varchar(255), + @sysType varchar(255) + +SET @RoleName = ''dbRoleSupUsr'' +SET @Command = '''' + +SELECT @Type = [Type] FROM [master].[cfg].[InstanceContext] + +/* TEMP TABLES */ +CREATE TABLE #UsersOnRole(username varchar(255)) +CREATE TABLE #Securables(typeofobject varchar(50), grantordeny varchar(10), rightsaction varchar(255), objectname varchar(255), schemaid varchar(10),N2 bit) + +/* !!! LIST OF SECURABLES TO CHANGE !!! */ + +INSERT INTO #Securables +VALUES +(''DB'',''GRANT'',''EXECUTE'','''',''dbo'',0) +,(''ROLE'',''GRANT'',''DB_DATAREADER'','''',''dbo'',0) +,(''ROLE'',''GRANT'',''DB_DATAWRITER'','''',''dbo'',0) +,(''ROLE'',''GRANT'',''DB_OWNER'','''',''dbo'',1) + + +/* GET ALL USERS ON THIS ROLE */ +INSERT INTO #UsersOnRole +SELECT + members.name +FROM sys.database_role_members + JOIN sys.database_principals roles ON database_role_members.role_principal_id = roles.principal_id + JOIN sys.database_principals members ON database_role_members.member_principal_id = members.principal_id +WHERE roles.name = @RoleName + +/* CREATE ROLE */ +SELECT @Command = '' +IF NOT EXISTS (SELECT 1 FROM sys.database_principals WHERE name = '''''' + @RoleName + '''''' AND type = ''''R'''') +BEGIN + CREATE ROLE ['' + @RoleName + ''] AUTHORIZATION [dbo] + PRINT ''''CREATE ROLE ['' + @RoleName + '']'''' +END +'' +EXEC sp_executesql @Command + +SET @Command = '' +DECLARE @SP_Name varchar(255) + +'' + +/* SET ALL ROLE SECURABLES */ +IF @Type = ''DEVE'' +BEGIN + + DECLARE SecurablesCurs CURSOR FOR + SELECT typeofobject, grantordeny, rightsaction, objectname, schemaid + FROM #Securables + WHERE N2 = 1 + + OPEN SecurablesCurs + FETCH NEXT FROM SecurablesCurs INTO @typeofobject, @grantordeny, @rightsaction, @objectname, @schemaid + WHILE @@FETCH_STATUS = 0 + BEGIN + + IF @typeofobject = ''DB'' + BEGIN + IF EXISTS(SELECT 1 FROM sys.fn_builtin_permissions(''DATABASE'') WHERE permission_name = '''' + @rightsaction + '''') + BEGIN + SET @Command = @Command + @grantordeny + '' '' + @rightsaction + '' TO ['' + @RoleName + ''] +'' + END + END + + IF @typeofobject = ''SCHEMA'' + BEGIN + SET @Command = @Command + '' +IF EXISTS (SELECT 1 FROM sys.schemas WHERE name = '''''' + @schemaid + '''''') +BEGIN + IF EXISTS(SELECT 1 FROM sys.fn_builtin_permissions(''''SCHEMA'''') WHERE permission_name = '''''' + @rightsaction + '''''') + BEGIN + '' + @grantordeny + '' '' + @rightsaction + '' ON SCHEMA::'' + @schemaid + '' TO ['' + @RoleName + ''] + END +END + +'' + END + + IF @typeofobject in(''TABLE'',''SP'',''FUNCTIONS'',''VIEWS'') + BEGIN + + IF @objectname like ''%[%]%'' + BEGIN + IF @typeofobject = ''TABLE'' + BEGIN + SET @sysTarget = ''sys.tables'' + SET @sysType = '''' + END + + IF @typeofobject = ''SP'' + BEGIN + SET @sysTarget = ''sys.procedures'' + SET @sysType = '''' + END + + IF @typeofobject = ''FUNCTIONS'' + BEGIN + SET @sysTarget = ''sys.objects'' + SET @sysType = '' and p.Type IN ( N''''FN'''', N''''IF'''', N''''TF'''', N''''FS'''', N''''FT'''' )'' + END + + IF @typeofobject = ''VIEWS'' + BEGIN + SET @sysTarget = ''sys.views'' + SET @sysType = '''' + END + + SET @Command = @Command + '' +DECLARE SP_cursor CURSOR FOR +SELECT p.name FROM '' + @sysTarget + '' p JOIN sys.schemas s ON s.schema_id = p.schema_id WHERE (p.name like '''''' + @objectname + '''''') and s.name = '''''' + @schemaid + '''' + @sysType + '''''' + +OPEN SP_cursor +FETCH NEXT FROM SP_cursor INTO @SP_Name +WHILE @@FETCH_STATUS = 0 +BEGIN + IF EXISTS(SELECT 1 FROM sys.fn_builtin_permissions(''''OBJECT'''') WHERE permission_name = '''''' + @rightsaction + '''''') + BEGIN + EXEC('''''' + @grantordeny + '' '' + @rightsaction + '' ON ['' + @schemaid + ''].['''' + @SP_Name + ''''] TO ['' + @RoleName + '']'''') + END + FETCH NEXT FROM SP_cursor INTO @SP_Name +END + +CLOSE SP_cursor +DEALLOCATE SP_cursor + +'' + + END + ELSE + BEGIN + + SET @Command = @Command + '' +IF EXISTS(SELECT 1 FROM sys.objects o WITH (NOLOCK) JOIN sys.schemas s ON s.schema_id = o.schema_id WHERE o.name = '''''' + @objectname + '''''' AND o.type IN (N''''U'''',''''P'''',''''V'''',''''FN'''',''''IF'''',''''TF'''') AND s.name = '''''' + @schemaid + '''''') +BEGIN + IF EXISTS(SELECT 1 FROM sys.fn_builtin_permissions(''''OBJECT'''') WHERE permission_name = '''''' + @rightsaction + '''''') + BEGIN + '' + @grantordeny + '' '' + @rightsaction + '' ON ['' + @schemaid + ''].['' + @objectname + ''] TO ['' + @RoleName + ''] + END +END + +'' + END + END + + IF @typeofobject = ''ASSEMBLIES'' + BEGIN + SET @Command = @Command + '' +IF EXISTS(SELECT 1 FROM sys.assemblies WHERE NAME = '''''' + @objectname + '''''') +BEGIN + IF EXISTS(SELECT 1 FROM sys.fn_builtin_permissions(''''ASSEMBLY'''') WHERE permission_name = '''''' + @rightsaction + '''''') + BEGIN + '' + @grantordeny + '' '' + @rightsaction + ''::['' + @objectname + ''] TO ['' + @RoleName + ''] + END +END + +'' + END + + IF @typeofobject = ''ROLE'' + BEGIN + SET @Command = @Command + '' +IF NOT EXISTS (SELECT 1 FROM sys.database_role_members JOIN sys.database_principals roles ON database_role_members.role_principal_id = roles.principal_id JOIN sys.database_principals members ON database_role_members.member_principal_id = members.principal_id WHERE roles.name = '''''' + @rightsaction + '''''' AND members.name = '''''' + @RoleName + '''''') +BEGIN + EXEC sp_addrolemember N'''''' + @rightsaction + '''''', N'''''' + @RoleName + '''''' +END + +'' + END + + FETCH NEXT FROM SecurablesCurs INTO @typeofobject, @grantordeny, @rightsaction, @objectname, @schemaid + END + +CLOSE SecurablesCurs +DEALLOCATE SecurablesCurs + +PRINT ''SET ALL SECURABLES ON ROLE ['' + @RoleName + '']'' +EXEC sp_executesql @Command + +END +ELSE +BEGIN + + DECLARE SecurablesCurs CURSOR FOR + SELECT typeofobject, grantordeny, rightsaction, objectname, schemaid + FROM #Securables + WHERE N2 = 0 + + OPEN SecurablesCurs + FETCH NEXT FROM SecurablesCurs INTO @typeofobject, @grantordeny, @rightsaction, @objectname, @schemaid + WHILE @@FETCH_STATUS = 0 + BEGIN + + IF @typeofobject = ''DB'' + BEGIN + IF EXISTS(SELECT 1 FROM sys.fn_builtin_permissions(''DATABASE'') WHERE permission_name = '''' + @rightsaction + '''') + BEGIN + SET @Command = @Command + @grantordeny + '' '' + @rightsaction + '' TO ['' + @RoleName + ''] +'' + END + END + + IF @typeofobject = ''SCHEMA'' + BEGIN + SET @Command = @Command + '' +IF EXISTS (SELECT 1 FROM sys.schemas WHERE name = '''''' + @schemaid + '''''') +BEGIN + IF EXISTS(SELECT 1 FROM sys.fn_builtin_permissions(''''SCHEMA'''') WHERE permission_name = '''''' + @rightsaction + '''''') + BEGIN + '' + @grantordeny + '' '' + @rightsaction + '' ON SCHEMA::'' + @schemaid + '' TO ['' + @RoleName + ''] + END +END + +'' + END + + IF @typeofobject in(''TABLE'',''SP'',''FUNCTIONS'',''VIEWS'') + BEGIN + + IF @objectname like ''%[%]%'' + BEGIN + + IF @typeofobject = ''TABLE'' + BEGIN + SET @sysTarget = ''sys.tables'' + SET @sysType = '''' + END + + IF @typeofobject = ''SP'' + BEGIN + SET @sysTarget = ''sys.procedures'' + SET @sysType = '''' + END + + IF @typeofobject = ''FUNCTIONS'' + BEGIN + SET @sysTarget = ''sys.objects'' + SET @sysType = '' and p.Type IN ( N''''FN'''', N''''IF'''', N''''TF'''', N''''FS'''', N''''FT'''' )'' + END + + IF @typeofobject = ''VIEWS'' + BEGIN + SET @sysTarget = ''sys.views'' + SET @sysType = '''' + END + + SET @Command = @Command + '' +DECLARE SP_cursor CURSOR FOR +SELECT p.name FROM '' + @sysTarget + '' p JOIN sys.schemas s ON s.schema_id = p.schema_id WHERE (p.name like '''''' + @objectname + '''''') and s.name = '''''' + @schemaid + '''' + @sysType + '''''' + +OPEN SP_cursor +FETCH NEXT FROM SP_cursor INTO @SP_Name +WHILE @@FETCH_STATUS = 0 +BEGIN + IF EXISTS(SELECT 1 FROM sys.fn_builtin_permissions(''''OBJECT'''') WHERE permission_name = '''''' + @rightsaction + '''''') + BEGIN + EXEC('''''' + @grantordeny + '' '' + @rightsaction + '' ON ['' + @schemaid + ''].['''' + @SP_Name + ''''] TO ['' + @RoleName + '']'''') + END + FETCH NEXT FROM SP_cursor INTO @SP_Name +END + +CLOSE SP_cursor +DEALLOCATE SP_cursor + +'' + + END + ELSE + BEGIN + + SET @Command = @Command + '' +IF EXISTS(SELECT 1 FROM sys.objects o WITH (NOLOCK) JOIN sys.schemas s ON s.schema_id = o.schema_id WHERE o.name = '''''' + @objectname + '''''' AND o.type IN (N''''U'''',''''P'''',''''V'''',''''FN'''',''''IF'''',''''TF'''') AND s.name = '''''' + @schemaid + '''''') +BEGIN + IF EXISTS(SELECT 1 FROM sys.fn_builtin_permissions(''''OBJECT'''') WHERE permission_name = '''''' + @rightsaction + '''''') + BEGIN + '' + @grantordeny + '' '' + @rightsaction + '' ON ['' + @schemaid + ''].['' + @objectname + ''] TO ['' + @RoleName + ''] + END +END + +'' + END + END + + IF @typeofobject = ''ASSEMBLIES'' + BEGIN + SET @Command = @Command + '' +IF EXISTS(SELECT 1 FROM sys.assemblies WHERE NAME = '''''' + @objectname + '''''') +BEGIN + IF EXISTS(SELECT 1 FROM sys.fn_builtin_permissions(''''ASSEMBLY'''') WHERE permission_name = '''''' + @rightsaction + '''''') + BEGIN + '' + @grantordeny + '' '' + @rightsaction + ''::['' + @objectname + ''] TO ['' + @RoleName + ''] + END +END + +'' + END + + IF @typeofobject = ''ROLE'' + BEGIN + SET @Command = @Command + '' +IF NOT EXISTS (SELECT 1 FROM sys.database_role_members JOIN sys.database_principals roles ON database_role_members.role_principal_id = roles.principal_id JOIN sys.database_principals members ON database_role_members.member_principal_id = members.principal_id WHERE roles.name = '''''' + @rightsaction + '''''' AND members.name = '''''' + @RoleName + '''''') +BEGIN + EXEC sp_addrolemember N'''''' + @rightsaction + '''''', N'''''' + @RoleName + '''''' +END + +'' + END + + FETCH NEXT FROM SecurablesCurs INTO @typeofobject, @grantordeny, @rightsaction, @objectname, @schemaid + END + +CLOSE SecurablesCurs +DEALLOCATE SecurablesCurs + +PRINT ''SET ALL SECURABLES ON ROLE ['' + @RoleName + '']'' +EXEC sp_executesql @Command + +END + +/* ADD USER */ +DECLARE UsersCurs CURSOR FOR +SELECT username + FROM #UsersOnRole + +OPEN UsersCurs + +FETCH NEXT FROM UsersCurs INTO @Users +WHILE @@FETCH_STATUS = 0 +BEGIN + + SELECT @Command = '' +EXEC sp_addrolemember N'''''' + @RoleName + '''''', N'''''' + @Users + '''''' +PRINT ''''ADD USER ['' + @Users + ''] ON ROLE ['' + @RoleName + '']'''' +'' + +FETCH NEXT FROM UsersCurs INTO @Users +END + +CLOSE UsersCurs +DEALLOCATE UsersCurs + +EXEC sp_executesql @Command + +/*============================================================================= + Drop temp tables +=============================================================================*/ +DROP TABLE #Securables +DROP TABLE #UsersOnRole','ArizonaLD','Pharmacies') + +INSERT INTO #AllRoles(STR_Definition,STR_Database,STR_Product)VALUES(' + +/*============================================================================= + + Script to create dbRoleCsltUsr role. + + Role Name: dbRoleCsltUsr + TEMPLATE: N2 and PROD + + EXAMPLE OF SECURABLES TO SET: + + INSERT INTO #Securables + VALUES + (''DB'',''GRANT'',''VIEW DEFINITION'','''',''''), + (''SCHEMA'',''GRANT'',''SELECT,EXECUTE,INSERT,UPDATE,DELETE'','''',''AP''), + (''TABLE'',''GRANT'',''INSERT,UPDATE'',''Address'',''dbo''), + (''SP'',''GRANT'',''EXECUTE'',''sp_bmc_GetNextID'',''dbo''), + (''ROLE'',''GRANT'',''db_datareader'','''','''') + + ----------------------------------------------- + +Generate date : 2023-05-12 / up208700 + +=============================================================================*/ + +DECLARE @Type varchar(6), + @Command nvarchar(max), + @RoleName varchar(60), + @Users varchar(255), + @typeofobject varchar(50), + @grantordeny varchar(10), + @rightsaction varchar(255), + @objectname varchar(255), + @schemaid varchar(10), + @sysTarget varchar(255), + @sysType varchar(255) + +SET @RoleName = ''dbRoleCsltUsr'' +SET @Command = '''' + +SELECT @Type = [Type] FROM [master].[cfg].[InstanceContext] + +/* TEMP TABLES */ +CREATE TABLE #UsersOnRole(username varchar(255)) +CREATE TABLE #Securables(typeofobject varchar(50), grantordeny varchar(10), rightsaction varchar(255), objectname varchar(255), schemaid varchar(10),N2 bit) + +/* !!! LIST OF SECURABLES TO CHANGE !!! */ + +INSERT INTO #Securables +VALUES +(''ROLE'',''GRANT'',''DB_OWNER'','''',''dbo'',0) +,(''ROLE'',''GRANT'',''DB_OWNER'','''',''dbo'',1) + + +/* GET ALL USERS ON THIS ROLE */ +INSERT INTO #UsersOnRole +SELECT + members.name +FROM sys.database_role_members + JOIN sys.database_principals roles ON database_role_members.role_principal_id = roles.principal_id + JOIN sys.database_principals members ON database_role_members.member_principal_id = members.principal_id +WHERE roles.name = @RoleName + +/* CREATE ROLE */ +SELECT @Command = '' +IF NOT EXISTS (SELECT 1 FROM sys.database_principals WHERE name = '''''' + @RoleName + '''''' AND type = ''''R'''') +BEGIN + CREATE ROLE ['' + @RoleName + ''] AUTHORIZATION [dbo] + PRINT ''''CREATE ROLE ['' + @RoleName + '']'''' +END +'' +EXEC sp_executesql @Command + +SET @Command = '' +DECLARE @SP_Name varchar(255) + +'' + +/* SET ALL ROLE SECURABLES */ +IF @Type = ''DEVE'' +BEGIN + + DECLARE SecurablesCurs CURSOR FOR + SELECT typeofobject, grantordeny, rightsaction, objectname, schemaid + FROM #Securables + WHERE N2 = 1 + + OPEN SecurablesCurs + FETCH NEXT FROM SecurablesCurs INTO @typeofobject, @grantordeny, @rightsaction, @objectname, @schemaid + WHILE @@FETCH_STATUS = 0 + BEGIN + + IF @typeofobject = ''DB'' + BEGIN + IF EXISTS(SELECT 1 FROM sys.fn_builtin_permissions(''DATABASE'') WHERE permission_name = '''' + @rightsaction + '''') + BEGIN + SET @Command = @Command + @grantordeny + '' '' + @rightsaction + '' TO ['' + @RoleName + ''] +'' + END + END + + IF @typeofobject = ''SCHEMA'' + BEGIN + SET @Command = @Command + '' +IF EXISTS (SELECT 1 FROM sys.schemas WHERE name = '''''' + @schemaid + '''''') +BEGIN + IF EXISTS(SELECT 1 FROM sys.fn_builtin_permissions(''''SCHEMA'''') WHERE permission_name = '''''' + @rightsaction + '''''') + BEGIN + '' + @grantordeny + '' '' + @rightsaction + '' ON SCHEMA::'' + @schemaid + '' TO ['' + @RoleName + ''] + END +END + +'' + END + + IF @typeofobject in(''TABLE'',''SP'',''FUNCTIONS'',''VIEWS'') + BEGIN + + IF @objectname like ''%[%]%'' + BEGIN + IF @typeofobject = ''TABLE'' + BEGIN + SET @sysTarget = ''sys.tables'' + SET @sysType = '''' + END + + IF @typeofobject = ''SP'' + BEGIN + SET @sysTarget = ''sys.procedures'' + SET @sysType = '''' + END + + IF @typeofobject = ''FUNCTIONS'' + BEGIN + SET @sysTarget = ''sys.objects'' + SET @sysType = '' and p.Type IN ( N''''FN'''', N''''IF'''', N''''TF'''', N''''FS'''', N''''FT'''' )'' + END + + IF @typeofobject = ''VIEWS'' + BEGIN + SET @sysTarget = ''sys.views'' + SET @sysType = '''' + END + + SET @Command = @Command + '' +DECLARE SP_cursor CURSOR FOR +SELECT p.name FROM '' + @sysTarget + '' p JOIN sys.schemas s ON s.schema_id = p.schema_id WHERE (p.name like '''''' + @objectname + '''''') and s.name = '''''' + @schemaid + '''' + @sysType + '''''' + +OPEN SP_cursor +FETCH NEXT FROM SP_cursor INTO @SP_Name +WHILE @@FETCH_STATUS = 0 +BEGIN + IF EXISTS(SELECT 1 FROM sys.fn_builtin_permissions(''''OBJECT'''') WHERE permission_name = '''''' + @rightsaction + '''''') + BEGIN + EXEC('''''' + @grantordeny + '' '' + @rightsaction + '' ON ['' + @schemaid + ''].['''' + @SP_Name + ''''] TO ['' + @RoleName + '']'''') + END + FETCH NEXT FROM SP_cursor INTO @SP_Name +END + +CLOSE SP_cursor +DEALLOCATE SP_cursor + +'' + + END + ELSE + BEGIN + + SET @Command = @Command + '' +IF EXISTS(SELECT 1 FROM sys.objects o WITH (NOLOCK) JOIN sys.schemas s ON s.schema_id = o.schema_id WHERE o.name = '''''' + @objectname + '''''' AND o.type IN (N''''U'''',''''P'''',''''V'''',''''FN'''',''''IF'''',''''TF'''') AND s.name = '''''' + @schemaid + '''''') +BEGIN + IF EXISTS(SELECT 1 FROM sys.fn_builtin_permissions(''''OBJECT'''') WHERE permission_name = '''''' + @rightsaction + '''''') + BEGIN + '' + @grantordeny + '' '' + @rightsaction + '' ON ['' + @schemaid + ''].['' + @objectname + ''] TO ['' + @RoleName + ''] + END +END + +'' + END + END + + IF @typeofobject = ''ASSEMBLIES'' + BEGIN + SET @Command = @Command + '' +IF EXISTS(SELECT 1 FROM sys.assemblies WHERE NAME = '''''' + @objectname + '''''') +BEGIN + IF EXISTS(SELECT 1 FROM sys.fn_builtin_permissions(''''ASSEMBLY'''') WHERE permission_name = '''''' + @rightsaction + '''''') + BEGIN + '' + @grantordeny + '' '' + @rightsaction + ''::['' + @objectname + ''] TO ['' + @RoleName + ''] + END +END + +'' + END + + IF @typeofobject = ''ROLE'' + BEGIN + SET @Command = @Command + '' +IF NOT EXISTS (SELECT 1 FROM sys.database_role_members JOIN sys.database_principals roles ON database_role_members.role_principal_id = roles.principal_id JOIN sys.database_principals members ON database_role_members.member_principal_id = members.principal_id WHERE roles.name = '''''' + @rightsaction + '''''' AND members.name = '''''' + @RoleName + '''''') +BEGIN + EXEC sp_addrolemember N'''''' + @rightsaction + '''''', N'''''' + @RoleName + '''''' +END + +'' + END + + FETCH NEXT FROM SecurablesCurs INTO @typeofobject, @grantordeny, @rightsaction, @objectname, @schemaid + END + +CLOSE SecurablesCurs +DEALLOCATE SecurablesCurs + +PRINT ''SET ALL SECURABLES ON ROLE ['' + @RoleName + '']'' +EXEC sp_executesql @Command + +END +ELSE +BEGIN + + DECLARE SecurablesCurs CURSOR FOR + SELECT typeofobject, grantordeny, rightsaction, objectname, schemaid + FROM #Securables + WHERE N2 = 0 + + OPEN SecurablesCurs + FETCH NEXT FROM SecurablesCurs INTO @typeofobject, @grantordeny, @rightsaction, @objectname, @schemaid + WHILE @@FETCH_STATUS = 0 + BEGIN + + IF @typeofobject = ''DB'' + BEGIN + IF EXISTS(SELECT 1 FROM sys.fn_builtin_permissions(''DATABASE'') WHERE permission_name = '''' + @rightsaction + '''') + BEGIN + SET @Command = @Command + @grantordeny + '' '' + @rightsaction + '' TO ['' + @RoleName + ''] +'' + END + END + + IF @typeofobject = ''SCHEMA'' + BEGIN + SET @Command = @Command + '' +IF EXISTS (SELECT 1 FROM sys.schemas WHERE name = '''''' + @schemaid + '''''') +BEGIN + IF EXISTS(SELECT 1 FROM sys.fn_builtin_permissions(''''SCHEMA'''') WHERE permission_name = '''''' + @rightsaction + '''''') + BEGIN + '' + @grantordeny + '' '' + @rightsaction + '' ON SCHEMA::'' + @schemaid + '' TO ['' + @RoleName + ''] + END +END + +'' + END + + IF @typeofobject in(''TABLE'',''SP'',''FUNCTIONS'',''VIEWS'') + BEGIN + + IF @objectname like ''%[%]%'' + BEGIN + + IF @typeofobject = ''TABLE'' + BEGIN + SET @sysTarget = ''sys.tables'' + SET @sysType = '''' + END + + IF @typeofobject = ''SP'' + BEGIN + SET @sysTarget = ''sys.procedures'' + SET @sysType = '''' + END + + IF @typeofobject = ''FUNCTIONS'' + BEGIN + SET @sysTarget = ''sys.objects'' + SET @sysType = '' and p.Type IN ( N''''FN'''', N''''IF'''', N''''TF'''', N''''FS'''', N''''FT'''' )'' + END + + IF @typeofobject = ''VIEWS'' + BEGIN + SET @sysTarget = ''sys.views'' + SET @sysType = '''' + END + + SET @Command = @Command + '' +DECLARE SP_cursor CURSOR FOR +SELECT p.name FROM '' + @sysTarget + '' p JOIN sys.schemas s ON s.schema_id = p.schema_id WHERE (p.name like '''''' + @objectname + '''''') and s.name = '''''' + @schemaid + '''' + @sysType + '''''' + +OPEN SP_cursor +FETCH NEXT FROM SP_cursor INTO @SP_Name +WHILE @@FETCH_STATUS = 0 +BEGIN + IF EXISTS(SELECT 1 FROM sys.fn_builtin_permissions(''''OBJECT'''') WHERE permission_name = '''''' + @rightsaction + '''''') + BEGIN + EXEC('''''' + @grantordeny + '' '' + @rightsaction + '' ON ['' + @schemaid + ''].['''' + @SP_Name + ''''] TO ['' + @RoleName + '']'''') + END + FETCH NEXT FROM SP_cursor INTO @SP_Name +END + +CLOSE SP_cursor +DEALLOCATE SP_cursor + +'' + + END + ELSE + BEGIN + + SET @Command = @Command + '' +IF EXISTS(SELECT 1 FROM sys.objects o WITH (NOLOCK) JOIN sys.schemas s ON s.schema_id = o.schema_id WHERE o.name = '''''' + @objectname + '''''' AND o.type IN (N''''U'''',''''P'''',''''V'''',''''FN'''',''''IF'''',''''TF'''') AND s.name = '''''' + @schemaid + '''''') +BEGIN + IF EXISTS(SELECT 1 FROM sys.fn_builtin_permissions(''''OBJECT'''') WHERE permission_name = '''''' + @rightsaction + '''''') + BEGIN + '' + @grantordeny + '' '' + @rightsaction + '' ON ['' + @schemaid + ''].['' + @objectname + ''] TO ['' + @RoleName + ''] + END +END + +'' + END + END + + IF @typeofobject = ''ASSEMBLIES'' + BEGIN + SET @Command = @Command + '' +IF EXISTS(SELECT 1 FROM sys.assemblies WHERE NAME = '''''' + @objectname + '''''') +BEGIN + IF EXISTS(SELECT 1 FROM sys.fn_builtin_permissions(''''ASSEMBLY'''') WHERE permission_name = '''''' + @rightsaction + '''''') + BEGIN + '' + @grantordeny + '' '' + @rightsaction + ''::['' + @objectname + ''] TO ['' + @RoleName + ''] + END +END + +'' + END + + IF @typeofobject = ''ROLE'' + BEGIN + SET @Command = @Command + '' +IF NOT EXISTS (SELECT 1 FROM sys.database_role_members JOIN sys.database_principals roles ON database_role_members.role_principal_id = roles.principal_id JOIN sys.database_principals members ON database_role_members.member_principal_id = members.principal_id WHERE roles.name = '''''' + @rightsaction + '''''' AND members.name = '''''' + @RoleName + '''''') +BEGIN + EXEC sp_addrolemember N'''''' + @rightsaction + '''''', N'''''' + @RoleName + '''''' +END + +'' + END + + FETCH NEXT FROM SecurablesCurs INTO @typeofobject, @grantordeny, @rightsaction, @objectname, @schemaid + END + +CLOSE SecurablesCurs +DEALLOCATE SecurablesCurs + +PRINT ''SET ALL SECURABLES ON ROLE ['' + @RoleName + '']'' +EXEC sp_executesql @Command + +END + +/* ADD USER */ +DECLARE UsersCurs CURSOR FOR +SELECT username + FROM #UsersOnRole + +OPEN UsersCurs + +FETCH NEXT FROM UsersCurs INTO @Users +WHILE @@FETCH_STATUS = 0 +BEGIN + + SELECT @Command = '' +EXEC sp_addrolemember N'''''' + @RoleName + '''''', N'''''' + @Users + '''''' +PRINT ''''ADD USER ['' + @Users + ''] ON ROLE ['' + @RoleName + '']'''' +'' + +FETCH NEXT FROM UsersCurs INTO @Users +END + +CLOSE UsersCurs +DEALLOCATE UsersCurs + +EXEC sp_executesql @Command + +/*============================================================================= + Drop temp tables +=============================================================================*/ +DROP TABLE #Securables +DROP TABLE #UsersOnRole','ArizonaTest','Pharmacies') + +INSERT INTO #AllRoles(STR_Definition,STR_Database,STR_Product)VALUES(' + +/*============================================================================= + + Script to create dbRoleDevUsr role. + + Role Name: dbRoleDevUsr + TEMPLATE: Default + + EXAMPLE OF SECURABLES TO SET: + + INSERT INTO #Securables + VALUES + (''DB'',''GRANT'',''VIEW DEFINITION'','''',''''), + (''SCHEMA'',''GRANT'',''SELECT,EXECUTE,INSERT,UPDATE,DELETE'','''',''AP''), + (''TABLE'',''GRANT'',''INSERT,UPDATE'',''Address'',''dbo''), + (''SP'',''GRANT'',''EXECUTE'',''sp_bmc_GetNextID'',''dbo''), + (''ROLE'',''GRANT'',''db_datareader'','''','''') + + ----------------------------------------------- + +Generate date : 2023-05-12 / up208700 + +=============================================================================*/ + +DECLARE @Command nvarchar(max), + @RoleName varchar(60), + @Users varchar(255), + @typeofobject varchar(50), + @grantordeny varchar(10), + @rightsaction varchar(255), + @objectname varchar(255), + @schemaid varchar(10), + @sysTarget varchar(255), + @sysType varchar(255) + +SET @RoleName = ''dbRoleDevUsr'' +SET @Command = '''' + +/* TEMP TABLES */ +CREATE TABLE #UsersOnRole(username varchar(255)) +CREATE TABLE #Securables(typeofobject varchar(50), grantordeny varchar(10), rightsaction varchar(255), objectname varchar(255), schemaid varchar(10),N2 bit) + +/* !!! LIST OF SECURABLES TO CHANGE !!! */ + +INSERT INTO #Securables +VALUES +(''ROLE'',''GRANT'',''DB_OWNER'','''',''dbo'',0) + + +/* GET ALL USERS ON THIS ROLE */ +INSERT INTO #UsersOnRole +SELECT + members.name +FROM sys.database_role_members + JOIN sys.database_principals roles ON database_role_members.role_principal_id = roles.principal_id + JOIN sys.database_principals members ON database_role_members.member_principal_id = members.principal_id +WHERE roles.name = @RoleName + +/* CREATE ROLE */ +SELECT @Command = '' +IF NOT EXISTS (SELECT 1 FROM sys.database_principals WHERE name = '''''' + @RoleName + '''''' AND type = ''''R'''') +BEGIN + CREATE ROLE ['' + @RoleName + ''] AUTHORIZATION [dbo] + PRINT ''''CREATE ROLE ['' + @RoleName + '']'''' +END +'' +EXEC sp_executesql @Command + +SET @Command = '' +DECLARE @SP_Name varchar(255) + +'' + +/* SET ALL ROLE SECURABLES */ +DECLARE SecurablesCurs CURSOR FOR +SELECT typeofobject, grantordeny, rightsaction, objectname, schemaid +FROM #Securables +WHERE N2 = 0 + +OPEN SecurablesCurs +FETCH NEXT FROM SecurablesCurs INTO @typeofobject, @grantordeny, @rightsaction, @objectname, @schemaid +WHILE @@FETCH_STATUS = 0 +BEGIN + + IF @typeofobject = ''DB'' + BEGIN + IF EXISTS(SELECT 1 FROM sys.fn_builtin_permissions(''DATABASE'') WHERE permission_name = '''' + @rightsaction + '''') + BEGIN + SET @Command = @Command + @grantordeny + '' '' + @rightsaction + '' TO ['' + @RoleName + ''] +'' + END + END + + IF @typeofobject = ''SCHEMA'' + BEGIN + SET @Command = @Command + '' +IF EXISTS (SELECT 1 FROM sys.schemas WHERE name = '''''' + @schemaid + '''''') +BEGIN + IF EXISTS(SELECT 1 FROM sys.fn_builtin_permissions(''''SCHEMA'''') WHERE permission_name = '''''' + @rightsaction + '''''') + BEGIN + '' + @grantordeny + '' '' + @rightsaction + '' ON SCHEMA::'' + @schemaid + '' TO ['' + @RoleName + ''] + END +END + +'' + END + + IF @typeofobject in(''TABLE'',''SP'',''FUNCTIONS'',''VIEWS'') + BEGIN + + IF @objectname like ''%[%]%'' + BEGIN + + IF @typeofobject = ''TABLE'' + BEGIN + SET @sysTarget = ''sys.tables'' + SET @sysType = '''' + END + + IF @typeofobject = ''SP'' + BEGIN + SET @sysTarget = ''sys.procedures'' + SET @sysType = '''' + END + + IF @typeofobject = ''FUNCTIONS'' + BEGIN + SET @sysTarget = ''sys.objects'' + SET @sysType = '' and p.Type IN ( N''''FN'''', N''''IF'''', N''''TF'''', N''''FS'''', N''''FT'''' )'' + END + + IF @typeofobject = ''VIEWS'' + BEGIN + SET @sysTarget = ''sys.views'' + SET @sysType = '''' + END + + SET @Command = @Command + '' +DECLARE SP_cursor CURSOR FOR +SELECT p.name FROM '' + @sysTarget + '' p JOIN sys.schemas s ON s.schema_id = p.schema_id WHERE (p.name like '''''' + @objectname + '''''') and s.name = '''''' + @schemaid + '''' + @sysType + '''''' + +OPEN SP_cursor +FETCH NEXT FROM SP_cursor INTO @SP_Name +WHILE @@FETCH_STATUS = 0 +BEGIN + IF EXISTS(SELECT 1 FROM sys.fn_builtin_permissions(''''OBJECT'''') WHERE permission_name = '''''' + @rightsaction + '''''') + BEGIN + EXEC('''''' + @grantordeny + '' '' + @rightsaction + '' ON ['' + @schemaid + ''].['''' + @SP_Name + ''''] TO ['' + @RoleName + '']'''') + END + FETCH NEXT FROM SP_cursor INTO @SP_Name +END + +CLOSE SP_cursor +DEALLOCATE SP_cursor + +'' + + END + ELSE + BEGIN + + SET @Command = @Command + '' +IF EXISTS(SELECT 1 FROM sys.objects o WITH (NOLOCK) JOIN sys.schemas s ON s.schema_id = o.schema_id WHERE o.name = '''''' + @objectname + '''''' AND o.type IN (N''''U'''',''''P'''',''''V'''',''''FN'''',''''IF'''',''''TF'''') AND s.name = '''''' + @schemaid + '''''') +BEGIN + IF EXISTS(SELECT 1 FROM sys.fn_builtin_permissions(''''OBJECT'''') WHERE permission_name = '''''' + @rightsaction + '''''') + BEGIN + '' + @grantordeny + '' '' + @rightsaction + '' ON ['' + @schemaid + ''].['' + @objectname + ''] TO ['' + @RoleName + ''] + END +END + +'' + END +END + +IF @typeofobject = ''ASSEMBLIES'' +BEGIN + SET @Command = @Command + '' +IF EXISTS(SELECT 1 FROM sys.assemblies WHERE NAME = '''''' + @objectname + '''''') +BEGIN + IF EXISTS(SELECT 1 FROM sys.fn_builtin_permissions(''''ASSEMBLY'''') WHERE permission_name = '''''' + @rightsaction + '''''') + BEGIN + '' + @grantordeny + '' '' + @rightsaction + ''::['' + @objectname + ''] TO ['' + @RoleName + ''] + END +END + +'' +END + +IF @typeofobject = ''ROLE'' +BEGIN + SET @Command = @Command + '' +IF NOT EXISTS (SELECT 1 FROM sys.database_role_members JOIN sys.database_principals roles ON database_role_members.role_principal_id = roles.principal_id JOIN sys.database_principals members ON database_role_members.member_principal_id = members.principal_id WHERE roles.name = '''''' + @rightsaction + '''''' AND members.name = '''''' + @RoleName + '''''') +BEGIN + EXEC sp_addrolemember N'''''' + @rightsaction + '''''', N'''''' + @RoleName + '''''' +END + +'' +END + +FETCH NEXT FROM SecurablesCurs INTO @typeofobject, @grantordeny, @rightsaction, @objectname, @schemaid +END + +CLOSE SecurablesCurs +DEALLOCATE SecurablesCurs + +PRINT ''SET ALL SECURABLES ON ROLE ['' + @RoleName + '']'' +EXEC sp_executesql @Command + +/* ADD USER */ +DECLARE UsersCurs CURSOR FOR +SELECT username + FROM #UsersOnRole + +OPEN UsersCurs + +FETCH NEXT FROM UsersCurs INTO @Users +WHILE @@FETCH_STATUS = 0 +BEGIN + + SELECT @Command = '' +EXEC sp_addrolemember N'''''' + @RoleName + '''''', N'''''' + @Users + '''''' +PRINT ''''ADD USER ['' + @Users + ''] ON ROLE ['' + @RoleName + '']'''' +'' + +FETCH NEXT FROM UsersCurs INTO @Users +END + +CLOSE UsersCurs +DEALLOCATE UsersCurs + +EXEC sp_executesql @Command + + +/*============================================================================= + Drop temp tables +=============================================================================*/ +DROP TABLE #Securables +DROP TABLE #UsersOnRole +','ArizonaTest','Pharmacies') + +INSERT INTO #AllRoles(STR_Definition,STR_Database,STR_Product)VALUES(' + +/*============================================================================= + + Script to create dbRoleIttechUsr role. + + Role Name: dbRoleIttechUsr + TEMPLATE: N2 and PROD + + EXAMPLE OF SECURABLES TO SET: + + INSERT INTO #Securables + VALUES + (''DB'',''GRANT'',''VIEW DEFINITION'','''',''''), + (''SCHEMA'',''GRANT'',''SELECT,EXECUTE,INSERT,UPDATE,DELETE'','''',''AP''), + (''TABLE'',''GRANT'',''INSERT,UPDATE'',''Address'',''dbo''), + (''SP'',''GRANT'',''EXECUTE'',''sp_bmc_GetNextID'',''dbo''), + (''ROLE'',''GRANT'',''db_datareader'','''','''') + + ----------------------------------------------- + +Generate date : 2023-05-12 / up208700 + +=============================================================================*/ + +DECLARE @Type varchar(6), + @Command nvarchar(max), + @RoleName varchar(60), + @Users varchar(255), + @typeofobject varchar(50), + @grantordeny varchar(10), + @rightsaction varchar(255), + @objectname varchar(255), + @schemaid varchar(10), + @sysTarget varchar(255), + @sysType varchar(255) + +SET @RoleName = ''dbRoleIttechUsr'' +SET @Command = '''' + +SELECT @Type = [Type] FROM [master].[cfg].[InstanceContext] + +/* TEMP TABLES */ +CREATE TABLE #UsersOnRole(username varchar(255)) +CREATE TABLE #Securables(typeofobject varchar(50), grantordeny varchar(10), rightsaction varchar(255), objectname varchar(255), schemaid varchar(10),N2 bit) + +/* !!! LIST OF SECURABLES TO CHANGE !!! */ + +INSERT INTO #Securables +VALUES +(''ROLE'',''GRANT'',''DB_OWNER'','''',''dbo'',0) +,(''ROLE'',''GRANT'',''DB_OWNER'','''',''dbo'',1) + + +/* GET ALL USERS ON THIS ROLE */ +INSERT INTO #UsersOnRole +SELECT + members.name +FROM sys.database_role_members + JOIN sys.database_principals roles ON database_role_members.role_principal_id = roles.principal_id + JOIN sys.database_principals members ON database_role_members.member_principal_id = members.principal_id +WHERE roles.name = @RoleName + +/* CREATE ROLE */ +SELECT @Command = '' +IF NOT EXISTS (SELECT 1 FROM sys.database_principals WHERE name = '''''' + @RoleName + '''''' AND type = ''''R'''') +BEGIN + CREATE ROLE ['' + @RoleName + ''] AUTHORIZATION [dbo] + PRINT ''''CREATE ROLE ['' + @RoleName + '']'''' +END +'' +EXEC sp_executesql @Command + +SET @Command = '' +DECLARE @SP_Name varchar(255) + +'' + +/* SET ALL ROLE SECURABLES */ +IF @Type = ''DEVE'' +BEGIN + + DECLARE SecurablesCurs CURSOR FOR + SELECT typeofobject, grantordeny, rightsaction, objectname, schemaid + FROM #Securables + WHERE N2 = 1 + + OPEN SecurablesCurs + FETCH NEXT FROM SecurablesCurs INTO @typeofobject, @grantordeny, @rightsaction, @objectname, @schemaid + WHILE @@FETCH_STATUS = 0 + BEGIN + + IF @typeofobject = ''DB'' + BEGIN + IF EXISTS(SELECT 1 FROM sys.fn_builtin_permissions(''DATABASE'') WHERE permission_name = '''' + @rightsaction + '''') + BEGIN + SET @Command = @Command + @grantordeny + '' '' + @rightsaction + '' TO ['' + @RoleName + ''] +'' + END + END + + IF @typeofobject = ''SCHEMA'' + BEGIN + SET @Command = @Command + '' +IF EXISTS (SELECT 1 FROM sys.schemas WHERE name = '''''' + @schemaid + '''''') +BEGIN + IF EXISTS(SELECT 1 FROM sys.fn_builtin_permissions(''''SCHEMA'''') WHERE permission_name = '''''' + @rightsaction + '''''') + BEGIN + '' + @grantordeny + '' '' + @rightsaction + '' ON SCHEMA::'' + @schemaid + '' TO ['' + @RoleName + ''] + END +END + +'' + END + + IF @typeofobject in(''TABLE'',''SP'',''FUNCTIONS'',''VIEWS'') + BEGIN + + IF @objectname like ''%[%]%'' + BEGIN + IF @typeofobject = ''TABLE'' + BEGIN + SET @sysTarget = ''sys.tables'' + SET @sysType = '''' + END + + IF @typeofobject = ''SP'' + BEGIN + SET @sysTarget = ''sys.procedures'' + SET @sysType = '''' + END + + IF @typeofobject = ''FUNCTIONS'' + BEGIN + SET @sysTarget = ''sys.objects'' + SET @sysType = '' and p.Type IN ( N''''FN'''', N''''IF'''', N''''TF'''', N''''FS'''', N''''FT'''' )'' + END + + IF @typeofobject = ''VIEWS'' + BEGIN + SET @sysTarget = ''sys.views'' + SET @sysType = '''' + END + + SET @Command = @Command + '' +DECLARE SP_cursor CURSOR FOR +SELECT p.name FROM '' + @sysTarget + '' p JOIN sys.schemas s ON s.schema_id = p.schema_id WHERE (p.name like '''''' + @objectname + '''''') and s.name = '''''' + @schemaid + '''' + @sysType + '''''' + +OPEN SP_cursor +FETCH NEXT FROM SP_cursor INTO @SP_Name +WHILE @@FETCH_STATUS = 0 +BEGIN + IF EXISTS(SELECT 1 FROM sys.fn_builtin_permissions(''''OBJECT'''') WHERE permission_name = '''''' + @rightsaction + '''''') + BEGIN + EXEC('''''' + @grantordeny + '' '' + @rightsaction + '' ON ['' + @schemaid + ''].['''' + @SP_Name + ''''] TO ['' + @RoleName + '']'''') + END + FETCH NEXT FROM SP_cursor INTO @SP_Name +END + +CLOSE SP_cursor +DEALLOCATE SP_cursor + +'' + + END + ELSE + BEGIN + + SET @Command = @Command + '' +IF EXISTS(SELECT 1 FROM sys.objects o WITH (NOLOCK) JOIN sys.schemas s ON s.schema_id = o.schema_id WHERE o.name = '''''' + @objectname + '''''' AND o.type IN (N''''U'''',''''P'''',''''V'''',''''FN'''',''''IF'''',''''TF'''') AND s.name = '''''' + @schemaid + '''''') +BEGIN + IF EXISTS(SELECT 1 FROM sys.fn_builtin_permissions(''''OBJECT'''') WHERE permission_name = '''''' + @rightsaction + '''''') + BEGIN + '' + @grantordeny + '' '' + @rightsaction + '' ON ['' + @schemaid + ''].['' + @objectname + ''] TO ['' + @RoleName + ''] + END +END + +'' + END + END + + IF @typeofobject = ''ASSEMBLIES'' + BEGIN + SET @Command = @Command + '' +IF EXISTS(SELECT 1 FROM sys.assemblies WHERE NAME = '''''' + @objectname + '''''') +BEGIN + IF EXISTS(SELECT 1 FROM sys.fn_builtin_permissions(''''ASSEMBLY'''') WHERE permission_name = '''''' + @rightsaction + '''''') + BEGIN + '' + @grantordeny + '' '' + @rightsaction + ''::['' + @objectname + ''] TO ['' + @RoleName + ''] + END +END + +'' + END + + IF @typeofobject = ''ROLE'' + BEGIN + SET @Command = @Command + '' +IF NOT EXISTS (SELECT 1 FROM sys.database_role_members JOIN sys.database_principals roles ON database_role_members.role_principal_id = roles.principal_id JOIN sys.database_principals members ON database_role_members.member_principal_id = members.principal_id WHERE roles.name = '''''' + @rightsaction + '''''' AND members.name = '''''' + @RoleName + '''''') +BEGIN + EXEC sp_addrolemember N'''''' + @rightsaction + '''''', N'''''' + @RoleName + '''''' +END + +'' + END + + FETCH NEXT FROM SecurablesCurs INTO @typeofobject, @grantordeny, @rightsaction, @objectname, @schemaid + END + +CLOSE SecurablesCurs +DEALLOCATE SecurablesCurs + +PRINT ''SET ALL SECURABLES ON ROLE ['' + @RoleName + '']'' +EXEC sp_executesql @Command + +END +ELSE +BEGIN + + DECLARE SecurablesCurs CURSOR FOR + SELECT typeofobject, grantordeny, rightsaction, objectname, schemaid + FROM #Securables + WHERE N2 = 0 + + OPEN SecurablesCurs + FETCH NEXT FROM SecurablesCurs INTO @typeofobject, @grantordeny, @rightsaction, @objectname, @schemaid + WHILE @@FETCH_STATUS = 0 + BEGIN + + IF @typeofobject = ''DB'' + BEGIN + IF EXISTS(SELECT 1 FROM sys.fn_builtin_permissions(''DATABASE'') WHERE permission_name = '''' + @rightsaction + '''') + BEGIN + SET @Command = @Command + @grantordeny + '' '' + @rightsaction + '' TO ['' + @RoleName + ''] +'' + END + END + + IF @typeofobject = ''SCHEMA'' + BEGIN + SET @Command = @Command + '' +IF EXISTS (SELECT 1 FROM sys.schemas WHERE name = '''''' + @schemaid + '''''') +BEGIN + IF EXISTS(SELECT 1 FROM sys.fn_builtin_permissions(''''SCHEMA'''') WHERE permission_name = '''''' + @rightsaction + '''''') + BEGIN + '' + @grantordeny + '' '' + @rightsaction + '' ON SCHEMA::'' + @schemaid + '' TO ['' + @RoleName + ''] + END +END + +'' + END + + IF @typeofobject in(''TABLE'',''SP'',''FUNCTIONS'',''VIEWS'') + BEGIN + + IF @objectname like ''%[%]%'' + BEGIN + + IF @typeofobject = ''TABLE'' + BEGIN + SET @sysTarget = ''sys.tables'' + SET @sysType = '''' + END + + IF @typeofobject = ''SP'' + BEGIN + SET @sysTarget = ''sys.procedures'' + SET @sysType = '''' + END + + IF @typeofobject = ''FUNCTIONS'' + BEGIN + SET @sysTarget = ''sys.objects'' + SET @sysType = '' and p.Type IN ( N''''FN'''', N''''IF'''', N''''TF'''', N''''FS'''', N''''FT'''' )'' + END + + IF @typeofobject = ''VIEWS'' + BEGIN + SET @sysTarget = ''sys.views'' + SET @sysType = '''' + END + + SET @Command = @Command + '' +DECLARE SP_cursor CURSOR FOR +SELECT p.name FROM '' + @sysTarget + '' p JOIN sys.schemas s ON s.schema_id = p.schema_id WHERE (p.name like '''''' + @objectname + '''''') and s.name = '''''' + @schemaid + '''' + @sysType + '''''' + +OPEN SP_cursor +FETCH NEXT FROM SP_cursor INTO @SP_Name +WHILE @@FETCH_STATUS = 0 +BEGIN + IF EXISTS(SELECT 1 FROM sys.fn_builtin_permissions(''''OBJECT'''') WHERE permission_name = '''''' + @rightsaction + '''''') + BEGIN + EXEC('''''' + @grantordeny + '' '' + @rightsaction + '' ON ['' + @schemaid + ''].['''' + @SP_Name + ''''] TO ['' + @RoleName + '']'''') + END + FETCH NEXT FROM SP_cursor INTO @SP_Name +END + +CLOSE SP_cursor +DEALLOCATE SP_cursor + +'' + + END + ELSE + BEGIN + + SET @Command = @Command + '' +IF EXISTS(SELECT 1 FROM sys.objects o WITH (NOLOCK) JOIN sys.schemas s ON s.schema_id = o.schema_id WHERE o.name = '''''' + @objectname + '''''' AND o.type IN (N''''U'''',''''P'''',''''V'''',''''FN'''',''''IF'''',''''TF'''') AND s.name = '''''' + @schemaid + '''''') +BEGIN + IF EXISTS(SELECT 1 FROM sys.fn_builtin_permissions(''''OBJECT'''') WHERE permission_name = '''''' + @rightsaction + '''''') + BEGIN + '' + @grantordeny + '' '' + @rightsaction + '' ON ['' + @schemaid + ''].['' + @objectname + ''] TO ['' + @RoleName + ''] + END +END + +'' + END + END + + IF @typeofobject = ''ASSEMBLIES'' + BEGIN + SET @Command = @Command + '' +IF EXISTS(SELECT 1 FROM sys.assemblies WHERE NAME = '''''' + @objectname + '''''') +BEGIN + IF EXISTS(SELECT 1 FROM sys.fn_builtin_permissions(''''ASSEMBLY'''') WHERE permission_name = '''''' + @rightsaction + '''''') + BEGIN + '' + @grantordeny + '' '' + @rightsaction + ''::['' + @objectname + ''] TO ['' + @RoleName + ''] + END +END + +'' + END + + IF @typeofobject = ''ROLE'' + BEGIN + SET @Command = @Command + '' +IF NOT EXISTS (SELECT 1 FROM sys.database_role_members JOIN sys.database_principals roles ON database_role_members.role_principal_id = roles.principal_id JOIN sys.database_principals members ON database_role_members.member_principal_id = members.principal_id WHERE roles.name = '''''' + @rightsaction + '''''' AND members.name = '''''' + @RoleName + '''''') +BEGIN + EXEC sp_addrolemember N'''''' + @rightsaction + '''''', N'''''' + @RoleName + '''''' +END + +'' + END + + FETCH NEXT FROM SecurablesCurs INTO @typeofobject, @grantordeny, @rightsaction, @objectname, @schemaid + END + +CLOSE SecurablesCurs +DEALLOCATE SecurablesCurs + +PRINT ''SET ALL SECURABLES ON ROLE ['' + @RoleName + '']'' +EXEC sp_executesql @Command + +END + +/* ADD USER */ +DECLARE UsersCurs CURSOR FOR +SELECT username + FROM #UsersOnRole + +OPEN UsersCurs + +FETCH NEXT FROM UsersCurs INTO @Users +WHILE @@FETCH_STATUS = 0 +BEGIN + + SELECT @Command = '' +EXEC sp_addrolemember N'''''' + @RoleName + '''''', N'''''' + @Users + '''''' +PRINT ''''ADD USER ['' + @Users + ''] ON ROLE ['' + @RoleName + '']'''' +'' + +FETCH NEXT FROM UsersCurs INTO @Users +END + +CLOSE UsersCurs +DEALLOCATE UsersCurs + +EXEC sp_executesql @Command + +/*============================================================================= + Drop temp tables +=============================================================================*/ +DROP TABLE #Securables +DROP TABLE #UsersOnRole','ArizonaTest','Pharmacies') + +INSERT INTO #AllRoles(STR_Definition,STR_Database,STR_Product)VALUES(' + +/*============================================================================= + + Script to create dbRoleSupUsr role. + + Role Name: dbRoleSupUsr + TEMPLATE: N2 and PROD + + EXAMPLE OF SECURABLES TO SET: + + INSERT INTO #Securables + VALUES + (''DB'',''GRANT'',''VIEW DEFINITION'','''',''''), + (''SCHEMA'',''GRANT'',''SELECT,EXECUTE,INSERT,UPDATE,DELETE'','''',''AP''), + (''TABLE'',''GRANT'',''INSERT,UPDATE'',''Address'',''dbo''), + (''SP'',''GRANT'',''EXECUTE'',''sp_bmc_GetNextID'',''dbo''), + (''ROLE'',''GRANT'',''db_datareader'','''','''') + + ----------------------------------------------- + +Generate date : 2023-05-12 / up208700 + +=============================================================================*/ + +DECLARE @Type varchar(6), + @Command nvarchar(max), + @RoleName varchar(60), + @Users varchar(255), + @typeofobject varchar(50), + @grantordeny varchar(10), + @rightsaction varchar(255), + @objectname varchar(255), + @schemaid varchar(10), + @sysTarget varchar(255), + @sysType varchar(255) + +SET @RoleName = ''dbRoleSupUsr'' +SET @Command = '''' + +SELECT @Type = [Type] FROM [master].[cfg].[InstanceContext] + +/* TEMP TABLES */ +CREATE TABLE #UsersOnRole(username varchar(255)) +CREATE TABLE #Securables(typeofobject varchar(50), grantordeny varchar(10), rightsaction varchar(255), objectname varchar(255), schemaid varchar(10),N2 bit) + +/* !!! LIST OF SECURABLES TO CHANGE !!! */ + +INSERT INTO #Securables +VALUES +(''ROLE'',''GRANT'',''DB_OWNER'','''',''dbo'',0) +,(''ROLE'',''GRANT'',''DB_OWNER'','''',''dbo'',1) + + +/* GET ALL USERS ON THIS ROLE */ +INSERT INTO #UsersOnRole +SELECT + members.name +FROM sys.database_role_members + JOIN sys.database_principals roles ON database_role_members.role_principal_id = roles.principal_id + JOIN sys.database_principals members ON database_role_members.member_principal_id = members.principal_id +WHERE roles.name = @RoleName + +/* CREATE ROLE */ +SELECT @Command = '' +IF NOT EXISTS (SELECT 1 FROM sys.database_principals WHERE name = '''''' + @RoleName + '''''' AND type = ''''R'''') +BEGIN + CREATE ROLE ['' + @RoleName + ''] AUTHORIZATION [dbo] + PRINT ''''CREATE ROLE ['' + @RoleName + '']'''' +END +'' +EXEC sp_executesql @Command + +SET @Command = '' +DECLARE @SP_Name varchar(255) + +'' + +/* SET ALL ROLE SECURABLES */ +IF @Type = ''DEVE'' +BEGIN + + DECLARE SecurablesCurs CURSOR FOR + SELECT typeofobject, grantordeny, rightsaction, objectname, schemaid + FROM #Securables + WHERE N2 = 1 + + OPEN SecurablesCurs + FETCH NEXT FROM SecurablesCurs INTO @typeofobject, @grantordeny, @rightsaction, @objectname, @schemaid + WHILE @@FETCH_STATUS = 0 + BEGIN + + IF @typeofobject = ''DB'' + BEGIN + IF EXISTS(SELECT 1 FROM sys.fn_builtin_permissions(''DATABASE'') WHERE permission_name = '''' + @rightsaction + '''') + BEGIN + SET @Command = @Command + @grantordeny + '' '' + @rightsaction + '' TO ['' + @RoleName + ''] +'' + END + END + + IF @typeofobject = ''SCHEMA'' + BEGIN + SET @Command = @Command + '' +IF EXISTS (SELECT 1 FROM sys.schemas WHERE name = '''''' + @schemaid + '''''') +BEGIN + IF EXISTS(SELECT 1 FROM sys.fn_builtin_permissions(''''SCHEMA'''') WHERE permission_name = '''''' + @rightsaction + '''''') + BEGIN + '' + @grantordeny + '' '' + @rightsaction + '' ON SCHEMA::'' + @schemaid + '' TO ['' + @RoleName + ''] + END +END + +'' + END + + IF @typeofobject in(''TABLE'',''SP'',''FUNCTIONS'',''VIEWS'') + BEGIN + + IF @objectname like ''%[%]%'' + BEGIN + IF @typeofobject = ''TABLE'' + BEGIN + SET @sysTarget = ''sys.tables'' + SET @sysType = '''' + END + + IF @typeofobject = ''SP'' + BEGIN + SET @sysTarget = ''sys.procedures'' + SET @sysType = '''' + END + + IF @typeofobject = ''FUNCTIONS'' + BEGIN + SET @sysTarget = ''sys.objects'' + SET @sysType = '' and p.Type IN ( N''''FN'''', N''''IF'''', N''''TF'''', N''''FS'''', N''''FT'''' )'' + END + + IF @typeofobject = ''VIEWS'' + BEGIN + SET @sysTarget = ''sys.views'' + SET @sysType = '''' + END + + SET @Command = @Command + '' +DECLARE SP_cursor CURSOR FOR +SELECT p.name FROM '' + @sysTarget + '' p JOIN sys.schemas s ON s.schema_id = p.schema_id WHERE (p.name like '''''' + @objectname + '''''') and s.name = '''''' + @schemaid + '''' + @sysType + '''''' + +OPEN SP_cursor +FETCH NEXT FROM SP_cursor INTO @SP_Name +WHILE @@FETCH_STATUS = 0 +BEGIN + IF EXISTS(SELECT 1 FROM sys.fn_builtin_permissions(''''OBJECT'''') WHERE permission_name = '''''' + @rightsaction + '''''') + BEGIN + EXEC('''''' + @grantordeny + '' '' + @rightsaction + '' ON ['' + @schemaid + ''].['''' + @SP_Name + ''''] TO ['' + @RoleName + '']'''') + END + FETCH NEXT FROM SP_cursor INTO @SP_Name +END + +CLOSE SP_cursor +DEALLOCATE SP_cursor + +'' + + END + ELSE + BEGIN + + SET @Command = @Command + '' +IF EXISTS(SELECT 1 FROM sys.objects o WITH (NOLOCK) JOIN sys.schemas s ON s.schema_id = o.schema_id WHERE o.name = '''''' + @objectname + '''''' AND o.type IN (N''''U'''',''''P'''',''''V'''',''''FN'''',''''IF'''',''''TF'''') AND s.name = '''''' + @schemaid + '''''') +BEGIN + IF EXISTS(SELECT 1 FROM sys.fn_builtin_permissions(''''OBJECT'''') WHERE permission_name = '''''' + @rightsaction + '''''') + BEGIN + '' + @grantordeny + '' '' + @rightsaction + '' ON ['' + @schemaid + ''].['' + @objectname + ''] TO ['' + @RoleName + ''] + END +END + +'' + END + END + + IF @typeofobject = ''ASSEMBLIES'' + BEGIN + SET @Command = @Command + '' +IF EXISTS(SELECT 1 FROM sys.assemblies WHERE NAME = '''''' + @objectname + '''''') +BEGIN + IF EXISTS(SELECT 1 FROM sys.fn_builtin_permissions(''''ASSEMBLY'''') WHERE permission_name = '''''' + @rightsaction + '''''') + BEGIN + '' + @grantordeny + '' '' + @rightsaction + ''::['' + @objectname + ''] TO ['' + @RoleName + ''] + END +END + +'' + END + + IF @typeofobject = ''ROLE'' + BEGIN + SET @Command = @Command + '' +IF NOT EXISTS (SELECT 1 FROM sys.database_role_members JOIN sys.database_principals roles ON database_role_members.role_principal_id = roles.principal_id JOIN sys.database_principals members ON database_role_members.member_principal_id = members.principal_id WHERE roles.name = '''''' + @rightsaction + '''''' AND members.name = '''''' + @RoleName + '''''') +BEGIN + EXEC sp_addrolemember N'''''' + @rightsaction + '''''', N'''''' + @RoleName + '''''' +END + +'' + END + + FETCH NEXT FROM SecurablesCurs INTO @typeofobject, @grantordeny, @rightsaction, @objectname, @schemaid + END + +CLOSE SecurablesCurs +DEALLOCATE SecurablesCurs + +PRINT ''SET ALL SECURABLES ON ROLE ['' + @RoleName + '']'' +EXEC sp_executesql @Command + +END +ELSE +BEGIN + + DECLARE SecurablesCurs CURSOR FOR + SELECT typeofobject, grantordeny, rightsaction, objectname, schemaid + FROM #Securables + WHERE N2 = 0 + + OPEN SecurablesCurs + FETCH NEXT FROM SecurablesCurs INTO @typeofobject, @grantordeny, @rightsaction, @objectname, @schemaid + WHILE @@FETCH_STATUS = 0 + BEGIN + + IF @typeofobject = ''DB'' + BEGIN + IF EXISTS(SELECT 1 FROM sys.fn_builtin_permissions(''DATABASE'') WHERE permission_name = '''' + @rightsaction + '''') + BEGIN + SET @Command = @Command + @grantordeny + '' '' + @rightsaction + '' TO ['' + @RoleName + ''] +'' + END + END + + IF @typeofobject = ''SCHEMA'' + BEGIN + SET @Command = @Command + '' +IF EXISTS (SELECT 1 FROM sys.schemas WHERE name = '''''' + @schemaid + '''''') +BEGIN + IF EXISTS(SELECT 1 FROM sys.fn_builtin_permissions(''''SCHEMA'''') WHERE permission_name = '''''' + @rightsaction + '''''') + BEGIN + '' + @grantordeny + '' '' + @rightsaction + '' ON SCHEMA::'' + @schemaid + '' TO ['' + @RoleName + ''] + END +END + +'' + END + + IF @typeofobject in(''TABLE'',''SP'',''FUNCTIONS'',''VIEWS'') + BEGIN + + IF @objectname like ''%[%]%'' + BEGIN + + IF @typeofobject = ''TABLE'' + BEGIN + SET @sysTarget = ''sys.tables'' + SET @sysType = '''' + END + + IF @typeofobject = ''SP'' + BEGIN + SET @sysTarget = ''sys.procedures'' + SET @sysType = '''' + END + + IF @typeofobject = ''FUNCTIONS'' + BEGIN + SET @sysTarget = ''sys.objects'' + SET @sysType = '' and p.Type IN ( N''''FN'''', N''''IF'''', N''''TF'''', N''''FS'''', N''''FT'''' )'' + END + + IF @typeofobject = ''VIEWS'' + BEGIN + SET @sysTarget = ''sys.views'' + SET @sysType = '''' + END + + SET @Command = @Command + '' +DECLARE SP_cursor CURSOR FOR +SELECT p.name FROM '' + @sysTarget + '' p JOIN sys.schemas s ON s.schema_id = p.schema_id WHERE (p.name like '''''' + @objectname + '''''') and s.name = '''''' + @schemaid + '''' + @sysType + '''''' + +OPEN SP_cursor +FETCH NEXT FROM SP_cursor INTO @SP_Name +WHILE @@FETCH_STATUS = 0 +BEGIN + IF EXISTS(SELECT 1 FROM sys.fn_builtin_permissions(''''OBJECT'''') WHERE permission_name = '''''' + @rightsaction + '''''') + BEGIN + EXEC('''''' + @grantordeny + '' '' + @rightsaction + '' ON ['' + @schemaid + ''].['''' + @SP_Name + ''''] TO ['' + @RoleName + '']'''') + END + FETCH NEXT FROM SP_cursor INTO @SP_Name +END + +CLOSE SP_cursor +DEALLOCATE SP_cursor + +'' + + END + ELSE + BEGIN + + SET @Command = @Command + '' +IF EXISTS(SELECT 1 FROM sys.objects o WITH (NOLOCK) JOIN sys.schemas s ON s.schema_id = o.schema_id WHERE o.name = '''''' + @objectname + '''''' AND o.type IN (N''''U'''',''''P'''',''''V'''',''''FN'''',''''IF'''',''''TF'''') AND s.name = '''''' + @schemaid + '''''') +BEGIN + IF EXISTS(SELECT 1 FROM sys.fn_builtin_permissions(''''OBJECT'''') WHERE permission_name = '''''' + @rightsaction + '''''') + BEGIN + '' + @grantordeny + '' '' + @rightsaction + '' ON ['' + @schemaid + ''].['' + @objectname + ''] TO ['' + @RoleName + ''] + END +END + +'' + END + END + + IF @typeofobject = ''ASSEMBLIES'' + BEGIN + SET @Command = @Command + '' +IF EXISTS(SELECT 1 FROM sys.assemblies WHERE NAME = '''''' + @objectname + '''''') +BEGIN + IF EXISTS(SELECT 1 FROM sys.fn_builtin_permissions(''''ASSEMBLY'''') WHERE permission_name = '''''' + @rightsaction + '''''') + BEGIN + '' + @grantordeny + '' '' + @rightsaction + ''::['' + @objectname + ''] TO ['' + @RoleName + ''] + END +END + +'' + END + + IF @typeofobject = ''ROLE'' + BEGIN + SET @Command = @Command + '' +IF NOT EXISTS (SELECT 1 FROM sys.database_role_members JOIN sys.database_principals roles ON database_role_members.role_principal_id = roles.principal_id JOIN sys.database_principals members ON database_role_members.member_principal_id = members.principal_id WHERE roles.name = '''''' + @rightsaction + '''''' AND members.name = '''''' + @RoleName + '''''') +BEGIN + EXEC sp_addrolemember N'''''' + @rightsaction + '''''', N'''''' + @RoleName + '''''' +END + +'' + END + + FETCH NEXT FROM SecurablesCurs INTO @typeofobject, @grantordeny, @rightsaction, @objectname, @schemaid + END + +CLOSE SecurablesCurs +DEALLOCATE SecurablesCurs + +PRINT ''SET ALL SECURABLES ON ROLE ['' + @RoleName + '']'' +EXEC sp_executesql @Command + +END + +/* ADD USER */ +DECLARE UsersCurs CURSOR FOR +SELECT username + FROM #UsersOnRole + +OPEN UsersCurs + +FETCH NEXT FROM UsersCurs INTO @Users +WHILE @@FETCH_STATUS = 0 +BEGIN + + SELECT @Command = '' +EXEC sp_addrolemember N'''''' + @RoleName + '''''', N'''''' + @Users + '''''' +PRINT ''''ADD USER ['' + @Users + ''] ON ROLE ['' + @RoleName + '']'''' +'' + +FETCH NEXT FROM UsersCurs INTO @Users +END + +CLOSE UsersCurs +DEALLOCATE UsersCurs + +EXEC sp_executesql @Command + +/*============================================================================= + Drop temp tables +=============================================================================*/ +DROP TABLE #Securables +DROP TABLE #UsersOnRole','ArizonaTest','Pharmacies') + +INSERT INTO #AllRoles(STR_Definition,STR_Database,STR_Product)VALUES(' + +/*============================================================================= + + Script to create dbRoleCsltUsr role. + + Role Name: dbRoleCsltUsr + TEMPLATE: N2 and PROD + + EXAMPLE OF SECURABLES TO SET: + + INSERT INTO #Securables + VALUES + (''DB'',''GRANT'',''VIEW DEFINITION'','''',''''), + (''SCHEMA'',''GRANT'',''SELECT,EXECUTE,INSERT,UPDATE,DELETE'','''',''AP''), + (''TABLE'',''GRANT'',''INSERT,UPDATE'',''Address'',''dbo''), + (''SP'',''GRANT'',''EXECUTE'',''sp_bmc_GetNextID'',''dbo''), + (''ROLE'',''GRANT'',''db_datareader'','''','''') + + ----------------------------------------------- + +Generate date : 2023-05-12 / up208700 + +=============================================================================*/ + +DECLARE @Type varchar(6), + @Command nvarchar(max), + @RoleName varchar(60), + @Users varchar(255), + @typeofobject varchar(50), + @grantordeny varchar(10), + @rightsaction varchar(255), + @objectname varchar(255), + @schemaid varchar(10), + @sysTarget varchar(255), + @sysType varchar(255) + +SET @RoleName = ''dbRoleCsltUsr'' +SET @Command = '''' + +SELECT @Type = [Type] FROM [master].[cfg].[InstanceContext] + +/* TEMP TABLES */ +CREATE TABLE #UsersOnRole(username varchar(255)) +CREATE TABLE #Securables(typeofobject varchar(50), grantordeny varchar(10), rightsaction varchar(255), objectname varchar(255), schemaid varchar(10),N2 bit) + +/* !!! LIST OF SECURABLES TO CHANGE !!! */ + +INSERT INTO #Securables +VALUES +(''ROLE'',''GRANT'',''REPLMONITOR'','''',''dbo'',0) +,(''ROLE'',''GRANT'',''REPLMONITOR'','''',''dbo'',1) +,(''TABLE'',''GRANT'',''SELECT'',''MSdistribution_agents'',''dbo'',0) +,(''TABLE'',''GRANT'',''SELECT'',''MSdistribution_agents'',''dbo'',1) +,(''TABLE'',''GRANT'',''SELECT'',''MSdistribution_history'',''dbo'',0) +,(''TABLE'',''GRANT'',''SELECT'',''MSdistribution_history'',''dbo'',1) +,(''TABLE'',''GRANT'',''SELECT'',''MSrepl_commands'',''dbo'',0) +,(''TABLE'',''GRANT'',''SELECT'',''MSrepl_commands'',''dbo'',1) +,(''TABLE'',''GRANT'',''SELECT'',''MSsubscriptions'',''dbo'',0) +,(''TABLE'',''GRANT'',''SELECT'',''MSsubscriptions'',''dbo'',1) + + +/* GET ALL USERS ON THIS ROLE */ +INSERT INTO #UsersOnRole +SELECT + members.name +FROM sys.database_role_members + JOIN sys.database_principals roles ON database_role_members.role_principal_id = roles.principal_id + JOIN sys.database_principals members ON database_role_members.member_principal_id = members.principal_id +WHERE roles.name = @RoleName + +/* CREATE ROLE */ +SELECT @Command = '' +IF NOT EXISTS (SELECT 1 FROM sys.database_principals WHERE name = '''''' + @RoleName + '''''' AND type = ''''R'''') +BEGIN + CREATE ROLE ['' + @RoleName + ''] AUTHORIZATION [dbo] + PRINT ''''CREATE ROLE ['' + @RoleName + '']'''' +END +'' +EXEC sp_executesql @Command + +SET @Command = '' +DECLARE @SP_Name varchar(255) + +'' + +/* SET ALL ROLE SECURABLES */ +IF @Type = ''DEVE'' +BEGIN + + DECLARE SecurablesCurs CURSOR FOR + SELECT typeofobject, grantordeny, rightsaction, objectname, schemaid + FROM #Securables + WHERE N2 = 1 + + OPEN SecurablesCurs + FETCH NEXT FROM SecurablesCurs INTO @typeofobject, @grantordeny, @rightsaction, @objectname, @schemaid + WHILE @@FETCH_STATUS = 0 + BEGIN + + IF @typeofobject = ''DB'' + BEGIN + IF EXISTS(SELECT 1 FROM sys.fn_builtin_permissions(''DATABASE'') WHERE permission_name = '''' + @rightsaction + '''') + BEGIN + SET @Command = @Command + @grantordeny + '' '' + @rightsaction + '' TO ['' + @RoleName + ''] +'' + END + END + + IF @typeofobject = ''SCHEMA'' + BEGIN + SET @Command = @Command + '' +IF EXISTS (SELECT 1 FROM sys.schemas WHERE name = '''''' + @schemaid + '''''') +BEGIN + IF EXISTS(SELECT 1 FROM sys.fn_builtin_permissions(''''SCHEMA'''') WHERE permission_name = '''''' + @rightsaction + '''''') + BEGIN + '' + @grantordeny + '' '' + @rightsaction + '' ON SCHEMA::'' + @schemaid + '' TO ['' + @RoleName + ''] + END +END + +'' + END + + IF @typeofobject in(''TABLE'',''SP'',''FUNCTIONS'',''VIEWS'') + BEGIN + + IF @objectname like ''%[%]%'' + BEGIN + IF @typeofobject = ''TABLE'' + BEGIN + SET @sysTarget = ''sys.tables'' + SET @sysType = '''' + END + + IF @typeofobject = ''SP'' + BEGIN + SET @sysTarget = ''sys.procedures'' + SET @sysType = '''' + END + + IF @typeofobject = ''FUNCTIONS'' + BEGIN + SET @sysTarget = ''sys.objects'' + SET @sysType = '' and p.Type IN ( N''''FN'''', N''''IF'''', N''''TF'''', N''''FS'''', N''''FT'''' )'' + END + + IF @typeofobject = ''VIEWS'' + BEGIN + SET @sysTarget = ''sys.views'' + SET @sysType = '''' + END + + SET @Command = @Command + '' +DECLARE SP_cursor CURSOR FOR +SELECT p.name FROM '' + @sysTarget + '' p JOIN sys.schemas s ON s.schema_id = p.schema_id WHERE (p.name like '''''' + @objectname + '''''') and s.name = '''''' + @schemaid + '''' + @sysType + '''''' + +OPEN SP_cursor +FETCH NEXT FROM SP_cursor INTO @SP_Name +WHILE @@FETCH_STATUS = 0 +BEGIN + IF EXISTS(SELECT 1 FROM sys.fn_builtin_permissions(''''OBJECT'''') WHERE permission_name = '''''' + @rightsaction + '''''') + BEGIN + EXEC('''''' + @grantordeny + '' '' + @rightsaction + '' ON ['' + @schemaid + ''].['''' + @SP_Name + ''''] TO ['' + @RoleName + '']'''') + END + FETCH NEXT FROM SP_cursor INTO @SP_Name +END + +CLOSE SP_cursor +DEALLOCATE SP_cursor + +'' + + END + ELSE + BEGIN + + SET @Command = @Command + '' +IF EXISTS(SELECT 1 FROM sys.objects o WITH (NOLOCK) JOIN sys.schemas s ON s.schema_id = o.schema_id WHERE o.name = '''''' + @objectname + '''''' AND o.type IN (N''''U'''',''''P'''',''''V'''',''''FN'''',''''IF'''',''''TF'''') AND s.name = '''''' + @schemaid + '''''') +BEGIN + IF EXISTS(SELECT 1 FROM sys.fn_builtin_permissions(''''OBJECT'''') WHERE permission_name = '''''' + @rightsaction + '''''') + BEGIN + '' + @grantordeny + '' '' + @rightsaction + '' ON ['' + @schemaid + ''].['' + @objectname + ''] TO ['' + @RoleName + ''] + END +END + +'' + END + END + + IF @typeofobject = ''ASSEMBLIES'' + BEGIN + SET @Command = @Command + '' +IF EXISTS(SELECT 1 FROM sys.assemblies WHERE NAME = '''''' + @objectname + '''''') +BEGIN + IF EXISTS(SELECT 1 FROM sys.fn_builtin_permissions(''''ASSEMBLY'''') WHERE permission_name = '''''' + @rightsaction + '''''') + BEGIN + '' + @grantordeny + '' '' + @rightsaction + ''::['' + @objectname + ''] TO ['' + @RoleName + ''] + END +END + +'' + END + + IF @typeofobject = ''ROLE'' + BEGIN + SET @Command = @Command + '' +IF NOT EXISTS (SELECT 1 FROM sys.database_role_members JOIN sys.database_principals roles ON database_role_members.role_principal_id = roles.principal_id JOIN sys.database_principals members ON database_role_members.member_principal_id = members.principal_id WHERE roles.name = '''''' + @rightsaction + '''''' AND members.name = '''''' + @RoleName + '''''') +BEGIN + EXEC sp_addrolemember N'''''' + @rightsaction + '''''', N'''''' + @RoleName + '''''' +END + +'' + END + + FETCH NEXT FROM SecurablesCurs INTO @typeofobject, @grantordeny, @rightsaction, @objectname, @schemaid + END + +CLOSE SecurablesCurs +DEALLOCATE SecurablesCurs + +PRINT ''SET ALL SECURABLES ON ROLE ['' + @RoleName + '']'' +EXEC sp_executesql @Command + +END +ELSE +BEGIN + + DECLARE SecurablesCurs CURSOR FOR + SELECT typeofobject, grantordeny, rightsaction, objectname, schemaid + FROM #Securables + WHERE N2 = 0 + + OPEN SecurablesCurs + FETCH NEXT FROM SecurablesCurs INTO @typeofobject, @grantordeny, @rightsaction, @objectname, @schemaid + WHILE @@FETCH_STATUS = 0 + BEGIN + + IF @typeofobject = ''DB'' + BEGIN + IF EXISTS(SELECT 1 FROM sys.fn_builtin_permissions(''DATABASE'') WHERE permission_name = '''' + @rightsaction + '''') + BEGIN + SET @Command = @Command + @grantordeny + '' '' + @rightsaction + '' TO ['' + @RoleName + ''] +'' + END + END + + IF @typeofobject = ''SCHEMA'' + BEGIN + SET @Command = @Command + '' +IF EXISTS (SELECT 1 FROM sys.schemas WHERE name = '''''' + @schemaid + '''''') +BEGIN + IF EXISTS(SELECT 1 FROM sys.fn_builtin_permissions(''''SCHEMA'''') WHERE permission_name = '''''' + @rightsaction + '''''') + BEGIN + '' + @grantordeny + '' '' + @rightsaction + '' ON SCHEMA::'' + @schemaid + '' TO ['' + @RoleName + ''] + END +END + +'' + END + + IF @typeofobject in(''TABLE'',''SP'',''FUNCTIONS'',''VIEWS'') + BEGIN + + IF @objectname like ''%[%]%'' + BEGIN + + IF @typeofobject = ''TABLE'' + BEGIN + SET @sysTarget = ''sys.tables'' + SET @sysType = '''' + END + + IF @typeofobject = ''SP'' + BEGIN + SET @sysTarget = ''sys.procedures'' + SET @sysType = '''' + END + + IF @typeofobject = ''FUNCTIONS'' + BEGIN + SET @sysTarget = ''sys.objects'' + SET @sysType = '' and p.Type IN ( N''''FN'''', N''''IF'''', N''''TF'''', N''''FS'''', N''''FT'''' )'' + END + + IF @typeofobject = ''VIEWS'' + BEGIN + SET @sysTarget = ''sys.views'' + SET @sysType = '''' + END + + SET @Command = @Command + '' +DECLARE SP_cursor CURSOR FOR +SELECT p.name FROM '' + @sysTarget + '' p JOIN sys.schemas s ON s.schema_id = p.schema_id WHERE (p.name like '''''' + @objectname + '''''') and s.name = '''''' + @schemaid + '''' + @sysType + '''''' + +OPEN SP_cursor +FETCH NEXT FROM SP_cursor INTO @SP_Name +WHILE @@FETCH_STATUS = 0 +BEGIN + IF EXISTS(SELECT 1 FROM sys.fn_builtin_permissions(''''OBJECT'''') WHERE permission_name = '''''' + @rightsaction + '''''') + BEGIN + EXEC('''''' + @grantordeny + '' '' + @rightsaction + '' ON ['' + @schemaid + ''].['''' + @SP_Name + ''''] TO ['' + @RoleName + '']'''') + END + FETCH NEXT FROM SP_cursor INTO @SP_Name +END + +CLOSE SP_cursor +DEALLOCATE SP_cursor + +'' + + END + ELSE + BEGIN + + SET @Command = @Command + '' +IF EXISTS(SELECT 1 FROM sys.objects o WITH (NOLOCK) JOIN sys.schemas s ON s.schema_id = o.schema_id WHERE o.name = '''''' + @objectname + '''''' AND o.type IN (N''''U'''',''''P'''',''''V'''',''''FN'''',''''IF'''',''''TF'''') AND s.name = '''''' + @schemaid + '''''') +BEGIN + IF EXISTS(SELECT 1 FROM sys.fn_builtin_permissions(''''OBJECT'''') WHERE permission_name = '''''' + @rightsaction + '''''') + BEGIN + '' + @grantordeny + '' '' + @rightsaction + '' ON ['' + @schemaid + ''].['' + @objectname + ''] TO ['' + @RoleName + ''] + END +END + +'' + END + END + + IF @typeofobject = ''ASSEMBLIES'' + BEGIN + SET @Command = @Command + '' +IF EXISTS(SELECT 1 FROM sys.assemblies WHERE NAME = '''''' + @objectname + '''''') +BEGIN + IF EXISTS(SELECT 1 FROM sys.fn_builtin_permissions(''''ASSEMBLY'''') WHERE permission_name = '''''' + @rightsaction + '''''') + BEGIN + '' + @grantordeny + '' '' + @rightsaction + ''::['' + @objectname + ''] TO ['' + @RoleName + ''] + END +END + +'' + END + + IF @typeofobject = ''ROLE'' + BEGIN + SET @Command = @Command + '' +IF NOT EXISTS (SELECT 1 FROM sys.database_role_members JOIN sys.database_principals roles ON database_role_members.role_principal_id = roles.principal_id JOIN sys.database_principals members ON database_role_members.member_principal_id = members.principal_id WHERE roles.name = '''''' + @rightsaction + '''''' AND members.name = '''''' + @RoleName + '''''') +BEGIN + EXEC sp_addrolemember N'''''' + @rightsaction + '''''', N'''''' + @RoleName + '''''' +END + +'' + END + + FETCH NEXT FROM SecurablesCurs INTO @typeofobject, @grantordeny, @rightsaction, @objectname, @schemaid + END + +CLOSE SecurablesCurs +DEALLOCATE SecurablesCurs + +PRINT ''SET ALL SECURABLES ON ROLE ['' + @RoleName + '']'' +EXEC sp_executesql @Command + +END + +/* ADD USER */ +DECLARE UsersCurs CURSOR FOR +SELECT username + FROM #UsersOnRole + +OPEN UsersCurs + +FETCH NEXT FROM UsersCurs INTO @Users +WHILE @@FETCH_STATUS = 0 +BEGIN + + SELECT @Command = '' +EXEC sp_addrolemember N'''''' + @RoleName + '''''', N'''''' + @Users + '''''' +PRINT ''''ADD USER ['' + @Users + ''] ON ROLE ['' + @RoleName + '']'''' +'' + +FETCH NEXT FROM UsersCurs INTO @Users +END + +CLOSE UsersCurs +DEALLOCATE UsersCurs + +EXEC sp_executesql @Command + +/*============================================================================= + Drop temp tables +=============================================================================*/ +DROP TABLE #Securables +DROP TABLE #UsersOnRole','distribution','Pharmacies') + +INSERT INTO #AllRoles(STR_Definition,STR_Database,STR_Product)VALUES(' + +/*============================================================================= + + Script to create dbRoleDevUsr role. + + Role Name: dbRoleDevUsr + TEMPLATE: Default + + EXAMPLE OF SECURABLES TO SET: + + INSERT INTO #Securables + VALUES + (''DB'',''GRANT'',''VIEW DEFINITION'','''',''''), + (''SCHEMA'',''GRANT'',''SELECT,EXECUTE,INSERT,UPDATE,DELETE'','''',''AP''), + (''TABLE'',''GRANT'',''INSERT,UPDATE'',''Address'',''dbo''), + (''SP'',''GRANT'',''EXECUTE'',''sp_bmc_GetNextID'',''dbo''), + (''ROLE'',''GRANT'',''db_datareader'','''','''') + + ----------------------------------------------- + +Generate date : 2023-05-12 / up208700 + +=============================================================================*/ + +DECLARE @Command nvarchar(max), + @RoleName varchar(60), + @Users varchar(255), + @typeofobject varchar(50), + @grantordeny varchar(10), + @rightsaction varchar(255), + @objectname varchar(255), + @schemaid varchar(10), + @sysTarget varchar(255), + @sysType varchar(255) + +SET @RoleName = ''dbRoleDevUsr'' +SET @Command = '''' + +/* TEMP TABLES */ +CREATE TABLE #UsersOnRole(username varchar(255)) +CREATE TABLE #Securables(typeofobject varchar(50), grantordeny varchar(10), rightsaction varchar(255), objectname varchar(255), schemaid varchar(10),N2 bit) + +/* !!! LIST OF SECURABLES TO CHANGE !!! */ + +INSERT INTO #Securables +VALUES +(''ROLE'',''GRANT'',''REPLMONITOR'','''',''dbo'',0) +,(''TABLE'',''GRANT'',''SELECT'',''MSdistribution_agents'',''dbo'',0) +,(''TABLE'',''GRANT'',''SELECT'',''MSdistribution_history'',''dbo'',0) +,(''TABLE'',''GRANT'',''SELECT'',''MSrepl_commands'',''dbo'',0) +,(''TABLE'',''GRANT'',''SELECT'',''MSsubscriptions'',''dbo'',0) + + +/* GET ALL USERS ON THIS ROLE */ +INSERT INTO #UsersOnRole +SELECT + members.name +FROM sys.database_role_members + JOIN sys.database_principals roles ON database_role_members.role_principal_id = roles.principal_id + JOIN sys.database_principals members ON database_role_members.member_principal_id = members.principal_id +WHERE roles.name = @RoleName + +/* CREATE ROLE */ +SELECT @Command = '' +IF NOT EXISTS (SELECT 1 FROM sys.database_principals WHERE name = '''''' + @RoleName + '''''' AND type = ''''R'''') +BEGIN + CREATE ROLE ['' + @RoleName + ''] AUTHORIZATION [dbo] + PRINT ''''CREATE ROLE ['' + @RoleName + '']'''' +END +'' +EXEC sp_executesql @Command + +SET @Command = '' +DECLARE @SP_Name varchar(255) + +'' + +/* SET ALL ROLE SECURABLES */ +DECLARE SecurablesCurs CURSOR FOR +SELECT typeofobject, grantordeny, rightsaction, objectname, schemaid +FROM #Securables +WHERE N2 = 0 + +OPEN SecurablesCurs +FETCH NEXT FROM SecurablesCurs INTO @typeofobject, @grantordeny, @rightsaction, @objectname, @schemaid +WHILE @@FETCH_STATUS = 0 +BEGIN + + IF @typeofobject = ''DB'' + BEGIN + IF EXISTS(SELECT 1 FROM sys.fn_builtin_permissions(''DATABASE'') WHERE permission_name = '''' + @rightsaction + '''') + BEGIN + SET @Command = @Command + @grantordeny + '' '' + @rightsaction + '' TO ['' + @RoleName + ''] +'' + END + END + + IF @typeofobject = ''SCHEMA'' + BEGIN + SET @Command = @Command + '' +IF EXISTS (SELECT 1 FROM sys.schemas WHERE name = '''''' + @schemaid + '''''') +BEGIN + IF EXISTS(SELECT 1 FROM sys.fn_builtin_permissions(''''SCHEMA'''') WHERE permission_name = '''''' + @rightsaction + '''''') + BEGIN + '' + @grantordeny + '' '' + @rightsaction + '' ON SCHEMA::'' + @schemaid + '' TO ['' + @RoleName + ''] + END +END + +'' + END + + IF @typeofobject in(''TABLE'',''SP'',''FUNCTIONS'',''VIEWS'') + BEGIN + + IF @objectname like ''%[%]%'' + BEGIN + + IF @typeofobject = ''TABLE'' + BEGIN + SET @sysTarget = ''sys.tables'' + SET @sysType = '''' + END + + IF @typeofobject = ''SP'' + BEGIN + SET @sysTarget = ''sys.procedures'' + SET @sysType = '''' + END + + IF @typeofobject = ''FUNCTIONS'' + BEGIN + SET @sysTarget = ''sys.objects'' + SET @sysType = '' and p.Type IN ( N''''FN'''', N''''IF'''', N''''TF'''', N''''FS'''', N''''FT'''' )'' + END + + IF @typeofobject = ''VIEWS'' + BEGIN + SET @sysTarget = ''sys.views'' + SET @sysType = '''' + END + + SET @Command = @Command + '' +DECLARE SP_cursor CURSOR FOR +SELECT p.name FROM '' + @sysTarget + '' p JOIN sys.schemas s ON s.schema_id = p.schema_id WHERE (p.name like '''''' + @objectname + '''''') and s.name = '''''' + @schemaid + '''' + @sysType + '''''' + +OPEN SP_cursor +FETCH NEXT FROM SP_cursor INTO @SP_Name +WHILE @@FETCH_STATUS = 0 +BEGIN + IF EXISTS(SELECT 1 FROM sys.fn_builtin_permissions(''''OBJECT'''') WHERE permission_name = '''''' + @rightsaction + '''''') + BEGIN + EXEC('''''' + @grantordeny + '' '' + @rightsaction + '' ON ['' + @schemaid + ''].['''' + @SP_Name + ''''] TO ['' + @RoleName + '']'''') + END + FETCH NEXT FROM SP_cursor INTO @SP_Name +END + +CLOSE SP_cursor +DEALLOCATE SP_cursor + +'' + + END + ELSE + BEGIN + + SET @Command = @Command + '' +IF EXISTS(SELECT 1 FROM sys.objects o WITH (NOLOCK) JOIN sys.schemas s ON s.schema_id = o.schema_id WHERE o.name = '''''' + @objectname + '''''' AND o.type IN (N''''U'''',''''P'''',''''V'''',''''FN'''',''''IF'''',''''TF'''') AND s.name = '''''' + @schemaid + '''''') +BEGIN + IF EXISTS(SELECT 1 FROM sys.fn_builtin_permissions(''''OBJECT'''') WHERE permission_name = '''''' + @rightsaction + '''''') + BEGIN + '' + @grantordeny + '' '' + @rightsaction + '' ON ['' + @schemaid + ''].['' + @objectname + ''] TO ['' + @RoleName + ''] + END +END + +'' + END +END + +IF @typeofobject = ''ASSEMBLIES'' +BEGIN + SET @Command = @Command + '' +IF EXISTS(SELECT 1 FROM sys.assemblies WHERE NAME = '''''' + @objectname + '''''') +BEGIN + IF EXISTS(SELECT 1 FROM sys.fn_builtin_permissions(''''ASSEMBLY'''') WHERE permission_name = '''''' + @rightsaction + '''''') + BEGIN + '' + @grantordeny + '' '' + @rightsaction + ''::['' + @objectname + ''] TO ['' + @RoleName + ''] + END +END + +'' +END + +IF @typeofobject = ''ROLE'' +BEGIN + SET @Command = @Command + '' +IF NOT EXISTS (SELECT 1 FROM sys.database_role_members JOIN sys.database_principals roles ON database_role_members.role_principal_id = roles.principal_id JOIN sys.database_principals members ON database_role_members.member_principal_id = members.principal_id WHERE roles.name = '''''' + @rightsaction + '''''' AND members.name = '''''' + @RoleName + '''''') +BEGIN + EXEC sp_addrolemember N'''''' + @rightsaction + '''''', N'''''' + @RoleName + '''''' +END + +'' +END + +FETCH NEXT FROM SecurablesCurs INTO @typeofobject, @grantordeny, @rightsaction, @objectname, @schemaid +END + +CLOSE SecurablesCurs +DEALLOCATE SecurablesCurs + +PRINT ''SET ALL SECURABLES ON ROLE ['' + @RoleName + '']'' +EXEC sp_executesql @Command + +/* ADD USER */ +DECLARE UsersCurs CURSOR FOR +SELECT username + FROM #UsersOnRole + +OPEN UsersCurs + +FETCH NEXT FROM UsersCurs INTO @Users +WHILE @@FETCH_STATUS = 0 +BEGIN + + SELECT @Command = '' +EXEC sp_addrolemember N'''''' + @RoleName + '''''', N'''''' + @Users + '''''' +PRINT ''''ADD USER ['' + @Users + ''] ON ROLE ['' + @RoleName + '']'''' +'' + +FETCH NEXT FROM UsersCurs INTO @Users +END + +CLOSE UsersCurs +DEALLOCATE UsersCurs + +EXEC sp_executesql @Command + + +/*============================================================================= + Drop temp tables +=============================================================================*/ +DROP TABLE #Securables +DROP TABLE #UsersOnRole +','distribution','Pharmacies') + +INSERT INTO #AllRoles(STR_Definition,STR_Database,STR_Product)VALUES(' + +/*============================================================================= + + Script to create dbRoleIttechUsr role. + + Role Name: dbRoleIttechUsr + TEMPLATE: N2 and PROD + + EXAMPLE OF SECURABLES TO SET: + + INSERT INTO #Securables + VALUES + (''DB'',''GRANT'',''VIEW DEFINITION'','''',''''), + (''SCHEMA'',''GRANT'',''SELECT,EXECUTE,INSERT,UPDATE,DELETE'','''',''AP''), + (''TABLE'',''GRANT'',''INSERT,UPDATE'',''Address'',''dbo''), + (''SP'',''GRANT'',''EXECUTE'',''sp_bmc_GetNextID'',''dbo''), + (''ROLE'',''GRANT'',''db_datareader'','''','''') + + ----------------------------------------------- + +Generate date : 2023-05-12 / up208700 + +=============================================================================*/ + +DECLARE @Type varchar(6), + @Command nvarchar(max), + @RoleName varchar(60), + @Users varchar(255), + @typeofobject varchar(50), + @grantordeny varchar(10), + @rightsaction varchar(255), + @objectname varchar(255), + @schemaid varchar(10), + @sysTarget varchar(255), + @sysType varchar(255) + +SET @RoleName = ''dbRoleIttechUsr'' +SET @Command = '''' + +SELECT @Type = [Type] FROM [master].[cfg].[InstanceContext] + +/* TEMP TABLES */ +CREATE TABLE #UsersOnRole(username varchar(255)) +CREATE TABLE #Securables(typeofobject varchar(50), grantordeny varchar(10), rightsaction varchar(255), objectname varchar(255), schemaid varchar(10),N2 bit) + +/* !!! LIST OF SECURABLES TO CHANGE !!! */ + +INSERT INTO #Securables +VALUES +(''ROLE'',''GRANT'',''DB_OWNER'','''',''dbo'',0) +,(''ROLE'',''GRANT'',''DB_OWNER'','''',''dbo'',1) +,(''ROLE'',''GRANT'',''REPLMONITOR'','''',''dbo'',0) +,(''ROLE'',''GRANT'',''REPLMONITOR'','''',''dbo'',1) + + +/* GET ALL USERS ON THIS ROLE */ +INSERT INTO #UsersOnRole +SELECT + members.name +FROM sys.database_role_members + JOIN sys.database_principals roles ON database_role_members.role_principal_id = roles.principal_id + JOIN sys.database_principals members ON database_role_members.member_principal_id = members.principal_id +WHERE roles.name = @RoleName + +/* CREATE ROLE */ +SELECT @Command = '' +IF NOT EXISTS (SELECT 1 FROM sys.database_principals WHERE name = '''''' + @RoleName + '''''' AND type = ''''R'''') +BEGIN + CREATE ROLE ['' + @RoleName + ''] AUTHORIZATION [dbo] + PRINT ''''CREATE ROLE ['' + @RoleName + '']'''' +END +'' +EXEC sp_executesql @Command + +SET @Command = '' +DECLARE @SP_Name varchar(255) + +'' + +/* SET ALL ROLE SECURABLES */ +IF @Type = ''DEVE'' +BEGIN + + DECLARE SecurablesCurs CURSOR FOR + SELECT typeofobject, grantordeny, rightsaction, objectname, schemaid + FROM #Securables + WHERE N2 = 1 + + OPEN SecurablesCurs + FETCH NEXT FROM SecurablesCurs INTO @typeofobject, @grantordeny, @rightsaction, @objectname, @schemaid + WHILE @@FETCH_STATUS = 0 + BEGIN + + IF @typeofobject = ''DB'' + BEGIN + IF EXISTS(SELECT 1 FROM sys.fn_builtin_permissions(''DATABASE'') WHERE permission_name = '''' + @rightsaction + '''') + BEGIN + SET @Command = @Command + @grantordeny + '' '' + @rightsaction + '' TO ['' + @RoleName + ''] +'' + END + END + + IF @typeofobject = ''SCHEMA'' + BEGIN + SET @Command = @Command + '' +IF EXISTS (SELECT 1 FROM sys.schemas WHERE name = '''''' + @schemaid + '''''') +BEGIN + IF EXISTS(SELECT 1 FROM sys.fn_builtin_permissions(''''SCHEMA'''') WHERE permission_name = '''''' + @rightsaction + '''''') + BEGIN + '' + @grantordeny + '' '' + @rightsaction + '' ON SCHEMA::'' + @schemaid + '' TO ['' + @RoleName + ''] + END +END + +'' + END + + IF @typeofobject in(''TABLE'',''SP'',''FUNCTIONS'',''VIEWS'') + BEGIN + + IF @objectname like ''%[%]%'' + BEGIN + IF @typeofobject = ''TABLE'' + BEGIN + SET @sysTarget = ''sys.tables'' + SET @sysType = '''' + END + + IF @typeofobject = ''SP'' + BEGIN + SET @sysTarget = ''sys.procedures'' + SET @sysType = '''' + END + + IF @typeofobject = ''FUNCTIONS'' + BEGIN + SET @sysTarget = ''sys.objects'' + SET @sysType = '' and p.Type IN ( N''''FN'''', N''''IF'''', N''''TF'''', N''''FS'''', N''''FT'''' )'' + END + + IF @typeofobject = ''VIEWS'' + BEGIN + SET @sysTarget = ''sys.views'' + SET @sysType = '''' + END + + SET @Command = @Command + '' +DECLARE SP_cursor CURSOR FOR +SELECT p.name FROM '' + @sysTarget + '' p JOIN sys.schemas s ON s.schema_id = p.schema_id WHERE (p.name like '''''' + @objectname + '''''') and s.name = '''''' + @schemaid + '''' + @sysType + '''''' + +OPEN SP_cursor +FETCH NEXT FROM SP_cursor INTO @SP_Name +WHILE @@FETCH_STATUS = 0 +BEGIN + IF EXISTS(SELECT 1 FROM sys.fn_builtin_permissions(''''OBJECT'''') WHERE permission_name = '''''' + @rightsaction + '''''') + BEGIN + EXEC('''''' + @grantordeny + '' '' + @rightsaction + '' ON ['' + @schemaid + ''].['''' + @SP_Name + ''''] TO ['' + @RoleName + '']'''') + END + FETCH NEXT FROM SP_cursor INTO @SP_Name +END + +CLOSE SP_cursor +DEALLOCATE SP_cursor + +'' + + END + ELSE + BEGIN + + SET @Command = @Command + '' +IF EXISTS(SELECT 1 FROM sys.objects o WITH (NOLOCK) JOIN sys.schemas s ON s.schema_id = o.schema_id WHERE o.name = '''''' + @objectname + '''''' AND o.type IN (N''''U'''',''''P'''',''''V'''',''''FN'''',''''IF'''',''''TF'''') AND s.name = '''''' + @schemaid + '''''') +BEGIN + IF EXISTS(SELECT 1 FROM sys.fn_builtin_permissions(''''OBJECT'''') WHERE permission_name = '''''' + @rightsaction + '''''') + BEGIN + '' + @grantordeny + '' '' + @rightsaction + '' ON ['' + @schemaid + ''].['' + @objectname + ''] TO ['' + @RoleName + ''] + END +END + +'' + END + END + + IF @typeofobject = ''ASSEMBLIES'' + BEGIN + SET @Command = @Command + '' +IF EXISTS(SELECT 1 FROM sys.assemblies WHERE NAME = '''''' + @objectname + '''''') +BEGIN + IF EXISTS(SELECT 1 FROM sys.fn_builtin_permissions(''''ASSEMBLY'''') WHERE permission_name = '''''' + @rightsaction + '''''') + BEGIN + '' + @grantordeny + '' '' + @rightsaction + ''::['' + @objectname + ''] TO ['' + @RoleName + ''] + END +END + +'' + END + + IF @typeofobject = ''ROLE'' + BEGIN + SET @Command = @Command + '' +IF NOT EXISTS (SELECT 1 FROM sys.database_role_members JOIN sys.database_principals roles ON database_role_members.role_principal_id = roles.principal_id JOIN sys.database_principals members ON database_role_members.member_principal_id = members.principal_id WHERE roles.name = '''''' + @rightsaction + '''''' AND members.name = '''''' + @RoleName + '''''') +BEGIN + EXEC sp_addrolemember N'''''' + @rightsaction + '''''', N'''''' + @RoleName + '''''' +END + +'' + END + + FETCH NEXT FROM SecurablesCurs INTO @typeofobject, @grantordeny, @rightsaction, @objectname, @schemaid + END + +CLOSE SecurablesCurs +DEALLOCATE SecurablesCurs + +PRINT ''SET ALL SECURABLES ON ROLE ['' + @RoleName + '']'' +EXEC sp_executesql @Command + +END +ELSE +BEGIN + + DECLARE SecurablesCurs CURSOR FOR + SELECT typeofobject, grantordeny, rightsaction, objectname, schemaid + FROM #Securables + WHERE N2 = 0 + + OPEN SecurablesCurs + FETCH NEXT FROM SecurablesCurs INTO @typeofobject, @grantordeny, @rightsaction, @objectname, @schemaid + WHILE @@FETCH_STATUS = 0 + BEGIN + + IF @typeofobject = ''DB'' + BEGIN + IF EXISTS(SELECT 1 FROM sys.fn_builtin_permissions(''DATABASE'') WHERE permission_name = '''' + @rightsaction + '''') + BEGIN + SET @Command = @Command + @grantordeny + '' '' + @rightsaction + '' TO ['' + @RoleName + ''] +'' + END + END + + IF @typeofobject = ''SCHEMA'' + BEGIN + SET @Command = @Command + '' +IF EXISTS (SELECT 1 FROM sys.schemas WHERE name = '''''' + @schemaid + '''''') +BEGIN + IF EXISTS(SELECT 1 FROM sys.fn_builtin_permissions(''''SCHEMA'''') WHERE permission_name = '''''' + @rightsaction + '''''') + BEGIN + '' + @grantordeny + '' '' + @rightsaction + '' ON SCHEMA::'' + @schemaid + '' TO ['' + @RoleName + ''] + END +END + +'' + END + + IF @typeofobject in(''TABLE'',''SP'',''FUNCTIONS'',''VIEWS'') + BEGIN + + IF @objectname like ''%[%]%'' + BEGIN + + IF @typeofobject = ''TABLE'' + BEGIN + SET @sysTarget = ''sys.tables'' + SET @sysType = '''' + END + + IF @typeofobject = ''SP'' + BEGIN + SET @sysTarget = ''sys.procedures'' + SET @sysType = '''' + END + + IF @typeofobject = ''FUNCTIONS'' + BEGIN + SET @sysTarget = ''sys.objects'' + SET @sysType = '' and p.Type IN ( N''''FN'''', N''''IF'''', N''''TF'''', N''''FS'''', N''''FT'''' )'' + END + + IF @typeofobject = ''VIEWS'' + BEGIN + SET @sysTarget = ''sys.views'' + SET @sysType = '''' + END + + SET @Command = @Command + '' +DECLARE SP_cursor CURSOR FOR +SELECT p.name FROM '' + @sysTarget + '' p JOIN sys.schemas s ON s.schema_id = p.schema_id WHERE (p.name like '''''' + @objectname + '''''') and s.name = '''''' + @schemaid + '''' + @sysType + '''''' + +OPEN SP_cursor +FETCH NEXT FROM SP_cursor INTO @SP_Name +WHILE @@FETCH_STATUS = 0 +BEGIN + IF EXISTS(SELECT 1 FROM sys.fn_builtin_permissions(''''OBJECT'''') WHERE permission_name = '''''' + @rightsaction + '''''') + BEGIN + EXEC('''''' + @grantordeny + '' '' + @rightsaction + '' ON ['' + @schemaid + ''].['''' + @SP_Name + ''''] TO ['' + @RoleName + '']'''') + END + FETCH NEXT FROM SP_cursor INTO @SP_Name +END + +CLOSE SP_cursor +DEALLOCATE SP_cursor + +'' + + END + ELSE + BEGIN + + SET @Command = @Command + '' +IF EXISTS(SELECT 1 FROM sys.objects o WITH (NOLOCK) JOIN sys.schemas s ON s.schema_id = o.schema_id WHERE o.name = '''''' + @objectname + '''''' AND o.type IN (N''''U'''',''''P'''',''''V'''',''''FN'''',''''IF'''',''''TF'''') AND s.name = '''''' + @schemaid + '''''') +BEGIN + IF EXISTS(SELECT 1 FROM sys.fn_builtin_permissions(''''OBJECT'''') WHERE permission_name = '''''' + @rightsaction + '''''') + BEGIN + '' + @grantordeny + '' '' + @rightsaction + '' ON ['' + @schemaid + ''].['' + @objectname + ''] TO ['' + @RoleName + ''] + END +END + +'' + END + END + + IF @typeofobject = ''ASSEMBLIES'' + BEGIN + SET @Command = @Command + '' +IF EXISTS(SELECT 1 FROM sys.assemblies WHERE NAME = '''''' + @objectname + '''''') +BEGIN + IF EXISTS(SELECT 1 FROM sys.fn_builtin_permissions(''''ASSEMBLY'''') WHERE permission_name = '''''' + @rightsaction + '''''') + BEGIN + '' + @grantordeny + '' '' + @rightsaction + ''::['' + @objectname + ''] TO ['' + @RoleName + ''] + END +END + +'' + END + + IF @typeofobject = ''ROLE'' + BEGIN + SET @Command = @Command + '' +IF NOT EXISTS (SELECT 1 FROM sys.database_role_members JOIN sys.database_principals roles ON database_role_members.role_principal_id = roles.principal_id JOIN sys.database_principals members ON database_role_members.member_principal_id = members.principal_id WHERE roles.name = '''''' + @rightsaction + '''''' AND members.name = '''''' + @RoleName + '''''') +BEGIN + EXEC sp_addrolemember N'''''' + @rightsaction + '''''', N'''''' + @RoleName + '''''' +END + +'' + END + + FETCH NEXT FROM SecurablesCurs INTO @typeofobject, @grantordeny, @rightsaction, @objectname, @schemaid + END + +CLOSE SecurablesCurs +DEALLOCATE SecurablesCurs + +PRINT ''SET ALL SECURABLES ON ROLE ['' + @RoleName + '']'' +EXEC sp_executesql @Command + +END + +/* ADD USER */ +DECLARE UsersCurs CURSOR FOR +SELECT username + FROM #UsersOnRole + +OPEN UsersCurs + +FETCH NEXT FROM UsersCurs INTO @Users +WHILE @@FETCH_STATUS = 0 +BEGIN + + SELECT @Command = '' +EXEC sp_addrolemember N'''''' + @RoleName + '''''', N'''''' + @Users + '''''' +PRINT ''''ADD USER ['' + @Users + ''] ON ROLE ['' + @RoleName + '']'''' +'' + +FETCH NEXT FROM UsersCurs INTO @Users +END + +CLOSE UsersCurs +DEALLOCATE UsersCurs + +EXEC sp_executesql @Command + +/*============================================================================= + Drop temp tables +=============================================================================*/ +DROP TABLE #Securables +DROP TABLE #UsersOnRole','distribution','Pharmacies') + +INSERT INTO #AllRoles(STR_Definition,STR_Database,STR_Product)VALUES(' + +/*============================================================================= + + Script to create dbRoleSupUsr role. + + Role Name: dbRoleSupUsr + TEMPLATE: N2 and PROD + + EXAMPLE OF SECURABLES TO SET: + + INSERT INTO #Securables + VALUES + (''DB'',''GRANT'',''VIEW DEFINITION'','''',''''), + (''SCHEMA'',''GRANT'',''SELECT,EXECUTE,INSERT,UPDATE,DELETE'','''',''AP''), + (''TABLE'',''GRANT'',''INSERT,UPDATE'',''Address'',''dbo''), + (''SP'',''GRANT'',''EXECUTE'',''sp_bmc_GetNextID'',''dbo''), + (''ROLE'',''GRANT'',''db_datareader'','''','''') + + ----------------------------------------------- + +Generate date : 2023-05-12 / up208700 + +=============================================================================*/ + +DECLARE @Type varchar(6), + @Command nvarchar(max), + @RoleName varchar(60), + @Users varchar(255), + @typeofobject varchar(50), + @grantordeny varchar(10), + @rightsaction varchar(255), + @objectname varchar(255), + @schemaid varchar(10), + @sysTarget varchar(255), + @sysType varchar(255) + +SET @RoleName = ''dbRoleSupUsr'' +SET @Command = '''' + +SELECT @Type = [Type] FROM [master].[cfg].[InstanceContext] + +/* TEMP TABLES */ +CREATE TABLE #UsersOnRole(username varchar(255)) +CREATE TABLE #Securables(typeofobject varchar(50), grantordeny varchar(10), rightsaction varchar(255), objectname varchar(255), schemaid varchar(10),N2 bit) + +/* !!! LIST OF SECURABLES TO CHANGE !!! */ + +INSERT INTO #Securables +VALUES +(''ROLE'',''GRANT'',''REPLMONITOR'','''',''dbo'',0) +,(''ROLE'',''GRANT'',''REPLMONITOR'','''',''dbo'',1) +,(''TABLE'',''GRANT'',''SELECT'',''MSdistribution_agents'',''dbo'',0) +,(''TABLE'',''GRANT'',''SELECT'',''MSdistribution_agents'',''dbo'',1) +,(''TABLE'',''GRANT'',''SELECT'',''MSdistribution_history'',''dbo'',0) +,(''TABLE'',''GRANT'',''SELECT'',''MSdistribution_history'',''dbo'',1) +,(''TABLE'',''GRANT'',''SELECT'',''MSrepl_commands'',''dbo'',0) +,(''TABLE'',''GRANT'',''SELECT'',''MSrepl_commands'',''dbo'',1) +,(''TABLE'',''GRANT'',''SELECT'',''MSsubscriptions'',''dbo'',0) +,(''TABLE'',''GRANT'',''SELECT'',''MSsubscriptions'',''dbo'',1) + + +/* GET ALL USERS ON THIS ROLE */ +INSERT INTO #UsersOnRole +SELECT + members.name +FROM sys.database_role_members + JOIN sys.database_principals roles ON database_role_members.role_principal_id = roles.principal_id + JOIN sys.database_principals members ON database_role_members.member_principal_id = members.principal_id +WHERE roles.name = @RoleName + +/* CREATE ROLE */ +SELECT @Command = '' +IF NOT EXISTS (SELECT 1 FROM sys.database_principals WHERE name = '''''' + @RoleName + '''''' AND type = ''''R'''') +BEGIN + CREATE ROLE ['' + @RoleName + ''] AUTHORIZATION [dbo] + PRINT ''''CREATE ROLE ['' + @RoleName + '']'''' +END +'' +EXEC sp_executesql @Command + +SET @Command = '' +DECLARE @SP_Name varchar(255) + +'' + +/* SET ALL ROLE SECURABLES */ +IF @Type = ''DEVE'' +BEGIN + + DECLARE SecurablesCurs CURSOR FOR + SELECT typeofobject, grantordeny, rightsaction, objectname, schemaid + FROM #Securables + WHERE N2 = 1 + + OPEN SecurablesCurs + FETCH NEXT FROM SecurablesCurs INTO @typeofobject, @grantordeny, @rightsaction, @objectname, @schemaid + WHILE @@FETCH_STATUS = 0 + BEGIN + + IF @typeofobject = ''DB'' + BEGIN + IF EXISTS(SELECT 1 FROM sys.fn_builtin_permissions(''DATABASE'') WHERE permission_name = '''' + @rightsaction + '''') + BEGIN + SET @Command = @Command + @grantordeny + '' '' + @rightsaction + '' TO ['' + @RoleName + ''] +'' + END + END + + IF @typeofobject = ''SCHEMA'' + BEGIN + SET @Command = @Command + '' +IF EXISTS (SELECT 1 FROM sys.schemas WHERE name = '''''' + @schemaid + '''''') +BEGIN + IF EXISTS(SELECT 1 FROM sys.fn_builtin_permissions(''''SCHEMA'''') WHERE permission_name = '''''' + @rightsaction + '''''') + BEGIN + '' + @grantordeny + '' '' + @rightsaction + '' ON SCHEMA::'' + @schemaid + '' TO ['' + @RoleName + ''] + END +END + +'' + END + + IF @typeofobject in(''TABLE'',''SP'',''FUNCTIONS'',''VIEWS'') + BEGIN + + IF @objectname like ''%[%]%'' + BEGIN + IF @typeofobject = ''TABLE'' + BEGIN + SET @sysTarget = ''sys.tables'' + SET @sysType = '''' + END + + IF @typeofobject = ''SP'' + BEGIN + SET @sysTarget = ''sys.procedures'' + SET @sysType = '''' + END + + IF @typeofobject = ''FUNCTIONS'' + BEGIN + SET @sysTarget = ''sys.objects'' + SET @sysType = '' and p.Type IN ( N''''FN'''', N''''IF'''', N''''TF'''', N''''FS'''', N''''FT'''' )'' + END + + IF @typeofobject = ''VIEWS'' + BEGIN + SET @sysTarget = ''sys.views'' + SET @sysType = '''' + END + + SET @Command = @Command + '' +DECLARE SP_cursor CURSOR FOR +SELECT p.name FROM '' + @sysTarget + '' p JOIN sys.schemas s ON s.schema_id = p.schema_id WHERE (p.name like '''''' + @objectname + '''''') and s.name = '''''' + @schemaid + '''' + @sysType + '''''' + +OPEN SP_cursor +FETCH NEXT FROM SP_cursor INTO @SP_Name +WHILE @@FETCH_STATUS = 0 +BEGIN + IF EXISTS(SELECT 1 FROM sys.fn_builtin_permissions(''''OBJECT'''') WHERE permission_name = '''''' + @rightsaction + '''''') + BEGIN + EXEC('''''' + @grantordeny + '' '' + @rightsaction + '' ON ['' + @schemaid + ''].['''' + @SP_Name + ''''] TO ['' + @RoleName + '']'''') + END + FETCH NEXT FROM SP_cursor INTO @SP_Name +END + +CLOSE SP_cursor +DEALLOCATE SP_cursor + +'' + + END + ELSE + BEGIN + + SET @Command = @Command + '' +IF EXISTS(SELECT 1 FROM sys.objects o WITH (NOLOCK) JOIN sys.schemas s ON s.schema_id = o.schema_id WHERE o.name = '''''' + @objectname + '''''' AND o.type IN (N''''U'''',''''P'''',''''V'''',''''FN'''',''''IF'''',''''TF'''') AND s.name = '''''' + @schemaid + '''''') +BEGIN + IF EXISTS(SELECT 1 FROM sys.fn_builtin_permissions(''''OBJECT'''') WHERE permission_name = '''''' + @rightsaction + '''''') + BEGIN + '' + @grantordeny + '' '' + @rightsaction + '' ON ['' + @schemaid + ''].['' + @objectname + ''] TO ['' + @RoleName + ''] + END +END + +'' + END + END + + IF @typeofobject = ''ASSEMBLIES'' + BEGIN + SET @Command = @Command + '' +IF EXISTS(SELECT 1 FROM sys.assemblies WHERE NAME = '''''' + @objectname + '''''') +BEGIN + IF EXISTS(SELECT 1 FROM sys.fn_builtin_permissions(''''ASSEMBLY'''') WHERE permission_name = '''''' + @rightsaction + '''''') + BEGIN + '' + @grantordeny + '' '' + @rightsaction + ''::['' + @objectname + ''] TO ['' + @RoleName + ''] + END +END + +'' + END + + IF @typeofobject = ''ROLE'' + BEGIN + SET @Command = @Command + '' +IF NOT EXISTS (SELECT 1 FROM sys.database_role_members JOIN sys.database_principals roles ON database_role_members.role_principal_id = roles.principal_id JOIN sys.database_principals members ON database_role_members.member_principal_id = members.principal_id WHERE roles.name = '''''' + @rightsaction + '''''' AND members.name = '''''' + @RoleName + '''''') +BEGIN + EXEC sp_addrolemember N'''''' + @rightsaction + '''''', N'''''' + @RoleName + '''''' +END + +'' + END + + FETCH NEXT FROM SecurablesCurs INTO @typeofobject, @grantordeny, @rightsaction, @objectname, @schemaid + END + +CLOSE SecurablesCurs +DEALLOCATE SecurablesCurs + +PRINT ''SET ALL SECURABLES ON ROLE ['' + @RoleName + '']'' +EXEC sp_executesql @Command + +END +ELSE +BEGIN + + DECLARE SecurablesCurs CURSOR FOR + SELECT typeofobject, grantordeny, rightsaction, objectname, schemaid + FROM #Securables + WHERE N2 = 0 + + OPEN SecurablesCurs + FETCH NEXT FROM SecurablesCurs INTO @typeofobject, @grantordeny, @rightsaction, @objectname, @schemaid + WHILE @@FETCH_STATUS = 0 + BEGIN + + IF @typeofobject = ''DB'' + BEGIN + IF EXISTS(SELECT 1 FROM sys.fn_builtin_permissions(''DATABASE'') WHERE permission_name = '''' + @rightsaction + '''') + BEGIN + SET @Command = @Command + @grantordeny + '' '' + @rightsaction + '' TO ['' + @RoleName + ''] +'' + END + END + + IF @typeofobject = ''SCHEMA'' + BEGIN + SET @Command = @Command + '' +IF EXISTS (SELECT 1 FROM sys.schemas WHERE name = '''''' + @schemaid + '''''') +BEGIN + IF EXISTS(SELECT 1 FROM sys.fn_builtin_permissions(''''SCHEMA'''') WHERE permission_name = '''''' + @rightsaction + '''''') + BEGIN + '' + @grantordeny + '' '' + @rightsaction + '' ON SCHEMA::'' + @schemaid + '' TO ['' + @RoleName + ''] + END +END + +'' + END + + IF @typeofobject in(''TABLE'',''SP'',''FUNCTIONS'',''VIEWS'') + BEGIN + + IF @objectname like ''%[%]%'' + BEGIN + + IF @typeofobject = ''TABLE'' + BEGIN + SET @sysTarget = ''sys.tables'' + SET @sysType = '''' + END + + IF @typeofobject = ''SP'' + BEGIN + SET @sysTarget = ''sys.procedures'' + SET @sysType = '''' + END + + IF @typeofobject = ''FUNCTIONS'' + BEGIN + SET @sysTarget = ''sys.objects'' + SET @sysType = '' and p.Type IN ( N''''FN'''', N''''IF'''', N''''TF'''', N''''FS'''', N''''FT'''' )'' + END + + IF @typeofobject = ''VIEWS'' + BEGIN + SET @sysTarget = ''sys.views'' + SET @sysType = '''' + END + + SET @Command = @Command + '' +DECLARE SP_cursor CURSOR FOR +SELECT p.name FROM '' + @sysTarget + '' p JOIN sys.schemas s ON s.schema_id = p.schema_id WHERE (p.name like '''''' + @objectname + '''''') and s.name = '''''' + @schemaid + '''' + @sysType + '''''' + +OPEN SP_cursor +FETCH NEXT FROM SP_cursor INTO @SP_Name +WHILE @@FETCH_STATUS = 0 +BEGIN + IF EXISTS(SELECT 1 FROM sys.fn_builtin_permissions(''''OBJECT'''') WHERE permission_name = '''''' + @rightsaction + '''''') + BEGIN + EXEC('''''' + @grantordeny + '' '' + @rightsaction + '' ON ['' + @schemaid + ''].['''' + @SP_Name + ''''] TO ['' + @RoleName + '']'''') + END + FETCH NEXT FROM SP_cursor INTO @SP_Name +END + +CLOSE SP_cursor +DEALLOCATE SP_cursor + +'' + + END + ELSE + BEGIN + + SET @Command = @Command + '' +IF EXISTS(SELECT 1 FROM sys.objects o WITH (NOLOCK) JOIN sys.schemas s ON s.schema_id = o.schema_id WHERE o.name = '''''' + @objectname + '''''' AND o.type IN (N''''U'''',''''P'''',''''V'''',''''FN'''',''''IF'''',''''TF'''') AND s.name = '''''' + @schemaid + '''''') +BEGIN + IF EXISTS(SELECT 1 FROM sys.fn_builtin_permissions(''''OBJECT'''') WHERE permission_name = '''''' + @rightsaction + '''''') + BEGIN + '' + @grantordeny + '' '' + @rightsaction + '' ON ['' + @schemaid + ''].['' + @objectname + ''] TO ['' + @RoleName + ''] + END +END + +'' + END + END + + IF @typeofobject = ''ASSEMBLIES'' + BEGIN + SET @Command = @Command + '' +IF EXISTS(SELECT 1 FROM sys.assemblies WHERE NAME = '''''' + @objectname + '''''') +BEGIN + IF EXISTS(SELECT 1 FROM sys.fn_builtin_permissions(''''ASSEMBLY'''') WHERE permission_name = '''''' + @rightsaction + '''''') + BEGIN + '' + @grantordeny + '' '' + @rightsaction + ''::['' + @objectname + ''] TO ['' + @RoleName + ''] + END +END + +'' + END + + IF @typeofobject = ''ROLE'' + BEGIN + SET @Command = @Command + '' +IF NOT EXISTS (SELECT 1 FROM sys.database_role_members JOIN sys.database_principals roles ON database_role_members.role_principal_id = roles.principal_id JOIN sys.database_principals members ON database_role_members.member_principal_id = members.principal_id WHERE roles.name = '''''' + @rightsaction + '''''' AND members.name = '''''' + @RoleName + '''''') +BEGIN + EXEC sp_addrolemember N'''''' + @rightsaction + '''''', N'''''' + @RoleName + '''''' +END + +'' + END + + FETCH NEXT FROM SecurablesCurs INTO @typeofobject, @grantordeny, @rightsaction, @objectname, @schemaid + END + +CLOSE SecurablesCurs +DEALLOCATE SecurablesCurs + +PRINT ''SET ALL SECURABLES ON ROLE ['' + @RoleName + '']'' +EXEC sp_executesql @Command + +END + +/* ADD USER */ +DECLARE UsersCurs CURSOR FOR +SELECT username + FROM #UsersOnRole + +OPEN UsersCurs + +FETCH NEXT FROM UsersCurs INTO @Users +WHILE @@FETCH_STATUS = 0 +BEGIN + + SELECT @Command = '' +EXEC sp_addrolemember N'''''' + @RoleName + '''''', N'''''' + @Users + '''''' +PRINT ''''ADD USER ['' + @Users + ''] ON ROLE ['' + @RoleName + '']'''' +'' + +FETCH NEXT FROM UsersCurs INTO @Users +END + +CLOSE UsersCurs +DEALLOCATE UsersCurs + +EXEC sp_executesql @Command + +/*============================================================================= + Drop temp tables +=============================================================================*/ +DROP TABLE #Securables +DROP TABLE #UsersOnRole','distribution','Pharmacies') + +INSERT INTO #AllRoles(STR_Definition,STR_Database,STR_Product)VALUES(' + +/*============================================================================= + + Script to create dbRoleTPPos role. + + Role Name: dbRoleTPPos + TEMPLATE: Default + + EXAMPLE OF SECURABLES TO SET: + + INSERT INTO #Securables + VALUES + (''DB'',''GRANT'',''VIEW DEFINITION'','''',''''), + (''SCHEMA'',''GRANT'',''SELECT,EXECUTE,INSERT,UPDATE,DELETE'','''',''AP''), + (''TABLE'',''GRANT'',''INSERT,UPDATE'',''Address'',''dbo''), + (''SP'',''GRANT'',''EXECUTE'',''sp_bmc_GetNextID'',''dbo''), + (''ROLE'',''GRANT'',''db_datareader'','''','''') + + ----------------------------------------------- + +Generate date : 2023-05-12 / up208700 + +=============================================================================*/ + +DECLARE @Command nvarchar(max), + @RoleName varchar(60), + @Users varchar(255), + @typeofobject varchar(50), + @grantordeny varchar(10), + @rightsaction varchar(255), + @objectname varchar(255), + @schemaid varchar(10), + @sysTarget varchar(255), + @sysType varchar(255) + +SET @RoleName = ''dbRoleTPPos'' +SET @Command = '''' + +/* TEMP TABLES */ +CREATE TABLE #UsersOnRole(username varchar(255)) +CREATE TABLE #Securables(typeofobject varchar(50), grantordeny varchar(10), rightsaction varchar(255), objectname varchar(255), schemaid varchar(10),N2 bit) + +/* !!! LIST OF SECURABLES TO CHANGE !!! */ + +INSERT INTO #Securables +VALUES +(''DB'',''GRANT'',''EXECUTE'','''',''dbo'',0) +,(''ROLE'',''GRANT'',''DB_DATAREADER'','''',''dbo'',0) +,(''ROLE'',''GRANT'',''DB_DATAWRITER'','''',''dbo'',0) +,(''ROLE'',''GRANT'',''DB_DDLADMIN'','''',''dbo'',0) + + +/* GET ALL USERS ON THIS ROLE */ +INSERT INTO #UsersOnRole +SELECT + members.name +FROM sys.database_role_members + JOIN sys.database_principals roles ON database_role_members.role_principal_id = roles.principal_id + JOIN sys.database_principals members ON database_role_members.member_principal_id = members.principal_id +WHERE roles.name = @RoleName + +/* CREATE ROLE */ +SELECT @Command = '' +IF NOT EXISTS (SELECT 1 FROM sys.database_principals WHERE name = '''''' + @RoleName + '''''' AND type = ''''R'''') +BEGIN + CREATE ROLE ['' + @RoleName + ''] AUTHORIZATION [dbo] + PRINT ''''CREATE ROLE ['' + @RoleName + '']'''' +END +'' +EXEC sp_executesql @Command + +SET @Command = '' +DECLARE @SP_Name varchar(255) + +'' + +/* SET ALL ROLE SECURABLES */ +DECLARE SecurablesCurs CURSOR FOR +SELECT typeofobject, grantordeny, rightsaction, objectname, schemaid +FROM #Securables +WHERE N2 = 0 + +OPEN SecurablesCurs +FETCH NEXT FROM SecurablesCurs INTO @typeofobject, @grantordeny, @rightsaction, @objectname, @schemaid +WHILE @@FETCH_STATUS = 0 +BEGIN + + IF @typeofobject = ''DB'' + BEGIN + IF EXISTS(SELECT 1 FROM sys.fn_builtin_permissions(''DATABASE'') WHERE permission_name = '''' + @rightsaction + '''') + BEGIN + SET @Command = @Command + @grantordeny + '' '' + @rightsaction + '' TO ['' + @RoleName + ''] +'' + END + END + + IF @typeofobject = ''SCHEMA'' + BEGIN + SET @Command = @Command + '' +IF EXISTS (SELECT 1 FROM sys.schemas WHERE name = '''''' + @schemaid + '''''') +BEGIN + IF EXISTS(SELECT 1 FROM sys.fn_builtin_permissions(''''SCHEMA'''') WHERE permission_name = '''''' + @rightsaction + '''''') + BEGIN + '' + @grantordeny + '' '' + @rightsaction + '' ON SCHEMA::'' + @schemaid + '' TO ['' + @RoleName + ''] + END +END + +'' + END + + IF @typeofobject in(''TABLE'',''SP'',''FUNCTIONS'',''VIEWS'') + BEGIN + + IF @objectname like ''%[%]%'' + BEGIN + + IF @typeofobject = ''TABLE'' + BEGIN + SET @sysTarget = ''sys.tables'' + SET @sysType = '''' + END + + IF @typeofobject = ''SP'' + BEGIN + SET @sysTarget = ''sys.procedures'' + SET @sysType = '''' + END + + IF @typeofobject = ''FUNCTIONS'' + BEGIN + SET @sysTarget = ''sys.objects'' + SET @sysType = '' and p.Type IN ( N''''FN'''', N''''IF'''', N''''TF'''', N''''FS'''', N''''FT'''' )'' + END + + IF @typeofobject = ''VIEWS'' + BEGIN + SET @sysTarget = ''sys.views'' + SET @sysType = '''' + END + + SET @Command = @Command + '' +DECLARE SP_cursor CURSOR FOR +SELECT p.name FROM '' + @sysTarget + '' p JOIN sys.schemas s ON s.schema_id = p.schema_id WHERE (p.name like '''''' + @objectname + '''''') and s.name = '''''' + @schemaid + '''' + @sysType + '''''' + +OPEN SP_cursor +FETCH NEXT FROM SP_cursor INTO @SP_Name +WHILE @@FETCH_STATUS = 0 +BEGIN + IF EXISTS(SELECT 1 FROM sys.fn_builtin_permissions(''''OBJECT'''') WHERE permission_name = '''''' + @rightsaction + '''''') + BEGIN + EXEC('''''' + @grantordeny + '' '' + @rightsaction + '' ON ['' + @schemaid + ''].['''' + @SP_Name + ''''] TO ['' + @RoleName + '']'''') + END + FETCH NEXT FROM SP_cursor INTO @SP_Name +END + +CLOSE SP_cursor +DEALLOCATE SP_cursor + +'' + + END + ELSE + BEGIN + + SET @Command = @Command + '' +IF EXISTS(SELECT 1 FROM sys.objects o WITH (NOLOCK) JOIN sys.schemas s ON s.schema_id = o.schema_id WHERE o.name = '''''' + @objectname + '''''' AND o.type IN (N''''U'''',''''P'''',''''V'''',''''FN'''',''''IF'''',''''TF'''') AND s.name = '''''' + @schemaid + '''''') +BEGIN + IF EXISTS(SELECT 1 FROM sys.fn_builtin_permissions(''''OBJECT'''') WHERE permission_name = '''''' + @rightsaction + '''''') + BEGIN + '' + @grantordeny + '' '' + @rightsaction + '' ON ['' + @schemaid + ''].['' + @objectname + ''] TO ['' + @RoleName + ''] + END +END + +'' + END +END + +IF @typeofobject = ''ASSEMBLIES'' +BEGIN + SET @Command = @Command + '' +IF EXISTS(SELECT 1 FROM sys.assemblies WHERE NAME = '''''' + @objectname + '''''') +BEGIN + IF EXISTS(SELECT 1 FROM sys.fn_builtin_permissions(''''ASSEMBLY'''') WHERE permission_name = '''''' + @rightsaction + '''''') + BEGIN + '' + @grantordeny + '' '' + @rightsaction + ''::['' + @objectname + ''] TO ['' + @RoleName + ''] + END +END + +'' +END + +IF @typeofobject = ''ROLE'' +BEGIN + SET @Command = @Command + '' +IF NOT EXISTS (SELECT 1 FROM sys.database_role_members JOIN sys.database_principals roles ON database_role_members.role_principal_id = roles.principal_id JOIN sys.database_principals members ON database_role_members.member_principal_id = members.principal_id WHERE roles.name = '''''' + @rightsaction + '''''' AND members.name = '''''' + @RoleName + '''''') +BEGIN + EXEC sp_addrolemember N'''''' + @rightsaction + '''''', N'''''' + @RoleName + '''''' +END + +'' +END + +FETCH NEXT FROM SecurablesCurs INTO @typeofobject, @grantordeny, @rightsaction, @objectname, @schemaid +END + +CLOSE SecurablesCurs +DEALLOCATE SecurablesCurs + +PRINT ''SET ALL SECURABLES ON ROLE ['' + @RoleName + '']'' +EXEC sp_executesql @Command + +/* ADD USER */ +DECLARE UsersCurs CURSOR FOR +SELECT username + FROM #UsersOnRole + +OPEN UsersCurs + +FETCH NEXT FROM UsersCurs INTO @Users +WHILE @@FETCH_STATUS = 0 +BEGIN + + SELECT @Command = '' +EXEC sp_addrolemember N'''''' + @RoleName + '''''', N'''''' + @Users + '''''' +PRINT ''''ADD USER ['' + @Users + ''] ON ROLE ['' + @RoleName + '']'''' +'' + +FETCH NEXT FROM UsersCurs INTO @Users +END + +CLOSE UsersCurs +DEALLOCATE UsersCurs + +EXEC sp_executesql @Command + + +/*============================================================================= + Drop temp tables +=============================================================================*/ +DROP TABLE #Securables +DROP TABLE #UsersOnRole +','distribution','Pharmacies') + +INSERT INTO #AllRoles(STR_Definition,STR_Database,STR_Product)VALUES(' + +/*============================================================================= + + Script to create dbRoleCsltUsr role. + + Role Name: dbRoleCsltUsr + TEMPLATE: N2 and PROD + + EXAMPLE OF SECURABLES TO SET: + + INSERT INTO #Securables + VALUES + (''DB'',''GRANT'',''VIEW DEFINITION'','''',''''), + (''SCHEMA'',''GRANT'',''SELECT,EXECUTE,INSERT,UPDATE,DELETE'','''',''AP''), + (''TABLE'',''GRANT'',''INSERT,UPDATE'',''Address'',''dbo''), + (''SP'',''GRANT'',''EXECUTE'',''sp_bmc_GetNextID'',''dbo''), + (''ROLE'',''GRANT'',''db_datareader'','''','''') + + ----------------------------------------------- + +Generate date : 2023-05-12 / up208700 + +=============================================================================*/ + +DECLARE @Type varchar(6), + @Command nvarchar(max), + @RoleName varchar(60), + @Users varchar(255), + @typeofobject varchar(50), + @grantordeny varchar(10), + @rightsaction varchar(255), + @objectname varchar(255), + @schemaid varchar(10), + @sysTarget varchar(255), + @sysType varchar(255) + +SET @RoleName = ''dbRoleCsltUsr'' +SET @Command = '''' + +SELECT @Type = [Type] FROM [master].[cfg].[InstanceContext] + +/* TEMP TABLES */ +CREATE TABLE #UsersOnRole(username varchar(255)) +CREATE TABLE #Securables(typeofobject varchar(50), grantordeny varchar(10), rightsaction varchar(255), objectname varchar(255), schemaid varchar(10),N2 bit) + +/* !!! LIST OF SECURABLES TO CHANGE !!! */ + +INSERT INTO #Securables +VALUES +(''DB'',''GRANT'',''CREATE TABLE'','''',''dbo'',0) +,(''DB'',''GRANT'',''CREATE TABLE'','''',''dbo'',1) +,(''DB'',''GRANT'',''EXECUTE'','''',''dbo'',0) +,(''DB'',''GRANT'',''EXECUTE'','''',''dbo'',1) +,(''DB'',''GRANT'',''VIEW DEFINITION'','''',''dbo'',0) +,(''DB'',''GRANT'',''VIEW DEFINITION'','''',''dbo'',1) +,(''ROLE'',''GRANT'',''DB_DATAREADER'','''',''dbo'',0) +,(''ROLE'',''GRANT'',''DB_DATAREADER'','''',''dbo'',1) +,(''SCHEMA'',''GRANT'',''ALTER'',''Entire Schema'',''tmp'',0) +,(''SCHEMA'',''GRANT'',''ALTER'',''Entire Schema'',''tmp'',1) +,(''SCHEMA'',''GRANT'',''DELETE'',''Entire Schema'',''tmp'',0) +,(''SCHEMA'',''GRANT'',''DELETE'',''Entire Schema'',''tmp'',1) +,(''SCHEMA'',''GRANT'',''EXECUTE'',''Entire Schema'',''tmp'',0) +,(''SCHEMA'',''GRANT'',''EXECUTE'',''Entire Schema'',''tmp'',1) +,(''SCHEMA'',''GRANT'',''INSERT'',''Entire Schema'',''tmp'',0) +,(''SCHEMA'',''GRANT'',''INSERT'',''Entire Schema'',''tmp'',1) +,(''SCHEMA'',''GRANT'',''SELECT'',''Entire Schema'',''tmp'',0) +,(''SCHEMA'',''GRANT'',''SELECT'',''Entire Schema'',''tmp'',1) +,(''SCHEMA'',''GRANT'',''UPDATE'',''Entire Schema'',''tmp'',0) +,(''SCHEMA'',''GRANT'',''UPDATE'',''Entire Schema'',''tmp'',1) + + +/* GET ALL USERS ON THIS ROLE */ +INSERT INTO #UsersOnRole +SELECT + members.name +FROM sys.database_role_members + JOIN sys.database_principals roles ON database_role_members.role_principal_id = roles.principal_id + JOIN sys.database_principals members ON database_role_members.member_principal_id = members.principal_id +WHERE roles.name = @RoleName + +/* CREATE ROLE */ +SELECT @Command = '' +IF NOT EXISTS (SELECT 1 FROM sys.database_principals WHERE name = '''''' + @RoleName + '''''' AND type = ''''R'''') +BEGIN + CREATE ROLE ['' + @RoleName + ''] AUTHORIZATION [dbo] + PRINT ''''CREATE ROLE ['' + @RoleName + '']'''' +END +'' +EXEC sp_executesql @Command + +SET @Command = '' +DECLARE @SP_Name varchar(255) + +'' + +/* SET ALL ROLE SECURABLES */ +IF @Type = ''DEVE'' +BEGIN + + DECLARE SecurablesCurs CURSOR FOR + SELECT typeofobject, grantordeny, rightsaction, objectname, schemaid + FROM #Securables + WHERE N2 = 1 + + OPEN SecurablesCurs + FETCH NEXT FROM SecurablesCurs INTO @typeofobject, @grantordeny, @rightsaction, @objectname, @schemaid + WHILE @@FETCH_STATUS = 0 + BEGIN + + IF @typeofobject = ''DB'' + BEGIN + IF EXISTS(SELECT 1 FROM sys.fn_builtin_permissions(''DATABASE'') WHERE permission_name = '''' + @rightsaction + '''') + BEGIN + SET @Command = @Command + @grantordeny + '' '' + @rightsaction + '' TO ['' + @RoleName + ''] +'' + END + END + + IF @typeofobject = ''SCHEMA'' + BEGIN + SET @Command = @Command + '' +IF EXISTS (SELECT 1 FROM sys.schemas WHERE name = '''''' + @schemaid + '''''') +BEGIN + IF EXISTS(SELECT 1 FROM sys.fn_builtin_permissions(''''SCHEMA'''') WHERE permission_name = '''''' + @rightsaction + '''''') + BEGIN + '' + @grantordeny + '' '' + @rightsaction + '' ON SCHEMA::'' + @schemaid + '' TO ['' + @RoleName + ''] + END +END + +'' + END + + IF @typeofobject in(''TABLE'',''SP'',''FUNCTIONS'',''VIEWS'') + BEGIN + + IF @objectname like ''%[%]%'' + BEGIN + IF @typeofobject = ''TABLE'' + BEGIN + SET @sysTarget = ''sys.tables'' + SET @sysType = '''' + END + + IF @typeofobject = ''SP'' + BEGIN + SET @sysTarget = ''sys.procedures'' + SET @sysType = '''' + END + + IF @typeofobject = ''FUNCTIONS'' + BEGIN + SET @sysTarget = ''sys.objects'' + SET @sysType = '' and p.Type IN ( N''''FN'''', N''''IF'''', N''''TF'''', N''''FS'''', N''''FT'''' )'' + END + + IF @typeofobject = ''VIEWS'' + BEGIN + SET @sysTarget = ''sys.views'' + SET @sysType = '''' + END + + SET @Command = @Command + '' +DECLARE SP_cursor CURSOR FOR +SELECT p.name FROM '' + @sysTarget + '' p JOIN sys.schemas s ON s.schema_id = p.schema_id WHERE (p.name like '''''' + @objectname + '''''') and s.name = '''''' + @schemaid + '''' + @sysType + '''''' + +OPEN SP_cursor +FETCH NEXT FROM SP_cursor INTO @SP_Name +WHILE @@FETCH_STATUS = 0 +BEGIN + IF EXISTS(SELECT 1 FROM sys.fn_builtin_permissions(''''OBJECT'''') WHERE permission_name = '''''' + @rightsaction + '''''') + BEGIN + EXEC('''''' + @grantordeny + '' '' + @rightsaction + '' ON ['' + @schemaid + ''].['''' + @SP_Name + ''''] TO ['' + @RoleName + '']'''') + END + FETCH NEXT FROM SP_cursor INTO @SP_Name +END + +CLOSE SP_cursor +DEALLOCATE SP_cursor + +'' + + END + ELSE + BEGIN + + SET @Command = @Command + '' +IF EXISTS(SELECT 1 FROM sys.objects o WITH (NOLOCK) JOIN sys.schemas s ON s.schema_id = o.schema_id WHERE o.name = '''''' + @objectname + '''''' AND o.type IN (N''''U'''',''''P'''',''''V'''',''''FN'''',''''IF'''',''''TF'''') AND s.name = '''''' + @schemaid + '''''') +BEGIN + IF EXISTS(SELECT 1 FROM sys.fn_builtin_permissions(''''OBJECT'''') WHERE permission_name = '''''' + @rightsaction + '''''') + BEGIN + '' + @grantordeny + '' '' + @rightsaction + '' ON ['' + @schemaid + ''].['' + @objectname + ''] TO ['' + @RoleName + ''] + END +END + +'' + END + END + + IF @typeofobject = ''ASSEMBLIES'' + BEGIN + SET @Command = @Command + '' +IF EXISTS(SELECT 1 FROM sys.assemblies WHERE NAME = '''''' + @objectname + '''''') +BEGIN + IF EXISTS(SELECT 1 FROM sys.fn_builtin_permissions(''''ASSEMBLY'''') WHERE permission_name = '''''' + @rightsaction + '''''') + BEGIN + '' + @grantordeny + '' '' + @rightsaction + ''::['' + @objectname + ''] TO ['' + @RoleName + ''] + END +END + +'' + END + + IF @typeofobject = ''ROLE'' + BEGIN + SET @Command = @Command + '' +IF NOT EXISTS (SELECT 1 FROM sys.database_role_members JOIN sys.database_principals roles ON database_role_members.role_principal_id = roles.principal_id JOIN sys.database_principals members ON database_role_members.member_principal_id = members.principal_id WHERE roles.name = '''''' + @rightsaction + '''''' AND members.name = '''''' + @RoleName + '''''') +BEGIN + EXEC sp_addrolemember N'''''' + @rightsaction + '''''', N'''''' + @RoleName + '''''' +END + +'' + END + + FETCH NEXT FROM SecurablesCurs INTO @typeofobject, @grantordeny, @rightsaction, @objectname, @schemaid + END + +CLOSE SecurablesCurs +DEALLOCATE SecurablesCurs + +PRINT ''SET ALL SECURABLES ON ROLE ['' + @RoleName + '']'' +EXEC sp_executesql @Command + +END +ELSE +BEGIN + + DECLARE SecurablesCurs CURSOR FOR + SELECT typeofobject, grantordeny, rightsaction, objectname, schemaid + FROM #Securables + WHERE N2 = 0 + + OPEN SecurablesCurs + FETCH NEXT FROM SecurablesCurs INTO @typeofobject, @grantordeny, @rightsaction, @objectname, @schemaid + WHILE @@FETCH_STATUS = 0 + BEGIN + + IF @typeofobject = ''DB'' + BEGIN + IF EXISTS(SELECT 1 FROM sys.fn_builtin_permissions(''DATABASE'') WHERE permission_name = '''' + @rightsaction + '''') + BEGIN + SET @Command = @Command + @grantordeny + '' '' + @rightsaction + '' TO ['' + @RoleName + ''] +'' + END + END + + IF @typeofobject = ''SCHEMA'' + BEGIN + SET @Command = @Command + '' +IF EXISTS (SELECT 1 FROM sys.schemas WHERE name = '''''' + @schemaid + '''''') +BEGIN + IF EXISTS(SELECT 1 FROM sys.fn_builtin_permissions(''''SCHEMA'''') WHERE permission_name = '''''' + @rightsaction + '''''') + BEGIN + '' + @grantordeny + '' '' + @rightsaction + '' ON SCHEMA::'' + @schemaid + '' TO ['' + @RoleName + ''] + END +END + +'' + END + + IF @typeofobject in(''TABLE'',''SP'',''FUNCTIONS'',''VIEWS'') + BEGIN + + IF @objectname like ''%[%]%'' + BEGIN + + IF @typeofobject = ''TABLE'' + BEGIN + SET @sysTarget = ''sys.tables'' + SET @sysType = '''' + END + + IF @typeofobject = ''SP'' + BEGIN + SET @sysTarget = ''sys.procedures'' + SET @sysType = '''' + END + + IF @typeofobject = ''FUNCTIONS'' + BEGIN + SET @sysTarget = ''sys.objects'' + SET @sysType = '' and p.Type IN ( N''''FN'''', N''''IF'''', N''''TF'''', N''''FS'''', N''''FT'''' )'' + END + + IF @typeofobject = ''VIEWS'' + BEGIN + SET @sysTarget = ''sys.views'' + SET @sysType = '''' + END + + SET @Command = @Command + '' +DECLARE SP_cursor CURSOR FOR +SELECT p.name FROM '' + @sysTarget + '' p JOIN sys.schemas s ON s.schema_id = p.schema_id WHERE (p.name like '''''' + @objectname + '''''') and s.name = '''''' + @schemaid + '''' + @sysType + '''''' + +OPEN SP_cursor +FETCH NEXT FROM SP_cursor INTO @SP_Name +WHILE @@FETCH_STATUS = 0 +BEGIN + IF EXISTS(SELECT 1 FROM sys.fn_builtin_permissions(''''OBJECT'''') WHERE permission_name = '''''' + @rightsaction + '''''') + BEGIN + EXEC('''''' + @grantordeny + '' '' + @rightsaction + '' ON ['' + @schemaid + ''].['''' + @SP_Name + ''''] TO ['' + @RoleName + '']'''') + END + FETCH NEXT FROM SP_cursor INTO @SP_Name +END + +CLOSE SP_cursor +DEALLOCATE SP_cursor + +'' + + END + ELSE + BEGIN + + SET @Command = @Command + '' +IF EXISTS(SELECT 1 FROM sys.objects o WITH (NOLOCK) JOIN sys.schemas s ON s.schema_id = o.schema_id WHERE o.name = '''''' + @objectname + '''''' AND o.type IN (N''''U'''',''''P'''',''''V'''',''''FN'''',''''IF'''',''''TF'''') AND s.name = '''''' + @schemaid + '''''') +BEGIN + IF EXISTS(SELECT 1 FROM sys.fn_builtin_permissions(''''OBJECT'''') WHERE permission_name = '''''' + @rightsaction + '''''') + BEGIN + '' + @grantordeny + '' '' + @rightsaction + '' ON ['' + @schemaid + ''].['' + @objectname + ''] TO ['' + @RoleName + ''] + END +END + +'' + END + END + + IF @typeofobject = ''ASSEMBLIES'' + BEGIN + SET @Command = @Command + '' +IF EXISTS(SELECT 1 FROM sys.assemblies WHERE NAME = '''''' + @objectname + '''''') +BEGIN + IF EXISTS(SELECT 1 FROM sys.fn_builtin_permissions(''''ASSEMBLY'''') WHERE permission_name = '''''' + @rightsaction + '''''') + BEGIN + '' + @grantordeny + '' '' + @rightsaction + ''::['' + @objectname + ''] TO ['' + @RoleName + ''] + END +END + +'' + END + + IF @typeofobject = ''ROLE'' + BEGIN + SET @Command = @Command + '' +IF NOT EXISTS (SELECT 1 FROM sys.database_role_members JOIN sys.database_principals roles ON database_role_members.role_principal_id = roles.principal_id JOIN sys.database_principals members ON database_role_members.member_principal_id = members.principal_id WHERE roles.name = '''''' + @rightsaction + '''''' AND members.name = '''''' + @RoleName + '''''') +BEGIN + EXEC sp_addrolemember N'''''' + @rightsaction + '''''', N'''''' + @RoleName + '''''' +END + +'' + END + + FETCH NEXT FROM SecurablesCurs INTO @typeofobject, @grantordeny, @rightsaction, @objectname, @schemaid + END + +CLOSE SecurablesCurs +DEALLOCATE SecurablesCurs + +PRINT ''SET ALL SECURABLES ON ROLE ['' + @RoleName + '']'' +EXEC sp_executesql @Command + +END + +/* ADD USER */ +DECLARE UsersCurs CURSOR FOR +SELECT username + FROM #UsersOnRole + +OPEN UsersCurs + +FETCH NEXT FROM UsersCurs INTO @Users +WHILE @@FETCH_STATUS = 0 +BEGIN + + SELECT @Command = '' +EXEC sp_addrolemember N'''''' + @RoleName + '''''', N'''''' + @Users + '''''' +PRINT ''''ADD USER ['' + @Users + ''] ON ROLE ['' + @RoleName + '']'''' +'' + +FETCH NEXT FROM UsersCurs INTO @Users +END + +CLOSE UsersCurs +DEALLOCATE UsersCurs + +EXEC sp_executesql @Command + +/*============================================================================= + Drop temp tables +=============================================================================*/ +DROP TABLE #Securables +DROP TABLE #UsersOnRole','HCITools','Pharmacies') + +INSERT INTO #AllRoles(STR_Definition,STR_Database,STR_Product)VALUES(' + +/*============================================================================= + + Script to create dbRoleDataMonitoring role. + + Role Name: dbRoleDataMonitoring + TEMPLATE: Default + + EXAMPLE OF SECURABLES TO SET: + + INSERT INTO #Securables + VALUES + (''DB'',''GRANT'',''VIEW DEFINITION'','''',''''), + (''SCHEMA'',''GRANT'',''SELECT,EXECUTE,INSERT,UPDATE,DELETE'','''',''AP''), + (''TABLE'',''GRANT'',''INSERT,UPDATE'',''Address'',''dbo''), + (''SP'',''GRANT'',''EXECUTE'',''sp_bmc_GetNextID'',''dbo''), + (''ROLE'',''GRANT'',''db_datareader'','''','''') + + ----------------------------------------------- + +Generate date : 2023-05-12 / up208700 + +=============================================================================*/ + +DECLARE @Command nvarchar(max), + @RoleName varchar(60), + @Users varchar(255), + @typeofobject varchar(50), + @grantordeny varchar(10), + @rightsaction varchar(255), + @objectname varchar(255), + @schemaid varchar(10), + @sysTarget varchar(255), + @sysType varchar(255) + +SET @RoleName = ''dbRoleDataMonitoring'' +SET @Command = '''' + +/* TEMP TABLES */ +CREATE TABLE #UsersOnRole(username varchar(255)) +CREATE TABLE #Securables(typeofobject varchar(50), grantordeny varchar(10), rightsaction varchar(255), objectname varchar(255), schemaid varchar(10),N2 bit) + +/* !!! LIST OF SECURABLES TO CHANGE !!! */ + +INSERT INTO #Securables +VALUES +(''ROLE'',''GRANT'',''DB_DATAREADER'','''',''dbo'',0) +,(''SCHEMA'',''GRANT'',''DELETE'',''Entire Schema'',''dam'',0) +,(''SCHEMA'',''GRANT'',''EXECUTE'',''Entire Schema'',''dam'',0) +,(''SCHEMA'',''GRANT'',''INSERT'',''Entire Schema'',''dam'',0) +,(''SCHEMA'',''GRANT'',''SELECT'',''Entire Schema'',''dam'',0) +,(''SCHEMA'',''GRANT'',''UPDATE'',''Entire Schema'',''dam'',0) +,(''SP'',''GRANT'',''EXECUTE'',''GetAllJobsInformations'',''mon'',0) +,(''SP'',''GRANT'',''EXECUTE'',''GetJobStepState'',''mon'',0) +,(''TABLE'',''GRANT'',''DELETE'',''HCI_PARAMS'',''dbo'',0) +,(''TABLE'',''GRANT'',''INSERT'',''HCI_PARAMS'',''dbo'',0) +,(''TABLE'',''GRANT'',''SELECT'',''HCI_PARAMS'',''dbo'',0) +,(''TABLE'',''GRANT'',''UPDATE'',''HCI_PARAMS'',''dbo'',0) + + +/* GET ALL USERS ON THIS ROLE */ +INSERT INTO #UsersOnRole +SELECT + members.name +FROM sys.database_role_members + JOIN sys.database_principals roles ON database_role_members.role_principal_id = roles.principal_id + JOIN sys.database_principals members ON database_role_members.member_principal_id = members.principal_id +WHERE roles.name = @RoleName + +/* CREATE ROLE */ +SELECT @Command = '' +IF NOT EXISTS (SELECT 1 FROM sys.database_principals WHERE name = '''''' + @RoleName + '''''' AND type = ''''R'''') +BEGIN + CREATE ROLE ['' + @RoleName + ''] AUTHORIZATION [dbo] + PRINT ''''CREATE ROLE ['' + @RoleName + '']'''' +END +'' +EXEC sp_executesql @Command + +SET @Command = '' +DECLARE @SP_Name varchar(255) + +'' + +/* SET ALL ROLE SECURABLES */ +DECLARE SecurablesCurs CURSOR FOR +SELECT typeofobject, grantordeny, rightsaction, objectname, schemaid +FROM #Securables +WHERE N2 = 0 + +OPEN SecurablesCurs +FETCH NEXT FROM SecurablesCurs INTO @typeofobject, @grantordeny, @rightsaction, @objectname, @schemaid +WHILE @@FETCH_STATUS = 0 +BEGIN + + IF @typeofobject = ''DB'' + BEGIN + IF EXISTS(SELECT 1 FROM sys.fn_builtin_permissions(''DATABASE'') WHERE permission_name = '''' + @rightsaction + '''') + BEGIN + SET @Command = @Command + @grantordeny + '' '' + @rightsaction + '' TO ['' + @RoleName + ''] +'' + END + END + + IF @typeofobject = ''SCHEMA'' + BEGIN + SET @Command = @Command + '' +IF EXISTS (SELECT 1 FROM sys.schemas WHERE name = '''''' + @schemaid + '''''') +BEGIN + IF EXISTS(SELECT 1 FROM sys.fn_builtin_permissions(''''SCHEMA'''') WHERE permission_name = '''''' + @rightsaction + '''''') + BEGIN + '' + @grantordeny + '' '' + @rightsaction + '' ON SCHEMA::'' + @schemaid + '' TO ['' + @RoleName + ''] + END +END + +'' + END + + IF @typeofobject in(''TABLE'',''SP'',''FUNCTIONS'',''VIEWS'') + BEGIN + + IF @objectname like ''%[%]%'' + BEGIN + + IF @typeofobject = ''TABLE'' + BEGIN + SET @sysTarget = ''sys.tables'' + SET @sysType = '''' + END + + IF @typeofobject = ''SP'' + BEGIN + SET @sysTarget = ''sys.procedures'' + SET @sysType = '''' + END + + IF @typeofobject = ''FUNCTIONS'' + BEGIN + SET @sysTarget = ''sys.objects'' + SET @sysType = '' and p.Type IN ( N''''FN'''', N''''IF'''', N''''TF'''', N''''FS'''', N''''FT'''' )'' + END + + IF @typeofobject = ''VIEWS'' + BEGIN + SET @sysTarget = ''sys.views'' + SET @sysType = '''' + END + + SET @Command = @Command + '' +DECLARE SP_cursor CURSOR FOR +SELECT p.name FROM '' + @sysTarget + '' p JOIN sys.schemas s ON s.schema_id = p.schema_id WHERE (p.name like '''''' + @objectname + '''''') and s.name = '''''' + @schemaid + '''' + @sysType + '''''' + +OPEN SP_cursor +FETCH NEXT FROM SP_cursor INTO @SP_Name +WHILE @@FETCH_STATUS = 0 +BEGIN + IF EXISTS(SELECT 1 FROM sys.fn_builtin_permissions(''''OBJECT'''') WHERE permission_name = '''''' + @rightsaction + '''''') + BEGIN + EXEC('''''' + @grantordeny + '' '' + @rightsaction + '' ON ['' + @schemaid + ''].['''' + @SP_Name + ''''] TO ['' + @RoleName + '']'''') + END + FETCH NEXT FROM SP_cursor INTO @SP_Name +END + +CLOSE SP_cursor +DEALLOCATE SP_cursor + +'' + + END + ELSE + BEGIN + + SET @Command = @Command + '' +IF EXISTS(SELECT 1 FROM sys.objects o WITH (NOLOCK) JOIN sys.schemas s ON s.schema_id = o.schema_id WHERE o.name = '''''' + @objectname + '''''' AND o.type IN (N''''U'''',''''P'''',''''V'''',''''FN'''',''''IF'''',''''TF'''') AND s.name = '''''' + @schemaid + '''''') +BEGIN + IF EXISTS(SELECT 1 FROM sys.fn_builtin_permissions(''''OBJECT'''') WHERE permission_name = '''''' + @rightsaction + '''''') + BEGIN + '' + @grantordeny + '' '' + @rightsaction + '' ON ['' + @schemaid + ''].['' + @objectname + ''] TO ['' + @RoleName + ''] + END +END + +'' + END +END + +IF @typeofobject = ''ASSEMBLIES'' +BEGIN + SET @Command = @Command + '' +IF EXISTS(SELECT 1 FROM sys.assemblies WHERE NAME = '''''' + @objectname + '''''') +BEGIN + IF EXISTS(SELECT 1 FROM sys.fn_builtin_permissions(''''ASSEMBLY'''') WHERE permission_name = '''''' + @rightsaction + '''''') + BEGIN + '' + @grantordeny + '' '' + @rightsaction + ''::['' + @objectname + ''] TO ['' + @RoleName + ''] + END +END + +'' +END + +IF @typeofobject = ''ROLE'' +BEGIN + SET @Command = @Command + '' +IF NOT EXISTS (SELECT 1 FROM sys.database_role_members JOIN sys.database_principals roles ON database_role_members.role_principal_id = roles.principal_id JOIN sys.database_principals members ON database_role_members.member_principal_id = members.principal_id WHERE roles.name = '''''' + @rightsaction + '''''' AND members.name = '''''' + @RoleName + '''''') +BEGIN + EXEC sp_addrolemember N'''''' + @rightsaction + '''''', N'''''' + @RoleName + '''''' +END + +'' +END + +FETCH NEXT FROM SecurablesCurs INTO @typeofobject, @grantordeny, @rightsaction, @objectname, @schemaid +END + +CLOSE SecurablesCurs +DEALLOCATE SecurablesCurs + +PRINT ''SET ALL SECURABLES ON ROLE ['' + @RoleName + '']'' +EXEC sp_executesql @Command + +/* ADD USER */ +DECLARE UsersCurs CURSOR FOR +SELECT username + FROM #UsersOnRole + +OPEN UsersCurs + +FETCH NEXT FROM UsersCurs INTO @Users +WHILE @@FETCH_STATUS = 0 +BEGIN + + SELECT @Command = '' +EXEC sp_addrolemember N'''''' + @RoleName + '''''', N'''''' + @Users + '''''' +PRINT ''''ADD USER ['' + @Users + ''] ON ROLE ['' + @RoleName + '']'''' +'' + +FETCH NEXT FROM UsersCurs INTO @Users +END + +CLOSE UsersCurs +DEALLOCATE UsersCurs + +EXEC sp_executesql @Command + + +/*============================================================================= + Drop temp tables +=============================================================================*/ +DROP TABLE #Securables +DROP TABLE #UsersOnRole +','HCITools','Pharmacies') + +INSERT INTO #AllRoles(STR_Definition,STR_Database,STR_Product)VALUES(' + +/*============================================================================= + + Script to create dbRoleDevUsr role. + + Role Name: dbRoleDevUsr + TEMPLATE: Default + + EXAMPLE OF SECURABLES TO SET: + + INSERT INTO #Securables + VALUES + (''DB'',''GRANT'',''VIEW DEFINITION'','''',''''), + (''SCHEMA'',''GRANT'',''SELECT,EXECUTE,INSERT,UPDATE,DELETE'','''',''AP''), + (''TABLE'',''GRANT'',''INSERT,UPDATE'',''Address'',''dbo''), + (''SP'',''GRANT'',''EXECUTE'',''sp_bmc_GetNextID'',''dbo''), + (''ROLE'',''GRANT'',''db_datareader'','''','''') + + ----------------------------------------------- + +Generate date : 2023-05-12 / up208700 + +=============================================================================*/ + +DECLARE @Command nvarchar(max), + @RoleName varchar(60), + @Users varchar(255), + @typeofobject varchar(50), + @grantordeny varchar(10), + @rightsaction varchar(255), + @objectname varchar(255), + @schemaid varchar(10), + @sysTarget varchar(255), + @sysType varchar(255) + +SET @RoleName = ''dbRoleDevUsr'' +SET @Command = '''' + +/* TEMP TABLES */ +CREATE TABLE #UsersOnRole(username varchar(255)) +CREATE TABLE #Securables(typeofobject varchar(50), grantordeny varchar(10), rightsaction varchar(255), objectname varchar(255), schemaid varchar(10),N2 bit) + +/* !!! LIST OF SECURABLES TO CHANGE !!! */ + +INSERT INTO #Securables +VALUES +(''DB'',''GRANT'',''CREATE TABLE'','''',''dbo'',0) +,(''DB'',''GRANT'',''EXECUTE'','''',''dbo'',0) +,(''DB'',''GRANT'',''SHOWPLAN'','''',''dbo'',0) +,(''DB'',''GRANT'',''VIEW DEFINITION'','''',''dbo'',0) +,(''ROLE'',''GRANT'',''DB_DATAREADER'','''',''dbo'',0) +,(''SCHEMA'',''GRANT'',''ALTER'',''Entire Schema'',''tmp'',0) +,(''SCHEMA'',''GRANT'',''DELETE'',''Entire Schema'',''tmp'',0) +,(''SCHEMA'',''GRANT'',''EXECUTE'',''Entire Schema'',''tmp'',0) +,(''SCHEMA'',''GRANT'',''INSERT'',''Entire Schema'',''tmp'',0) +,(''SCHEMA'',''GRANT'',''SELECT'',''Entire Schema'',''tmp'',0) +,(''SCHEMA'',''GRANT'',''UPDATE'',''Entire Schema'',''tmp'',0) + + +/* GET ALL USERS ON THIS ROLE */ +INSERT INTO #UsersOnRole +SELECT + members.name +FROM sys.database_role_members + JOIN sys.database_principals roles ON database_role_members.role_principal_id = roles.principal_id + JOIN sys.database_principals members ON database_role_members.member_principal_id = members.principal_id +WHERE roles.name = @RoleName + +/* CREATE ROLE */ +SELECT @Command = '' +IF NOT EXISTS (SELECT 1 FROM sys.database_principals WHERE name = '''''' + @RoleName + '''''' AND type = ''''R'''') +BEGIN + CREATE ROLE ['' + @RoleName + ''] AUTHORIZATION [dbo] + PRINT ''''CREATE ROLE ['' + @RoleName + '']'''' +END +'' +EXEC sp_executesql @Command + +SET @Command = '' +DECLARE @SP_Name varchar(255) + +'' + +/* SET ALL ROLE SECURABLES */ +DECLARE SecurablesCurs CURSOR FOR +SELECT typeofobject, grantordeny, rightsaction, objectname, schemaid +FROM #Securables +WHERE N2 = 0 + +OPEN SecurablesCurs +FETCH NEXT FROM SecurablesCurs INTO @typeofobject, @grantordeny, @rightsaction, @objectname, @schemaid +WHILE @@FETCH_STATUS = 0 +BEGIN + + IF @typeofobject = ''DB'' + BEGIN + IF EXISTS(SELECT 1 FROM sys.fn_builtin_permissions(''DATABASE'') WHERE permission_name = '''' + @rightsaction + '''') + BEGIN + SET @Command = @Command + @grantordeny + '' '' + @rightsaction + '' TO ['' + @RoleName + ''] +'' + END + END + + IF @typeofobject = ''SCHEMA'' + BEGIN + SET @Command = @Command + '' +IF EXISTS (SELECT 1 FROM sys.schemas WHERE name = '''''' + @schemaid + '''''') +BEGIN + IF EXISTS(SELECT 1 FROM sys.fn_builtin_permissions(''''SCHEMA'''') WHERE permission_name = '''''' + @rightsaction + '''''') + BEGIN + '' + @grantordeny + '' '' + @rightsaction + '' ON SCHEMA::'' + @schemaid + '' TO ['' + @RoleName + ''] + END +END + +'' + END + + IF @typeofobject in(''TABLE'',''SP'',''FUNCTIONS'',''VIEWS'') + BEGIN + + IF @objectname like ''%[%]%'' + BEGIN + + IF @typeofobject = ''TABLE'' + BEGIN + SET @sysTarget = ''sys.tables'' + SET @sysType = '''' + END + + IF @typeofobject = ''SP'' + BEGIN + SET @sysTarget = ''sys.procedures'' + SET @sysType = '''' + END + + IF @typeofobject = ''FUNCTIONS'' + BEGIN + SET @sysTarget = ''sys.objects'' + SET @sysType = '' and p.Type IN ( N''''FN'''', N''''IF'''', N''''TF'''', N''''FS'''', N''''FT'''' )'' + END + + IF @typeofobject = ''VIEWS'' + BEGIN + SET @sysTarget = ''sys.views'' + SET @sysType = '''' + END + + SET @Command = @Command + '' +DECLARE SP_cursor CURSOR FOR +SELECT p.name FROM '' + @sysTarget + '' p JOIN sys.schemas s ON s.schema_id = p.schema_id WHERE (p.name like '''''' + @objectname + '''''') and s.name = '''''' + @schemaid + '''' + @sysType + '''''' + +OPEN SP_cursor +FETCH NEXT FROM SP_cursor INTO @SP_Name +WHILE @@FETCH_STATUS = 0 +BEGIN + IF EXISTS(SELECT 1 FROM sys.fn_builtin_permissions(''''OBJECT'''') WHERE permission_name = '''''' + @rightsaction + '''''') + BEGIN + EXEC('''''' + @grantordeny + '' '' + @rightsaction + '' ON ['' + @schemaid + ''].['''' + @SP_Name + ''''] TO ['' + @RoleName + '']'''') + END + FETCH NEXT FROM SP_cursor INTO @SP_Name +END + +CLOSE SP_cursor +DEALLOCATE SP_cursor + +'' + + END + ELSE + BEGIN + + SET @Command = @Command + '' +IF EXISTS(SELECT 1 FROM sys.objects o WITH (NOLOCK) JOIN sys.schemas s ON s.schema_id = o.schema_id WHERE o.name = '''''' + @objectname + '''''' AND o.type IN (N''''U'''',''''P'''',''''V'''',''''FN'''',''''IF'''',''''TF'''') AND s.name = '''''' + @schemaid + '''''') +BEGIN + IF EXISTS(SELECT 1 FROM sys.fn_builtin_permissions(''''OBJECT'''') WHERE permission_name = '''''' + @rightsaction + '''''') + BEGIN + '' + @grantordeny + '' '' + @rightsaction + '' ON ['' + @schemaid + ''].['' + @objectname + ''] TO ['' + @RoleName + ''] + END +END + +'' + END +END + +IF @typeofobject = ''ASSEMBLIES'' +BEGIN + SET @Command = @Command + '' +IF EXISTS(SELECT 1 FROM sys.assemblies WHERE NAME = '''''' + @objectname + '''''') +BEGIN + IF EXISTS(SELECT 1 FROM sys.fn_builtin_permissions(''''ASSEMBLY'''') WHERE permission_name = '''''' + @rightsaction + '''''') + BEGIN + '' + @grantordeny + '' '' + @rightsaction + ''::['' + @objectname + ''] TO ['' + @RoleName + ''] + END +END + +'' +END + +IF @typeofobject = ''ROLE'' +BEGIN + SET @Command = @Command + '' +IF NOT EXISTS (SELECT 1 FROM sys.database_role_members JOIN sys.database_principals roles ON database_role_members.role_principal_id = roles.principal_id JOIN sys.database_principals members ON database_role_members.member_principal_id = members.principal_id WHERE roles.name = '''''' + @rightsaction + '''''' AND members.name = '''''' + @RoleName + '''''') +BEGIN + EXEC sp_addrolemember N'''''' + @rightsaction + '''''', N'''''' + @RoleName + '''''' +END + +'' +END + +FETCH NEXT FROM SecurablesCurs INTO @typeofobject, @grantordeny, @rightsaction, @objectname, @schemaid +END + +CLOSE SecurablesCurs +DEALLOCATE SecurablesCurs + +PRINT ''SET ALL SECURABLES ON ROLE ['' + @RoleName + '']'' +EXEC sp_executesql @Command + +/* ADD USER */ +DECLARE UsersCurs CURSOR FOR +SELECT username + FROM #UsersOnRole + +OPEN UsersCurs + +FETCH NEXT FROM UsersCurs INTO @Users +WHILE @@FETCH_STATUS = 0 +BEGIN + + SELECT @Command = '' +EXEC sp_addrolemember N'''''' + @RoleName + '''''', N'''''' + @Users + '''''' +PRINT ''''ADD USER ['' + @Users + ''] ON ROLE ['' + @RoleName + '']'''' +'' + +FETCH NEXT FROM UsersCurs INTO @Users +END + +CLOSE UsersCurs +DEALLOCATE UsersCurs + +EXEC sp_executesql @Command + + +/*============================================================================= + Drop temp tables +=============================================================================*/ +DROP TABLE #Securables +DROP TABLE #UsersOnRole +','HCITools','Pharmacies') + +INSERT INTO #AllRoles(STR_Definition,STR_Database,STR_Product)VALUES(' + +/*============================================================================= + + Script to create dbRoleIttechUsr role. + + Role Name: dbRoleIttechUsr + TEMPLATE: N2 and PROD + + EXAMPLE OF SECURABLES TO SET: + + INSERT INTO #Securables + VALUES + (''DB'',''GRANT'',''VIEW DEFINITION'','''',''''), + (''SCHEMA'',''GRANT'',''SELECT,EXECUTE,INSERT,UPDATE,DELETE'','''',''AP''), + (''TABLE'',''GRANT'',''INSERT,UPDATE'',''Address'',''dbo''), + (''SP'',''GRANT'',''EXECUTE'',''sp_bmc_GetNextID'',''dbo''), + (''ROLE'',''GRANT'',''db_datareader'','''','''') + + ----------------------------------------------- + +Generate date : 2023-05-12 / up208700 + +=============================================================================*/ + +DECLARE @Type varchar(6), + @Command nvarchar(max), + @RoleName varchar(60), + @Users varchar(255), + @typeofobject varchar(50), + @grantordeny varchar(10), + @rightsaction varchar(255), + @objectname varchar(255), + @schemaid varchar(10), + @sysTarget varchar(255), + @sysType varchar(255) + +SET @RoleName = ''dbRoleIttechUsr'' +SET @Command = '''' + +SELECT @Type = [Type] FROM [master].[cfg].[InstanceContext] + +/* TEMP TABLES */ +CREATE TABLE #UsersOnRole(username varchar(255)) +CREATE TABLE #Securables(typeofobject varchar(50), grantordeny varchar(10), rightsaction varchar(255), objectname varchar(255), schemaid varchar(10),N2 bit) + +/* !!! LIST OF SECURABLES TO CHANGE !!! */ + +INSERT INTO #Securables +VALUES +(''DB'',''GRANT'',''CREATE TABLE'','''',''dbo'',0) +,(''DB'',''GRANT'',''CREATE TABLE'','''',''dbo'',1) +,(''DB'',''GRANT'',''EXECUTE'','''',''dbo'',0) +,(''DB'',''GRANT'',''EXECUTE'','''',''dbo'',1) +,(''DB'',''GRANT'',''VIEW DEFINITION'','''',''dbo'',0) +,(''DB'',''GRANT'',''VIEW DEFINITION'','''',''dbo'',1) +,(''ROLE'',''GRANT'',''DB_DATAREADER'','''',''dbo'',0) +,(''ROLE'',''GRANT'',''DB_DATAREADER'','''',''dbo'',1) +,(''SCHEMA'',''GRANT'',''ALTER'',''Entire Schema'',''tmp'',0) +,(''SCHEMA'',''GRANT'',''ALTER'',''Entire Schema'',''tmp'',1) +,(''SCHEMA'',''GRANT'',''DELETE'',''Entire Schema'',''tmp'',0) +,(''SCHEMA'',''GRANT'',''DELETE'',''Entire Schema'',''tmp'',1) +,(''SCHEMA'',''GRANT'',''EXECUTE'',''Entire Schema'',''tmp'',0) +,(''SCHEMA'',''GRANT'',''EXECUTE'',''Entire Schema'',''tmp'',1) +,(''SCHEMA'',''GRANT'',''INSERT'',''Entire Schema'',''tmp'',0) +,(''SCHEMA'',''GRANT'',''INSERT'',''Entire Schema'',''tmp'',1) +,(''SCHEMA'',''GRANT'',''SELECT'',''Entire Schema'',''tmp'',0) +,(''SCHEMA'',''GRANT'',''SELECT'',''Entire Schema'',''tmp'',1) +,(''SCHEMA'',''GRANT'',''UPDATE'',''Entire Schema'',''tmp'',0) +,(''SCHEMA'',''GRANT'',''UPDATE'',''Entire Schema'',''tmp'',1) + + +/* GET ALL USERS ON THIS ROLE */ +INSERT INTO #UsersOnRole +SELECT + members.name +FROM sys.database_role_members + JOIN sys.database_principals roles ON database_role_members.role_principal_id = roles.principal_id + JOIN sys.database_principals members ON database_role_members.member_principal_id = members.principal_id +WHERE roles.name = @RoleName + +/* CREATE ROLE */ +SELECT @Command = '' +IF NOT EXISTS (SELECT 1 FROM sys.database_principals WHERE name = '''''' + @RoleName + '''''' AND type = ''''R'''') +BEGIN + CREATE ROLE ['' + @RoleName + ''] AUTHORIZATION [dbo] + PRINT ''''CREATE ROLE ['' + @RoleName + '']'''' +END +'' +EXEC sp_executesql @Command + +SET @Command = '' +DECLARE @SP_Name varchar(255) + +'' + +/* SET ALL ROLE SECURABLES */ +IF @Type = ''DEVE'' +BEGIN + + DECLARE SecurablesCurs CURSOR FOR + SELECT typeofobject, grantordeny, rightsaction, objectname, schemaid + FROM #Securables + WHERE N2 = 1 + + OPEN SecurablesCurs + FETCH NEXT FROM SecurablesCurs INTO @typeofobject, @grantordeny, @rightsaction, @objectname, @schemaid + WHILE @@FETCH_STATUS = 0 + BEGIN + + IF @typeofobject = ''DB'' + BEGIN + IF EXISTS(SELECT 1 FROM sys.fn_builtin_permissions(''DATABASE'') WHERE permission_name = '''' + @rightsaction + '''') + BEGIN + SET @Command = @Command + @grantordeny + '' '' + @rightsaction + '' TO ['' + @RoleName + ''] +'' + END + END + + IF @typeofobject = ''SCHEMA'' + BEGIN + SET @Command = @Command + '' +IF EXISTS (SELECT 1 FROM sys.schemas WHERE name = '''''' + @schemaid + '''''') +BEGIN + IF EXISTS(SELECT 1 FROM sys.fn_builtin_permissions(''''SCHEMA'''') WHERE permission_name = '''''' + @rightsaction + '''''') + BEGIN + '' + @grantordeny + '' '' + @rightsaction + '' ON SCHEMA::'' + @schemaid + '' TO ['' + @RoleName + ''] + END +END + +'' + END + + IF @typeofobject in(''TABLE'',''SP'',''FUNCTIONS'',''VIEWS'') + BEGIN + + IF @objectname like ''%[%]%'' + BEGIN + IF @typeofobject = ''TABLE'' + BEGIN + SET @sysTarget = ''sys.tables'' + SET @sysType = '''' + END + + IF @typeofobject = ''SP'' + BEGIN + SET @sysTarget = ''sys.procedures'' + SET @sysType = '''' + END + + IF @typeofobject = ''FUNCTIONS'' + BEGIN + SET @sysTarget = ''sys.objects'' + SET @sysType = '' and p.Type IN ( N''''FN'''', N''''IF'''', N''''TF'''', N''''FS'''', N''''FT'''' )'' + END + + IF @typeofobject = ''VIEWS'' + BEGIN + SET @sysTarget = ''sys.views'' + SET @sysType = '''' + END + + SET @Command = @Command + '' +DECLARE SP_cursor CURSOR FOR +SELECT p.name FROM '' + @sysTarget + '' p JOIN sys.schemas s ON s.schema_id = p.schema_id WHERE (p.name like '''''' + @objectname + '''''') and s.name = '''''' + @schemaid + '''' + @sysType + '''''' + +OPEN SP_cursor +FETCH NEXT FROM SP_cursor INTO @SP_Name +WHILE @@FETCH_STATUS = 0 +BEGIN + IF EXISTS(SELECT 1 FROM sys.fn_builtin_permissions(''''OBJECT'''') WHERE permission_name = '''''' + @rightsaction + '''''') + BEGIN + EXEC('''''' + @grantordeny + '' '' + @rightsaction + '' ON ['' + @schemaid + ''].['''' + @SP_Name + ''''] TO ['' + @RoleName + '']'''') + END + FETCH NEXT FROM SP_cursor INTO @SP_Name +END + +CLOSE SP_cursor +DEALLOCATE SP_cursor + +'' + + END + ELSE + BEGIN + + SET @Command = @Command + '' +IF EXISTS(SELECT 1 FROM sys.objects o WITH (NOLOCK) JOIN sys.schemas s ON s.schema_id = o.schema_id WHERE o.name = '''''' + @objectname + '''''' AND o.type IN (N''''U'''',''''P'''',''''V'''',''''FN'''',''''IF'''',''''TF'''') AND s.name = '''''' + @schemaid + '''''') +BEGIN + IF EXISTS(SELECT 1 FROM sys.fn_builtin_permissions(''''OBJECT'''') WHERE permission_name = '''''' + @rightsaction + '''''') + BEGIN + '' + @grantordeny + '' '' + @rightsaction + '' ON ['' + @schemaid + ''].['' + @objectname + ''] TO ['' + @RoleName + ''] + END +END + +'' + END + END + + IF @typeofobject = ''ASSEMBLIES'' + BEGIN + SET @Command = @Command + '' +IF EXISTS(SELECT 1 FROM sys.assemblies WHERE NAME = '''''' + @objectname + '''''') +BEGIN + IF EXISTS(SELECT 1 FROM sys.fn_builtin_permissions(''''ASSEMBLY'''') WHERE permission_name = '''''' + @rightsaction + '''''') + BEGIN + '' + @grantordeny + '' '' + @rightsaction + ''::['' + @objectname + ''] TO ['' + @RoleName + ''] + END +END + +'' + END + + IF @typeofobject = ''ROLE'' + BEGIN + SET @Command = @Command + '' +IF NOT EXISTS (SELECT 1 FROM sys.database_role_members JOIN sys.database_principals roles ON database_role_members.role_principal_id = roles.principal_id JOIN sys.database_principals members ON database_role_members.member_principal_id = members.principal_id WHERE roles.name = '''''' + @rightsaction + '''''' AND members.name = '''''' + @RoleName + '''''') +BEGIN + EXEC sp_addrolemember N'''''' + @rightsaction + '''''', N'''''' + @RoleName + '''''' +END + +'' + END + + FETCH NEXT FROM SecurablesCurs INTO @typeofobject, @grantordeny, @rightsaction, @objectname, @schemaid + END + +CLOSE SecurablesCurs +DEALLOCATE SecurablesCurs + +PRINT ''SET ALL SECURABLES ON ROLE ['' + @RoleName + '']'' +EXEC sp_executesql @Command + +END +ELSE +BEGIN + + DECLARE SecurablesCurs CURSOR FOR + SELECT typeofobject, grantordeny, rightsaction, objectname, schemaid + FROM #Securables + WHERE N2 = 0 + + OPEN SecurablesCurs + FETCH NEXT FROM SecurablesCurs INTO @typeofobject, @grantordeny, @rightsaction, @objectname, @schemaid + WHILE @@FETCH_STATUS = 0 + BEGIN + + IF @typeofobject = ''DB'' + BEGIN + IF EXISTS(SELECT 1 FROM sys.fn_builtin_permissions(''DATABASE'') WHERE permission_name = '''' + @rightsaction + '''') + BEGIN + SET @Command = @Command + @grantordeny + '' '' + @rightsaction + '' TO ['' + @RoleName + ''] +'' + END + END + + IF @typeofobject = ''SCHEMA'' + BEGIN + SET @Command = @Command + '' +IF EXISTS (SELECT 1 FROM sys.schemas WHERE name = '''''' + @schemaid + '''''') +BEGIN + IF EXISTS(SELECT 1 FROM sys.fn_builtin_permissions(''''SCHEMA'''') WHERE permission_name = '''''' + @rightsaction + '''''') + BEGIN + '' + @grantordeny + '' '' + @rightsaction + '' ON SCHEMA::'' + @schemaid + '' TO ['' + @RoleName + ''] + END +END + +'' + END + + IF @typeofobject in(''TABLE'',''SP'',''FUNCTIONS'',''VIEWS'') + BEGIN + + IF @objectname like ''%[%]%'' + BEGIN + + IF @typeofobject = ''TABLE'' + BEGIN + SET @sysTarget = ''sys.tables'' + SET @sysType = '''' + END + + IF @typeofobject = ''SP'' + BEGIN + SET @sysTarget = ''sys.procedures'' + SET @sysType = '''' + END + + IF @typeofobject = ''FUNCTIONS'' + BEGIN + SET @sysTarget = ''sys.objects'' + SET @sysType = '' and p.Type IN ( N''''FN'''', N''''IF'''', N''''TF'''', N''''FS'''', N''''FT'''' )'' + END + + IF @typeofobject = ''VIEWS'' + BEGIN + SET @sysTarget = ''sys.views'' + SET @sysType = '''' + END + + SET @Command = @Command + '' +DECLARE SP_cursor CURSOR FOR +SELECT p.name FROM '' + @sysTarget + '' p JOIN sys.schemas s ON s.schema_id = p.schema_id WHERE (p.name like '''''' + @objectname + '''''') and s.name = '''''' + @schemaid + '''' + @sysType + '''''' + +OPEN SP_cursor +FETCH NEXT FROM SP_cursor INTO @SP_Name +WHILE @@FETCH_STATUS = 0 +BEGIN + IF EXISTS(SELECT 1 FROM sys.fn_builtin_permissions(''''OBJECT'''') WHERE permission_name = '''''' + @rightsaction + '''''') + BEGIN + EXEC('''''' + @grantordeny + '' '' + @rightsaction + '' ON ['' + @schemaid + ''].['''' + @SP_Name + ''''] TO ['' + @RoleName + '']'''') + END + FETCH NEXT FROM SP_cursor INTO @SP_Name +END + +CLOSE SP_cursor +DEALLOCATE SP_cursor + +'' + + END + ELSE + BEGIN + + SET @Command = @Command + '' +IF EXISTS(SELECT 1 FROM sys.objects o WITH (NOLOCK) JOIN sys.schemas s ON s.schema_id = o.schema_id WHERE o.name = '''''' + @objectname + '''''' AND o.type IN (N''''U'''',''''P'''',''''V'''',''''FN'''',''''IF'''',''''TF'''') AND s.name = '''''' + @schemaid + '''''') +BEGIN + IF EXISTS(SELECT 1 FROM sys.fn_builtin_permissions(''''OBJECT'''') WHERE permission_name = '''''' + @rightsaction + '''''') + BEGIN + '' + @grantordeny + '' '' + @rightsaction + '' ON ['' + @schemaid + ''].['' + @objectname + ''] TO ['' + @RoleName + ''] + END +END + +'' + END + END + + IF @typeofobject = ''ASSEMBLIES'' + BEGIN + SET @Command = @Command + '' +IF EXISTS(SELECT 1 FROM sys.assemblies WHERE NAME = '''''' + @objectname + '''''') +BEGIN + IF EXISTS(SELECT 1 FROM sys.fn_builtin_permissions(''''ASSEMBLY'''') WHERE permission_name = '''''' + @rightsaction + '''''') + BEGIN + '' + @grantordeny + '' '' + @rightsaction + ''::['' + @objectname + ''] TO ['' + @RoleName + ''] + END +END + +'' + END + + IF @typeofobject = ''ROLE'' + BEGIN + SET @Command = @Command + '' +IF NOT EXISTS (SELECT 1 FROM sys.database_role_members JOIN sys.database_principals roles ON database_role_members.role_principal_id = roles.principal_id JOIN sys.database_principals members ON database_role_members.member_principal_id = members.principal_id WHERE roles.name = '''''' + @rightsaction + '''''' AND members.name = '''''' + @RoleName + '''''') +BEGIN + EXEC sp_addrolemember N'''''' + @rightsaction + '''''', N'''''' + @RoleName + '''''' +END + +'' + END + + FETCH NEXT FROM SecurablesCurs INTO @typeofobject, @grantordeny, @rightsaction, @objectname, @schemaid + END + +CLOSE SecurablesCurs +DEALLOCATE SecurablesCurs + +PRINT ''SET ALL SECURABLES ON ROLE ['' + @RoleName + '']'' +EXEC sp_executesql @Command + +END + +/* ADD USER */ +DECLARE UsersCurs CURSOR FOR +SELECT username + FROM #UsersOnRole + +OPEN UsersCurs + +FETCH NEXT FROM UsersCurs INTO @Users +WHILE @@FETCH_STATUS = 0 +BEGIN + + SELECT @Command = '' +EXEC sp_addrolemember N'''''' + @RoleName + '''''', N'''''' + @Users + '''''' +PRINT ''''ADD USER ['' + @Users + ''] ON ROLE ['' + @RoleName + '']'''' +'' + +FETCH NEXT FROM UsersCurs INTO @Users +END + +CLOSE UsersCurs +DEALLOCATE UsersCurs + +EXEC sp_executesql @Command + +/*============================================================================= + Drop temp tables +=============================================================================*/ +DROP TABLE #Securables +DROP TABLE #UsersOnRole','HCITools','Pharmacies') + +INSERT INTO #AllRoles(STR_Definition,STR_Database,STR_Product)VALUES(' + +/*============================================================================= + + Script to create dbRoleNagiosMonitoring role. + + Role Name: dbRoleNagiosMonitoring + TEMPLATE: Default + + EXAMPLE OF SECURABLES TO SET: + + INSERT INTO #Securables + VALUES + (''DB'',''GRANT'',''VIEW DEFINITION'','''',''''), + (''SCHEMA'',''GRANT'',''SELECT,EXECUTE,INSERT,UPDATE,DELETE'','''',''AP''), + (''TABLE'',''GRANT'',''INSERT,UPDATE'',''Address'',''dbo''), + (''SP'',''GRANT'',''EXECUTE'',''sp_bmc_GetNextID'',''dbo''), + (''ROLE'',''GRANT'',''db_datareader'','''','''') + + ----------------------------------------------- + +Generate date : 2023-05-12 / up208700 + +=============================================================================*/ + +DECLARE @Command nvarchar(max), + @RoleName varchar(60), + @Users varchar(255), + @typeofobject varchar(50), + @grantordeny varchar(10), + @rightsaction varchar(255), + @objectname varchar(255), + @schemaid varchar(10), + @sysTarget varchar(255), + @sysType varchar(255) + +SET @RoleName = ''dbRoleNagiosMonitoring'' +SET @Command = '''' + +/* TEMP TABLES */ +CREATE TABLE #UsersOnRole(username varchar(255)) +CREATE TABLE #Securables(typeofobject varchar(50), grantordeny varchar(10), rightsaction varchar(255), objectname varchar(255), schemaid varchar(10),N2 bit) + +/* !!! LIST OF SECURABLES TO CHANGE !!! */ + +INSERT INTO #Securables +VALUES +(''TABLE'',''GRANT'',''SELECT'',''v_ReplicationCheck'',''dbo'',0) + + +/* GET ALL USERS ON THIS ROLE */ +INSERT INTO #UsersOnRole +SELECT + members.name +FROM sys.database_role_members + JOIN sys.database_principals roles ON database_role_members.role_principal_id = roles.principal_id + JOIN sys.database_principals members ON database_role_members.member_principal_id = members.principal_id +WHERE roles.name = @RoleName + +/* CREATE ROLE */ +SELECT @Command = '' +IF NOT EXISTS (SELECT 1 FROM sys.database_principals WHERE name = '''''' + @RoleName + '''''' AND type = ''''R'''') +BEGIN + CREATE ROLE ['' + @RoleName + ''] AUTHORIZATION [dbo] + PRINT ''''CREATE ROLE ['' + @RoleName + '']'''' +END +'' +EXEC sp_executesql @Command + +SET @Command = '' +DECLARE @SP_Name varchar(255) + +'' + +/* SET ALL ROLE SECURABLES */ +DECLARE SecurablesCurs CURSOR FOR +SELECT typeofobject, grantordeny, rightsaction, objectname, schemaid +FROM #Securables +WHERE N2 = 0 + +OPEN SecurablesCurs +FETCH NEXT FROM SecurablesCurs INTO @typeofobject, @grantordeny, @rightsaction, @objectname, @schemaid +WHILE @@FETCH_STATUS = 0 +BEGIN + + IF @typeofobject = ''DB'' + BEGIN + IF EXISTS(SELECT 1 FROM sys.fn_builtin_permissions(''DATABASE'') WHERE permission_name = '''' + @rightsaction + '''') + BEGIN + SET @Command = @Command + @grantordeny + '' '' + @rightsaction + '' TO ['' + @RoleName + ''] +'' + END + END + + IF @typeofobject = ''SCHEMA'' + BEGIN + SET @Command = @Command + '' +IF EXISTS (SELECT 1 FROM sys.schemas WHERE name = '''''' + @schemaid + '''''') +BEGIN + IF EXISTS(SELECT 1 FROM sys.fn_builtin_permissions(''''SCHEMA'''') WHERE permission_name = '''''' + @rightsaction + '''''') + BEGIN + '' + @grantordeny + '' '' + @rightsaction + '' ON SCHEMA::'' + @schemaid + '' TO ['' + @RoleName + ''] + END +END + +'' + END + + IF @typeofobject in(''TABLE'',''SP'',''FUNCTIONS'',''VIEWS'') + BEGIN + + IF @objectname like ''%[%]%'' + BEGIN + + IF @typeofobject = ''TABLE'' + BEGIN + SET @sysTarget = ''sys.tables'' + SET @sysType = '''' + END + + IF @typeofobject = ''SP'' + BEGIN + SET @sysTarget = ''sys.procedures'' + SET @sysType = '''' + END + + IF @typeofobject = ''FUNCTIONS'' + BEGIN + SET @sysTarget = ''sys.objects'' + SET @sysType = '' and p.Type IN ( N''''FN'''', N''''IF'''', N''''TF'''', N''''FS'''', N''''FT'''' )'' + END + + IF @typeofobject = ''VIEWS'' + BEGIN + SET @sysTarget = ''sys.views'' + SET @sysType = '''' + END + + SET @Command = @Command + '' +DECLARE SP_cursor CURSOR FOR +SELECT p.name FROM '' + @sysTarget + '' p JOIN sys.schemas s ON s.schema_id = p.schema_id WHERE (p.name like '''''' + @objectname + '''''') and s.name = '''''' + @schemaid + '''' + @sysType + '''''' + +OPEN SP_cursor +FETCH NEXT FROM SP_cursor INTO @SP_Name +WHILE @@FETCH_STATUS = 0 +BEGIN + IF EXISTS(SELECT 1 FROM sys.fn_builtin_permissions(''''OBJECT'''') WHERE permission_name = '''''' + @rightsaction + '''''') + BEGIN + EXEC('''''' + @grantordeny + '' '' + @rightsaction + '' ON ['' + @schemaid + ''].['''' + @SP_Name + ''''] TO ['' + @RoleName + '']'''') + END + FETCH NEXT FROM SP_cursor INTO @SP_Name +END + +CLOSE SP_cursor +DEALLOCATE SP_cursor + +'' + + END + ELSE + BEGIN + + SET @Command = @Command + '' +IF EXISTS(SELECT 1 FROM sys.objects o WITH (NOLOCK) JOIN sys.schemas s ON s.schema_id = o.schema_id WHERE o.name = '''''' + @objectname + '''''' AND o.type IN (N''''U'''',''''P'''',''''V'''',''''FN'''',''''IF'''',''''TF'''') AND s.name = '''''' + @schemaid + '''''') +BEGIN + IF EXISTS(SELECT 1 FROM sys.fn_builtin_permissions(''''OBJECT'''') WHERE permission_name = '''''' + @rightsaction + '''''') + BEGIN + '' + @grantordeny + '' '' + @rightsaction + '' ON ['' + @schemaid + ''].['' + @objectname + ''] TO ['' + @RoleName + ''] + END +END + +'' + END +END + +IF @typeofobject = ''ASSEMBLIES'' +BEGIN + SET @Command = @Command + '' +IF EXISTS(SELECT 1 FROM sys.assemblies WHERE NAME = '''''' + @objectname + '''''') +BEGIN + IF EXISTS(SELECT 1 FROM sys.fn_builtin_permissions(''''ASSEMBLY'''') WHERE permission_name = '''''' + @rightsaction + '''''') + BEGIN + '' + @grantordeny + '' '' + @rightsaction + ''::['' + @objectname + ''] TO ['' + @RoleName + ''] + END +END + +'' +END + +IF @typeofobject = ''ROLE'' +BEGIN + SET @Command = @Command + '' +IF NOT EXISTS (SELECT 1 FROM sys.database_role_members JOIN sys.database_principals roles ON database_role_members.role_principal_id = roles.principal_id JOIN sys.database_principals members ON database_role_members.member_principal_id = members.principal_id WHERE roles.name = '''''' + @rightsaction + '''''' AND members.name = '''''' + @RoleName + '''''') +BEGIN + EXEC sp_addrolemember N'''''' + @rightsaction + '''''', N'''''' + @RoleName + '''''' +END + +'' +END + +FETCH NEXT FROM SecurablesCurs INTO @typeofobject, @grantordeny, @rightsaction, @objectname, @schemaid +END + +CLOSE SecurablesCurs +DEALLOCATE SecurablesCurs + +PRINT ''SET ALL SECURABLES ON ROLE ['' + @RoleName + '']'' +EXEC sp_executesql @Command + +/* ADD USER */ +DECLARE UsersCurs CURSOR FOR +SELECT username + FROM #UsersOnRole + +OPEN UsersCurs + +FETCH NEXT FROM UsersCurs INTO @Users +WHILE @@FETCH_STATUS = 0 +BEGIN + + SELECT @Command = '' +EXEC sp_addrolemember N'''''' + @RoleName + '''''', N'''''' + @Users + '''''' +PRINT ''''ADD USER ['' + @Users + ''] ON ROLE ['' + @RoleName + '']'''' +'' + +FETCH NEXT FROM UsersCurs INTO @Users +END + +CLOSE UsersCurs +DEALLOCATE UsersCurs + +EXEC sp_executesql @Command + + +/*============================================================================= + Drop temp tables +=============================================================================*/ +DROP TABLE #Securables +DROP TABLE #UsersOnRole +','HCITools','Pharmacies') + +INSERT INTO #AllRoles(STR_Definition,STR_Database,STR_Product)VALUES(' + +/*============================================================================= + + Script to create dbRoleSSRSMonitoring role. + + Role Name: dbRoleSSRSMonitoring + TEMPLATE: Default + + EXAMPLE OF SECURABLES TO SET: + + INSERT INTO #Securables + VALUES + (''DB'',''GRANT'',''VIEW DEFINITION'','''',''''), + (''SCHEMA'',''GRANT'',''SELECT,EXECUTE,INSERT,UPDATE,DELETE'','''',''AP''), + (''TABLE'',''GRANT'',''INSERT,UPDATE'',''Address'',''dbo''), + (''SP'',''GRANT'',''EXECUTE'',''sp_bmc_GetNextID'',''dbo''), + (''ROLE'',''GRANT'',''db_datareader'','''','''') + + ----------------------------------------------- + +Generate date : 2023-05-12 / up208700 + +=============================================================================*/ + +DECLARE @Command nvarchar(max), + @RoleName varchar(60), + @Users varchar(255), + @typeofobject varchar(50), + @grantordeny varchar(10), + @rightsaction varchar(255), + @objectname varchar(255), + @schemaid varchar(10), + @sysTarget varchar(255), + @sysType varchar(255) + +SET @RoleName = ''dbRoleSSRSMonitoring'' +SET @Command = '''' + +/* TEMP TABLES */ +CREATE TABLE #UsersOnRole(username varchar(255)) +CREATE TABLE #Securables(typeofobject varchar(50), grantordeny varchar(10), rightsaction varchar(255), objectname varchar(255), schemaid varchar(10),N2 bit) + +/* !!! LIST OF SECURABLES TO CHANGE !!! */ + +INSERT INTO #Securables +VALUES +(''SP'',''GRANT'',''EXECUTE'',''mon_Get_Counters_History'',''dbo'',0) +,(''TABLE'',''GRANT'',''SELECT'',''Monitoring_%'',''dbo'',0) + + +/* GET ALL USERS ON THIS ROLE */ +INSERT INTO #UsersOnRole +SELECT + members.name +FROM sys.database_role_members + JOIN sys.database_principals roles ON database_role_members.role_principal_id = roles.principal_id + JOIN sys.database_principals members ON database_role_members.member_principal_id = members.principal_id +WHERE roles.name = @RoleName + +/* CREATE ROLE */ +SELECT @Command = '' +IF NOT EXISTS (SELECT 1 FROM sys.database_principals WHERE name = '''''' + @RoleName + '''''' AND type = ''''R'''') +BEGIN + CREATE ROLE ['' + @RoleName + ''] AUTHORIZATION [dbo] + PRINT ''''CREATE ROLE ['' + @RoleName + '']'''' +END +'' +EXEC sp_executesql @Command + +SET @Command = '' +DECLARE @SP_Name varchar(255) + +'' + +/* SET ALL ROLE SECURABLES */ +DECLARE SecurablesCurs CURSOR FOR +SELECT typeofobject, grantordeny, rightsaction, objectname, schemaid +FROM #Securables +WHERE N2 = 0 + +OPEN SecurablesCurs +FETCH NEXT FROM SecurablesCurs INTO @typeofobject, @grantordeny, @rightsaction, @objectname, @schemaid +WHILE @@FETCH_STATUS = 0 +BEGIN + + IF @typeofobject = ''DB'' + BEGIN + IF EXISTS(SELECT 1 FROM sys.fn_builtin_permissions(''DATABASE'') WHERE permission_name = '''' + @rightsaction + '''') + BEGIN + SET @Command = @Command + @grantordeny + '' '' + @rightsaction + '' TO ['' + @RoleName + ''] +'' + END + END + + IF @typeofobject = ''SCHEMA'' + BEGIN + SET @Command = @Command + '' +IF EXISTS (SELECT 1 FROM sys.schemas WHERE name = '''''' + @schemaid + '''''') +BEGIN + IF EXISTS(SELECT 1 FROM sys.fn_builtin_permissions(''''SCHEMA'''') WHERE permission_name = '''''' + @rightsaction + '''''') + BEGIN + '' + @grantordeny + '' '' + @rightsaction + '' ON SCHEMA::'' + @schemaid + '' TO ['' + @RoleName + ''] + END +END + +'' + END + + IF @typeofobject in(''TABLE'',''SP'',''FUNCTIONS'',''VIEWS'') + BEGIN + + IF @objectname like ''%[%]%'' + BEGIN + + IF @typeofobject = ''TABLE'' + BEGIN + SET @sysTarget = ''sys.tables'' + SET @sysType = '''' + END + + IF @typeofobject = ''SP'' + BEGIN + SET @sysTarget = ''sys.procedures'' + SET @sysType = '''' + END + + IF @typeofobject = ''FUNCTIONS'' + BEGIN + SET @sysTarget = ''sys.objects'' + SET @sysType = '' and p.Type IN ( N''''FN'''', N''''IF'''', N''''TF'''', N''''FS'''', N''''FT'''' )'' + END + + IF @typeofobject = ''VIEWS'' + BEGIN + SET @sysTarget = ''sys.views'' + SET @sysType = '''' + END + + SET @Command = @Command + '' +DECLARE SP_cursor CURSOR FOR +SELECT p.name FROM '' + @sysTarget + '' p JOIN sys.schemas s ON s.schema_id = p.schema_id WHERE (p.name like '''''' + @objectname + '''''') and s.name = '''''' + @schemaid + '''' + @sysType + '''''' + +OPEN SP_cursor +FETCH NEXT FROM SP_cursor INTO @SP_Name +WHILE @@FETCH_STATUS = 0 +BEGIN + IF EXISTS(SELECT 1 FROM sys.fn_builtin_permissions(''''OBJECT'''') WHERE permission_name = '''''' + @rightsaction + '''''') + BEGIN + EXEC('''''' + @grantordeny + '' '' + @rightsaction + '' ON ['' + @schemaid + ''].['''' + @SP_Name + ''''] TO ['' + @RoleName + '']'''') + END + FETCH NEXT FROM SP_cursor INTO @SP_Name +END + +CLOSE SP_cursor +DEALLOCATE SP_cursor + +'' + + END + ELSE + BEGIN + + SET @Command = @Command + '' +IF EXISTS(SELECT 1 FROM sys.objects o WITH (NOLOCK) JOIN sys.schemas s ON s.schema_id = o.schema_id WHERE o.name = '''''' + @objectname + '''''' AND o.type IN (N''''U'''',''''P'''',''''V'''',''''FN'''',''''IF'''',''''TF'''') AND s.name = '''''' + @schemaid + '''''') +BEGIN + IF EXISTS(SELECT 1 FROM sys.fn_builtin_permissions(''''OBJECT'''') WHERE permission_name = '''''' + @rightsaction + '''''') + BEGIN + '' + @grantordeny + '' '' + @rightsaction + '' ON ['' + @schemaid + ''].['' + @objectname + ''] TO ['' + @RoleName + ''] + END +END + +'' + END +END + +IF @typeofobject = ''ASSEMBLIES'' +BEGIN + SET @Command = @Command + '' +IF EXISTS(SELECT 1 FROM sys.assemblies WHERE NAME = '''''' + @objectname + '''''') +BEGIN + IF EXISTS(SELECT 1 FROM sys.fn_builtin_permissions(''''ASSEMBLY'''') WHERE permission_name = '''''' + @rightsaction + '''''') + BEGIN + '' + @grantordeny + '' '' + @rightsaction + ''::['' + @objectname + ''] TO ['' + @RoleName + ''] + END +END + +'' +END + +IF @typeofobject = ''ROLE'' +BEGIN + SET @Command = @Command + '' +IF NOT EXISTS (SELECT 1 FROM sys.database_role_members JOIN sys.database_principals roles ON database_role_members.role_principal_id = roles.principal_id JOIN sys.database_principals members ON database_role_members.member_principal_id = members.principal_id WHERE roles.name = '''''' + @rightsaction + '''''' AND members.name = '''''' + @RoleName + '''''') +BEGIN + EXEC sp_addrolemember N'''''' + @rightsaction + '''''', N'''''' + @RoleName + '''''' +END + +'' +END + +FETCH NEXT FROM SecurablesCurs INTO @typeofobject, @grantordeny, @rightsaction, @objectname, @schemaid +END + +CLOSE SecurablesCurs +DEALLOCATE SecurablesCurs + +PRINT ''SET ALL SECURABLES ON ROLE ['' + @RoleName + '']'' +EXEC sp_executesql @Command + +/* ADD USER */ +DECLARE UsersCurs CURSOR FOR +SELECT username + FROM #UsersOnRole + +OPEN UsersCurs + +FETCH NEXT FROM UsersCurs INTO @Users +WHILE @@FETCH_STATUS = 0 +BEGIN + + SELECT @Command = '' +EXEC sp_addrolemember N'''''' + @RoleName + '''''', N'''''' + @Users + '''''' +PRINT ''''ADD USER ['' + @Users + ''] ON ROLE ['' + @RoleName + '']'''' +'' + +FETCH NEXT FROM UsersCurs INTO @Users +END + +CLOSE UsersCurs +DEALLOCATE UsersCurs + +EXEC sp_executesql @Command + + +/*============================================================================= + Drop temp tables +=============================================================================*/ +DROP TABLE #Securables +DROP TABLE #UsersOnRole +','HCITools','Pharmacies') + +INSERT INTO #AllRoles(STR_Definition,STR_Database,STR_Product)VALUES(' + +/*============================================================================= + + Script to create dbRoleSupUsr role. + + Role Name: dbRoleSupUsr + TEMPLATE: N2 and PROD + + EXAMPLE OF SECURABLES TO SET: + + INSERT INTO #Securables + VALUES + (''DB'',''GRANT'',''VIEW DEFINITION'','''',''''), + (''SCHEMA'',''GRANT'',''SELECT,EXECUTE,INSERT,UPDATE,DELETE'','''',''AP''), + (''TABLE'',''GRANT'',''INSERT,UPDATE'',''Address'',''dbo''), + (''SP'',''GRANT'',''EXECUTE'',''sp_bmc_GetNextID'',''dbo''), + (''ROLE'',''GRANT'',''db_datareader'','''','''') + + ----------------------------------------------- + +Generate date : 2023-05-12 / up208700 + +=============================================================================*/ + +DECLARE @Type varchar(6), + @Command nvarchar(max), + @RoleName varchar(60), + @Users varchar(255), + @typeofobject varchar(50), + @grantordeny varchar(10), + @rightsaction varchar(255), + @objectname varchar(255), + @schemaid varchar(10), + @sysTarget varchar(255), + @sysType varchar(255) + +SET @RoleName = ''dbRoleSupUsr'' +SET @Command = '''' + +SELECT @Type = [Type] FROM [master].[cfg].[InstanceContext] + +/* TEMP TABLES */ +CREATE TABLE #UsersOnRole(username varchar(255)) +CREATE TABLE #Securables(typeofobject varchar(50), grantordeny varchar(10), rightsaction varchar(255), objectname varchar(255), schemaid varchar(10),N2 bit) + +/* !!! LIST OF SECURABLES TO CHANGE !!! */ + +INSERT INTO #Securables +VALUES +(''DB'',''GRANT'',''CREATE TABLE'','''',''dbo'',0) +,(''DB'',''GRANT'',''CREATE TABLE'','''',''dbo'',1) +,(''DB'',''GRANT'',''EXECUTE'','''',''dbo'',0) +,(''DB'',''GRANT'',''EXECUTE'','''',''dbo'',1) +,(''DB'',''GRANT'',''VIEW DEFINITION'','''',''dbo'',0) +,(''DB'',''GRANT'',''VIEW DEFINITION'','''',''dbo'',1) +,(''ROLE'',''GRANT'',''DB_DATAREADER'','''',''dbo'',0) +,(''ROLE'',''GRANT'',''DB_DATAREADER'','''',''dbo'',1) +,(''SCHEMA'',''GRANT'',''ALTER'',''Entire Schema'',''tmp'',0) +,(''SCHEMA'',''GRANT'',''ALTER'',''Entire Schema'',''tmp'',1) +,(''SCHEMA'',''GRANT'',''DELETE'',''Entire Schema'',''tmp'',0) +,(''SCHEMA'',''GRANT'',''DELETE'',''Entire Schema'',''tmp'',1) +,(''SCHEMA'',''GRANT'',''EXECUTE'',''Entire Schema'',''tmp'',0) +,(''SCHEMA'',''GRANT'',''EXECUTE'',''Entire Schema'',''tmp'',1) +,(''SCHEMA'',''GRANT'',''INSERT'',''Entire Schema'',''tmp'',0) +,(''SCHEMA'',''GRANT'',''INSERT'',''Entire Schema'',''tmp'',1) +,(''SCHEMA'',''GRANT'',''SELECT'',''Entire Schema'',''tmp'',0) +,(''SCHEMA'',''GRANT'',''SELECT'',''Entire Schema'',''tmp'',1) +,(''SCHEMA'',''GRANT'',''UPDATE'',''Entire Schema'',''tmp'',0) +,(''SCHEMA'',''GRANT'',''UPDATE'',''Entire Schema'',''tmp'',1) + + +/* GET ALL USERS ON THIS ROLE */ +INSERT INTO #UsersOnRole +SELECT + members.name +FROM sys.database_role_members + JOIN sys.database_principals roles ON database_role_members.role_principal_id = roles.principal_id + JOIN sys.database_principals members ON database_role_members.member_principal_id = members.principal_id +WHERE roles.name = @RoleName + +/* CREATE ROLE */ +SELECT @Command = '' +IF NOT EXISTS (SELECT 1 FROM sys.database_principals WHERE name = '''''' + @RoleName + '''''' AND type = ''''R'''') +BEGIN + CREATE ROLE ['' + @RoleName + ''] AUTHORIZATION [dbo] + PRINT ''''CREATE ROLE ['' + @RoleName + '']'''' +END +'' +EXEC sp_executesql @Command + +SET @Command = '' +DECLARE @SP_Name varchar(255) + +'' + +/* SET ALL ROLE SECURABLES */ +IF @Type = ''DEVE'' +BEGIN + + DECLARE SecurablesCurs CURSOR FOR + SELECT typeofobject, grantordeny, rightsaction, objectname, schemaid + FROM #Securables + WHERE N2 = 1 + + OPEN SecurablesCurs + FETCH NEXT FROM SecurablesCurs INTO @typeofobject, @grantordeny, @rightsaction, @objectname, @schemaid + WHILE @@FETCH_STATUS = 0 + BEGIN + + IF @typeofobject = ''DB'' + BEGIN + IF EXISTS(SELECT 1 FROM sys.fn_builtin_permissions(''DATABASE'') WHERE permission_name = '''' + @rightsaction + '''') + BEGIN + SET @Command = @Command + @grantordeny + '' '' + @rightsaction + '' TO ['' + @RoleName + ''] +'' + END + END + + IF @typeofobject = ''SCHEMA'' + BEGIN + SET @Command = @Command + '' +IF EXISTS (SELECT 1 FROM sys.schemas WHERE name = '''''' + @schemaid + '''''') +BEGIN + IF EXISTS(SELECT 1 FROM sys.fn_builtin_permissions(''''SCHEMA'''') WHERE permission_name = '''''' + @rightsaction + '''''') + BEGIN + '' + @grantordeny + '' '' + @rightsaction + '' ON SCHEMA::'' + @schemaid + '' TO ['' + @RoleName + ''] + END +END + +'' + END + + IF @typeofobject in(''TABLE'',''SP'',''FUNCTIONS'',''VIEWS'') + BEGIN + + IF @objectname like ''%[%]%'' + BEGIN + IF @typeofobject = ''TABLE'' + BEGIN + SET @sysTarget = ''sys.tables'' + SET @sysType = '''' + END + + IF @typeofobject = ''SP'' + BEGIN + SET @sysTarget = ''sys.procedures'' + SET @sysType = '''' + END + + IF @typeofobject = ''FUNCTIONS'' + BEGIN + SET @sysTarget = ''sys.objects'' + SET @sysType = '' and p.Type IN ( N''''FN'''', N''''IF'''', N''''TF'''', N''''FS'''', N''''FT'''' )'' + END + + IF @typeofobject = ''VIEWS'' + BEGIN + SET @sysTarget = ''sys.views'' + SET @sysType = '''' + END + + SET @Command = @Command + '' +DECLARE SP_cursor CURSOR FOR +SELECT p.name FROM '' + @sysTarget + '' p JOIN sys.schemas s ON s.schema_id = p.schema_id WHERE (p.name like '''''' + @objectname + '''''') and s.name = '''''' + @schemaid + '''' + @sysType + '''''' + +OPEN SP_cursor +FETCH NEXT FROM SP_cursor INTO @SP_Name +WHILE @@FETCH_STATUS = 0 +BEGIN + IF EXISTS(SELECT 1 FROM sys.fn_builtin_permissions(''''OBJECT'''') WHERE permission_name = '''''' + @rightsaction + '''''') + BEGIN + EXEC('''''' + @grantordeny + '' '' + @rightsaction + '' ON ['' + @schemaid + ''].['''' + @SP_Name + ''''] TO ['' + @RoleName + '']'''') + END + FETCH NEXT FROM SP_cursor INTO @SP_Name +END + +CLOSE SP_cursor +DEALLOCATE SP_cursor + +'' + + END + ELSE + BEGIN + + SET @Command = @Command + '' +IF EXISTS(SELECT 1 FROM sys.objects o WITH (NOLOCK) JOIN sys.schemas s ON s.schema_id = o.schema_id WHERE o.name = '''''' + @objectname + '''''' AND o.type IN (N''''U'''',''''P'''',''''V'''',''''FN'''',''''IF'''',''''TF'''') AND s.name = '''''' + @schemaid + '''''') +BEGIN + IF EXISTS(SELECT 1 FROM sys.fn_builtin_permissions(''''OBJECT'''') WHERE permission_name = '''''' + @rightsaction + '''''') + BEGIN + '' + @grantordeny + '' '' + @rightsaction + '' ON ['' + @schemaid + ''].['' + @objectname + ''] TO ['' + @RoleName + ''] + END +END + +'' + END + END + + IF @typeofobject = ''ASSEMBLIES'' + BEGIN + SET @Command = @Command + '' +IF EXISTS(SELECT 1 FROM sys.assemblies WHERE NAME = '''''' + @objectname + '''''') +BEGIN + IF EXISTS(SELECT 1 FROM sys.fn_builtin_permissions(''''ASSEMBLY'''') WHERE permission_name = '''''' + @rightsaction + '''''') + BEGIN + '' + @grantordeny + '' '' + @rightsaction + ''::['' + @objectname + ''] TO ['' + @RoleName + ''] + END +END + +'' + END + + IF @typeofobject = ''ROLE'' + BEGIN + SET @Command = @Command + '' +IF NOT EXISTS (SELECT 1 FROM sys.database_role_members JOIN sys.database_principals roles ON database_role_members.role_principal_id = roles.principal_id JOIN sys.database_principals members ON database_role_members.member_principal_id = members.principal_id WHERE roles.name = '''''' + @rightsaction + '''''' AND members.name = '''''' + @RoleName + '''''') +BEGIN + EXEC sp_addrolemember N'''''' + @rightsaction + '''''', N'''''' + @RoleName + '''''' +END + +'' + END + + FETCH NEXT FROM SecurablesCurs INTO @typeofobject, @grantordeny, @rightsaction, @objectname, @schemaid + END + +CLOSE SecurablesCurs +DEALLOCATE SecurablesCurs + +PRINT ''SET ALL SECURABLES ON ROLE ['' + @RoleName + '']'' +EXEC sp_executesql @Command + +END +ELSE +BEGIN + + DECLARE SecurablesCurs CURSOR FOR + SELECT typeofobject, grantordeny, rightsaction, objectname, schemaid + FROM #Securables + WHERE N2 = 0 + + OPEN SecurablesCurs + FETCH NEXT FROM SecurablesCurs INTO @typeofobject, @grantordeny, @rightsaction, @objectname, @schemaid + WHILE @@FETCH_STATUS = 0 + BEGIN + + IF @typeofobject = ''DB'' + BEGIN + IF EXISTS(SELECT 1 FROM sys.fn_builtin_permissions(''DATABASE'') WHERE permission_name = '''' + @rightsaction + '''') + BEGIN + SET @Command = @Command + @grantordeny + '' '' + @rightsaction + '' TO ['' + @RoleName + ''] +'' + END + END + + IF @typeofobject = ''SCHEMA'' + BEGIN + SET @Command = @Command + '' +IF EXISTS (SELECT 1 FROM sys.schemas WHERE name = '''''' + @schemaid + '''''') +BEGIN + IF EXISTS(SELECT 1 FROM sys.fn_builtin_permissions(''''SCHEMA'''') WHERE permission_name = '''''' + @rightsaction + '''''') + BEGIN + '' + @grantordeny + '' '' + @rightsaction + '' ON SCHEMA::'' + @schemaid + '' TO ['' + @RoleName + ''] + END +END + +'' + END + + IF @typeofobject in(''TABLE'',''SP'',''FUNCTIONS'',''VIEWS'') + BEGIN + + IF @objectname like ''%[%]%'' + BEGIN + + IF @typeofobject = ''TABLE'' + BEGIN + SET @sysTarget = ''sys.tables'' + SET @sysType = '''' + END + + IF @typeofobject = ''SP'' + BEGIN + SET @sysTarget = ''sys.procedures'' + SET @sysType = '''' + END + + IF @typeofobject = ''FUNCTIONS'' + BEGIN + SET @sysTarget = ''sys.objects'' + SET @sysType = '' and p.Type IN ( N''''FN'''', N''''IF'''', N''''TF'''', N''''FS'''', N''''FT'''' )'' + END + + IF @typeofobject = ''VIEWS'' + BEGIN + SET @sysTarget = ''sys.views'' + SET @sysType = '''' + END + + SET @Command = @Command + '' +DECLARE SP_cursor CURSOR FOR +SELECT p.name FROM '' + @sysTarget + '' p JOIN sys.schemas s ON s.schema_id = p.schema_id WHERE (p.name like '''''' + @objectname + '''''') and s.name = '''''' + @schemaid + '''' + @sysType + '''''' + +OPEN SP_cursor +FETCH NEXT FROM SP_cursor INTO @SP_Name +WHILE @@FETCH_STATUS = 0 +BEGIN + IF EXISTS(SELECT 1 FROM sys.fn_builtin_permissions(''''OBJECT'''') WHERE permission_name = '''''' + @rightsaction + '''''') + BEGIN + EXEC('''''' + @grantordeny + '' '' + @rightsaction + '' ON ['' + @schemaid + ''].['''' + @SP_Name + ''''] TO ['' + @RoleName + '']'''') + END + FETCH NEXT FROM SP_cursor INTO @SP_Name +END + +CLOSE SP_cursor +DEALLOCATE SP_cursor + +'' + + END + ELSE + BEGIN + + SET @Command = @Command + '' +IF EXISTS(SELECT 1 FROM sys.objects o WITH (NOLOCK) JOIN sys.schemas s ON s.schema_id = o.schema_id WHERE o.name = '''''' + @objectname + '''''' AND o.type IN (N''''U'''',''''P'''',''''V'''',''''FN'''',''''IF'''',''''TF'''') AND s.name = '''''' + @schemaid + '''''') +BEGIN + IF EXISTS(SELECT 1 FROM sys.fn_builtin_permissions(''''OBJECT'''') WHERE permission_name = '''''' + @rightsaction + '''''') + BEGIN + '' + @grantordeny + '' '' + @rightsaction + '' ON ['' + @schemaid + ''].['' + @objectname + ''] TO ['' + @RoleName + ''] + END +END + +'' + END + END + + IF @typeofobject = ''ASSEMBLIES'' + BEGIN + SET @Command = @Command + '' +IF EXISTS(SELECT 1 FROM sys.assemblies WHERE NAME = '''''' + @objectname + '''''') +BEGIN + IF EXISTS(SELECT 1 FROM sys.fn_builtin_permissions(''''ASSEMBLY'''') WHERE permission_name = '''''' + @rightsaction + '''''') + BEGIN + '' + @grantordeny + '' '' + @rightsaction + ''::['' + @objectname + ''] TO ['' + @RoleName + ''] + END +END + +'' + END + + IF @typeofobject = ''ROLE'' + BEGIN + SET @Command = @Command + '' +IF NOT EXISTS (SELECT 1 FROM sys.database_role_members JOIN sys.database_principals roles ON database_role_members.role_principal_id = roles.principal_id JOIN sys.database_principals members ON database_role_members.member_principal_id = members.principal_id WHERE roles.name = '''''' + @rightsaction + '''''' AND members.name = '''''' + @RoleName + '''''') +BEGIN + EXEC sp_addrolemember N'''''' + @rightsaction + '''''', N'''''' + @RoleName + '''''' +END + +'' + END + + FETCH NEXT FROM SecurablesCurs INTO @typeofobject, @grantordeny, @rightsaction, @objectname, @schemaid + END + +CLOSE SecurablesCurs +DEALLOCATE SecurablesCurs + +PRINT ''SET ALL SECURABLES ON ROLE ['' + @RoleName + '']'' +EXEC sp_executesql @Command + +END + +/* ADD USER */ +DECLARE UsersCurs CURSOR FOR +SELECT username + FROM #UsersOnRole + +OPEN UsersCurs + +FETCH NEXT FROM UsersCurs INTO @Users +WHILE @@FETCH_STATUS = 0 +BEGIN + + SELECT @Command = '' +EXEC sp_addrolemember N'''''' + @RoleName + '''''', N'''''' + @Users + '''''' +PRINT ''''ADD USER ['' + @Users + ''] ON ROLE ['' + @RoleName + '']'''' +'' + +FETCH NEXT FROM UsersCurs INTO @Users +END + +CLOSE UsersCurs +DEALLOCATE UsersCurs + +EXEC sp_executesql @Command + +/*============================================================================= + Drop temp tables +=============================================================================*/ +DROP TABLE #Securables +DROP TABLE #UsersOnRole','HCITools','Pharmacies') + +INSERT INTO #AllRoles(STR_Definition,STR_Database,STR_Product)VALUES(' + +/*============================================================================= + + Script to create dbRoleAtlas role. + + Role Name: dbRoleAtlas + TEMPLATE: Default + + EXAMPLE OF SECURABLES TO SET: + + INSERT INTO #Securables + VALUES + (''DB'',''GRANT'',''VIEW DEFINITION'','''',''''), + (''SCHEMA'',''GRANT'',''SELECT,EXECUTE,INSERT,UPDATE,DELETE'','''',''AP''), + (''TABLE'',''GRANT'',''INSERT,UPDATE'',''Address'',''dbo''), + (''SP'',''GRANT'',''EXECUTE'',''sp_bmc_GetNextID'',''dbo''), + (''ROLE'',''GRANT'',''db_datareader'','''','''') + + ----------------------------------------------- + +Generate date : 2023-05-12 / up208700 + +=============================================================================*/ + +DECLARE @Command nvarchar(max), + @RoleName varchar(60), + @Users varchar(255), + @typeofobject varchar(50), + @grantordeny varchar(10), + @rightsaction varchar(255), + @objectname varchar(255), + @schemaid varchar(10), + @sysTarget varchar(255), + @sysType varchar(255) + +SET @RoleName = ''dbRoleAtlas'' +SET @Command = '''' + +/* TEMP TABLES */ +CREATE TABLE #UsersOnRole(username varchar(255)) +CREATE TABLE #Securables(typeofobject varchar(50), grantordeny varchar(10), rightsaction varchar(255), objectname varchar(255), schemaid varchar(10),N2 bit) + +/* !!! LIST OF SECURABLES TO CHANGE !!! */ + +INSERT INTO #Securables +VALUES +(''TABLE'',''GRANT'',''SELECT'',''InstanceContext'',''cfg'',0) + + +/* GET ALL USERS ON THIS ROLE */ +INSERT INTO #UsersOnRole +SELECT + members.name +FROM sys.database_role_members + JOIN sys.database_principals roles ON database_role_members.role_principal_id = roles.principal_id + JOIN sys.database_principals members ON database_role_members.member_principal_id = members.principal_id +WHERE roles.name = @RoleName + +/* CREATE ROLE */ +SELECT @Command = '' +IF NOT EXISTS (SELECT 1 FROM sys.database_principals WHERE name = '''''' + @RoleName + '''''' AND type = ''''R'''') +BEGIN + CREATE ROLE ['' + @RoleName + ''] AUTHORIZATION [dbo] + PRINT ''''CREATE ROLE ['' + @RoleName + '']'''' +END +'' +EXEC sp_executesql @Command + +SET @Command = '' +DECLARE @SP_Name varchar(255) + +'' + +/* SET ALL ROLE SECURABLES */ +DECLARE SecurablesCurs CURSOR FOR +SELECT typeofobject, grantordeny, rightsaction, objectname, schemaid +FROM #Securables +WHERE N2 = 0 + +OPEN SecurablesCurs +FETCH NEXT FROM SecurablesCurs INTO @typeofobject, @grantordeny, @rightsaction, @objectname, @schemaid +WHILE @@FETCH_STATUS = 0 +BEGIN + + IF @typeofobject = ''DB'' + BEGIN + IF EXISTS(SELECT 1 FROM sys.fn_builtin_permissions(''DATABASE'') WHERE permission_name = '''' + @rightsaction + '''') + BEGIN + SET @Command = @Command + @grantordeny + '' '' + @rightsaction + '' TO ['' + @RoleName + ''] +'' + END + END + + IF @typeofobject = ''SCHEMA'' + BEGIN + SET @Command = @Command + '' +IF EXISTS (SELECT 1 FROM sys.schemas WHERE name = '''''' + @schemaid + '''''') +BEGIN + IF EXISTS(SELECT 1 FROM sys.fn_builtin_permissions(''''SCHEMA'''') WHERE permission_name = '''''' + @rightsaction + '''''') + BEGIN + '' + @grantordeny + '' '' + @rightsaction + '' ON SCHEMA::'' + @schemaid + '' TO ['' + @RoleName + ''] + END +END + +'' + END + + IF @typeofobject in(''TABLE'',''SP'',''FUNCTIONS'',''VIEWS'') + BEGIN + + IF @objectname like ''%[%]%'' + BEGIN + + IF @typeofobject = ''TABLE'' + BEGIN + SET @sysTarget = ''sys.tables'' + SET @sysType = '''' + END + + IF @typeofobject = ''SP'' + BEGIN + SET @sysTarget = ''sys.procedures'' + SET @sysType = '''' + END + + IF @typeofobject = ''FUNCTIONS'' + BEGIN + SET @sysTarget = ''sys.objects'' + SET @sysType = '' and p.Type IN ( N''''FN'''', N''''IF'''', N''''TF'''', N''''FS'''', N''''FT'''' )'' + END + + IF @typeofobject = ''VIEWS'' + BEGIN + SET @sysTarget = ''sys.views'' + SET @sysType = '''' + END + + SET @Command = @Command + '' +DECLARE SP_cursor CURSOR FOR +SELECT p.name FROM '' + @sysTarget + '' p JOIN sys.schemas s ON s.schema_id = p.schema_id WHERE (p.name like '''''' + @objectname + '''''') and s.name = '''''' + @schemaid + '''' + @sysType + '''''' + +OPEN SP_cursor +FETCH NEXT FROM SP_cursor INTO @SP_Name +WHILE @@FETCH_STATUS = 0 +BEGIN + IF EXISTS(SELECT 1 FROM sys.fn_builtin_permissions(''''OBJECT'''') WHERE permission_name = '''''' + @rightsaction + '''''') + BEGIN + EXEC('''''' + @grantordeny + '' '' + @rightsaction + '' ON ['' + @schemaid + ''].['''' + @SP_Name + ''''] TO ['' + @RoleName + '']'''') + END + FETCH NEXT FROM SP_cursor INTO @SP_Name +END + +CLOSE SP_cursor +DEALLOCATE SP_cursor + +'' + + END + ELSE + BEGIN + + SET @Command = @Command + '' +IF EXISTS(SELECT 1 FROM sys.objects o WITH (NOLOCK) JOIN sys.schemas s ON s.schema_id = o.schema_id WHERE o.name = '''''' + @objectname + '''''' AND o.type IN (N''''U'''',''''P'''',''''V'''',''''FN'''',''''IF'''',''''TF'''') AND s.name = '''''' + @schemaid + '''''') +BEGIN + IF EXISTS(SELECT 1 FROM sys.fn_builtin_permissions(''''OBJECT'''') WHERE permission_name = '''''' + @rightsaction + '''''') + BEGIN + '' + @grantordeny + '' '' + @rightsaction + '' ON ['' + @schemaid + ''].['' + @objectname + ''] TO ['' + @RoleName + ''] + END +END + +'' + END +END + +IF @typeofobject = ''ASSEMBLIES'' +BEGIN + SET @Command = @Command + '' +IF EXISTS(SELECT 1 FROM sys.assemblies WHERE NAME = '''''' + @objectname + '''''') +BEGIN + IF EXISTS(SELECT 1 FROM sys.fn_builtin_permissions(''''ASSEMBLY'''') WHERE permission_name = '''''' + @rightsaction + '''''') + BEGIN + '' + @grantordeny + '' '' + @rightsaction + ''::['' + @objectname + ''] TO ['' + @RoleName + ''] + END +END + +'' +END + +IF @typeofobject = ''ROLE'' +BEGIN + SET @Command = @Command + '' +IF NOT EXISTS (SELECT 1 FROM sys.database_role_members JOIN sys.database_principals roles ON database_role_members.role_principal_id = roles.principal_id JOIN sys.database_principals members ON database_role_members.member_principal_id = members.principal_id WHERE roles.name = '''''' + @rightsaction + '''''' AND members.name = '''''' + @RoleName + '''''') +BEGIN + EXEC sp_addrolemember N'''''' + @rightsaction + '''''', N'''''' + @RoleName + '''''' +END + +'' +END + +FETCH NEXT FROM SecurablesCurs INTO @typeofobject, @grantordeny, @rightsaction, @objectname, @schemaid +END + +CLOSE SecurablesCurs +DEALLOCATE SecurablesCurs + +PRINT ''SET ALL SECURABLES ON ROLE ['' + @RoleName + '']'' +EXEC sp_executesql @Command + +/* ADD USER */ +DECLARE UsersCurs CURSOR FOR +SELECT username + FROM #UsersOnRole + +OPEN UsersCurs + +FETCH NEXT FROM UsersCurs INTO @Users +WHILE @@FETCH_STATUS = 0 +BEGIN + + SELECT @Command = '' +EXEC sp_addrolemember N'''''' + @RoleName + '''''', N'''''' + @Users + '''''' +PRINT ''''ADD USER ['' + @Users + ''] ON ROLE ['' + @RoleName + '']'''' +'' + +FETCH NEXT FROM UsersCurs INTO @Users +END + +CLOSE UsersCurs +DEALLOCATE UsersCurs + +EXEC sp_executesql @Command + + +/*============================================================================= + Drop temp tables +=============================================================================*/ +DROP TABLE #Securables +DROP TABLE #UsersOnRole +','master','Pharmacies') + +INSERT INTO #AllRoles(STR_Definition,STR_Database,STR_Product)VALUES(' + +/*============================================================================= + + Script to create dbRoleSyncAccountingExtraction role. + + Role Name: dbRoleSyncAccountingExtraction + TEMPLATE: Default + + EXAMPLE OF SECURABLES TO SET: + + INSERT INTO #Securables + VALUES + (''DB'',''GRANT'',''VIEW DEFINITION'','''',''''), + (''SCHEMA'',''GRANT'',''SELECT,EXECUTE,INSERT,UPDATE,DELETE'','''',''AP''), + (''TABLE'',''GRANT'',''INSERT,UPDATE'',''Address'',''dbo''), + (''SP'',''GRANT'',''EXECUTE'',''sp_bmc_GetNextID'',''dbo''), + (''ROLE'',''GRANT'',''db_datareader'','''','''') + + ----------------------------------------------- + +Generate date : 2023-05-12 / up208700 + +=============================================================================*/ + +DECLARE @Command nvarchar(max), + @RoleName varchar(60), + @Users varchar(255), + @typeofobject varchar(50), + @grantordeny varchar(10), + @rightsaction varchar(255), + @objectname varchar(255), + @schemaid varchar(10), + @sysTarget varchar(255), + @sysType varchar(255) + +SET @RoleName = ''dbRoleSyncAccountingExtraction'' +SET @Command = '''' + +/* TEMP TABLES */ +CREATE TABLE #UsersOnRole(username varchar(255)) +CREATE TABLE #Securables(typeofobject varchar(50), grantordeny varchar(10), rightsaction varchar(255), objectname varchar(255), schemaid varchar(10),N2 bit) + +/* !!! LIST OF SECURABLES TO CHANGE !!! */ + +INSERT INTO #Securables +VALUES +(''TABLE'',''GRANT'',''SELECT'',''Identity'',''cfg'',0) +,(''TABLE'',''GRANT'',''SELECT'',''InstanceContext'',''cfg'',0) + + +/* GET ALL USERS ON THIS ROLE */ +INSERT INTO #UsersOnRole +SELECT + members.name +FROM sys.database_role_members + JOIN sys.database_principals roles ON database_role_members.role_principal_id = roles.principal_id + JOIN sys.database_principals members ON database_role_members.member_principal_id = members.principal_id +WHERE roles.name = @RoleName + +/* CREATE ROLE */ +SELECT @Command = '' +IF NOT EXISTS (SELECT 1 FROM sys.database_principals WHERE name = '''''' + @RoleName + '''''' AND type = ''''R'''') +BEGIN + CREATE ROLE ['' + @RoleName + ''] AUTHORIZATION [dbo] + PRINT ''''CREATE ROLE ['' + @RoleName + '']'''' +END +'' +EXEC sp_executesql @Command + +SET @Command = '' +DECLARE @SP_Name varchar(255) + +'' + +/* SET ALL ROLE SECURABLES */ +DECLARE SecurablesCurs CURSOR FOR +SELECT typeofobject, grantordeny, rightsaction, objectname, schemaid +FROM #Securables +WHERE N2 = 0 + +OPEN SecurablesCurs +FETCH NEXT FROM SecurablesCurs INTO @typeofobject, @grantordeny, @rightsaction, @objectname, @schemaid +WHILE @@FETCH_STATUS = 0 +BEGIN + + IF @typeofobject = ''DB'' + BEGIN + IF EXISTS(SELECT 1 FROM sys.fn_builtin_permissions(''DATABASE'') WHERE permission_name = '''' + @rightsaction + '''') + BEGIN + SET @Command = @Command + @grantordeny + '' '' + @rightsaction + '' TO ['' + @RoleName + ''] +'' + END + END + + IF @typeofobject = ''SCHEMA'' + BEGIN + SET @Command = @Command + '' +IF EXISTS (SELECT 1 FROM sys.schemas WHERE name = '''''' + @schemaid + '''''') +BEGIN + IF EXISTS(SELECT 1 FROM sys.fn_builtin_permissions(''''SCHEMA'''') WHERE permission_name = '''''' + @rightsaction + '''''') + BEGIN + '' + @grantordeny + '' '' + @rightsaction + '' ON SCHEMA::'' + @schemaid + '' TO ['' + @RoleName + ''] + END +END + +'' + END + + IF @typeofobject in(''TABLE'',''SP'',''FUNCTIONS'',''VIEWS'') + BEGIN + + IF @objectname like ''%[%]%'' + BEGIN + + IF @typeofobject = ''TABLE'' + BEGIN + SET @sysTarget = ''sys.tables'' + SET @sysType = '''' + END + + IF @typeofobject = ''SP'' + BEGIN + SET @sysTarget = ''sys.procedures'' + SET @sysType = '''' + END + + IF @typeofobject = ''FUNCTIONS'' + BEGIN + SET @sysTarget = ''sys.objects'' + SET @sysType = '' and p.Type IN ( N''''FN'''', N''''IF'''', N''''TF'''', N''''FS'''', N''''FT'''' )'' + END + + IF @typeofobject = ''VIEWS'' + BEGIN + SET @sysTarget = ''sys.views'' + SET @sysType = '''' + END + + SET @Command = @Command + '' +DECLARE SP_cursor CURSOR FOR +SELECT p.name FROM '' + @sysTarget + '' p JOIN sys.schemas s ON s.schema_id = p.schema_id WHERE (p.name like '''''' + @objectname + '''''') and s.name = '''''' + @schemaid + '''' + @sysType + '''''' + +OPEN SP_cursor +FETCH NEXT FROM SP_cursor INTO @SP_Name +WHILE @@FETCH_STATUS = 0 +BEGIN + IF EXISTS(SELECT 1 FROM sys.fn_builtin_permissions(''''OBJECT'''') WHERE permission_name = '''''' + @rightsaction + '''''') + BEGIN + EXEC('''''' + @grantordeny + '' '' + @rightsaction + '' ON ['' + @schemaid + ''].['''' + @SP_Name + ''''] TO ['' + @RoleName + '']'''') + END + FETCH NEXT FROM SP_cursor INTO @SP_Name +END + +CLOSE SP_cursor +DEALLOCATE SP_cursor + +'' + + END + ELSE + BEGIN + + SET @Command = @Command + '' +IF EXISTS(SELECT 1 FROM sys.objects o WITH (NOLOCK) JOIN sys.schemas s ON s.schema_id = o.schema_id WHERE o.name = '''''' + @objectname + '''''' AND o.type IN (N''''U'''',''''P'''',''''V'''',''''FN'''',''''IF'''',''''TF'''') AND s.name = '''''' + @schemaid + '''''') +BEGIN + IF EXISTS(SELECT 1 FROM sys.fn_builtin_permissions(''''OBJECT'''') WHERE permission_name = '''''' + @rightsaction + '''''') + BEGIN + '' + @grantordeny + '' '' + @rightsaction + '' ON ['' + @schemaid + ''].['' + @objectname + ''] TO ['' + @RoleName + ''] + END +END + +'' + END +END + +IF @typeofobject = ''ASSEMBLIES'' +BEGIN + SET @Command = @Command + '' +IF EXISTS(SELECT 1 FROM sys.assemblies WHERE NAME = '''''' + @objectname + '''''') +BEGIN + IF EXISTS(SELECT 1 FROM sys.fn_builtin_permissions(''''ASSEMBLY'''') WHERE permission_name = '''''' + @rightsaction + '''''') + BEGIN + '' + @grantordeny + '' '' + @rightsaction + ''::['' + @objectname + ''] TO ['' + @RoleName + ''] + END +END + +'' +END + +IF @typeofobject = ''ROLE'' +BEGIN + SET @Command = @Command + '' +IF NOT EXISTS (SELECT 1 FROM sys.database_role_members JOIN sys.database_principals roles ON database_role_members.role_principal_id = roles.principal_id JOIN sys.database_principals members ON database_role_members.member_principal_id = members.principal_id WHERE roles.name = '''''' + @rightsaction + '''''' AND members.name = '''''' + @RoleName + '''''') +BEGIN + EXEC sp_addrolemember N'''''' + @rightsaction + '''''', N'''''' + @RoleName + '''''' +END + +'' +END + +FETCH NEXT FROM SecurablesCurs INTO @typeofobject, @grantordeny, @rightsaction, @objectname, @schemaid +END + +CLOSE SecurablesCurs +DEALLOCATE SecurablesCurs + +PRINT ''SET ALL SECURABLES ON ROLE ['' + @RoleName + '']'' +EXEC sp_executesql @Command + +/* ADD USER */ +DECLARE UsersCurs CURSOR FOR +SELECT username + FROM #UsersOnRole + +OPEN UsersCurs + +FETCH NEXT FROM UsersCurs INTO @Users +WHILE @@FETCH_STATUS = 0 +BEGIN + + SELECT @Command = '' +EXEC sp_addrolemember N'''''' + @RoleName + '''''', N'''''' + @Users + '''''' +PRINT ''''ADD USER ['' + @Users + ''] ON ROLE ['' + @RoleName + '']'''' +'' + +FETCH NEXT FROM UsersCurs INTO @Users +END + +CLOSE UsersCurs +DEALLOCATE UsersCurs + +EXEC sp_executesql @Command + + +/*============================================================================= + Drop temp tables +=============================================================================*/ +DROP TABLE #Securables +DROP TABLE #UsersOnRole +','master','Pharmacies') + +INSERT INTO #AllRoles(STR_Definition,STR_Database,STR_Product)VALUES(' + +/*============================================================================= + + Script to create dbRoleTPPos role. + + Role Name: dbRoleTPPos + TEMPLATE: Default + + EXAMPLE OF SECURABLES TO SET: + + INSERT INTO #Securables + VALUES + (''DB'',''GRANT'',''VIEW DEFINITION'','''',''''), + (''SCHEMA'',''GRANT'',''SELECT,EXECUTE,INSERT,UPDATE,DELETE'','''',''AP''), + (''TABLE'',''GRANT'',''INSERT,UPDATE'',''Address'',''dbo''), + (''SP'',''GRANT'',''EXECUTE'',''sp_bmc_GetNextID'',''dbo''), + (''ROLE'',''GRANT'',''db_datareader'','''','''') + + ----------------------------------------------- + +Generate date : 2023-05-12 / up208700 + +=============================================================================*/ + +DECLARE @Command nvarchar(max), + @RoleName varchar(60), + @Users varchar(255), + @typeofobject varchar(50), + @grantordeny varchar(10), + @rightsaction varchar(255), + @objectname varchar(255), + @schemaid varchar(10), + @sysTarget varchar(255), + @sysType varchar(255) + +SET @RoleName = ''dbRoleTPPos'' +SET @Command = '''' + +/* TEMP TABLES */ +CREATE TABLE #UsersOnRole(username varchar(255)) +CREATE TABLE #Securables(typeofobject varchar(50), grantordeny varchar(10), rightsaction varchar(255), objectname varchar(255), schemaid varchar(10),N2 bit) + +/* !!! LIST OF SECURABLES TO CHANGE !!! */ + +INSERT INTO #Securables +VALUES +(''DB'',''GRANT'',''EXECUTE'','''',''dbo'',0) +,(''ROLE'',''GRANT'',''DB_DATAREADER'','''',''dbo'',0) +,(''ROLE'',''GRANT'',''DB_DATAWRITER'','''',''dbo'',0) +,(''ROLE'',''GRANT'',''DB_DDLADMIN'','''',''dbo'',0) + + +/* GET ALL USERS ON THIS ROLE */ +INSERT INTO #UsersOnRole +SELECT + members.name +FROM sys.database_role_members + JOIN sys.database_principals roles ON database_role_members.role_principal_id = roles.principal_id + JOIN sys.database_principals members ON database_role_members.member_principal_id = members.principal_id +WHERE roles.name = @RoleName + +/* CREATE ROLE */ +SELECT @Command = '' +IF NOT EXISTS (SELECT 1 FROM sys.database_principals WHERE name = '''''' + @RoleName + '''''' AND type = ''''R'''') +BEGIN + CREATE ROLE ['' + @RoleName + ''] AUTHORIZATION [dbo] + PRINT ''''CREATE ROLE ['' + @RoleName + '']'''' +END +'' +EXEC sp_executesql @Command + +SET @Command = '' +DECLARE @SP_Name varchar(255) + +'' + +/* SET ALL ROLE SECURABLES */ +DECLARE SecurablesCurs CURSOR FOR +SELECT typeofobject, grantordeny, rightsaction, objectname, schemaid +FROM #Securables +WHERE N2 = 0 + +OPEN SecurablesCurs +FETCH NEXT FROM SecurablesCurs INTO @typeofobject, @grantordeny, @rightsaction, @objectname, @schemaid +WHILE @@FETCH_STATUS = 0 +BEGIN + + IF @typeofobject = ''DB'' + BEGIN + IF EXISTS(SELECT 1 FROM sys.fn_builtin_permissions(''DATABASE'') WHERE permission_name = '''' + @rightsaction + '''') + BEGIN + SET @Command = @Command + @grantordeny + '' '' + @rightsaction + '' TO ['' + @RoleName + ''] +'' + END + END + + IF @typeofobject = ''SCHEMA'' + BEGIN + SET @Command = @Command + '' +IF EXISTS (SELECT 1 FROM sys.schemas WHERE name = '''''' + @schemaid + '''''') +BEGIN + IF EXISTS(SELECT 1 FROM sys.fn_builtin_permissions(''''SCHEMA'''') WHERE permission_name = '''''' + @rightsaction + '''''') + BEGIN + '' + @grantordeny + '' '' + @rightsaction + '' ON SCHEMA::'' + @schemaid + '' TO ['' + @RoleName + ''] + END +END + +'' + END + + IF @typeofobject in(''TABLE'',''SP'',''FUNCTIONS'',''VIEWS'') + BEGIN + + IF @objectname like ''%[%]%'' + BEGIN + + IF @typeofobject = ''TABLE'' + BEGIN + SET @sysTarget = ''sys.tables'' + SET @sysType = '''' + END + + IF @typeofobject = ''SP'' + BEGIN + SET @sysTarget = ''sys.procedures'' + SET @sysType = '''' + END + + IF @typeofobject = ''FUNCTIONS'' + BEGIN + SET @sysTarget = ''sys.objects'' + SET @sysType = '' and p.Type IN ( N''''FN'''', N''''IF'''', N''''TF'''', N''''FS'''', N''''FT'''' )'' + END + + IF @typeofobject = ''VIEWS'' + BEGIN + SET @sysTarget = ''sys.views'' + SET @sysType = '''' + END + + SET @Command = @Command + '' +DECLARE SP_cursor CURSOR FOR +SELECT p.name FROM '' + @sysTarget + '' p JOIN sys.schemas s ON s.schema_id = p.schema_id WHERE (p.name like '''''' + @objectname + '''''') and s.name = '''''' + @schemaid + '''' + @sysType + '''''' + +OPEN SP_cursor +FETCH NEXT FROM SP_cursor INTO @SP_Name +WHILE @@FETCH_STATUS = 0 +BEGIN + IF EXISTS(SELECT 1 FROM sys.fn_builtin_permissions(''''OBJECT'''') WHERE permission_name = '''''' + @rightsaction + '''''') + BEGIN + EXEC('''''' + @grantordeny + '' '' + @rightsaction + '' ON ['' + @schemaid + ''].['''' + @SP_Name + ''''] TO ['' + @RoleName + '']'''') + END + FETCH NEXT FROM SP_cursor INTO @SP_Name +END + +CLOSE SP_cursor +DEALLOCATE SP_cursor + +'' + + END + ELSE + BEGIN + + SET @Command = @Command + '' +IF EXISTS(SELECT 1 FROM sys.objects o WITH (NOLOCK) JOIN sys.schemas s ON s.schema_id = o.schema_id WHERE o.name = '''''' + @objectname + '''''' AND o.type IN (N''''U'''',''''P'''',''''V'''',''''FN'''',''''IF'''',''''TF'''') AND s.name = '''''' + @schemaid + '''''') +BEGIN + IF EXISTS(SELECT 1 FROM sys.fn_builtin_permissions(''''OBJECT'''') WHERE permission_name = '''''' + @rightsaction + '''''') + BEGIN + '' + @grantordeny + '' '' + @rightsaction + '' ON ['' + @schemaid + ''].['' + @objectname + ''] TO ['' + @RoleName + ''] + END +END + +'' + END +END + +IF @typeofobject = ''ASSEMBLIES'' +BEGIN + SET @Command = @Command + '' +IF EXISTS(SELECT 1 FROM sys.assemblies WHERE NAME = '''''' + @objectname + '''''') +BEGIN + IF EXISTS(SELECT 1 FROM sys.fn_builtin_permissions(''''ASSEMBLY'''') WHERE permission_name = '''''' + @rightsaction + '''''') + BEGIN + '' + @grantordeny + '' '' + @rightsaction + ''::['' + @objectname + ''] TO ['' + @RoleName + ''] + END +END + +'' +END + +IF @typeofobject = ''ROLE'' +BEGIN + SET @Command = @Command + '' +IF NOT EXISTS (SELECT 1 FROM sys.database_role_members JOIN sys.database_principals roles ON database_role_members.role_principal_id = roles.principal_id JOIN sys.database_principals members ON database_role_members.member_principal_id = members.principal_id WHERE roles.name = '''''' + @rightsaction + '''''' AND members.name = '''''' + @RoleName + '''''') +BEGIN + EXEC sp_addrolemember N'''''' + @rightsaction + '''''', N'''''' + @RoleName + '''''' +END + +'' +END + +FETCH NEXT FROM SecurablesCurs INTO @typeofobject, @grantordeny, @rightsaction, @objectname, @schemaid +END + +CLOSE SecurablesCurs +DEALLOCATE SecurablesCurs + +PRINT ''SET ALL SECURABLES ON ROLE ['' + @RoleName + '']'' +EXEC sp_executesql @Command + +/* ADD USER */ +DECLARE UsersCurs CURSOR FOR +SELECT username + FROM #UsersOnRole + +OPEN UsersCurs + +FETCH NEXT FROM UsersCurs INTO @Users +WHILE @@FETCH_STATUS = 0 +BEGIN + + SELECT @Command = '' +EXEC sp_addrolemember N'''''' + @RoleName + '''''', N'''''' + @Users + '''''' +PRINT ''''ADD USER ['' + @Users + ''] ON ROLE ['' + @RoleName + '']'''' +'' + +FETCH NEXT FROM UsersCurs INTO @Users +END + +CLOSE UsersCurs +DEALLOCATE UsersCurs + +EXEC sp_executesql @Command + + +/*============================================================================= + Drop temp tables +=============================================================================*/ +DROP TABLE #Securables +DROP TABLE #UsersOnRole +','master','Pharmacies') + +INSERT INTO #AllRoles(STR_Definition,STR_Database,STR_Product)VALUES(' + +/*============================================================================= + + Script to create dbRoleCsltUsr role. + + Role Name: dbRoleCsltUsr + TEMPLATE: N2 and PROD + + EXAMPLE OF SECURABLES TO SET: + + INSERT INTO #Securables + VALUES + (''DB'',''GRANT'',''VIEW DEFINITION'','''',''''), + (''SCHEMA'',''GRANT'',''SELECT,EXECUTE,INSERT,UPDATE,DELETE'','''',''AP''), + (''TABLE'',''GRANT'',''INSERT,UPDATE'',''Address'',''dbo''), + (''SP'',''GRANT'',''EXECUTE'',''sp_bmc_GetNextID'',''dbo''), + (''ROLE'',''GRANT'',''db_datareader'','''','''') + + ----------------------------------------------- + +Generate date : 2023-05-12 / up208700 + +=============================================================================*/ + +DECLARE @Type varchar(6), + @Command nvarchar(max), + @RoleName varchar(60), + @Users varchar(255), + @typeofobject varchar(50), + @grantordeny varchar(10), + @rightsaction varchar(255), + @objectname varchar(255), + @schemaid varchar(10), + @sysTarget varchar(255), + @sysType varchar(255) + +SET @RoleName = ''dbRoleCsltUsr'' +SET @Command = '''' + +SELECT @Type = [Type] FROM [master].[cfg].[InstanceContext] + +/* TEMP TABLES */ +CREATE TABLE #UsersOnRole(username varchar(255)) +CREATE TABLE #Securables(typeofobject varchar(50), grantordeny varchar(10), rightsaction varchar(255), objectname varchar(255), schemaid varchar(10),N2 bit) + +/* !!! LIST OF SECURABLES TO CHANGE !!! */ + +INSERT INTO #Securables +VALUES +(''ROLE'',''GRANT'',''DATABASEMAILUSERROLE'','''',''dbo'',0) +,(''ROLE'',''GRANT'',''DATABASEMAILUSERROLE'','''',''dbo'',1) +,(''ROLE'',''GRANT'',''DB_OWNER'','''',''dbo'',1) +,(''ROLE'',''GRANT'',''SQLAGENTOPERATORROLE'','''',''dbo'',0) +,(''ROLE'',''GRANT'',''SQLAGENTOPERATORROLE'','''',''dbo'',1) +,(''TABLE'',''GRANT'',''SELECT'',''sysjobs'',''dbo'',0) +,(''TABLE'',''GRANT'',''SELECT'',''sysjobsteps'',''dbo'',0) + + +/* GET ALL USERS ON THIS ROLE */ +INSERT INTO #UsersOnRole +SELECT + members.name +FROM sys.database_role_members + JOIN sys.database_principals roles ON database_role_members.role_principal_id = roles.principal_id + JOIN sys.database_principals members ON database_role_members.member_principal_id = members.principal_id +WHERE roles.name = @RoleName + +/* CREATE ROLE */ +SELECT @Command = '' +IF NOT EXISTS (SELECT 1 FROM sys.database_principals WHERE name = '''''' + @RoleName + '''''' AND type = ''''R'''') +BEGIN + CREATE ROLE ['' + @RoleName + ''] AUTHORIZATION [dbo] + PRINT ''''CREATE ROLE ['' + @RoleName + '']'''' +END +'' +EXEC sp_executesql @Command + +SET @Command = '' +DECLARE @SP_Name varchar(255) + +'' + +/* SET ALL ROLE SECURABLES */ +IF @Type = ''DEVE'' +BEGIN + + DECLARE SecurablesCurs CURSOR FOR + SELECT typeofobject, grantordeny, rightsaction, objectname, schemaid + FROM #Securables + WHERE N2 = 1 + + OPEN SecurablesCurs + FETCH NEXT FROM SecurablesCurs INTO @typeofobject, @grantordeny, @rightsaction, @objectname, @schemaid + WHILE @@FETCH_STATUS = 0 + BEGIN + + IF @typeofobject = ''DB'' + BEGIN + IF EXISTS(SELECT 1 FROM sys.fn_builtin_permissions(''DATABASE'') WHERE permission_name = '''' + @rightsaction + '''') + BEGIN + SET @Command = @Command + @grantordeny + '' '' + @rightsaction + '' TO ['' + @RoleName + ''] +'' + END + END + + IF @typeofobject = ''SCHEMA'' + BEGIN + SET @Command = @Command + '' +IF EXISTS (SELECT 1 FROM sys.schemas WHERE name = '''''' + @schemaid + '''''') +BEGIN + IF EXISTS(SELECT 1 FROM sys.fn_builtin_permissions(''''SCHEMA'''') WHERE permission_name = '''''' + @rightsaction + '''''') + BEGIN + '' + @grantordeny + '' '' + @rightsaction + '' ON SCHEMA::'' + @schemaid + '' TO ['' + @RoleName + ''] + END +END + +'' + END + + IF @typeofobject in(''TABLE'',''SP'',''FUNCTIONS'',''VIEWS'') + BEGIN + + IF @objectname like ''%[%]%'' + BEGIN + IF @typeofobject = ''TABLE'' + BEGIN + SET @sysTarget = ''sys.tables'' + SET @sysType = '''' + END + + IF @typeofobject = ''SP'' + BEGIN + SET @sysTarget = ''sys.procedures'' + SET @sysType = '''' + END + + IF @typeofobject = ''FUNCTIONS'' + BEGIN + SET @sysTarget = ''sys.objects'' + SET @sysType = '' and p.Type IN ( N''''FN'''', N''''IF'''', N''''TF'''', N''''FS'''', N''''FT'''' )'' + END + + IF @typeofobject = ''VIEWS'' + BEGIN + SET @sysTarget = ''sys.views'' + SET @sysType = '''' + END + + SET @Command = @Command + '' +DECLARE SP_cursor CURSOR FOR +SELECT p.name FROM '' + @sysTarget + '' p JOIN sys.schemas s ON s.schema_id = p.schema_id WHERE (p.name like '''''' + @objectname + '''''') and s.name = '''''' + @schemaid + '''' + @sysType + '''''' + +OPEN SP_cursor +FETCH NEXT FROM SP_cursor INTO @SP_Name +WHILE @@FETCH_STATUS = 0 +BEGIN + IF EXISTS(SELECT 1 FROM sys.fn_builtin_permissions(''''OBJECT'''') WHERE permission_name = '''''' + @rightsaction + '''''') + BEGIN + EXEC('''''' + @grantordeny + '' '' + @rightsaction + '' ON ['' + @schemaid + ''].['''' + @SP_Name + ''''] TO ['' + @RoleName + '']'''') + END + FETCH NEXT FROM SP_cursor INTO @SP_Name +END + +CLOSE SP_cursor +DEALLOCATE SP_cursor + +'' + + END + ELSE + BEGIN + + SET @Command = @Command + '' +IF EXISTS(SELECT 1 FROM sys.objects o WITH (NOLOCK) JOIN sys.schemas s ON s.schema_id = o.schema_id WHERE o.name = '''''' + @objectname + '''''' AND o.type IN (N''''U'''',''''P'''',''''V'''',''''FN'''',''''IF'''',''''TF'''') AND s.name = '''''' + @schemaid + '''''') +BEGIN + IF EXISTS(SELECT 1 FROM sys.fn_builtin_permissions(''''OBJECT'''') WHERE permission_name = '''''' + @rightsaction + '''''') + BEGIN + '' + @grantordeny + '' '' + @rightsaction + '' ON ['' + @schemaid + ''].['' + @objectname + ''] TO ['' + @RoleName + ''] + END +END + +'' + END + END + + IF @typeofobject = ''ASSEMBLIES'' + BEGIN + SET @Command = @Command + '' +IF EXISTS(SELECT 1 FROM sys.assemblies WHERE NAME = '''''' + @objectname + '''''') +BEGIN + IF EXISTS(SELECT 1 FROM sys.fn_builtin_permissions(''''ASSEMBLY'''') WHERE permission_name = '''''' + @rightsaction + '''''') + BEGIN + '' + @grantordeny + '' '' + @rightsaction + ''::['' + @objectname + ''] TO ['' + @RoleName + ''] + END +END + +'' + END + + IF @typeofobject = ''ROLE'' + BEGIN + SET @Command = @Command + '' +IF NOT EXISTS (SELECT 1 FROM sys.database_role_members JOIN sys.database_principals roles ON database_role_members.role_principal_id = roles.principal_id JOIN sys.database_principals members ON database_role_members.member_principal_id = members.principal_id WHERE roles.name = '''''' + @rightsaction + '''''' AND members.name = '''''' + @RoleName + '''''') +BEGIN + EXEC sp_addrolemember N'''''' + @rightsaction + '''''', N'''''' + @RoleName + '''''' +END + +'' + END + + FETCH NEXT FROM SecurablesCurs INTO @typeofobject, @grantordeny, @rightsaction, @objectname, @schemaid + END + +CLOSE SecurablesCurs +DEALLOCATE SecurablesCurs + +PRINT ''SET ALL SECURABLES ON ROLE ['' + @RoleName + '']'' +EXEC sp_executesql @Command + +END +ELSE +BEGIN + + DECLARE SecurablesCurs CURSOR FOR + SELECT typeofobject, grantordeny, rightsaction, objectname, schemaid + FROM #Securables + WHERE N2 = 0 + + OPEN SecurablesCurs + FETCH NEXT FROM SecurablesCurs INTO @typeofobject, @grantordeny, @rightsaction, @objectname, @schemaid + WHILE @@FETCH_STATUS = 0 + BEGIN + + IF @typeofobject = ''DB'' + BEGIN + IF EXISTS(SELECT 1 FROM sys.fn_builtin_permissions(''DATABASE'') WHERE permission_name = '''' + @rightsaction + '''') + BEGIN + SET @Command = @Command + @grantordeny + '' '' + @rightsaction + '' TO ['' + @RoleName + ''] +'' + END + END + + IF @typeofobject = ''SCHEMA'' + BEGIN + SET @Command = @Command + '' +IF EXISTS (SELECT 1 FROM sys.schemas WHERE name = '''''' + @schemaid + '''''') +BEGIN + IF EXISTS(SELECT 1 FROM sys.fn_builtin_permissions(''''SCHEMA'''') WHERE permission_name = '''''' + @rightsaction + '''''') + BEGIN + '' + @grantordeny + '' '' + @rightsaction + '' ON SCHEMA::'' + @schemaid + '' TO ['' + @RoleName + ''] + END +END + +'' + END + + IF @typeofobject in(''TABLE'',''SP'',''FUNCTIONS'',''VIEWS'') + BEGIN + + IF @objectname like ''%[%]%'' + BEGIN + + IF @typeofobject = ''TABLE'' + BEGIN + SET @sysTarget = ''sys.tables'' + SET @sysType = '''' + END + + IF @typeofobject = ''SP'' + BEGIN + SET @sysTarget = ''sys.procedures'' + SET @sysType = '''' + END + + IF @typeofobject = ''FUNCTIONS'' + BEGIN + SET @sysTarget = ''sys.objects'' + SET @sysType = '' and p.Type IN ( N''''FN'''', N''''IF'''', N''''TF'''', N''''FS'''', N''''FT'''' )'' + END + + IF @typeofobject = ''VIEWS'' + BEGIN + SET @sysTarget = ''sys.views'' + SET @sysType = '''' + END + + SET @Command = @Command + '' +DECLARE SP_cursor CURSOR FOR +SELECT p.name FROM '' + @sysTarget + '' p JOIN sys.schemas s ON s.schema_id = p.schema_id WHERE (p.name like '''''' + @objectname + '''''') and s.name = '''''' + @schemaid + '''' + @sysType + '''''' + +OPEN SP_cursor +FETCH NEXT FROM SP_cursor INTO @SP_Name +WHILE @@FETCH_STATUS = 0 +BEGIN + IF EXISTS(SELECT 1 FROM sys.fn_builtin_permissions(''''OBJECT'''') WHERE permission_name = '''''' + @rightsaction + '''''') + BEGIN + EXEC('''''' + @grantordeny + '' '' + @rightsaction + '' ON ['' + @schemaid + ''].['''' + @SP_Name + ''''] TO ['' + @RoleName + '']'''') + END + FETCH NEXT FROM SP_cursor INTO @SP_Name +END + +CLOSE SP_cursor +DEALLOCATE SP_cursor + +'' + + END + ELSE + BEGIN + + SET @Command = @Command + '' +IF EXISTS(SELECT 1 FROM sys.objects o WITH (NOLOCK) JOIN sys.schemas s ON s.schema_id = o.schema_id WHERE o.name = '''''' + @objectname + '''''' AND o.type IN (N''''U'''',''''P'''',''''V'''',''''FN'''',''''IF'''',''''TF'''') AND s.name = '''''' + @schemaid + '''''') +BEGIN + IF EXISTS(SELECT 1 FROM sys.fn_builtin_permissions(''''OBJECT'''') WHERE permission_name = '''''' + @rightsaction + '''''') + BEGIN + '' + @grantordeny + '' '' + @rightsaction + '' ON ['' + @schemaid + ''].['' + @objectname + ''] TO ['' + @RoleName + ''] + END +END + +'' + END + END + + IF @typeofobject = ''ASSEMBLIES'' + BEGIN + SET @Command = @Command + '' +IF EXISTS(SELECT 1 FROM sys.assemblies WHERE NAME = '''''' + @objectname + '''''') +BEGIN + IF EXISTS(SELECT 1 FROM sys.fn_builtin_permissions(''''ASSEMBLY'''') WHERE permission_name = '''''' + @rightsaction + '''''') + BEGIN + '' + @grantordeny + '' '' + @rightsaction + ''::['' + @objectname + ''] TO ['' + @RoleName + ''] + END +END + +'' + END + + IF @typeofobject = ''ROLE'' + BEGIN + SET @Command = @Command + '' +IF NOT EXISTS (SELECT 1 FROM sys.database_role_members JOIN sys.database_principals roles ON database_role_members.role_principal_id = roles.principal_id JOIN sys.database_principals members ON database_role_members.member_principal_id = members.principal_id WHERE roles.name = '''''' + @rightsaction + '''''' AND members.name = '''''' + @RoleName + '''''') +BEGIN + EXEC sp_addrolemember N'''''' + @rightsaction + '''''', N'''''' + @RoleName + '''''' +END + +'' + END + + FETCH NEXT FROM SecurablesCurs INTO @typeofobject, @grantordeny, @rightsaction, @objectname, @schemaid + END + +CLOSE SecurablesCurs +DEALLOCATE SecurablesCurs + +PRINT ''SET ALL SECURABLES ON ROLE ['' + @RoleName + '']'' +EXEC sp_executesql @Command + +END + +/* ADD USER */ +DECLARE UsersCurs CURSOR FOR +SELECT username + FROM #UsersOnRole + +OPEN UsersCurs + +FETCH NEXT FROM UsersCurs INTO @Users +WHILE @@FETCH_STATUS = 0 +BEGIN + + SELECT @Command = '' +EXEC sp_addrolemember N'''''' + @RoleName + '''''', N'''''' + @Users + '''''' +PRINT ''''ADD USER ['' + @Users + ''] ON ROLE ['' + @RoleName + '']'''' +'' + +FETCH NEXT FROM UsersCurs INTO @Users +END + +CLOSE UsersCurs +DEALLOCATE UsersCurs + +EXEC sp_executesql @Command + +/*============================================================================= + Drop temp tables +=============================================================================*/ +DROP TABLE #Securables +DROP TABLE #UsersOnRole','msdb','Pharmacies') + +INSERT INTO #AllRoles(STR_Definition,STR_Database,STR_Product)VALUES(' + +/*============================================================================= + + Script to create dbRoleDataMonitoring role. + + Role Name: dbRoleDataMonitoring + TEMPLATE: Default + + EXAMPLE OF SECURABLES TO SET: + + INSERT INTO #Securables + VALUES + (''DB'',''GRANT'',''VIEW DEFINITION'','''',''''), + (''SCHEMA'',''GRANT'',''SELECT,EXECUTE,INSERT,UPDATE,DELETE'','''',''AP''), + (''TABLE'',''GRANT'',''INSERT,UPDATE'',''Address'',''dbo''), + (''SP'',''GRANT'',''EXECUTE'',''sp_bmc_GetNextID'',''dbo''), + (''ROLE'',''GRANT'',''db_datareader'','''','''') + + ----------------------------------------------- + +Generate date : 2023-05-12 / up208700 + +=============================================================================*/ + +DECLARE @Command nvarchar(max), + @RoleName varchar(60), + @Users varchar(255), + @typeofobject varchar(50), + @grantordeny varchar(10), + @rightsaction varchar(255), + @objectname varchar(255), + @schemaid varchar(10), + @sysTarget varchar(255), + @sysType varchar(255) + +SET @RoleName = ''dbRoleDataMonitoring'' +SET @Command = '''' + +/* TEMP TABLES */ +CREATE TABLE #UsersOnRole(username varchar(255)) +CREATE TABLE #Securables(typeofobject varchar(50), grantordeny varchar(10), rightsaction varchar(255), objectname varchar(255), schemaid varchar(10),N2 bit) + +/* !!! LIST OF SECURABLES TO CHANGE !!! */ + +INSERT INTO #Securables +VALUES +(''SP'',''GRANT'',''EXECUTE'',''agent_datetime'',''dbo'',0) +,(''TABLE'',''GRANT'',''SELECT'',''sysjobactivity'',''dbo'',0) +,(''TABLE'',''GRANT'',''SELECT'',''sysjobhistory'',''dbo'',0) +,(''TABLE'',''GRANT'',''SELECT'',''sysjobs'',''dbo'',0) +,(''TABLE'',''GRANT'',''SELECT'',''sysjobschedules'',''dbo'',0) +,(''TABLE'',''GRANT'',''SELECT'',''sysschedules'',''dbo'',0) + + +/* GET ALL USERS ON THIS ROLE */ +INSERT INTO #UsersOnRole +SELECT + members.name +FROM sys.database_role_members + JOIN sys.database_principals roles ON database_role_members.role_principal_id = roles.principal_id + JOIN sys.database_principals members ON database_role_members.member_principal_id = members.principal_id +WHERE roles.name = @RoleName + +/* CREATE ROLE */ +SELECT @Command = '' +IF NOT EXISTS (SELECT 1 FROM sys.database_principals WHERE name = '''''' + @RoleName + '''''' AND type = ''''R'''') +BEGIN + CREATE ROLE ['' + @RoleName + ''] AUTHORIZATION [dbo] + PRINT ''''CREATE ROLE ['' + @RoleName + '']'''' +END +'' +EXEC sp_executesql @Command + +SET @Command = '' +DECLARE @SP_Name varchar(255) + +'' + +/* SET ALL ROLE SECURABLES */ +DECLARE SecurablesCurs CURSOR FOR +SELECT typeofobject, grantordeny, rightsaction, objectname, schemaid +FROM #Securables +WHERE N2 = 0 + +OPEN SecurablesCurs +FETCH NEXT FROM SecurablesCurs INTO @typeofobject, @grantordeny, @rightsaction, @objectname, @schemaid +WHILE @@FETCH_STATUS = 0 +BEGIN + + IF @typeofobject = ''DB'' + BEGIN + IF EXISTS(SELECT 1 FROM sys.fn_builtin_permissions(''DATABASE'') WHERE permission_name = '''' + @rightsaction + '''') + BEGIN + SET @Command = @Command + @grantordeny + '' '' + @rightsaction + '' TO ['' + @RoleName + ''] +'' + END + END + + IF @typeofobject = ''SCHEMA'' + BEGIN + SET @Command = @Command + '' +IF EXISTS (SELECT 1 FROM sys.schemas WHERE name = '''''' + @schemaid + '''''') +BEGIN + IF EXISTS(SELECT 1 FROM sys.fn_builtin_permissions(''''SCHEMA'''') WHERE permission_name = '''''' + @rightsaction + '''''') + BEGIN + '' + @grantordeny + '' '' + @rightsaction + '' ON SCHEMA::'' + @schemaid + '' TO ['' + @RoleName + ''] + END +END + +'' + END + + IF @typeofobject in(''TABLE'',''SP'',''FUNCTIONS'',''VIEWS'') + BEGIN + + IF @objectname like ''%[%]%'' + BEGIN + + IF @typeofobject = ''TABLE'' + BEGIN + SET @sysTarget = ''sys.tables'' + SET @sysType = '''' + END + + IF @typeofobject = ''SP'' + BEGIN + SET @sysTarget = ''sys.procedures'' + SET @sysType = '''' + END + + IF @typeofobject = ''FUNCTIONS'' + BEGIN + SET @sysTarget = ''sys.objects'' + SET @sysType = '' and p.Type IN ( N''''FN'''', N''''IF'''', N''''TF'''', N''''FS'''', N''''FT'''' )'' + END + + IF @typeofobject = ''VIEWS'' + BEGIN + SET @sysTarget = ''sys.views'' + SET @sysType = '''' + END + + SET @Command = @Command + '' +DECLARE SP_cursor CURSOR FOR +SELECT p.name FROM '' + @sysTarget + '' p JOIN sys.schemas s ON s.schema_id = p.schema_id WHERE (p.name like '''''' + @objectname + '''''') and s.name = '''''' + @schemaid + '''' + @sysType + '''''' + +OPEN SP_cursor +FETCH NEXT FROM SP_cursor INTO @SP_Name +WHILE @@FETCH_STATUS = 0 +BEGIN + IF EXISTS(SELECT 1 FROM sys.fn_builtin_permissions(''''OBJECT'''') WHERE permission_name = '''''' + @rightsaction + '''''') + BEGIN + EXEC('''''' + @grantordeny + '' '' + @rightsaction + '' ON ['' + @schemaid + ''].['''' + @SP_Name + ''''] TO ['' + @RoleName + '']'''') + END + FETCH NEXT FROM SP_cursor INTO @SP_Name +END + +CLOSE SP_cursor +DEALLOCATE SP_cursor + +'' + + END + ELSE + BEGIN + + SET @Command = @Command + '' +IF EXISTS(SELECT 1 FROM sys.objects o WITH (NOLOCK) JOIN sys.schemas s ON s.schema_id = o.schema_id WHERE o.name = '''''' + @objectname + '''''' AND o.type IN (N''''U'''',''''P'''',''''V'''',''''FN'''',''''IF'''',''''TF'''') AND s.name = '''''' + @schemaid + '''''') +BEGIN + IF EXISTS(SELECT 1 FROM sys.fn_builtin_permissions(''''OBJECT'''') WHERE permission_name = '''''' + @rightsaction + '''''') + BEGIN + '' + @grantordeny + '' '' + @rightsaction + '' ON ['' + @schemaid + ''].['' + @objectname + ''] TO ['' + @RoleName + ''] + END +END + +'' + END +END + +IF @typeofobject = ''ASSEMBLIES'' +BEGIN + SET @Command = @Command + '' +IF EXISTS(SELECT 1 FROM sys.assemblies WHERE NAME = '''''' + @objectname + '''''') +BEGIN + IF EXISTS(SELECT 1 FROM sys.fn_builtin_permissions(''''ASSEMBLY'''') WHERE permission_name = '''''' + @rightsaction + '''''') + BEGIN + '' + @grantordeny + '' '' + @rightsaction + ''::['' + @objectname + ''] TO ['' + @RoleName + ''] + END +END + +'' +END + +IF @typeofobject = ''ROLE'' +BEGIN + SET @Command = @Command + '' +IF NOT EXISTS (SELECT 1 FROM sys.database_role_members JOIN sys.database_principals roles ON database_role_members.role_principal_id = roles.principal_id JOIN sys.database_principals members ON database_role_members.member_principal_id = members.principal_id WHERE roles.name = '''''' + @rightsaction + '''''' AND members.name = '''''' + @RoleName + '''''') +BEGIN + EXEC sp_addrolemember N'''''' + @rightsaction + '''''', N'''''' + @RoleName + '''''' +END + +'' +END + +FETCH NEXT FROM SecurablesCurs INTO @typeofobject, @grantordeny, @rightsaction, @objectname, @schemaid +END + +CLOSE SecurablesCurs +DEALLOCATE SecurablesCurs + +PRINT ''SET ALL SECURABLES ON ROLE ['' + @RoleName + '']'' +EXEC sp_executesql @Command + +/* ADD USER */ +DECLARE UsersCurs CURSOR FOR +SELECT username + FROM #UsersOnRole + +OPEN UsersCurs + +FETCH NEXT FROM UsersCurs INTO @Users +WHILE @@FETCH_STATUS = 0 +BEGIN + + SELECT @Command = '' +EXEC sp_addrolemember N'''''' + @RoleName + '''''', N'''''' + @Users + '''''' +PRINT ''''ADD USER ['' + @Users + ''] ON ROLE ['' + @RoleName + '']'''' +'' + +FETCH NEXT FROM UsersCurs INTO @Users +END + +CLOSE UsersCurs +DEALLOCATE UsersCurs + +EXEC sp_executesql @Command + + +/*============================================================================= + Drop temp tables +=============================================================================*/ +DROP TABLE #Securables +DROP TABLE #UsersOnRole +','msdb','Pharmacies') + +INSERT INTO #AllRoles(STR_Definition,STR_Database,STR_Product)VALUES(' + +/*============================================================================= + + Script to create dbRoleDevUsr role. + + Role Name: dbRoleDevUsr + TEMPLATE: Default + + EXAMPLE OF SECURABLES TO SET: + + INSERT INTO #Securables + VALUES + (''DB'',''GRANT'',''VIEW DEFINITION'','''',''''), + (''SCHEMA'',''GRANT'',''SELECT,EXECUTE,INSERT,UPDATE,DELETE'','''',''AP''), + (''TABLE'',''GRANT'',''INSERT,UPDATE'',''Address'',''dbo''), + (''SP'',''GRANT'',''EXECUTE'',''sp_bmc_GetNextID'',''dbo''), + (''ROLE'',''GRANT'',''db_datareader'','''','''') + + ----------------------------------------------- + +Generate date : 2023-05-12 / up208700 + +=============================================================================*/ + +DECLARE @Command nvarchar(max), + @RoleName varchar(60), + @Users varchar(255), + @typeofobject varchar(50), + @grantordeny varchar(10), + @rightsaction varchar(255), + @objectname varchar(255), + @schemaid varchar(10), + @sysTarget varchar(255), + @sysType varchar(255) + +SET @RoleName = ''dbRoleDevUsr'' +SET @Command = '''' + +/* TEMP TABLES */ +CREATE TABLE #UsersOnRole(username varchar(255)) +CREATE TABLE #Securables(typeofobject varchar(50), grantordeny varchar(10), rightsaction varchar(255), objectname varchar(255), schemaid varchar(10),N2 bit) + +/* !!! LIST OF SECURABLES TO CHANGE !!! */ + +INSERT INTO #Securables +VALUES +(''ROLE'',''GRANT'',''DATABASEMAILUSERROLE'','''',''dbo'',0) +,(''ROLE'',''GRANT'',''SQLAGENTOPERATORROLE'','''',''dbo'',0) +,(''TABLE'',''GRANT'',''SELECT'',''sysjobs'',''dbo'',0) +,(''TABLE'',''GRANT'',''SELECT'',''sysjobsteps'',''dbo'',0) + + +/* GET ALL USERS ON THIS ROLE */ +INSERT INTO #UsersOnRole +SELECT + members.name +FROM sys.database_role_members + JOIN sys.database_principals roles ON database_role_members.role_principal_id = roles.principal_id + JOIN sys.database_principals members ON database_role_members.member_principal_id = members.principal_id +WHERE roles.name = @RoleName + +/* CREATE ROLE */ +SELECT @Command = '' +IF NOT EXISTS (SELECT 1 FROM sys.database_principals WHERE name = '''''' + @RoleName + '''''' AND type = ''''R'''') +BEGIN + CREATE ROLE ['' + @RoleName + ''] AUTHORIZATION [dbo] + PRINT ''''CREATE ROLE ['' + @RoleName + '']'''' +END +'' +EXEC sp_executesql @Command + +SET @Command = '' +DECLARE @SP_Name varchar(255) + +'' + +/* SET ALL ROLE SECURABLES */ +DECLARE SecurablesCurs CURSOR FOR +SELECT typeofobject, grantordeny, rightsaction, objectname, schemaid +FROM #Securables +WHERE N2 = 0 + +OPEN SecurablesCurs +FETCH NEXT FROM SecurablesCurs INTO @typeofobject, @grantordeny, @rightsaction, @objectname, @schemaid +WHILE @@FETCH_STATUS = 0 +BEGIN + + IF @typeofobject = ''DB'' + BEGIN + IF EXISTS(SELECT 1 FROM sys.fn_builtin_permissions(''DATABASE'') WHERE permission_name = '''' + @rightsaction + '''') + BEGIN + SET @Command = @Command + @grantordeny + '' '' + @rightsaction + '' TO ['' + @RoleName + ''] +'' + END + END + + IF @typeofobject = ''SCHEMA'' + BEGIN + SET @Command = @Command + '' +IF EXISTS (SELECT 1 FROM sys.schemas WHERE name = '''''' + @schemaid + '''''') +BEGIN + IF EXISTS(SELECT 1 FROM sys.fn_builtin_permissions(''''SCHEMA'''') WHERE permission_name = '''''' + @rightsaction + '''''') + BEGIN + '' + @grantordeny + '' '' + @rightsaction + '' ON SCHEMA::'' + @schemaid + '' TO ['' + @RoleName + ''] + END +END + +'' + END + + IF @typeofobject in(''TABLE'',''SP'',''FUNCTIONS'',''VIEWS'') + BEGIN + + IF @objectname like ''%[%]%'' + BEGIN + + IF @typeofobject = ''TABLE'' + BEGIN + SET @sysTarget = ''sys.tables'' + SET @sysType = '''' + END + + IF @typeofobject = ''SP'' + BEGIN + SET @sysTarget = ''sys.procedures'' + SET @sysType = '''' + END + + IF @typeofobject = ''FUNCTIONS'' + BEGIN + SET @sysTarget = ''sys.objects'' + SET @sysType = '' and p.Type IN ( N''''FN'''', N''''IF'''', N''''TF'''', N''''FS'''', N''''FT'''' )'' + END + + IF @typeofobject = ''VIEWS'' + BEGIN + SET @sysTarget = ''sys.views'' + SET @sysType = '''' + END + + SET @Command = @Command + '' +DECLARE SP_cursor CURSOR FOR +SELECT p.name FROM '' + @sysTarget + '' p JOIN sys.schemas s ON s.schema_id = p.schema_id WHERE (p.name like '''''' + @objectname + '''''') and s.name = '''''' + @schemaid + '''' + @sysType + '''''' + +OPEN SP_cursor +FETCH NEXT FROM SP_cursor INTO @SP_Name +WHILE @@FETCH_STATUS = 0 +BEGIN + IF EXISTS(SELECT 1 FROM sys.fn_builtin_permissions(''''OBJECT'''') WHERE permission_name = '''''' + @rightsaction + '''''') + BEGIN + EXEC('''''' + @grantordeny + '' '' + @rightsaction + '' ON ['' + @schemaid + ''].['''' + @SP_Name + ''''] TO ['' + @RoleName + '']'''') + END + FETCH NEXT FROM SP_cursor INTO @SP_Name +END + +CLOSE SP_cursor +DEALLOCATE SP_cursor + +'' + + END + ELSE + BEGIN + + SET @Command = @Command + '' +IF EXISTS(SELECT 1 FROM sys.objects o WITH (NOLOCK) JOIN sys.schemas s ON s.schema_id = o.schema_id WHERE o.name = '''''' + @objectname + '''''' AND o.type IN (N''''U'''',''''P'''',''''V'''',''''FN'''',''''IF'''',''''TF'''') AND s.name = '''''' + @schemaid + '''''') +BEGIN + IF EXISTS(SELECT 1 FROM sys.fn_builtin_permissions(''''OBJECT'''') WHERE permission_name = '''''' + @rightsaction + '''''') + BEGIN + '' + @grantordeny + '' '' + @rightsaction + '' ON ['' + @schemaid + ''].['' + @objectname + ''] TO ['' + @RoleName + ''] + END +END + +'' + END +END + +IF @typeofobject = ''ASSEMBLIES'' +BEGIN + SET @Command = @Command + '' +IF EXISTS(SELECT 1 FROM sys.assemblies WHERE NAME = '''''' + @objectname + '''''') +BEGIN + IF EXISTS(SELECT 1 FROM sys.fn_builtin_permissions(''''ASSEMBLY'''') WHERE permission_name = '''''' + @rightsaction + '''''') + BEGIN + '' + @grantordeny + '' '' + @rightsaction + ''::['' + @objectname + ''] TO ['' + @RoleName + ''] + END +END + +'' +END + +IF @typeofobject = ''ROLE'' +BEGIN + SET @Command = @Command + '' +IF NOT EXISTS (SELECT 1 FROM sys.database_role_members JOIN sys.database_principals roles ON database_role_members.role_principal_id = roles.principal_id JOIN sys.database_principals members ON database_role_members.member_principal_id = members.principal_id WHERE roles.name = '''''' + @rightsaction + '''''' AND members.name = '''''' + @RoleName + '''''') +BEGIN + EXEC sp_addrolemember N'''''' + @rightsaction + '''''', N'''''' + @RoleName + '''''' +END + +'' +END + +FETCH NEXT FROM SecurablesCurs INTO @typeofobject, @grantordeny, @rightsaction, @objectname, @schemaid +END + +CLOSE SecurablesCurs +DEALLOCATE SecurablesCurs + +PRINT ''SET ALL SECURABLES ON ROLE ['' + @RoleName + '']'' +EXEC sp_executesql @Command + +/* ADD USER */ +DECLARE UsersCurs CURSOR FOR +SELECT username + FROM #UsersOnRole + +OPEN UsersCurs + +FETCH NEXT FROM UsersCurs INTO @Users +WHILE @@FETCH_STATUS = 0 +BEGIN + + SELECT @Command = '' +EXEC sp_addrolemember N'''''' + @RoleName + '''''', N'''''' + @Users + '''''' +PRINT ''''ADD USER ['' + @Users + ''] ON ROLE ['' + @RoleName + '']'''' +'' + +FETCH NEXT FROM UsersCurs INTO @Users +END + +CLOSE UsersCurs +DEALLOCATE UsersCurs + +EXEC sp_executesql @Command + + +/*============================================================================= + Drop temp tables +=============================================================================*/ +DROP TABLE #Securables +DROP TABLE #UsersOnRole +','msdb','Pharmacies') + +INSERT INTO #AllRoles(STR_Definition,STR_Database,STR_Product)VALUES(' + +/*============================================================================= + + Script to create dbRoleIttechUsr role. + + Role Name: dbRoleIttechUsr + TEMPLATE: N2 and PROD + + EXAMPLE OF SECURABLES TO SET: + + INSERT INTO #Securables + VALUES + (''DB'',''GRANT'',''VIEW DEFINITION'','''',''''), + (''SCHEMA'',''GRANT'',''SELECT,EXECUTE,INSERT,UPDATE,DELETE'','''',''AP''), + (''TABLE'',''GRANT'',''INSERT,UPDATE'',''Address'',''dbo''), + (''SP'',''GRANT'',''EXECUTE'',''sp_bmc_GetNextID'',''dbo''), + (''ROLE'',''GRANT'',''db_datareader'','''','''') + + ----------------------------------------------- + +Generate date : 2023-05-12 / up208700 + +=============================================================================*/ + +DECLARE @Type varchar(6), + @Command nvarchar(max), + @RoleName varchar(60), + @Users varchar(255), + @typeofobject varchar(50), + @grantordeny varchar(10), + @rightsaction varchar(255), + @objectname varchar(255), + @schemaid varchar(10), + @sysTarget varchar(255), + @sysType varchar(255) + +SET @RoleName = ''dbRoleIttechUsr'' +SET @Command = '''' + +SELECT @Type = [Type] FROM [master].[cfg].[InstanceContext] + +/* TEMP TABLES */ +CREATE TABLE #UsersOnRole(username varchar(255)) +CREATE TABLE #Securables(typeofobject varchar(50), grantordeny varchar(10), rightsaction varchar(255), objectname varchar(255), schemaid varchar(10),N2 bit) + +/* !!! LIST OF SECURABLES TO CHANGE !!! */ + +INSERT INTO #Securables +VALUES +(''ROLE'',''GRANT'',''DATABASEMAILUSERROLE'','''',''dbo'',0) +,(''ROLE'',''GRANT'',''DB_DATAREADER'','''',''dbo'',1) +,(''ROLE'',''GRANT'',''DB_DATAWRITER'','''',''dbo'',1) +,(''ROLE'',''GRANT'',''DB_OWNER'','''',''dbo'',1) +,(''ROLE'',''GRANT'',''SQLAGENTOPERATORROLE'','''',''dbo'',0) + + +/* GET ALL USERS ON THIS ROLE */ +INSERT INTO #UsersOnRole +SELECT + members.name +FROM sys.database_role_members + JOIN sys.database_principals roles ON database_role_members.role_principal_id = roles.principal_id + JOIN sys.database_principals members ON database_role_members.member_principal_id = members.principal_id +WHERE roles.name = @RoleName + +/* CREATE ROLE */ +SELECT @Command = '' +IF NOT EXISTS (SELECT 1 FROM sys.database_principals WHERE name = '''''' + @RoleName + '''''' AND type = ''''R'''') +BEGIN + CREATE ROLE ['' + @RoleName + ''] AUTHORIZATION [dbo] + PRINT ''''CREATE ROLE ['' + @RoleName + '']'''' +END +'' +EXEC sp_executesql @Command + +SET @Command = '' +DECLARE @SP_Name varchar(255) + +'' + +/* SET ALL ROLE SECURABLES */ +IF @Type = ''DEVE'' +BEGIN + + DECLARE SecurablesCurs CURSOR FOR + SELECT typeofobject, grantordeny, rightsaction, objectname, schemaid + FROM #Securables + WHERE N2 = 1 + + OPEN SecurablesCurs + FETCH NEXT FROM SecurablesCurs INTO @typeofobject, @grantordeny, @rightsaction, @objectname, @schemaid + WHILE @@FETCH_STATUS = 0 + BEGIN + + IF @typeofobject = ''DB'' + BEGIN + IF EXISTS(SELECT 1 FROM sys.fn_builtin_permissions(''DATABASE'') WHERE permission_name = '''' + @rightsaction + '''') + BEGIN + SET @Command = @Command + @grantordeny + '' '' + @rightsaction + '' TO ['' + @RoleName + ''] +'' + END + END + + IF @typeofobject = ''SCHEMA'' + BEGIN + SET @Command = @Command + '' +IF EXISTS (SELECT 1 FROM sys.schemas WHERE name = '''''' + @schemaid + '''''') +BEGIN + IF EXISTS(SELECT 1 FROM sys.fn_builtin_permissions(''''SCHEMA'''') WHERE permission_name = '''''' + @rightsaction + '''''') + BEGIN + '' + @grantordeny + '' '' + @rightsaction + '' ON SCHEMA::'' + @schemaid + '' TO ['' + @RoleName + ''] + END +END + +'' + END + + IF @typeofobject in(''TABLE'',''SP'',''FUNCTIONS'',''VIEWS'') + BEGIN + + IF @objectname like ''%[%]%'' + BEGIN + IF @typeofobject = ''TABLE'' + BEGIN + SET @sysTarget = ''sys.tables'' + SET @sysType = '''' + END + + IF @typeofobject = ''SP'' + BEGIN + SET @sysTarget = ''sys.procedures'' + SET @sysType = '''' + END + + IF @typeofobject = ''FUNCTIONS'' + BEGIN + SET @sysTarget = ''sys.objects'' + SET @sysType = '' and p.Type IN ( N''''FN'''', N''''IF'''', N''''TF'''', N''''FS'''', N''''FT'''' )'' + END + + IF @typeofobject = ''VIEWS'' + BEGIN + SET @sysTarget = ''sys.views'' + SET @sysType = '''' + END + + SET @Command = @Command + '' +DECLARE SP_cursor CURSOR FOR +SELECT p.name FROM '' + @sysTarget + '' p JOIN sys.schemas s ON s.schema_id = p.schema_id WHERE (p.name like '''''' + @objectname + '''''') and s.name = '''''' + @schemaid + '''' + @sysType + '''''' + +OPEN SP_cursor +FETCH NEXT FROM SP_cursor INTO @SP_Name +WHILE @@FETCH_STATUS = 0 +BEGIN + IF EXISTS(SELECT 1 FROM sys.fn_builtin_permissions(''''OBJECT'''') WHERE permission_name = '''''' + @rightsaction + '''''') + BEGIN + EXEC('''''' + @grantordeny + '' '' + @rightsaction + '' ON ['' + @schemaid + ''].['''' + @SP_Name + ''''] TO ['' + @RoleName + '']'''') + END + FETCH NEXT FROM SP_cursor INTO @SP_Name +END + +CLOSE SP_cursor +DEALLOCATE SP_cursor + +'' + + END + ELSE + BEGIN + + SET @Command = @Command + '' +IF EXISTS(SELECT 1 FROM sys.objects o WITH (NOLOCK) JOIN sys.schemas s ON s.schema_id = o.schema_id WHERE o.name = '''''' + @objectname + '''''' AND o.type IN (N''''U'''',''''P'''',''''V'''',''''FN'''',''''IF'''',''''TF'''') AND s.name = '''''' + @schemaid + '''''') +BEGIN + IF EXISTS(SELECT 1 FROM sys.fn_builtin_permissions(''''OBJECT'''') WHERE permission_name = '''''' + @rightsaction + '''''') + BEGIN + '' + @grantordeny + '' '' + @rightsaction + '' ON ['' + @schemaid + ''].['' + @objectname + ''] TO ['' + @RoleName + ''] + END +END + +'' + END + END + + IF @typeofobject = ''ASSEMBLIES'' + BEGIN + SET @Command = @Command + '' +IF EXISTS(SELECT 1 FROM sys.assemblies WHERE NAME = '''''' + @objectname + '''''') +BEGIN + IF EXISTS(SELECT 1 FROM sys.fn_builtin_permissions(''''ASSEMBLY'''') WHERE permission_name = '''''' + @rightsaction + '''''') + BEGIN + '' + @grantordeny + '' '' + @rightsaction + ''::['' + @objectname + ''] TO ['' + @RoleName + ''] + END +END + +'' + END + + IF @typeofobject = ''ROLE'' + BEGIN + SET @Command = @Command + '' +IF NOT EXISTS (SELECT 1 FROM sys.database_role_members JOIN sys.database_principals roles ON database_role_members.role_principal_id = roles.principal_id JOIN sys.database_principals members ON database_role_members.member_principal_id = members.principal_id WHERE roles.name = '''''' + @rightsaction + '''''' AND members.name = '''''' + @RoleName + '''''') +BEGIN + EXEC sp_addrolemember N'''''' + @rightsaction + '''''', N'''''' + @RoleName + '''''' +END + +'' + END + + FETCH NEXT FROM SecurablesCurs INTO @typeofobject, @grantordeny, @rightsaction, @objectname, @schemaid + END + +CLOSE SecurablesCurs +DEALLOCATE SecurablesCurs + +PRINT ''SET ALL SECURABLES ON ROLE ['' + @RoleName + '']'' +EXEC sp_executesql @Command + +END +ELSE +BEGIN + + DECLARE SecurablesCurs CURSOR FOR + SELECT typeofobject, grantordeny, rightsaction, objectname, schemaid + FROM #Securables + WHERE N2 = 0 + + OPEN SecurablesCurs + FETCH NEXT FROM SecurablesCurs INTO @typeofobject, @grantordeny, @rightsaction, @objectname, @schemaid + WHILE @@FETCH_STATUS = 0 + BEGIN + + IF @typeofobject = ''DB'' + BEGIN + IF EXISTS(SELECT 1 FROM sys.fn_builtin_permissions(''DATABASE'') WHERE permission_name = '''' + @rightsaction + '''') + BEGIN + SET @Command = @Command + @grantordeny + '' '' + @rightsaction + '' TO ['' + @RoleName + ''] +'' + END + END + + IF @typeofobject = ''SCHEMA'' + BEGIN + SET @Command = @Command + '' +IF EXISTS (SELECT 1 FROM sys.schemas WHERE name = '''''' + @schemaid + '''''') +BEGIN + IF EXISTS(SELECT 1 FROM sys.fn_builtin_permissions(''''SCHEMA'''') WHERE permission_name = '''''' + @rightsaction + '''''') + BEGIN + '' + @grantordeny + '' '' + @rightsaction + '' ON SCHEMA::'' + @schemaid + '' TO ['' + @RoleName + ''] + END +END + +'' + END + + IF @typeofobject in(''TABLE'',''SP'',''FUNCTIONS'',''VIEWS'') + BEGIN + + IF @objectname like ''%[%]%'' + BEGIN + + IF @typeofobject = ''TABLE'' + BEGIN + SET @sysTarget = ''sys.tables'' + SET @sysType = '''' + END + + IF @typeofobject = ''SP'' + BEGIN + SET @sysTarget = ''sys.procedures'' + SET @sysType = '''' + END + + IF @typeofobject = ''FUNCTIONS'' + BEGIN + SET @sysTarget = ''sys.objects'' + SET @sysType = '' and p.Type IN ( N''''FN'''', N''''IF'''', N''''TF'''', N''''FS'''', N''''FT'''' )'' + END + + IF @typeofobject = ''VIEWS'' + BEGIN + SET @sysTarget = ''sys.views'' + SET @sysType = '''' + END + + SET @Command = @Command + '' +DECLARE SP_cursor CURSOR FOR +SELECT p.name FROM '' + @sysTarget + '' p JOIN sys.schemas s ON s.schema_id = p.schema_id WHERE (p.name like '''''' + @objectname + '''''') and s.name = '''''' + @schemaid + '''' + @sysType + '''''' + +OPEN SP_cursor +FETCH NEXT FROM SP_cursor INTO @SP_Name +WHILE @@FETCH_STATUS = 0 +BEGIN + IF EXISTS(SELECT 1 FROM sys.fn_builtin_permissions(''''OBJECT'''') WHERE permission_name = '''''' + @rightsaction + '''''') + BEGIN + EXEC('''''' + @grantordeny + '' '' + @rightsaction + '' ON ['' + @schemaid + ''].['''' + @SP_Name + ''''] TO ['' + @RoleName + '']'''') + END + FETCH NEXT FROM SP_cursor INTO @SP_Name +END + +CLOSE SP_cursor +DEALLOCATE SP_cursor + +'' + + END + ELSE + BEGIN + + SET @Command = @Command + '' +IF EXISTS(SELECT 1 FROM sys.objects o WITH (NOLOCK) JOIN sys.schemas s ON s.schema_id = o.schema_id WHERE o.name = '''''' + @objectname + '''''' AND o.type IN (N''''U'''',''''P'''',''''V'''',''''FN'''',''''IF'''',''''TF'''') AND s.name = '''''' + @schemaid + '''''') +BEGIN + IF EXISTS(SELECT 1 FROM sys.fn_builtin_permissions(''''OBJECT'''') WHERE permission_name = '''''' + @rightsaction + '''''') + BEGIN + '' + @grantordeny + '' '' + @rightsaction + '' ON ['' + @schemaid + ''].['' + @objectname + ''] TO ['' + @RoleName + ''] + END +END + +'' + END + END + + IF @typeofobject = ''ASSEMBLIES'' + BEGIN + SET @Command = @Command + '' +IF EXISTS(SELECT 1 FROM sys.assemblies WHERE NAME = '''''' + @objectname + '''''') +BEGIN + IF EXISTS(SELECT 1 FROM sys.fn_builtin_permissions(''''ASSEMBLY'''') WHERE permission_name = '''''' + @rightsaction + '''''') + BEGIN + '' + @grantordeny + '' '' + @rightsaction + ''::['' + @objectname + ''] TO ['' + @RoleName + ''] + END +END + +'' + END + + IF @typeofobject = ''ROLE'' + BEGIN + SET @Command = @Command + '' +IF NOT EXISTS (SELECT 1 FROM sys.database_role_members JOIN sys.database_principals roles ON database_role_members.role_principal_id = roles.principal_id JOIN sys.database_principals members ON database_role_members.member_principal_id = members.principal_id WHERE roles.name = '''''' + @rightsaction + '''''' AND members.name = '''''' + @RoleName + '''''') +BEGIN + EXEC sp_addrolemember N'''''' + @rightsaction + '''''', N'''''' + @RoleName + '''''' +END + +'' + END + + FETCH NEXT FROM SecurablesCurs INTO @typeofobject, @grantordeny, @rightsaction, @objectname, @schemaid + END + +CLOSE SecurablesCurs +DEALLOCATE SecurablesCurs + +PRINT ''SET ALL SECURABLES ON ROLE ['' + @RoleName + '']'' +EXEC sp_executesql @Command + +END + +/* ADD USER */ +DECLARE UsersCurs CURSOR FOR +SELECT username + FROM #UsersOnRole + +OPEN UsersCurs + +FETCH NEXT FROM UsersCurs INTO @Users +WHILE @@FETCH_STATUS = 0 +BEGIN + + SELECT @Command = '' +EXEC sp_addrolemember N'''''' + @RoleName + '''''', N'''''' + @Users + '''''' +PRINT ''''ADD USER ['' + @Users + ''] ON ROLE ['' + @RoleName + '']'''' +'' + +FETCH NEXT FROM UsersCurs INTO @Users +END + +CLOSE UsersCurs +DEALLOCATE UsersCurs + +EXEC sp_executesql @Command + +/*============================================================================= + Drop temp tables +=============================================================================*/ +DROP TABLE #Securables +DROP TABLE #UsersOnRole','msdb','Pharmacies') + +INSERT INTO #AllRoles(STR_Definition,STR_Database,STR_Product)VALUES(' + +/*============================================================================= + + Script to create dbRoleSupUsr role. + + Role Name: dbRoleSupUsr + TEMPLATE: N2 and PROD + + EXAMPLE OF SECURABLES TO SET: + + INSERT INTO #Securables + VALUES + (''DB'',''GRANT'',''VIEW DEFINITION'','''',''''), + (''SCHEMA'',''GRANT'',''SELECT,EXECUTE,INSERT,UPDATE,DELETE'','''',''AP''), + (''TABLE'',''GRANT'',''INSERT,UPDATE'',''Address'',''dbo''), + (''SP'',''GRANT'',''EXECUTE'',''sp_bmc_GetNextID'',''dbo''), + (''ROLE'',''GRANT'',''db_datareader'','''','''') + + ----------------------------------------------- + +Generate date : 2023-05-12 / up208700 + +=============================================================================*/ + +DECLARE @Type varchar(6), + @Command nvarchar(max), + @RoleName varchar(60), + @Users varchar(255), + @typeofobject varchar(50), + @grantordeny varchar(10), + @rightsaction varchar(255), + @objectname varchar(255), + @schemaid varchar(10), + @sysTarget varchar(255), + @sysType varchar(255) + +SET @RoleName = ''dbRoleSupUsr'' +SET @Command = '''' + +SELECT @Type = [Type] FROM [master].[cfg].[InstanceContext] + +/* TEMP TABLES */ +CREATE TABLE #UsersOnRole(username varchar(255)) +CREATE TABLE #Securables(typeofobject varchar(50), grantordeny varchar(10), rightsaction varchar(255), objectname varchar(255), schemaid varchar(10),N2 bit) + +/* !!! LIST OF SECURABLES TO CHANGE !!! */ + +INSERT INTO #Securables +VALUES +(''ROLE'',''GRANT'',''DATABASEMAILUSERROLE'','''',''dbo'',0) +,(''ROLE'',''GRANT'',''DATABASEMAILUSERROLE'','''',''dbo'',1) +,(''ROLE'',''GRANT'',''DB_OWNER'','''',''dbo'',1) +,(''ROLE'',''GRANT'',''SQLAGENTOPERATORROLE'','''',''dbo'',0) +,(''ROLE'',''GRANT'',''SQLAGENTOPERATORROLE'','''',''dbo'',1) + + +/* GET ALL USERS ON THIS ROLE */ +INSERT INTO #UsersOnRole +SELECT + members.name +FROM sys.database_role_members + JOIN sys.database_principals roles ON database_role_members.role_principal_id = roles.principal_id + JOIN sys.database_principals members ON database_role_members.member_principal_id = members.principal_id +WHERE roles.name = @RoleName + +/* CREATE ROLE */ +SELECT @Command = '' +IF NOT EXISTS (SELECT 1 FROM sys.database_principals WHERE name = '''''' + @RoleName + '''''' AND type = ''''R'''') +BEGIN + CREATE ROLE ['' + @RoleName + ''] AUTHORIZATION [dbo] + PRINT ''''CREATE ROLE ['' + @RoleName + '']'''' +END +'' +EXEC sp_executesql @Command + +SET @Command = '' +DECLARE @SP_Name varchar(255) + +'' + +/* SET ALL ROLE SECURABLES */ +IF @Type = ''DEVE'' +BEGIN + + DECLARE SecurablesCurs CURSOR FOR + SELECT typeofobject, grantordeny, rightsaction, objectname, schemaid + FROM #Securables + WHERE N2 = 1 + + OPEN SecurablesCurs + FETCH NEXT FROM SecurablesCurs INTO @typeofobject, @grantordeny, @rightsaction, @objectname, @schemaid + WHILE @@FETCH_STATUS = 0 + BEGIN + + IF @typeofobject = ''DB'' + BEGIN + IF EXISTS(SELECT 1 FROM sys.fn_builtin_permissions(''DATABASE'') WHERE permission_name = '''' + @rightsaction + '''') + BEGIN + SET @Command = @Command + @grantordeny + '' '' + @rightsaction + '' TO ['' + @RoleName + ''] +'' + END + END + + IF @typeofobject = ''SCHEMA'' + BEGIN + SET @Command = @Command + '' +IF EXISTS (SELECT 1 FROM sys.schemas WHERE name = '''''' + @schemaid + '''''') +BEGIN + IF EXISTS(SELECT 1 FROM sys.fn_builtin_permissions(''''SCHEMA'''') WHERE permission_name = '''''' + @rightsaction + '''''') + BEGIN + '' + @grantordeny + '' '' + @rightsaction + '' ON SCHEMA::'' + @schemaid + '' TO ['' + @RoleName + ''] + END +END + +'' + END + + IF @typeofobject in(''TABLE'',''SP'',''FUNCTIONS'',''VIEWS'') + BEGIN + + IF @objectname like ''%[%]%'' + BEGIN + IF @typeofobject = ''TABLE'' + BEGIN + SET @sysTarget = ''sys.tables'' + SET @sysType = '''' + END + + IF @typeofobject = ''SP'' + BEGIN + SET @sysTarget = ''sys.procedures'' + SET @sysType = '''' + END + + IF @typeofobject = ''FUNCTIONS'' + BEGIN + SET @sysTarget = ''sys.objects'' + SET @sysType = '' and p.Type IN ( N''''FN'''', N''''IF'''', N''''TF'''', N''''FS'''', N''''FT'''' )'' + END + + IF @typeofobject = ''VIEWS'' + BEGIN + SET @sysTarget = ''sys.views'' + SET @sysType = '''' + END + + SET @Command = @Command + '' +DECLARE SP_cursor CURSOR FOR +SELECT p.name FROM '' + @sysTarget + '' p JOIN sys.schemas s ON s.schema_id = p.schema_id WHERE (p.name like '''''' + @objectname + '''''') and s.name = '''''' + @schemaid + '''' + @sysType + '''''' + +OPEN SP_cursor +FETCH NEXT FROM SP_cursor INTO @SP_Name +WHILE @@FETCH_STATUS = 0 +BEGIN + IF EXISTS(SELECT 1 FROM sys.fn_builtin_permissions(''''OBJECT'''') WHERE permission_name = '''''' + @rightsaction + '''''') + BEGIN + EXEC('''''' + @grantordeny + '' '' + @rightsaction + '' ON ['' + @schemaid + ''].['''' + @SP_Name + ''''] TO ['' + @RoleName + '']'''') + END + FETCH NEXT FROM SP_cursor INTO @SP_Name +END + +CLOSE SP_cursor +DEALLOCATE SP_cursor + +'' + + END + ELSE + BEGIN + + SET @Command = @Command + '' +IF EXISTS(SELECT 1 FROM sys.objects o WITH (NOLOCK) JOIN sys.schemas s ON s.schema_id = o.schema_id WHERE o.name = '''''' + @objectname + '''''' AND o.type IN (N''''U'''',''''P'''',''''V'''',''''FN'''',''''IF'''',''''TF'''') AND s.name = '''''' + @schemaid + '''''') +BEGIN + IF EXISTS(SELECT 1 FROM sys.fn_builtin_permissions(''''OBJECT'''') WHERE permission_name = '''''' + @rightsaction + '''''') + BEGIN + '' + @grantordeny + '' '' + @rightsaction + '' ON ['' + @schemaid + ''].['' + @objectname + ''] TO ['' + @RoleName + ''] + END +END + +'' + END + END + + IF @typeofobject = ''ASSEMBLIES'' + BEGIN + SET @Command = @Command + '' +IF EXISTS(SELECT 1 FROM sys.assemblies WHERE NAME = '''''' + @objectname + '''''') +BEGIN + IF EXISTS(SELECT 1 FROM sys.fn_builtin_permissions(''''ASSEMBLY'''') WHERE permission_name = '''''' + @rightsaction + '''''') + BEGIN + '' + @grantordeny + '' '' + @rightsaction + ''::['' + @objectname + ''] TO ['' + @RoleName + ''] + END +END + +'' + END + + IF @typeofobject = ''ROLE'' + BEGIN + SET @Command = @Command + '' +IF NOT EXISTS (SELECT 1 FROM sys.database_role_members JOIN sys.database_principals roles ON database_role_members.role_principal_id = roles.principal_id JOIN sys.database_principals members ON database_role_members.member_principal_id = members.principal_id WHERE roles.name = '''''' + @rightsaction + '''''' AND members.name = '''''' + @RoleName + '''''') +BEGIN + EXEC sp_addrolemember N'''''' + @rightsaction + '''''', N'''''' + @RoleName + '''''' +END + +'' + END + + FETCH NEXT FROM SecurablesCurs INTO @typeofobject, @grantordeny, @rightsaction, @objectname, @schemaid + END + +CLOSE SecurablesCurs +DEALLOCATE SecurablesCurs + +PRINT ''SET ALL SECURABLES ON ROLE ['' + @RoleName + '']'' +EXEC sp_executesql @Command + +END +ELSE +BEGIN + + DECLARE SecurablesCurs CURSOR FOR + SELECT typeofobject, grantordeny, rightsaction, objectname, schemaid + FROM #Securables + WHERE N2 = 0 + + OPEN SecurablesCurs + FETCH NEXT FROM SecurablesCurs INTO @typeofobject, @grantordeny, @rightsaction, @objectname, @schemaid + WHILE @@FETCH_STATUS = 0 + BEGIN + + IF @typeofobject = ''DB'' + BEGIN + IF EXISTS(SELECT 1 FROM sys.fn_builtin_permissions(''DATABASE'') WHERE permission_name = '''' + @rightsaction + '''') + BEGIN + SET @Command = @Command + @grantordeny + '' '' + @rightsaction + '' TO ['' + @RoleName + ''] +'' + END + END + + IF @typeofobject = ''SCHEMA'' + BEGIN + SET @Command = @Command + '' +IF EXISTS (SELECT 1 FROM sys.schemas WHERE name = '''''' + @schemaid + '''''') +BEGIN + IF EXISTS(SELECT 1 FROM sys.fn_builtin_permissions(''''SCHEMA'''') WHERE permission_name = '''''' + @rightsaction + '''''') + BEGIN + '' + @grantordeny + '' '' + @rightsaction + '' ON SCHEMA::'' + @schemaid + '' TO ['' + @RoleName + ''] + END +END + +'' + END + + IF @typeofobject in(''TABLE'',''SP'',''FUNCTIONS'',''VIEWS'') + BEGIN + + IF @objectname like ''%[%]%'' + BEGIN + + IF @typeofobject = ''TABLE'' + BEGIN + SET @sysTarget = ''sys.tables'' + SET @sysType = '''' + END + + IF @typeofobject = ''SP'' + BEGIN + SET @sysTarget = ''sys.procedures'' + SET @sysType = '''' + END + + IF @typeofobject = ''FUNCTIONS'' + BEGIN + SET @sysTarget = ''sys.objects'' + SET @sysType = '' and p.Type IN ( N''''FN'''', N''''IF'''', N''''TF'''', N''''FS'''', N''''FT'''' )'' + END + + IF @typeofobject = ''VIEWS'' + BEGIN + SET @sysTarget = ''sys.views'' + SET @sysType = '''' + END + + SET @Command = @Command + '' +DECLARE SP_cursor CURSOR FOR +SELECT p.name FROM '' + @sysTarget + '' p JOIN sys.schemas s ON s.schema_id = p.schema_id WHERE (p.name like '''''' + @objectname + '''''') and s.name = '''''' + @schemaid + '''' + @sysType + '''''' + +OPEN SP_cursor +FETCH NEXT FROM SP_cursor INTO @SP_Name +WHILE @@FETCH_STATUS = 0 +BEGIN + IF EXISTS(SELECT 1 FROM sys.fn_builtin_permissions(''''OBJECT'''') WHERE permission_name = '''''' + @rightsaction + '''''') + BEGIN + EXEC('''''' + @grantordeny + '' '' + @rightsaction + '' ON ['' + @schemaid + ''].['''' + @SP_Name + ''''] TO ['' + @RoleName + '']'''') + END + FETCH NEXT FROM SP_cursor INTO @SP_Name +END + +CLOSE SP_cursor +DEALLOCATE SP_cursor + +'' + + END + ELSE + BEGIN + + SET @Command = @Command + '' +IF EXISTS(SELECT 1 FROM sys.objects o WITH (NOLOCK) JOIN sys.schemas s ON s.schema_id = o.schema_id WHERE o.name = '''''' + @objectname + '''''' AND o.type IN (N''''U'''',''''P'''',''''V'''',''''FN'''',''''IF'''',''''TF'''') AND s.name = '''''' + @schemaid + '''''') +BEGIN + IF EXISTS(SELECT 1 FROM sys.fn_builtin_permissions(''''OBJECT'''') WHERE permission_name = '''''' + @rightsaction + '''''') + BEGIN + '' + @grantordeny + '' '' + @rightsaction + '' ON ['' + @schemaid + ''].['' + @objectname + ''] TO ['' + @RoleName + ''] + END +END + +'' + END + END + + IF @typeofobject = ''ASSEMBLIES'' + BEGIN + SET @Command = @Command + '' +IF EXISTS(SELECT 1 FROM sys.assemblies WHERE NAME = '''''' + @objectname + '''''') +BEGIN + IF EXISTS(SELECT 1 FROM sys.fn_builtin_permissions(''''ASSEMBLY'''') WHERE permission_name = '''''' + @rightsaction + '''''') + BEGIN + '' + @grantordeny + '' '' + @rightsaction + ''::['' + @objectname + ''] TO ['' + @RoleName + ''] + END +END + +'' + END + + IF @typeofobject = ''ROLE'' + BEGIN + SET @Command = @Command + '' +IF NOT EXISTS (SELECT 1 FROM sys.database_role_members JOIN sys.database_principals roles ON database_role_members.role_principal_id = roles.principal_id JOIN sys.database_principals members ON database_role_members.member_principal_id = members.principal_id WHERE roles.name = '''''' + @rightsaction + '''''' AND members.name = '''''' + @RoleName + '''''') +BEGIN + EXEC sp_addrolemember N'''''' + @rightsaction + '''''', N'''''' + @RoleName + '''''' +END + +'' + END + + FETCH NEXT FROM SecurablesCurs INTO @typeofobject, @grantordeny, @rightsaction, @objectname, @schemaid + END + +CLOSE SecurablesCurs +DEALLOCATE SecurablesCurs + +PRINT ''SET ALL SECURABLES ON ROLE ['' + @RoleName + '']'' +EXEC sp_executesql @Command + +END + +/* ADD USER */ +DECLARE UsersCurs CURSOR FOR +SELECT username + FROM #UsersOnRole + +OPEN UsersCurs + +FETCH NEXT FROM UsersCurs INTO @Users +WHILE @@FETCH_STATUS = 0 +BEGIN + + SELECT @Command = '' +EXEC sp_addrolemember N'''''' + @RoleName + '''''', N'''''' + @Users + '''''' +PRINT ''''ADD USER ['' + @Users + ''] ON ROLE ['' + @RoleName + '']'''' +'' + +FETCH NEXT FROM UsersCurs INTO @Users +END + +CLOSE UsersCurs +DEALLOCATE UsersCurs + +EXEC sp_executesql @Command + +/*============================================================================= + Drop temp tables +=============================================================================*/ +DROP TABLE #Securables +DROP TABLE #UsersOnRole','msdb','Pharmacies') + +INSERT INTO #AllRoles(STR_Definition,STR_Database,STR_Product)VALUES(' + +/*============================================================================= + + Script to create dbRoleTPPos role. + + Role Name: dbRoleTPPos + TEMPLATE: Default + + EXAMPLE OF SECURABLES TO SET: + + INSERT INTO #Securables + VALUES + (''DB'',''GRANT'',''VIEW DEFINITION'','''',''''), + (''SCHEMA'',''GRANT'',''SELECT,EXECUTE,INSERT,UPDATE,DELETE'','''',''AP''), + (''TABLE'',''GRANT'',''INSERT,UPDATE'',''Address'',''dbo''), + (''SP'',''GRANT'',''EXECUTE'',''sp_bmc_GetNextID'',''dbo''), + (''ROLE'',''GRANT'',''db_datareader'','''','''') + + ----------------------------------------------- + +Generate date : 2023-05-12 / up208700 + +=============================================================================*/ + +DECLARE @Command nvarchar(max), + @RoleName varchar(60), + @Users varchar(255), + @typeofobject varchar(50), + @grantordeny varchar(10), + @rightsaction varchar(255), + @objectname varchar(255), + @schemaid varchar(10), + @sysTarget varchar(255), + @sysType varchar(255) + +SET @RoleName = ''dbRoleTPPos'' +SET @Command = '''' + +/* TEMP TABLES */ +CREATE TABLE #UsersOnRole(username varchar(255)) +CREATE TABLE #Securables(typeofobject varchar(50), grantordeny varchar(10), rightsaction varchar(255), objectname varchar(255), schemaid varchar(10),N2 bit) + +/* !!! LIST OF SECURABLES TO CHANGE !!! */ + +INSERT INTO #Securables +VALUES +(''ROLE'',''GRANT'',''DB_DDLADMIN'','''',''dbo'',0) +,(''TABLE'',''GRANT'',''SELECT'',''sysjobactivity'',''dbo'',0) +,(''TABLE'',''GRANT'',''SELECT'',''sysjobs'',''dbo'',0) +,(''TABLE'',''GRANT'',''SELECT'',''sysjobs_view'',''dbo'',0) + + +/* GET ALL USERS ON THIS ROLE */ +INSERT INTO #UsersOnRole +SELECT + members.name +FROM sys.database_role_members + JOIN sys.database_principals roles ON database_role_members.role_principal_id = roles.principal_id + JOIN sys.database_principals members ON database_role_members.member_principal_id = members.principal_id +WHERE roles.name = @RoleName + +/* CREATE ROLE */ +SELECT @Command = '' +IF NOT EXISTS (SELECT 1 FROM sys.database_principals WHERE name = '''''' + @RoleName + '''''' AND type = ''''R'''') +BEGIN + CREATE ROLE ['' + @RoleName + ''] AUTHORIZATION [dbo] + PRINT ''''CREATE ROLE ['' + @RoleName + '']'''' +END +'' +EXEC sp_executesql @Command + +SET @Command = '' +DECLARE @SP_Name varchar(255) + +'' + +/* SET ALL ROLE SECURABLES */ +DECLARE SecurablesCurs CURSOR FOR +SELECT typeofobject, grantordeny, rightsaction, objectname, schemaid +FROM #Securables +WHERE N2 = 0 + +OPEN SecurablesCurs +FETCH NEXT FROM SecurablesCurs INTO @typeofobject, @grantordeny, @rightsaction, @objectname, @schemaid +WHILE @@FETCH_STATUS = 0 +BEGIN + + IF @typeofobject = ''DB'' + BEGIN + IF EXISTS(SELECT 1 FROM sys.fn_builtin_permissions(''DATABASE'') WHERE permission_name = '''' + @rightsaction + '''') + BEGIN + SET @Command = @Command + @grantordeny + '' '' + @rightsaction + '' TO ['' + @RoleName + ''] +'' + END + END + + IF @typeofobject = ''SCHEMA'' + BEGIN + SET @Command = @Command + '' +IF EXISTS (SELECT 1 FROM sys.schemas WHERE name = '''''' + @schemaid + '''''') +BEGIN + IF EXISTS(SELECT 1 FROM sys.fn_builtin_permissions(''''SCHEMA'''') WHERE permission_name = '''''' + @rightsaction + '''''') + BEGIN + '' + @grantordeny + '' '' + @rightsaction + '' ON SCHEMA::'' + @schemaid + '' TO ['' + @RoleName + ''] + END +END + +'' + END + + IF @typeofobject in(''TABLE'',''SP'',''FUNCTIONS'',''VIEWS'') + BEGIN + + IF @objectname like ''%[%]%'' + BEGIN + + IF @typeofobject = ''TABLE'' + BEGIN + SET @sysTarget = ''sys.tables'' + SET @sysType = '''' + END + + IF @typeofobject = ''SP'' + BEGIN + SET @sysTarget = ''sys.procedures'' + SET @sysType = '''' + END + + IF @typeofobject = ''FUNCTIONS'' + BEGIN + SET @sysTarget = ''sys.objects'' + SET @sysType = '' and p.Type IN ( N''''FN'''', N''''IF'''', N''''TF'''', N''''FS'''', N''''FT'''' )'' + END + + IF @typeofobject = ''VIEWS'' + BEGIN + SET @sysTarget = ''sys.views'' + SET @sysType = '''' + END + + SET @Command = @Command + '' +DECLARE SP_cursor CURSOR FOR +SELECT p.name FROM '' + @sysTarget + '' p JOIN sys.schemas s ON s.schema_id = p.schema_id WHERE (p.name like '''''' + @objectname + '''''') and s.name = '''''' + @schemaid + '''' + @sysType + '''''' + +OPEN SP_cursor +FETCH NEXT FROM SP_cursor INTO @SP_Name +WHILE @@FETCH_STATUS = 0 +BEGIN + IF EXISTS(SELECT 1 FROM sys.fn_builtin_permissions(''''OBJECT'''') WHERE permission_name = '''''' + @rightsaction + '''''') + BEGIN + EXEC('''''' + @grantordeny + '' '' + @rightsaction + '' ON ['' + @schemaid + ''].['''' + @SP_Name + ''''] TO ['' + @RoleName + '']'''') + END + FETCH NEXT FROM SP_cursor INTO @SP_Name +END + +CLOSE SP_cursor +DEALLOCATE SP_cursor + +'' + + END + ELSE + BEGIN + + SET @Command = @Command + '' +IF EXISTS(SELECT 1 FROM sys.objects o WITH (NOLOCK) JOIN sys.schemas s ON s.schema_id = o.schema_id WHERE o.name = '''''' + @objectname + '''''' AND o.type IN (N''''U'''',''''P'''',''''V'''',''''FN'''',''''IF'''',''''TF'''') AND s.name = '''''' + @schemaid + '''''') +BEGIN + IF EXISTS(SELECT 1 FROM sys.fn_builtin_permissions(''''OBJECT'''') WHERE permission_name = '''''' + @rightsaction + '''''') + BEGIN + '' + @grantordeny + '' '' + @rightsaction + '' ON ['' + @schemaid + ''].['' + @objectname + ''] TO ['' + @RoleName + ''] + END +END + +'' + END +END + +IF @typeofobject = ''ASSEMBLIES'' +BEGIN + SET @Command = @Command + '' +IF EXISTS(SELECT 1 FROM sys.assemblies WHERE NAME = '''''' + @objectname + '''''') +BEGIN + IF EXISTS(SELECT 1 FROM sys.fn_builtin_permissions(''''ASSEMBLY'''') WHERE permission_name = '''''' + @rightsaction + '''''') + BEGIN + '' + @grantordeny + '' '' + @rightsaction + ''::['' + @objectname + ''] TO ['' + @RoleName + ''] + END +END + +'' +END + +IF @typeofobject = ''ROLE'' +BEGIN + SET @Command = @Command + '' +IF NOT EXISTS (SELECT 1 FROM sys.database_role_members JOIN sys.database_principals roles ON database_role_members.role_principal_id = roles.principal_id JOIN sys.database_principals members ON database_role_members.member_principal_id = members.principal_id WHERE roles.name = '''''' + @rightsaction + '''''' AND members.name = '''''' + @RoleName + '''''') +BEGIN + EXEC sp_addrolemember N'''''' + @rightsaction + '''''', N'''''' + @RoleName + '''''' +END + +'' +END + +FETCH NEXT FROM SecurablesCurs INTO @typeofobject, @grantordeny, @rightsaction, @objectname, @schemaid +END + +CLOSE SecurablesCurs +DEALLOCATE SecurablesCurs + +PRINT ''SET ALL SECURABLES ON ROLE ['' + @RoleName + '']'' +EXEC sp_executesql @Command + +/* ADD USER */ +DECLARE UsersCurs CURSOR FOR +SELECT username + FROM #UsersOnRole + +OPEN UsersCurs + +FETCH NEXT FROM UsersCurs INTO @Users +WHILE @@FETCH_STATUS = 0 +BEGIN + + SELECT @Command = '' +EXEC sp_addrolemember N'''''' + @RoleName + '''''', N'''''' + @Users + '''''' +PRINT ''''ADD USER ['' + @Users + ''] ON ROLE ['' + @RoleName + '']'''' +'' + +FETCH NEXT FROM UsersCurs INTO @Users +END + +CLOSE UsersCurs +DEALLOCATE UsersCurs + +EXEC sp_executesql @Command + + +/*============================================================================= + Drop temp tables +=============================================================================*/ +DROP TABLE #Securables +DROP TABLE #UsersOnRole +','msdb','Pharmacies') + +INSERT INTO #AllRoles(STR_Definition,STR_Database,STR_Product)VALUES(' + +/*============================================================================= + + Script to create dbRoleCsltUsr role. + + Role Name: dbRoleCsltUsr + TEMPLATE: N2 and PROD + + EXAMPLE OF SECURABLES TO SET: + + INSERT INTO #Securables + VALUES + (''DB'',''GRANT'',''VIEW DEFINITION'','''',''''), + (''SCHEMA'',''GRANT'',''SELECT,EXECUTE,INSERT,UPDATE,DELETE'','''',''AP''), + (''TABLE'',''GRANT'',''INSERT,UPDATE'',''Address'',''dbo''), + (''SP'',''GRANT'',''EXECUTE'',''sp_bmc_GetNextID'',''dbo''), + (''ROLE'',''GRANT'',''db_datareader'','''','''') + + ----------------------------------------------- + +Generate date : 2023-05-12 / up208700 + +=============================================================================*/ + +DECLARE @Type varchar(6), + @Command nvarchar(max), + @RoleName varchar(60), + @Users varchar(255), + @typeofobject varchar(50), + @grantordeny varchar(10), + @rightsaction varchar(255), + @objectname varchar(255), + @schemaid varchar(10), + @sysTarget varchar(255), + @sysType varchar(255) + +SET @RoleName = ''dbRoleCsltUsr'' +SET @Command = '''' + +SELECT @Type = [Type] FROM [master].[cfg].[InstanceContext] + +/* TEMP TABLES */ +CREATE TABLE #UsersOnRole(username varchar(255)) +CREATE TABLE #Securables(typeofobject varchar(50), grantordeny varchar(10), rightsaction varchar(255), objectname varchar(255), schemaid varchar(10),N2 bit) + +/* !!! LIST OF SECURABLES TO CHANGE !!! */ + +INSERT INTO #Securables +VALUES +(''ROLE'',''GRANT'',''DB_OWNER'','''',''dbo'',0) +,(''ROLE'',''GRANT'',''DB_OWNER'','''',''dbo'',1) + + +/* GET ALL USERS ON THIS ROLE */ +INSERT INTO #UsersOnRole +SELECT + members.name +FROM sys.database_role_members + JOIN sys.database_principals roles ON database_role_members.role_principal_id = roles.principal_id + JOIN sys.database_principals members ON database_role_members.member_principal_id = members.principal_id +WHERE roles.name = @RoleName + +/* CREATE ROLE */ +SELECT @Command = '' +IF NOT EXISTS (SELECT 1 FROM sys.database_principals WHERE name = '''''' + @RoleName + '''''' AND type = ''''R'''') +BEGIN + CREATE ROLE ['' + @RoleName + ''] AUTHORIZATION [dbo] + PRINT ''''CREATE ROLE ['' + @RoleName + '']'''' +END +'' +EXEC sp_executesql @Command + +SET @Command = '' +DECLARE @SP_Name varchar(255) + +'' + +/* SET ALL ROLE SECURABLES */ +IF @Type = ''DEVE'' +BEGIN + + DECLARE SecurablesCurs CURSOR FOR + SELECT typeofobject, grantordeny, rightsaction, objectname, schemaid + FROM #Securables + WHERE N2 = 1 + + OPEN SecurablesCurs + FETCH NEXT FROM SecurablesCurs INTO @typeofobject, @grantordeny, @rightsaction, @objectname, @schemaid + WHILE @@FETCH_STATUS = 0 + BEGIN + + IF @typeofobject = ''DB'' + BEGIN + IF EXISTS(SELECT 1 FROM sys.fn_builtin_permissions(''DATABASE'') WHERE permission_name = '''' + @rightsaction + '''') + BEGIN + SET @Command = @Command + @grantordeny + '' '' + @rightsaction + '' TO ['' + @RoleName + ''] +'' + END + END + + IF @typeofobject = ''SCHEMA'' + BEGIN + SET @Command = @Command + '' +IF EXISTS (SELECT 1 FROM sys.schemas WHERE name = '''''' + @schemaid + '''''') +BEGIN + IF EXISTS(SELECT 1 FROM sys.fn_builtin_permissions(''''SCHEMA'''') WHERE permission_name = '''''' + @rightsaction + '''''') + BEGIN + '' + @grantordeny + '' '' + @rightsaction + '' ON SCHEMA::'' + @schemaid + '' TO ['' + @RoleName + ''] + END +END + +'' + END + + IF @typeofobject in(''TABLE'',''SP'',''FUNCTIONS'',''VIEWS'') + BEGIN + + IF @objectname like ''%[%]%'' + BEGIN + IF @typeofobject = ''TABLE'' + BEGIN + SET @sysTarget = ''sys.tables'' + SET @sysType = '''' + END + + IF @typeofobject = ''SP'' + BEGIN + SET @sysTarget = ''sys.procedures'' + SET @sysType = '''' + END + + IF @typeofobject = ''FUNCTIONS'' + BEGIN + SET @sysTarget = ''sys.objects'' + SET @sysType = '' and p.Type IN ( N''''FN'''', N''''IF'''', N''''TF'''', N''''FS'''', N''''FT'''' )'' + END + + IF @typeofobject = ''VIEWS'' + BEGIN + SET @sysTarget = ''sys.views'' + SET @sysType = '''' + END + + SET @Command = @Command + '' +DECLARE SP_cursor CURSOR FOR +SELECT p.name FROM '' + @sysTarget + '' p JOIN sys.schemas s ON s.schema_id = p.schema_id WHERE (p.name like '''''' + @objectname + '''''') and s.name = '''''' + @schemaid + '''' + @sysType + '''''' + +OPEN SP_cursor +FETCH NEXT FROM SP_cursor INTO @SP_Name +WHILE @@FETCH_STATUS = 0 +BEGIN + IF EXISTS(SELECT 1 FROM sys.fn_builtin_permissions(''''OBJECT'''') WHERE permission_name = '''''' + @rightsaction + '''''') + BEGIN + EXEC('''''' + @grantordeny + '' '' + @rightsaction + '' ON ['' + @schemaid + ''].['''' + @SP_Name + ''''] TO ['' + @RoleName + '']'''') + END + FETCH NEXT FROM SP_cursor INTO @SP_Name +END + +CLOSE SP_cursor +DEALLOCATE SP_cursor + +'' + + END + ELSE + BEGIN + + SET @Command = @Command + '' +IF EXISTS(SELECT 1 FROM sys.objects o WITH (NOLOCK) JOIN sys.schemas s ON s.schema_id = o.schema_id WHERE o.name = '''''' + @objectname + '''''' AND o.type IN (N''''U'''',''''P'''',''''V'''',''''FN'''',''''IF'''',''''TF'''') AND s.name = '''''' + @schemaid + '''''') +BEGIN + IF EXISTS(SELECT 1 FROM sys.fn_builtin_permissions(''''OBJECT'''') WHERE permission_name = '''''' + @rightsaction + '''''') + BEGIN + '' + @grantordeny + '' '' + @rightsaction + '' ON ['' + @schemaid + ''].['' + @objectname + ''] TO ['' + @RoleName + ''] + END +END + +'' + END + END + + IF @typeofobject = ''ASSEMBLIES'' + BEGIN + SET @Command = @Command + '' +IF EXISTS(SELECT 1 FROM sys.assemblies WHERE NAME = '''''' + @objectname + '''''') +BEGIN + IF EXISTS(SELECT 1 FROM sys.fn_builtin_permissions(''''ASSEMBLY'''') WHERE permission_name = '''''' + @rightsaction + '''''') + BEGIN + '' + @grantordeny + '' '' + @rightsaction + ''::['' + @objectname + ''] TO ['' + @RoleName + ''] + END +END + +'' + END + + IF @typeofobject = ''ROLE'' + BEGIN + SET @Command = @Command + '' +IF NOT EXISTS (SELECT 1 FROM sys.database_role_members JOIN sys.database_principals roles ON database_role_members.role_principal_id = roles.principal_id JOIN sys.database_principals members ON database_role_members.member_principal_id = members.principal_id WHERE roles.name = '''''' + @rightsaction + '''''' AND members.name = '''''' + @RoleName + '''''') +BEGIN + EXEC sp_addrolemember N'''''' + @rightsaction + '''''', N'''''' + @RoleName + '''''' +END + +'' + END + + FETCH NEXT FROM SecurablesCurs INTO @typeofobject, @grantordeny, @rightsaction, @objectname, @schemaid + END + +CLOSE SecurablesCurs +DEALLOCATE SecurablesCurs + +PRINT ''SET ALL SECURABLES ON ROLE ['' + @RoleName + '']'' +EXEC sp_executesql @Command + +END +ELSE +BEGIN + + DECLARE SecurablesCurs CURSOR FOR + SELECT typeofobject, grantordeny, rightsaction, objectname, schemaid + FROM #Securables + WHERE N2 = 0 + + OPEN SecurablesCurs + FETCH NEXT FROM SecurablesCurs INTO @typeofobject, @grantordeny, @rightsaction, @objectname, @schemaid + WHILE @@FETCH_STATUS = 0 + BEGIN + + IF @typeofobject = ''DB'' + BEGIN + IF EXISTS(SELECT 1 FROM sys.fn_builtin_permissions(''DATABASE'') WHERE permission_name = '''' + @rightsaction + '''') + BEGIN + SET @Command = @Command + @grantordeny + '' '' + @rightsaction + '' TO ['' + @RoleName + ''] +'' + END + END + + IF @typeofobject = ''SCHEMA'' + BEGIN + SET @Command = @Command + '' +IF EXISTS (SELECT 1 FROM sys.schemas WHERE name = '''''' + @schemaid + '''''') +BEGIN + IF EXISTS(SELECT 1 FROM sys.fn_builtin_permissions(''''SCHEMA'''') WHERE permission_name = '''''' + @rightsaction + '''''') + BEGIN + '' + @grantordeny + '' '' + @rightsaction + '' ON SCHEMA::'' + @schemaid + '' TO ['' + @RoleName + ''] + END +END + +'' + END + + IF @typeofobject in(''TABLE'',''SP'',''FUNCTIONS'',''VIEWS'') + BEGIN + + IF @objectname like ''%[%]%'' + BEGIN + + IF @typeofobject = ''TABLE'' + BEGIN + SET @sysTarget = ''sys.tables'' + SET @sysType = '''' + END + + IF @typeofobject = ''SP'' + BEGIN + SET @sysTarget = ''sys.procedures'' + SET @sysType = '''' + END + + IF @typeofobject = ''FUNCTIONS'' + BEGIN + SET @sysTarget = ''sys.objects'' + SET @sysType = '' and p.Type IN ( N''''FN'''', N''''IF'''', N''''TF'''', N''''FS'''', N''''FT'''' )'' + END + + IF @typeofobject = ''VIEWS'' + BEGIN + SET @sysTarget = ''sys.views'' + SET @sysType = '''' + END + + SET @Command = @Command + '' +DECLARE SP_cursor CURSOR FOR +SELECT p.name FROM '' + @sysTarget + '' p JOIN sys.schemas s ON s.schema_id = p.schema_id WHERE (p.name like '''''' + @objectname + '''''') and s.name = '''''' + @schemaid + '''' + @sysType + '''''' + +OPEN SP_cursor +FETCH NEXT FROM SP_cursor INTO @SP_Name +WHILE @@FETCH_STATUS = 0 +BEGIN + IF EXISTS(SELECT 1 FROM sys.fn_builtin_permissions(''''OBJECT'''') WHERE permission_name = '''''' + @rightsaction + '''''') + BEGIN + EXEC('''''' + @grantordeny + '' '' + @rightsaction + '' ON ['' + @schemaid + ''].['''' + @SP_Name + ''''] TO ['' + @RoleName + '']'''') + END + FETCH NEXT FROM SP_cursor INTO @SP_Name +END + +CLOSE SP_cursor +DEALLOCATE SP_cursor + +'' + + END + ELSE + BEGIN + + SET @Command = @Command + '' +IF EXISTS(SELECT 1 FROM sys.objects o WITH (NOLOCK) JOIN sys.schemas s ON s.schema_id = o.schema_id WHERE o.name = '''''' + @objectname + '''''' AND o.type IN (N''''U'''',''''P'''',''''V'''',''''FN'''',''''IF'''',''''TF'''') AND s.name = '''''' + @schemaid + '''''') +BEGIN + IF EXISTS(SELECT 1 FROM sys.fn_builtin_permissions(''''OBJECT'''') WHERE permission_name = '''''' + @rightsaction + '''''') + BEGIN + '' + @grantordeny + '' '' + @rightsaction + '' ON ['' + @schemaid + ''].['' + @objectname + ''] TO ['' + @RoleName + ''] + END +END + +'' + END + END + + IF @typeofobject = ''ASSEMBLIES'' + BEGIN + SET @Command = @Command + '' +IF EXISTS(SELECT 1 FROM sys.assemblies WHERE NAME = '''''' + @objectname + '''''') +BEGIN + IF EXISTS(SELECT 1 FROM sys.fn_builtin_permissions(''''ASSEMBLY'''') WHERE permission_name = '''''' + @rightsaction + '''''') + BEGIN + '' + @grantordeny + '' '' + @rightsaction + ''::['' + @objectname + ''] TO ['' + @RoleName + ''] + END +END + +'' + END + + IF @typeofobject = ''ROLE'' + BEGIN + SET @Command = @Command + '' +IF NOT EXISTS (SELECT 1 FROM sys.database_role_members JOIN sys.database_principals roles ON database_role_members.role_principal_id = roles.principal_id JOIN sys.database_principals members ON database_role_members.member_principal_id = members.principal_id WHERE roles.name = '''''' + @rightsaction + '''''' AND members.name = '''''' + @RoleName + '''''') +BEGIN + EXEC sp_addrolemember N'''''' + @rightsaction + '''''', N'''''' + @RoleName + '''''' +END + +'' + END + + FETCH NEXT FROM SecurablesCurs INTO @typeofobject, @grantordeny, @rightsaction, @objectname, @schemaid + END + +CLOSE SecurablesCurs +DEALLOCATE SecurablesCurs + +PRINT ''SET ALL SECURABLES ON ROLE ['' + @RoleName + '']'' +EXEC sp_executesql @Command + +END + +/* ADD USER */ +DECLARE UsersCurs CURSOR FOR +SELECT username + FROM #UsersOnRole + +OPEN UsersCurs + +FETCH NEXT FROM UsersCurs INTO @Users +WHILE @@FETCH_STATUS = 0 +BEGIN + + SELECT @Command = '' +EXEC sp_addrolemember N'''''' + @RoleName + '''''', N'''''' + @Users + '''''' +PRINT ''''ADD USER ['' + @Users + ''] ON ROLE ['' + @RoleName + '']'''' +'' + +FETCH NEXT FROM UsersCurs INTO @Users +END + +CLOSE UsersCurs +DEALLOCATE UsersCurs + +EXEC sp_executesql @Command + +/*============================================================================= + Drop temp tables +=============================================================================*/ +DROP TABLE #Securables +DROP TABLE #UsersOnRole','Symbiose','Pharmacies') + +INSERT INTO #AllRoles(STR_Definition,STR_Database,STR_Product)VALUES(' + +/*============================================================================= + + Script to create dbRoleDevUsr role. + + Role Name: dbRoleDevUsr + TEMPLATE: Default + + EXAMPLE OF SECURABLES TO SET: + + INSERT INTO #Securables + VALUES + (''DB'',''GRANT'',''VIEW DEFINITION'','''',''''), + (''SCHEMA'',''GRANT'',''SELECT,EXECUTE,INSERT,UPDATE,DELETE'','''',''AP''), + (''TABLE'',''GRANT'',''INSERT,UPDATE'',''Address'',''dbo''), + (''SP'',''GRANT'',''EXECUTE'',''sp_bmc_GetNextID'',''dbo''), + (''ROLE'',''GRANT'',''db_datareader'','''','''') + + ----------------------------------------------- + +Generate date : 2023-05-12 / up208700 + +=============================================================================*/ + +DECLARE @Command nvarchar(max), + @RoleName varchar(60), + @Users varchar(255), + @typeofobject varchar(50), + @grantordeny varchar(10), + @rightsaction varchar(255), + @objectname varchar(255), + @schemaid varchar(10), + @sysTarget varchar(255), + @sysType varchar(255) + +SET @RoleName = ''dbRoleDevUsr'' +SET @Command = '''' + +/* TEMP TABLES */ +CREATE TABLE #UsersOnRole(username varchar(255)) +CREATE TABLE #Securables(typeofobject varchar(50), grantordeny varchar(10), rightsaction varchar(255), objectname varchar(255), schemaid varchar(10),N2 bit) + +/* !!! LIST OF SECURABLES TO CHANGE !!! */ + +INSERT INTO #Securables +VALUES +(''ROLE'',''GRANT'',''DB_OWNER'','''',''dbo'',0) + + +/* GET ALL USERS ON THIS ROLE */ +INSERT INTO #UsersOnRole +SELECT + members.name +FROM sys.database_role_members + JOIN sys.database_principals roles ON database_role_members.role_principal_id = roles.principal_id + JOIN sys.database_principals members ON database_role_members.member_principal_id = members.principal_id +WHERE roles.name = @RoleName + +/* CREATE ROLE */ +SELECT @Command = '' +IF NOT EXISTS (SELECT 1 FROM sys.database_principals WHERE name = '''''' + @RoleName + '''''' AND type = ''''R'''') +BEGIN + CREATE ROLE ['' + @RoleName + ''] AUTHORIZATION [dbo] + PRINT ''''CREATE ROLE ['' + @RoleName + '']'''' +END +'' +EXEC sp_executesql @Command + +SET @Command = '' +DECLARE @SP_Name varchar(255) + +'' + +/* SET ALL ROLE SECURABLES */ +DECLARE SecurablesCurs CURSOR FOR +SELECT typeofobject, grantordeny, rightsaction, objectname, schemaid +FROM #Securables +WHERE N2 = 0 + +OPEN SecurablesCurs +FETCH NEXT FROM SecurablesCurs INTO @typeofobject, @grantordeny, @rightsaction, @objectname, @schemaid +WHILE @@FETCH_STATUS = 0 +BEGIN + + IF @typeofobject = ''DB'' + BEGIN + IF EXISTS(SELECT 1 FROM sys.fn_builtin_permissions(''DATABASE'') WHERE permission_name = '''' + @rightsaction + '''') + BEGIN + SET @Command = @Command + @grantordeny + '' '' + @rightsaction + '' TO ['' + @RoleName + ''] +'' + END + END + + IF @typeofobject = ''SCHEMA'' + BEGIN + SET @Command = @Command + '' +IF EXISTS (SELECT 1 FROM sys.schemas WHERE name = '''''' + @schemaid + '''''') +BEGIN + IF EXISTS(SELECT 1 FROM sys.fn_builtin_permissions(''''SCHEMA'''') WHERE permission_name = '''''' + @rightsaction + '''''') + BEGIN + '' + @grantordeny + '' '' + @rightsaction + '' ON SCHEMA::'' + @schemaid + '' TO ['' + @RoleName + ''] + END +END + +'' + END + + IF @typeofobject in(''TABLE'',''SP'',''FUNCTIONS'',''VIEWS'') + BEGIN + + IF @objectname like ''%[%]%'' + BEGIN + + IF @typeofobject = ''TABLE'' + BEGIN + SET @sysTarget = ''sys.tables'' + SET @sysType = '''' + END + + IF @typeofobject = ''SP'' + BEGIN + SET @sysTarget = ''sys.procedures'' + SET @sysType = '''' + END + + IF @typeofobject = ''FUNCTIONS'' + BEGIN + SET @sysTarget = ''sys.objects'' + SET @sysType = '' and p.Type IN ( N''''FN'''', N''''IF'''', N''''TF'''', N''''FS'''', N''''FT'''' )'' + END + + IF @typeofobject = ''VIEWS'' + BEGIN + SET @sysTarget = ''sys.views'' + SET @sysType = '''' + END + + SET @Command = @Command + '' +DECLARE SP_cursor CURSOR FOR +SELECT p.name FROM '' + @sysTarget + '' p JOIN sys.schemas s ON s.schema_id = p.schema_id WHERE (p.name like '''''' + @objectname + '''''') and s.name = '''''' + @schemaid + '''' + @sysType + '''''' + +OPEN SP_cursor +FETCH NEXT FROM SP_cursor INTO @SP_Name +WHILE @@FETCH_STATUS = 0 +BEGIN + IF EXISTS(SELECT 1 FROM sys.fn_builtin_permissions(''''OBJECT'''') WHERE permission_name = '''''' + @rightsaction + '''''') + BEGIN + EXEC('''''' + @grantordeny + '' '' + @rightsaction + '' ON ['' + @schemaid + ''].['''' + @SP_Name + ''''] TO ['' + @RoleName + '']'''') + END + FETCH NEXT FROM SP_cursor INTO @SP_Name +END + +CLOSE SP_cursor +DEALLOCATE SP_cursor + +'' + + END + ELSE + BEGIN + + SET @Command = @Command + '' +IF EXISTS(SELECT 1 FROM sys.objects o WITH (NOLOCK) JOIN sys.schemas s ON s.schema_id = o.schema_id WHERE o.name = '''''' + @objectname + '''''' AND o.type IN (N''''U'''',''''P'''',''''V'''',''''FN'''',''''IF'''',''''TF'''') AND s.name = '''''' + @schemaid + '''''') +BEGIN + IF EXISTS(SELECT 1 FROM sys.fn_builtin_permissions(''''OBJECT'''') WHERE permission_name = '''''' + @rightsaction + '''''') + BEGIN + '' + @grantordeny + '' '' + @rightsaction + '' ON ['' + @schemaid + ''].['' + @objectname + ''] TO ['' + @RoleName + ''] + END +END + +'' + END +END + +IF @typeofobject = ''ASSEMBLIES'' +BEGIN + SET @Command = @Command + '' +IF EXISTS(SELECT 1 FROM sys.assemblies WHERE NAME = '''''' + @objectname + '''''') +BEGIN + IF EXISTS(SELECT 1 FROM sys.fn_builtin_permissions(''''ASSEMBLY'''') WHERE permission_name = '''''' + @rightsaction + '''''') + BEGIN + '' + @grantordeny + '' '' + @rightsaction + ''::['' + @objectname + ''] TO ['' + @RoleName + ''] + END +END + +'' +END + +IF @typeofobject = ''ROLE'' +BEGIN + SET @Command = @Command + '' +IF NOT EXISTS (SELECT 1 FROM sys.database_role_members JOIN sys.database_principals roles ON database_role_members.role_principal_id = roles.principal_id JOIN sys.database_principals members ON database_role_members.member_principal_id = members.principal_id WHERE roles.name = '''''' + @rightsaction + '''''' AND members.name = '''''' + @RoleName + '''''') +BEGIN + EXEC sp_addrolemember N'''''' + @rightsaction + '''''', N'''''' + @RoleName + '''''' +END + +'' +END + +FETCH NEXT FROM SecurablesCurs INTO @typeofobject, @grantordeny, @rightsaction, @objectname, @schemaid +END + +CLOSE SecurablesCurs +DEALLOCATE SecurablesCurs + +PRINT ''SET ALL SECURABLES ON ROLE ['' + @RoleName + '']'' +EXEC sp_executesql @Command + +/* ADD USER */ +DECLARE UsersCurs CURSOR FOR +SELECT username + FROM #UsersOnRole + +OPEN UsersCurs + +FETCH NEXT FROM UsersCurs INTO @Users +WHILE @@FETCH_STATUS = 0 +BEGIN + + SELECT @Command = '' +EXEC sp_addrolemember N'''''' + @RoleName + '''''', N'''''' + @Users + '''''' +PRINT ''''ADD USER ['' + @Users + ''] ON ROLE ['' + @RoleName + '']'''' +'' + +FETCH NEXT FROM UsersCurs INTO @Users +END + +CLOSE UsersCurs +DEALLOCATE UsersCurs + +EXEC sp_executesql @Command + + +/*============================================================================= + Drop temp tables +=============================================================================*/ +DROP TABLE #Securables +DROP TABLE #UsersOnRole +','Symbiose','Pharmacies') + +INSERT INTO #AllRoles(STR_Definition,STR_Database,STR_Product)VALUES(' + +/*============================================================================= + + Script to create dbRoleIttechUsr role. + + Role Name: dbRoleIttechUsr + TEMPLATE: N2 and PROD + + EXAMPLE OF SECURABLES TO SET: + + INSERT INTO #Securables + VALUES + (''DB'',''GRANT'',''VIEW DEFINITION'','''',''''), + (''SCHEMA'',''GRANT'',''SELECT,EXECUTE,INSERT,UPDATE,DELETE'','''',''AP''), + (''TABLE'',''GRANT'',''INSERT,UPDATE'',''Address'',''dbo''), + (''SP'',''GRANT'',''EXECUTE'',''sp_bmc_GetNextID'',''dbo''), + (''ROLE'',''GRANT'',''db_datareader'','''','''') + + ----------------------------------------------- + +Generate date : 2023-05-12 / up208700 + +=============================================================================*/ + +DECLARE @Type varchar(6), + @Command nvarchar(max), + @RoleName varchar(60), + @Users varchar(255), + @typeofobject varchar(50), + @grantordeny varchar(10), + @rightsaction varchar(255), + @objectname varchar(255), + @schemaid varchar(10), + @sysTarget varchar(255), + @sysType varchar(255) + +SET @RoleName = ''dbRoleIttechUsr'' +SET @Command = '''' + +SELECT @Type = [Type] FROM [master].[cfg].[InstanceContext] + +/* TEMP TABLES */ +CREATE TABLE #UsersOnRole(username varchar(255)) +CREATE TABLE #Securables(typeofobject varchar(50), grantordeny varchar(10), rightsaction varchar(255), objectname varchar(255), schemaid varchar(10),N2 bit) + +/* !!! LIST OF SECURABLES TO CHANGE !!! */ + +INSERT INTO #Securables +VALUES +(''ROLE'',''GRANT'',''DB_OWNER'','''',''dbo'',0) +,(''ROLE'',''GRANT'',''DB_OWNER'','''',''dbo'',1) + + +/* GET ALL USERS ON THIS ROLE */ +INSERT INTO #UsersOnRole +SELECT + members.name +FROM sys.database_role_members + JOIN sys.database_principals roles ON database_role_members.role_principal_id = roles.principal_id + JOIN sys.database_principals members ON database_role_members.member_principal_id = members.principal_id +WHERE roles.name = @RoleName + +/* CREATE ROLE */ +SELECT @Command = '' +IF NOT EXISTS (SELECT 1 FROM sys.database_principals WHERE name = '''''' + @RoleName + '''''' AND type = ''''R'''') +BEGIN + CREATE ROLE ['' + @RoleName + ''] AUTHORIZATION [dbo] + PRINT ''''CREATE ROLE ['' + @RoleName + '']'''' +END +'' +EXEC sp_executesql @Command + +SET @Command = '' +DECLARE @SP_Name varchar(255) + +'' + +/* SET ALL ROLE SECURABLES */ +IF @Type = ''DEVE'' +BEGIN + + DECLARE SecurablesCurs CURSOR FOR + SELECT typeofobject, grantordeny, rightsaction, objectname, schemaid + FROM #Securables + WHERE N2 = 1 + + OPEN SecurablesCurs + FETCH NEXT FROM SecurablesCurs INTO @typeofobject, @grantordeny, @rightsaction, @objectname, @schemaid + WHILE @@FETCH_STATUS = 0 + BEGIN + + IF @typeofobject = ''DB'' + BEGIN + IF EXISTS(SELECT 1 FROM sys.fn_builtin_permissions(''DATABASE'') WHERE permission_name = '''' + @rightsaction + '''') + BEGIN + SET @Command = @Command + @grantordeny + '' '' + @rightsaction + '' TO ['' + @RoleName + ''] +'' + END + END + + IF @typeofobject = ''SCHEMA'' + BEGIN + SET @Command = @Command + '' +IF EXISTS (SELECT 1 FROM sys.schemas WHERE name = '''''' + @schemaid + '''''') +BEGIN + IF EXISTS(SELECT 1 FROM sys.fn_builtin_permissions(''''SCHEMA'''') WHERE permission_name = '''''' + @rightsaction + '''''') + BEGIN + '' + @grantordeny + '' '' + @rightsaction + '' ON SCHEMA::'' + @schemaid + '' TO ['' + @RoleName + ''] + END +END + +'' + END + + IF @typeofobject in(''TABLE'',''SP'',''FUNCTIONS'',''VIEWS'') + BEGIN + + IF @objectname like ''%[%]%'' + BEGIN + IF @typeofobject = ''TABLE'' + BEGIN + SET @sysTarget = ''sys.tables'' + SET @sysType = '''' + END + + IF @typeofobject = ''SP'' + BEGIN + SET @sysTarget = ''sys.procedures'' + SET @sysType = '''' + END + + IF @typeofobject = ''FUNCTIONS'' + BEGIN + SET @sysTarget = ''sys.objects'' + SET @sysType = '' and p.Type IN ( N''''FN'''', N''''IF'''', N''''TF'''', N''''FS'''', N''''FT'''' )'' + END + + IF @typeofobject = ''VIEWS'' + BEGIN + SET @sysTarget = ''sys.views'' + SET @sysType = '''' + END + + SET @Command = @Command + '' +DECLARE SP_cursor CURSOR FOR +SELECT p.name FROM '' + @sysTarget + '' p JOIN sys.schemas s ON s.schema_id = p.schema_id WHERE (p.name like '''''' + @objectname + '''''') and s.name = '''''' + @schemaid + '''' + @sysType + '''''' + +OPEN SP_cursor +FETCH NEXT FROM SP_cursor INTO @SP_Name +WHILE @@FETCH_STATUS = 0 +BEGIN + IF EXISTS(SELECT 1 FROM sys.fn_builtin_permissions(''''OBJECT'''') WHERE permission_name = '''''' + @rightsaction + '''''') + BEGIN + EXEC('''''' + @grantordeny + '' '' + @rightsaction + '' ON ['' + @schemaid + ''].['''' + @SP_Name + ''''] TO ['' + @RoleName + '']'''') + END + FETCH NEXT FROM SP_cursor INTO @SP_Name +END + +CLOSE SP_cursor +DEALLOCATE SP_cursor + +'' + + END + ELSE + BEGIN + + SET @Command = @Command + '' +IF EXISTS(SELECT 1 FROM sys.objects o WITH (NOLOCK) JOIN sys.schemas s ON s.schema_id = o.schema_id WHERE o.name = '''''' + @objectname + '''''' AND o.type IN (N''''U'''',''''P'''',''''V'''',''''FN'''',''''IF'''',''''TF'''') AND s.name = '''''' + @schemaid + '''''') +BEGIN + IF EXISTS(SELECT 1 FROM sys.fn_builtin_permissions(''''OBJECT'''') WHERE permission_name = '''''' + @rightsaction + '''''') + BEGIN + '' + @grantordeny + '' '' + @rightsaction + '' ON ['' + @schemaid + ''].['' + @objectname + ''] TO ['' + @RoleName + ''] + END +END + +'' + END + END + + IF @typeofobject = ''ASSEMBLIES'' + BEGIN + SET @Command = @Command + '' +IF EXISTS(SELECT 1 FROM sys.assemblies WHERE NAME = '''''' + @objectname + '''''') +BEGIN + IF EXISTS(SELECT 1 FROM sys.fn_builtin_permissions(''''ASSEMBLY'''') WHERE permission_name = '''''' + @rightsaction + '''''') + BEGIN + '' + @grantordeny + '' '' + @rightsaction + ''::['' + @objectname + ''] TO ['' + @RoleName + ''] + END +END + +'' + END + + IF @typeofobject = ''ROLE'' + BEGIN + SET @Command = @Command + '' +IF NOT EXISTS (SELECT 1 FROM sys.database_role_members JOIN sys.database_principals roles ON database_role_members.role_principal_id = roles.principal_id JOIN sys.database_principals members ON database_role_members.member_principal_id = members.principal_id WHERE roles.name = '''''' + @rightsaction + '''''' AND members.name = '''''' + @RoleName + '''''') +BEGIN + EXEC sp_addrolemember N'''''' + @rightsaction + '''''', N'''''' + @RoleName + '''''' +END + +'' + END + + FETCH NEXT FROM SecurablesCurs INTO @typeofobject, @grantordeny, @rightsaction, @objectname, @schemaid + END + +CLOSE SecurablesCurs +DEALLOCATE SecurablesCurs + +PRINT ''SET ALL SECURABLES ON ROLE ['' + @RoleName + '']'' +EXEC sp_executesql @Command + +END +ELSE +BEGIN + + DECLARE SecurablesCurs CURSOR FOR + SELECT typeofobject, grantordeny, rightsaction, objectname, schemaid + FROM #Securables + WHERE N2 = 0 + + OPEN SecurablesCurs + FETCH NEXT FROM SecurablesCurs INTO @typeofobject, @grantordeny, @rightsaction, @objectname, @schemaid + WHILE @@FETCH_STATUS = 0 + BEGIN + + IF @typeofobject = ''DB'' + BEGIN + IF EXISTS(SELECT 1 FROM sys.fn_builtin_permissions(''DATABASE'') WHERE permission_name = '''' + @rightsaction + '''') + BEGIN + SET @Command = @Command + @grantordeny + '' '' + @rightsaction + '' TO ['' + @RoleName + ''] +'' + END + END + + IF @typeofobject = ''SCHEMA'' + BEGIN + SET @Command = @Command + '' +IF EXISTS (SELECT 1 FROM sys.schemas WHERE name = '''''' + @schemaid + '''''') +BEGIN + IF EXISTS(SELECT 1 FROM sys.fn_builtin_permissions(''''SCHEMA'''') WHERE permission_name = '''''' + @rightsaction + '''''') + BEGIN + '' + @grantordeny + '' '' + @rightsaction + '' ON SCHEMA::'' + @schemaid + '' TO ['' + @RoleName + ''] + END +END + +'' + END + + IF @typeofobject in(''TABLE'',''SP'',''FUNCTIONS'',''VIEWS'') + BEGIN + + IF @objectname like ''%[%]%'' + BEGIN + + IF @typeofobject = ''TABLE'' + BEGIN + SET @sysTarget = ''sys.tables'' + SET @sysType = '''' + END + + IF @typeofobject = ''SP'' + BEGIN + SET @sysTarget = ''sys.procedures'' + SET @sysType = '''' + END + + IF @typeofobject = ''FUNCTIONS'' + BEGIN + SET @sysTarget = ''sys.objects'' + SET @sysType = '' and p.Type IN ( N''''FN'''', N''''IF'''', N''''TF'''', N''''FS'''', N''''FT'''' )'' + END + + IF @typeofobject = ''VIEWS'' + BEGIN + SET @sysTarget = ''sys.views'' + SET @sysType = '''' + END + + SET @Command = @Command + '' +DECLARE SP_cursor CURSOR FOR +SELECT p.name FROM '' + @sysTarget + '' p JOIN sys.schemas s ON s.schema_id = p.schema_id WHERE (p.name like '''''' + @objectname + '''''') and s.name = '''''' + @schemaid + '''' + @sysType + '''''' + +OPEN SP_cursor +FETCH NEXT FROM SP_cursor INTO @SP_Name +WHILE @@FETCH_STATUS = 0 +BEGIN + IF EXISTS(SELECT 1 FROM sys.fn_builtin_permissions(''''OBJECT'''') WHERE permission_name = '''''' + @rightsaction + '''''') + BEGIN + EXEC('''''' + @grantordeny + '' '' + @rightsaction + '' ON ['' + @schemaid + ''].['''' + @SP_Name + ''''] TO ['' + @RoleName + '']'''') + END + FETCH NEXT FROM SP_cursor INTO @SP_Name +END + +CLOSE SP_cursor +DEALLOCATE SP_cursor + +'' + + END + ELSE + BEGIN + + SET @Command = @Command + '' +IF EXISTS(SELECT 1 FROM sys.objects o WITH (NOLOCK) JOIN sys.schemas s ON s.schema_id = o.schema_id WHERE o.name = '''''' + @objectname + '''''' AND o.type IN (N''''U'''',''''P'''',''''V'''',''''FN'''',''''IF'''',''''TF'''') AND s.name = '''''' + @schemaid + '''''') +BEGIN + IF EXISTS(SELECT 1 FROM sys.fn_builtin_permissions(''''OBJECT'''') WHERE permission_name = '''''' + @rightsaction + '''''') + BEGIN + '' + @grantordeny + '' '' + @rightsaction + '' ON ['' + @schemaid + ''].['' + @objectname + ''] TO ['' + @RoleName + ''] + END +END + +'' + END + END + + IF @typeofobject = ''ASSEMBLIES'' + BEGIN + SET @Command = @Command + '' +IF EXISTS(SELECT 1 FROM sys.assemblies WHERE NAME = '''''' + @objectname + '''''') +BEGIN + IF EXISTS(SELECT 1 FROM sys.fn_builtin_permissions(''''ASSEMBLY'''') WHERE permission_name = '''''' + @rightsaction + '''''') + BEGIN + '' + @grantordeny + '' '' + @rightsaction + ''::['' + @objectname + ''] TO ['' + @RoleName + ''] + END +END + +'' + END + + IF @typeofobject = ''ROLE'' + BEGIN + SET @Command = @Command + '' +IF NOT EXISTS (SELECT 1 FROM sys.database_role_members JOIN sys.database_principals roles ON database_role_members.role_principal_id = roles.principal_id JOIN sys.database_principals members ON database_role_members.member_principal_id = members.principal_id WHERE roles.name = '''''' + @rightsaction + '''''' AND members.name = '''''' + @RoleName + '''''') +BEGIN + EXEC sp_addrolemember N'''''' + @rightsaction + '''''', N'''''' + @RoleName + '''''' +END + +'' + END + + FETCH NEXT FROM SecurablesCurs INTO @typeofobject, @grantordeny, @rightsaction, @objectname, @schemaid + END + +CLOSE SecurablesCurs +DEALLOCATE SecurablesCurs + +PRINT ''SET ALL SECURABLES ON ROLE ['' + @RoleName + '']'' +EXEC sp_executesql @Command + +END + +/* ADD USER */ +DECLARE UsersCurs CURSOR FOR +SELECT username + FROM #UsersOnRole + +OPEN UsersCurs + +FETCH NEXT FROM UsersCurs INTO @Users +WHILE @@FETCH_STATUS = 0 +BEGIN + + SELECT @Command = '' +EXEC sp_addrolemember N'''''' + @RoleName + '''''', N'''''' + @Users + '''''' +PRINT ''''ADD USER ['' + @Users + ''] ON ROLE ['' + @RoleName + '']'''' +'' + +FETCH NEXT FROM UsersCurs INTO @Users +END + +CLOSE UsersCurs +DEALLOCATE UsersCurs + +EXEC sp_executesql @Command + +/*============================================================================= + Drop temp tables +=============================================================================*/ +DROP TABLE #Securables +DROP TABLE #UsersOnRole','Symbiose','Pharmacies') + +INSERT INTO #AllRoles(STR_Definition,STR_Database,STR_Product)VALUES(' + +/*============================================================================= + + Script to create dbRoleSupUsr role. + + Role Name: dbRoleSupUsr + TEMPLATE: N2 and PROD + + EXAMPLE OF SECURABLES TO SET: + + INSERT INTO #Securables + VALUES + (''DB'',''GRANT'',''VIEW DEFINITION'','''',''''), + (''SCHEMA'',''GRANT'',''SELECT,EXECUTE,INSERT,UPDATE,DELETE'','''',''AP''), + (''TABLE'',''GRANT'',''INSERT,UPDATE'',''Address'',''dbo''), + (''SP'',''GRANT'',''EXECUTE'',''sp_bmc_GetNextID'',''dbo''), + (''ROLE'',''GRANT'',''db_datareader'','''','''') + + ----------------------------------------------- + +Generate date : 2023-05-12 / up208700 + +=============================================================================*/ + +DECLARE @Type varchar(6), + @Command nvarchar(max), + @RoleName varchar(60), + @Users varchar(255), + @typeofobject varchar(50), + @grantordeny varchar(10), + @rightsaction varchar(255), + @objectname varchar(255), + @schemaid varchar(10), + @sysTarget varchar(255), + @sysType varchar(255) + +SET @RoleName = ''dbRoleSupUsr'' +SET @Command = '''' + +SELECT @Type = [Type] FROM [master].[cfg].[InstanceContext] + +/* TEMP TABLES */ +CREATE TABLE #UsersOnRole(username varchar(255)) +CREATE TABLE #Securables(typeofobject varchar(50), grantordeny varchar(10), rightsaction varchar(255), objectname varchar(255), schemaid varchar(10),N2 bit) + +/* !!! LIST OF SECURABLES TO CHANGE !!! */ + +INSERT INTO #Securables +VALUES +(''ROLE'',''GRANT'',''DB_OWNER'','''',''dbo'',0) +,(''ROLE'',''GRANT'',''DB_OWNER'','''',''dbo'',1) + + +/* GET ALL USERS ON THIS ROLE */ +INSERT INTO #UsersOnRole +SELECT + members.name +FROM sys.database_role_members + JOIN sys.database_principals roles ON database_role_members.role_principal_id = roles.principal_id + JOIN sys.database_principals members ON database_role_members.member_principal_id = members.principal_id +WHERE roles.name = @RoleName + +/* CREATE ROLE */ +SELECT @Command = '' +IF NOT EXISTS (SELECT 1 FROM sys.database_principals WHERE name = '''''' + @RoleName + '''''' AND type = ''''R'''') +BEGIN + CREATE ROLE ['' + @RoleName + ''] AUTHORIZATION [dbo] + PRINT ''''CREATE ROLE ['' + @RoleName + '']'''' +END +'' +EXEC sp_executesql @Command + +SET @Command = '' +DECLARE @SP_Name varchar(255) + +'' + +/* SET ALL ROLE SECURABLES */ +IF @Type = ''DEVE'' +BEGIN + + DECLARE SecurablesCurs CURSOR FOR + SELECT typeofobject, grantordeny, rightsaction, objectname, schemaid + FROM #Securables + WHERE N2 = 1 + + OPEN SecurablesCurs + FETCH NEXT FROM SecurablesCurs INTO @typeofobject, @grantordeny, @rightsaction, @objectname, @schemaid + WHILE @@FETCH_STATUS = 0 + BEGIN + + IF @typeofobject = ''DB'' + BEGIN + IF EXISTS(SELECT 1 FROM sys.fn_builtin_permissions(''DATABASE'') WHERE permission_name = '''' + @rightsaction + '''') + BEGIN + SET @Command = @Command + @grantordeny + '' '' + @rightsaction + '' TO ['' + @RoleName + ''] +'' + END + END + + IF @typeofobject = ''SCHEMA'' + BEGIN + SET @Command = @Command + '' +IF EXISTS (SELECT 1 FROM sys.schemas WHERE name = '''''' + @schemaid + '''''') +BEGIN + IF EXISTS(SELECT 1 FROM sys.fn_builtin_permissions(''''SCHEMA'''') WHERE permission_name = '''''' + @rightsaction + '''''') + BEGIN + '' + @grantordeny + '' '' + @rightsaction + '' ON SCHEMA::'' + @schemaid + '' TO ['' + @RoleName + ''] + END +END + +'' + END + + IF @typeofobject in(''TABLE'',''SP'',''FUNCTIONS'',''VIEWS'') + BEGIN + + IF @objectname like ''%[%]%'' + BEGIN + IF @typeofobject = ''TABLE'' + BEGIN + SET @sysTarget = ''sys.tables'' + SET @sysType = '''' + END + + IF @typeofobject = ''SP'' + BEGIN + SET @sysTarget = ''sys.procedures'' + SET @sysType = '''' + END + + IF @typeofobject = ''FUNCTIONS'' + BEGIN + SET @sysTarget = ''sys.objects'' + SET @sysType = '' and p.Type IN ( N''''FN'''', N''''IF'''', N''''TF'''', N''''FS'''', N''''FT'''' )'' + END + + IF @typeofobject = ''VIEWS'' + BEGIN + SET @sysTarget = ''sys.views'' + SET @sysType = '''' + END + + SET @Command = @Command + '' +DECLARE SP_cursor CURSOR FOR +SELECT p.name FROM '' + @sysTarget + '' p JOIN sys.schemas s ON s.schema_id = p.schema_id WHERE (p.name like '''''' + @objectname + '''''') and s.name = '''''' + @schemaid + '''' + @sysType + '''''' + +OPEN SP_cursor +FETCH NEXT FROM SP_cursor INTO @SP_Name +WHILE @@FETCH_STATUS = 0 +BEGIN + IF EXISTS(SELECT 1 FROM sys.fn_builtin_permissions(''''OBJECT'''') WHERE permission_name = '''''' + @rightsaction + '''''') + BEGIN + EXEC('''''' + @grantordeny + '' '' + @rightsaction + '' ON ['' + @schemaid + ''].['''' + @SP_Name + ''''] TO ['' + @RoleName + '']'''') + END + FETCH NEXT FROM SP_cursor INTO @SP_Name +END + +CLOSE SP_cursor +DEALLOCATE SP_cursor + +'' + + END + ELSE + BEGIN + + SET @Command = @Command + '' +IF EXISTS(SELECT 1 FROM sys.objects o WITH (NOLOCK) JOIN sys.schemas s ON s.schema_id = o.schema_id WHERE o.name = '''''' + @objectname + '''''' AND o.type IN (N''''U'''',''''P'''',''''V'''',''''FN'''',''''IF'''',''''TF'''') AND s.name = '''''' + @schemaid + '''''') +BEGIN + IF EXISTS(SELECT 1 FROM sys.fn_builtin_permissions(''''OBJECT'''') WHERE permission_name = '''''' + @rightsaction + '''''') + BEGIN + '' + @grantordeny + '' '' + @rightsaction + '' ON ['' + @schemaid + ''].['' + @objectname + ''] TO ['' + @RoleName + ''] + END +END + +'' + END + END + + IF @typeofobject = ''ASSEMBLIES'' + BEGIN + SET @Command = @Command + '' +IF EXISTS(SELECT 1 FROM sys.assemblies WHERE NAME = '''''' + @objectname + '''''') +BEGIN + IF EXISTS(SELECT 1 FROM sys.fn_builtin_permissions(''''ASSEMBLY'''') WHERE permission_name = '''''' + @rightsaction + '''''') + BEGIN + '' + @grantordeny + '' '' + @rightsaction + ''::['' + @objectname + ''] TO ['' + @RoleName + ''] + END +END + +'' + END + + IF @typeofobject = ''ROLE'' + BEGIN + SET @Command = @Command + '' +IF NOT EXISTS (SELECT 1 FROM sys.database_role_members JOIN sys.database_principals roles ON database_role_members.role_principal_id = roles.principal_id JOIN sys.database_principals members ON database_role_members.member_principal_id = members.principal_id WHERE roles.name = '''''' + @rightsaction + '''''' AND members.name = '''''' + @RoleName + '''''') +BEGIN + EXEC sp_addrolemember N'''''' + @rightsaction + '''''', N'''''' + @RoleName + '''''' +END + +'' + END + + FETCH NEXT FROM SecurablesCurs INTO @typeofobject, @grantordeny, @rightsaction, @objectname, @schemaid + END + +CLOSE SecurablesCurs +DEALLOCATE SecurablesCurs + +PRINT ''SET ALL SECURABLES ON ROLE ['' + @RoleName + '']'' +EXEC sp_executesql @Command + +END +ELSE +BEGIN + + DECLARE SecurablesCurs CURSOR FOR + SELECT typeofobject, grantordeny, rightsaction, objectname, schemaid + FROM #Securables + WHERE N2 = 0 + + OPEN SecurablesCurs + FETCH NEXT FROM SecurablesCurs INTO @typeofobject, @grantordeny, @rightsaction, @objectname, @schemaid + WHILE @@FETCH_STATUS = 0 + BEGIN + + IF @typeofobject = ''DB'' + BEGIN + IF EXISTS(SELECT 1 FROM sys.fn_builtin_permissions(''DATABASE'') WHERE permission_name = '''' + @rightsaction + '''') + BEGIN + SET @Command = @Command + @grantordeny + '' '' + @rightsaction + '' TO ['' + @RoleName + ''] +'' + END + END + + IF @typeofobject = ''SCHEMA'' + BEGIN + SET @Command = @Command + '' +IF EXISTS (SELECT 1 FROM sys.schemas WHERE name = '''''' + @schemaid + '''''') +BEGIN + IF EXISTS(SELECT 1 FROM sys.fn_builtin_permissions(''''SCHEMA'''') WHERE permission_name = '''''' + @rightsaction + '''''') + BEGIN + '' + @grantordeny + '' '' + @rightsaction + '' ON SCHEMA::'' + @schemaid + '' TO ['' + @RoleName + ''] + END +END + +'' + END + + IF @typeofobject in(''TABLE'',''SP'',''FUNCTIONS'',''VIEWS'') + BEGIN + + IF @objectname like ''%[%]%'' + BEGIN + + IF @typeofobject = ''TABLE'' + BEGIN + SET @sysTarget = ''sys.tables'' + SET @sysType = '''' + END + + IF @typeofobject = ''SP'' + BEGIN + SET @sysTarget = ''sys.procedures'' + SET @sysType = '''' + END + + IF @typeofobject = ''FUNCTIONS'' + BEGIN + SET @sysTarget = ''sys.objects'' + SET @sysType = '' and p.Type IN ( N''''FN'''', N''''IF'''', N''''TF'''', N''''FS'''', N''''FT'''' )'' + END + + IF @typeofobject = ''VIEWS'' + BEGIN + SET @sysTarget = ''sys.views'' + SET @sysType = '''' + END + + SET @Command = @Command + '' +DECLARE SP_cursor CURSOR FOR +SELECT p.name FROM '' + @sysTarget + '' p JOIN sys.schemas s ON s.schema_id = p.schema_id WHERE (p.name like '''''' + @objectname + '''''') and s.name = '''''' + @schemaid + '''' + @sysType + '''''' + +OPEN SP_cursor +FETCH NEXT FROM SP_cursor INTO @SP_Name +WHILE @@FETCH_STATUS = 0 +BEGIN + IF EXISTS(SELECT 1 FROM sys.fn_builtin_permissions(''''OBJECT'''') WHERE permission_name = '''''' + @rightsaction + '''''') + BEGIN + EXEC('''''' + @grantordeny + '' '' + @rightsaction + '' ON ['' + @schemaid + ''].['''' + @SP_Name + ''''] TO ['' + @RoleName + '']'''') + END + FETCH NEXT FROM SP_cursor INTO @SP_Name +END + +CLOSE SP_cursor +DEALLOCATE SP_cursor + +'' + + END + ELSE + BEGIN + + SET @Command = @Command + '' +IF EXISTS(SELECT 1 FROM sys.objects o WITH (NOLOCK) JOIN sys.schemas s ON s.schema_id = o.schema_id WHERE o.name = '''''' + @objectname + '''''' AND o.type IN (N''''U'''',''''P'''',''''V'''',''''FN'''',''''IF'''',''''TF'''') AND s.name = '''''' + @schemaid + '''''') +BEGIN + IF EXISTS(SELECT 1 FROM sys.fn_builtin_permissions(''''OBJECT'''') WHERE permission_name = '''''' + @rightsaction + '''''') + BEGIN + '' + @grantordeny + '' '' + @rightsaction + '' ON ['' + @schemaid + ''].['' + @objectname + ''] TO ['' + @RoleName + ''] + END +END + +'' + END + END + + IF @typeofobject = ''ASSEMBLIES'' + BEGIN + SET @Command = @Command + '' +IF EXISTS(SELECT 1 FROM sys.assemblies WHERE NAME = '''''' + @objectname + '''''') +BEGIN + IF EXISTS(SELECT 1 FROM sys.fn_builtin_permissions(''''ASSEMBLY'''') WHERE permission_name = '''''' + @rightsaction + '''''') + BEGIN + '' + @grantordeny + '' '' + @rightsaction + ''::['' + @objectname + ''] TO ['' + @RoleName + ''] + END +END + +'' + END + + IF @typeofobject = ''ROLE'' + BEGIN + SET @Command = @Command + '' +IF NOT EXISTS (SELECT 1 FROM sys.database_role_members JOIN sys.database_principals roles ON database_role_members.role_principal_id = roles.principal_id JOIN sys.database_principals members ON database_role_members.member_principal_id = members.principal_id WHERE roles.name = '''''' + @rightsaction + '''''' AND members.name = '''''' + @RoleName + '''''') +BEGIN + EXEC sp_addrolemember N'''''' + @rightsaction + '''''', N'''''' + @RoleName + '''''' +END + +'' + END + + FETCH NEXT FROM SecurablesCurs INTO @typeofobject, @grantordeny, @rightsaction, @objectname, @schemaid + END + +CLOSE SecurablesCurs +DEALLOCATE SecurablesCurs + +PRINT ''SET ALL SECURABLES ON ROLE ['' + @RoleName + '']'' +EXEC sp_executesql @Command + +END + +/* ADD USER */ +DECLARE UsersCurs CURSOR FOR +SELECT username + FROM #UsersOnRole + +OPEN UsersCurs + +FETCH NEXT FROM UsersCurs INTO @Users +WHILE @@FETCH_STATUS = 0 +BEGIN + + SELECT @Command = '' +EXEC sp_addrolemember N'''''' + @RoleName + '''''', N'''''' + @Users + '''''' +PRINT ''''ADD USER ['' + @Users + ''] ON ROLE ['' + @RoleName + '']'''' +'' + +FETCH NEXT FROM UsersCurs INTO @Users +END + +CLOSE UsersCurs +DEALLOCATE UsersCurs + +EXEC sp_executesql @Command + +/*============================================================================= + Drop temp tables +=============================================================================*/ +DROP TABLE #Securables +DROP TABLE #UsersOnRole','Symbiose','Pharmacies') + +INSERT INTO #AllRoles(STR_Definition,STR_Database,STR_Product)VALUES(' + +/*============================================================================= + + Script to create dbRoleDevUsr role. + + Role Name: dbRoleDevUsr + TEMPLATE: Default + + EXAMPLE OF SECURABLES TO SET: + + INSERT INTO #Securables + VALUES + (''DB'',''GRANT'',''VIEW DEFINITION'','''',''''), + (''SCHEMA'',''GRANT'',''SELECT,EXECUTE,INSERT,UPDATE,DELETE'','''',''AP''), + (''TABLE'',''GRANT'',''INSERT,UPDATE'',''Address'',''dbo''), + (''SP'',''GRANT'',''EXECUTE'',''sp_bmc_GetNextID'',''dbo''), + (''ROLE'',''GRANT'',''db_datareader'','''','''') + + ----------------------------------------------- + +Generate date : 2023-05-12 / up208700 + +=============================================================================*/ + +DECLARE @Command nvarchar(max), + @RoleName varchar(60), + @Users varchar(255), + @typeofobject varchar(50), + @grantordeny varchar(10), + @rightsaction varchar(255), + @objectname varchar(255), + @schemaid varchar(10), + @sysTarget varchar(255), + @sysType varchar(255) + +SET @RoleName = ''dbRoleDevUsr'' +SET @Command = '''' + +/* TEMP TABLES */ +CREATE TABLE #UsersOnRole(username varchar(255)) +CREATE TABLE #Securables(typeofobject varchar(50), grantordeny varchar(10), rightsaction varchar(255), objectname varchar(255), schemaid varchar(10),N2 bit) + +/* !!! LIST OF SECURABLES TO CHANGE !!! */ + +INSERT INTO #Securables +VALUES +(''ROLE'',''GRANT'',''DB_OWNER'','''',''dbo'',0) + + +/* GET ALL USERS ON THIS ROLE */ +INSERT INTO #UsersOnRole +SELECT + members.name +FROM sys.database_role_members + JOIN sys.database_principals roles ON database_role_members.role_principal_id = roles.principal_id + JOIN sys.database_principals members ON database_role_members.member_principal_id = members.principal_id +WHERE roles.name = @RoleName + +/* CREATE ROLE */ +SELECT @Command = '' +IF NOT EXISTS (SELECT 1 FROM sys.database_principals WHERE name = '''''' + @RoleName + '''''' AND type = ''''R'''') +BEGIN + CREATE ROLE ['' + @RoleName + ''] AUTHORIZATION [dbo] + PRINT ''''CREATE ROLE ['' + @RoleName + '']'''' +END +'' +EXEC sp_executesql @Command + +SET @Command = '' +DECLARE @SP_Name varchar(255) + +'' + +/* SET ALL ROLE SECURABLES */ +DECLARE SecurablesCurs CURSOR FOR +SELECT typeofobject, grantordeny, rightsaction, objectname, schemaid +FROM #Securables +WHERE N2 = 0 + +OPEN SecurablesCurs +FETCH NEXT FROM SecurablesCurs INTO @typeofobject, @grantordeny, @rightsaction, @objectname, @schemaid +WHILE @@FETCH_STATUS = 0 +BEGIN + + IF @typeofobject = ''DB'' + BEGIN + IF EXISTS(SELECT 1 FROM sys.fn_builtin_permissions(''DATABASE'') WHERE permission_name = '''' + @rightsaction + '''') + BEGIN + SET @Command = @Command + @grantordeny + '' '' + @rightsaction + '' TO ['' + @RoleName + ''] +'' + END + END + + IF @typeofobject = ''SCHEMA'' + BEGIN + SET @Command = @Command + '' +IF EXISTS (SELECT 1 FROM sys.schemas WHERE name = '''''' + @schemaid + '''''') +BEGIN + IF EXISTS(SELECT 1 FROM sys.fn_builtin_permissions(''''SCHEMA'''') WHERE permission_name = '''''' + @rightsaction + '''''') + BEGIN + '' + @grantordeny + '' '' + @rightsaction + '' ON SCHEMA::'' + @schemaid + '' TO ['' + @RoleName + ''] + END +END + +'' + END + + IF @typeofobject in(''TABLE'',''SP'',''FUNCTIONS'',''VIEWS'') + BEGIN + + IF @objectname like ''%[%]%'' + BEGIN + + IF @typeofobject = ''TABLE'' + BEGIN + SET @sysTarget = ''sys.tables'' + SET @sysType = '''' + END + + IF @typeofobject = ''SP'' + BEGIN + SET @sysTarget = ''sys.procedures'' + SET @sysType = '''' + END + + IF @typeofobject = ''FUNCTIONS'' + BEGIN + SET @sysTarget = ''sys.objects'' + SET @sysType = '' and p.Type IN ( N''''FN'''', N''''IF'''', N''''TF'''', N''''FS'''', N''''FT'''' )'' + END + + IF @typeofobject = ''VIEWS'' + BEGIN + SET @sysTarget = ''sys.views'' + SET @sysType = '''' + END + + SET @Command = @Command + '' +DECLARE SP_cursor CURSOR FOR +SELECT p.name FROM '' + @sysTarget + '' p JOIN sys.schemas s ON s.schema_id = p.schema_id WHERE (p.name like '''''' + @objectname + '''''') and s.name = '''''' + @schemaid + '''' + @sysType + '''''' + +OPEN SP_cursor +FETCH NEXT FROM SP_cursor INTO @SP_Name +WHILE @@FETCH_STATUS = 0 +BEGIN + IF EXISTS(SELECT 1 FROM sys.fn_builtin_permissions(''''OBJECT'''') WHERE permission_name = '''''' + @rightsaction + '''''') + BEGIN + EXEC('''''' + @grantordeny + '' '' + @rightsaction + '' ON ['' + @schemaid + ''].['''' + @SP_Name + ''''] TO ['' + @RoleName + '']'''') + END + FETCH NEXT FROM SP_cursor INTO @SP_Name +END + +CLOSE SP_cursor +DEALLOCATE SP_cursor + +'' + + END + ELSE + BEGIN + + SET @Command = @Command + '' +IF EXISTS(SELECT 1 FROM sys.objects o WITH (NOLOCK) JOIN sys.schemas s ON s.schema_id = o.schema_id WHERE o.name = '''''' + @objectname + '''''' AND o.type IN (N''''U'''',''''P'''',''''V'''',''''FN'''',''''IF'''',''''TF'''') AND s.name = '''''' + @schemaid + '''''') +BEGIN + IF EXISTS(SELECT 1 FROM sys.fn_builtin_permissions(''''OBJECT'''') WHERE permission_name = '''''' + @rightsaction + '''''') + BEGIN + '' + @grantordeny + '' '' + @rightsaction + '' ON ['' + @schemaid + ''].['' + @objectname + ''] TO ['' + @RoleName + ''] + END +END + +'' + END +END + +IF @typeofobject = ''ASSEMBLIES'' +BEGIN + SET @Command = @Command + '' +IF EXISTS(SELECT 1 FROM sys.assemblies WHERE NAME = '''''' + @objectname + '''''') +BEGIN + IF EXISTS(SELECT 1 FROM sys.fn_builtin_permissions(''''ASSEMBLY'''') WHERE permission_name = '''''' + @rightsaction + '''''') + BEGIN + '' + @grantordeny + '' '' + @rightsaction + ''::['' + @objectname + ''] TO ['' + @RoleName + ''] + END +END + +'' +END + +IF @typeofobject = ''ROLE'' +BEGIN + SET @Command = @Command + '' +IF NOT EXISTS (SELECT 1 FROM sys.database_role_members JOIN sys.database_principals roles ON database_role_members.role_principal_id = roles.principal_id JOIN sys.database_principals members ON database_role_members.member_principal_id = members.principal_id WHERE roles.name = '''''' + @rightsaction + '''''' AND members.name = '''''' + @RoleName + '''''') +BEGIN + EXEC sp_addrolemember N'''''' + @rightsaction + '''''', N'''''' + @RoleName + '''''' +END + +'' +END + +FETCH NEXT FROM SecurablesCurs INTO @typeofobject, @grantordeny, @rightsaction, @objectname, @schemaid +END + +CLOSE SecurablesCurs +DEALLOCATE SecurablesCurs + +PRINT ''SET ALL SECURABLES ON ROLE ['' + @RoleName + '']'' +EXEC sp_executesql @Command + +/* ADD USER */ +DECLARE UsersCurs CURSOR FOR +SELECT username + FROM #UsersOnRole + +OPEN UsersCurs + +FETCH NEXT FROM UsersCurs INTO @Users +WHILE @@FETCH_STATUS = 0 +BEGIN + + SELECT @Command = '' +EXEC sp_addrolemember N'''''' + @RoleName + '''''', N'''''' + @Users + '''''' +PRINT ''''ADD USER ['' + @Users + ''] ON ROLE ['' + @RoleName + '']'''' +'' + +FETCH NEXT FROM UsersCurs INTO @Users +END + +CLOSE UsersCurs +DEALLOCATE UsersCurs + +EXEC sp_executesql @Command + + +/*============================================================================= + Drop temp tables +=============================================================================*/ +DROP TABLE #Securables +DROP TABLE #UsersOnRole +','Golabo','Pharmacies') + +INSERT INTO #AllRoles(STR_Definition,STR_Database,STR_Product)VALUES(' + +/*============================================================================= + + Script to create dbRoleGaia role. + + Role Name: dbRoleGaia + TEMPLATE: Default + + EXAMPLE OF SECURABLES TO SET: + + INSERT INTO #Securables + VALUES + (''DB'',''GRANT'',''VIEW DEFINITION'','''',''''), + (''SCHEMA'',''GRANT'',''SELECT,EXECUTE,INSERT,UPDATE,DELETE'','''',''AP''), + (''TABLE'',''GRANT'',''INSERT,UPDATE'',''Address'',''dbo''), + (''SP'',''GRANT'',''EXECUTE'',''sp_bmc_GetNextID'',''dbo''), + (''ROLE'',''GRANT'',''db_datareader'','''','''') + + ----------------------------------------------- + +Generate date : 2023-05-12 / up208700 + +=============================================================================*/ + +DECLARE @Command nvarchar(max), + @RoleName varchar(60), + @Users varchar(255), + @typeofobject varchar(50), + @grantordeny varchar(10), + @rightsaction varchar(255), + @objectname varchar(255), + @schemaid varchar(10), + @sysTarget varchar(255), + @sysType varchar(255) + +SET @RoleName = ''dbRoleGaia'' +SET @Command = '''' + +/* TEMP TABLES */ +CREATE TABLE #UsersOnRole(username varchar(255)) +CREATE TABLE #Securables(typeofobject varchar(50), grantordeny varchar(10), rightsaction varchar(255), objectname varchar(255), schemaid varchar(10),N2 bit) + +/* !!! LIST OF SECURABLES TO CHANGE !!! */ + +INSERT INTO #Securables +VALUES +(''ROLE'',''GRANT'',''DB_DATAREADER'','''',''dbo'',0) + + +/* GET ALL USERS ON THIS ROLE */ +INSERT INTO #UsersOnRole +SELECT + members.name +FROM sys.database_role_members + JOIN sys.database_principals roles ON database_role_members.role_principal_id = roles.principal_id + JOIN sys.database_principals members ON database_role_members.member_principal_id = members.principal_id +WHERE roles.name = @RoleName + +/* CREATE ROLE */ +SELECT @Command = '' +IF NOT EXISTS (SELECT 1 FROM sys.database_principals WHERE name = '''''' + @RoleName + '''''' AND type = ''''R'''') +BEGIN + CREATE ROLE ['' + @RoleName + ''] AUTHORIZATION [dbo] + PRINT ''''CREATE ROLE ['' + @RoleName + '']'''' +END +'' +EXEC sp_executesql @Command + +SET @Command = '' +DECLARE @SP_Name varchar(255) + +'' + +/* SET ALL ROLE SECURABLES */ +DECLARE SecurablesCurs CURSOR FOR +SELECT typeofobject, grantordeny, rightsaction, objectname, schemaid +FROM #Securables +WHERE N2 = 0 + +OPEN SecurablesCurs +FETCH NEXT FROM SecurablesCurs INTO @typeofobject, @grantordeny, @rightsaction, @objectname, @schemaid +WHILE @@FETCH_STATUS = 0 +BEGIN + + IF @typeofobject = ''DB'' + BEGIN + IF EXISTS(SELECT 1 FROM sys.fn_builtin_permissions(''DATABASE'') WHERE permission_name = '''' + @rightsaction + '''') + BEGIN + SET @Command = @Command + @grantordeny + '' '' + @rightsaction + '' TO ['' + @RoleName + ''] +'' + END + END + + IF @typeofobject = ''SCHEMA'' + BEGIN + SET @Command = @Command + '' +IF EXISTS (SELECT 1 FROM sys.schemas WHERE name = '''''' + @schemaid + '''''') +BEGIN + IF EXISTS(SELECT 1 FROM sys.fn_builtin_permissions(''''SCHEMA'''') WHERE permission_name = '''''' + @rightsaction + '''''') + BEGIN + '' + @grantordeny + '' '' + @rightsaction + '' ON SCHEMA::'' + @schemaid + '' TO ['' + @RoleName + ''] + END +END + +'' + END + + IF @typeofobject in(''TABLE'',''SP'',''FUNCTIONS'',''VIEWS'') + BEGIN + + IF @objectname like ''%[%]%'' + BEGIN + + IF @typeofobject = ''TABLE'' + BEGIN + SET @sysTarget = ''sys.tables'' + SET @sysType = '''' + END + + IF @typeofobject = ''SP'' + BEGIN + SET @sysTarget = ''sys.procedures'' + SET @sysType = '''' + END + + IF @typeofobject = ''FUNCTIONS'' + BEGIN + SET @sysTarget = ''sys.objects'' + SET @sysType = '' and p.Type IN ( N''''FN'''', N''''IF'''', N''''TF'''', N''''FS'''', N''''FT'''' )'' + END + + IF @typeofobject = ''VIEWS'' + BEGIN + SET @sysTarget = ''sys.views'' + SET @sysType = '''' + END + + SET @Command = @Command + '' +DECLARE SP_cursor CURSOR FOR +SELECT p.name FROM '' + @sysTarget + '' p JOIN sys.schemas s ON s.schema_id = p.schema_id WHERE (p.name like '''''' + @objectname + '''''') and s.name = '''''' + @schemaid + '''' + @sysType + '''''' + +OPEN SP_cursor +FETCH NEXT FROM SP_cursor INTO @SP_Name +WHILE @@FETCH_STATUS = 0 +BEGIN + IF EXISTS(SELECT 1 FROM sys.fn_builtin_permissions(''''OBJECT'''') WHERE permission_name = '''''' + @rightsaction + '''''') + BEGIN + EXEC('''''' + @grantordeny + '' '' + @rightsaction + '' ON ['' + @schemaid + ''].['''' + @SP_Name + ''''] TO ['' + @RoleName + '']'''') + END + FETCH NEXT FROM SP_cursor INTO @SP_Name +END + +CLOSE SP_cursor +DEALLOCATE SP_cursor + +'' + + END + ELSE + BEGIN + + SET @Command = @Command + '' +IF EXISTS(SELECT 1 FROM sys.objects o WITH (NOLOCK) JOIN sys.schemas s ON s.schema_id = o.schema_id WHERE o.name = '''''' + @objectname + '''''' AND o.type IN (N''''U'''',''''P'''',''''V'''',''''FN'''',''''IF'''',''''TF'''') AND s.name = '''''' + @schemaid + '''''') +BEGIN + IF EXISTS(SELECT 1 FROM sys.fn_builtin_permissions(''''OBJECT'''') WHERE permission_name = '''''' + @rightsaction + '''''') + BEGIN + '' + @grantordeny + '' '' + @rightsaction + '' ON ['' + @schemaid + ''].['' + @objectname + ''] TO ['' + @RoleName + ''] + END +END + +'' + END +END + +IF @typeofobject = ''ASSEMBLIES'' +BEGIN + SET @Command = @Command + '' +IF EXISTS(SELECT 1 FROM sys.assemblies WHERE NAME = '''''' + @objectname + '''''') +BEGIN + IF EXISTS(SELECT 1 FROM sys.fn_builtin_permissions(''''ASSEMBLY'''') WHERE permission_name = '''''' + @rightsaction + '''''') + BEGIN + '' + @grantordeny + '' '' + @rightsaction + ''::['' + @objectname + ''] TO ['' + @RoleName + ''] + END +END + +'' +END + +IF @typeofobject = ''ROLE'' +BEGIN + SET @Command = @Command + '' +IF NOT EXISTS (SELECT 1 FROM sys.database_role_members JOIN sys.database_principals roles ON database_role_members.role_principal_id = roles.principal_id JOIN sys.database_principals members ON database_role_members.member_principal_id = members.principal_id WHERE roles.name = '''''' + @rightsaction + '''''' AND members.name = '''''' + @RoleName + '''''') +BEGIN + EXEC sp_addrolemember N'''''' + @rightsaction + '''''', N'''''' + @RoleName + '''''' +END + +'' +END + +FETCH NEXT FROM SecurablesCurs INTO @typeofobject, @grantordeny, @rightsaction, @objectname, @schemaid +END + +CLOSE SecurablesCurs +DEALLOCATE SecurablesCurs + +PRINT ''SET ALL SECURABLES ON ROLE ['' + @RoleName + '']'' +EXEC sp_executesql @Command + +/* ADD USER */ +DECLARE UsersCurs CURSOR FOR +SELECT username + FROM #UsersOnRole + +OPEN UsersCurs + +FETCH NEXT FROM UsersCurs INTO @Users +WHILE @@FETCH_STATUS = 0 +BEGIN + + SELECT @Command = '' +EXEC sp_addrolemember N'''''' + @RoleName + '''''', N'''''' + @Users + '''''' +PRINT ''''ADD USER ['' + @Users + ''] ON ROLE ['' + @RoleName + '']'''' +'' + +FETCH NEXT FROM UsersCurs INTO @Users +END + +CLOSE UsersCurs +DEALLOCATE UsersCurs + +EXEC sp_executesql @Command + + +/*============================================================================= + Drop temp tables +=============================================================================*/ +DROP TABLE #Securables +DROP TABLE #UsersOnRole +','Arizona','Pharmacies') + +INSERT INTO #AllRoles(STR_Definition,STR_Database,STR_Product)VALUES(' + +/*============================================================================= + + Script to create dbRoleQAtesters role. + + Role Name: dbRoleQAtesters + TEMPLATE: Default + + EXAMPLE OF SECURABLES TO SET: + + INSERT INTO #Securables + VALUES + (''DB'',''GRANT'',''VIEW DEFINITION'','''',''''), + (''SCHEMA'',''GRANT'',''SELECT,EXECUTE,INSERT,UPDATE,DELETE'','''',''AP''), + (''TABLE'',''GRANT'',''INSERT,UPDATE'',''Address'',''dbo''), + (''SP'',''GRANT'',''EXECUTE'',''sp_bmc_GetNextID'',''dbo''), + (''ROLE'',''GRANT'',''db_datareader'','''','''') + + ----------------------------------------------- + +Generate date : 2023-05-12 / up208700 + +=============================================================================*/ + +DECLARE @Command nvarchar(max), + @RoleName varchar(60), + @Users varchar(255), + @typeofobject varchar(50), + @grantordeny varchar(10), + @rightsaction varchar(255), + @objectname varchar(255), + @schemaid varchar(10), + @sysTarget varchar(255), + @sysType varchar(255) + +SET @RoleName = ''dbRoleQAtesters'' +SET @Command = '''' + +/* TEMP TABLES */ +CREATE TABLE #UsersOnRole(username varchar(255)) +CREATE TABLE #Securables(typeofobject varchar(50), grantordeny varchar(10), rightsaction varchar(255), objectname varchar(255), schemaid varchar(10),N2 bit) + +/* !!! LIST OF SECURABLES TO CHANGE !!! */ + +INSERT INTO #Securables +VALUES +(''ROLE'',''GRANT'',''DB_DATAREADER'','''',''dbo'',0) + + +/* GET ALL USERS ON THIS ROLE */ +INSERT INTO #UsersOnRole +SELECT + members.name +FROM sys.database_role_members + JOIN sys.database_principals roles ON database_role_members.role_principal_id = roles.principal_id + JOIN sys.database_principals members ON database_role_members.member_principal_id = members.principal_id +WHERE roles.name = @RoleName + +/* CREATE ROLE */ +SELECT @Command = '' +IF NOT EXISTS (SELECT 1 FROM sys.database_principals WHERE name = '''''' + @RoleName + '''''' AND type = ''''R'''') +BEGIN + CREATE ROLE ['' + @RoleName + ''] AUTHORIZATION [dbo] + PRINT ''''CREATE ROLE ['' + @RoleName + '']'''' +END +'' +EXEC sp_executesql @Command + +SET @Command = '' +DECLARE @SP_Name varchar(255) + +'' + +/* SET ALL ROLE SECURABLES */ +DECLARE SecurablesCurs CURSOR FOR +SELECT typeofobject, grantordeny, rightsaction, objectname, schemaid +FROM #Securables +WHERE N2 = 0 + +OPEN SecurablesCurs +FETCH NEXT FROM SecurablesCurs INTO @typeofobject, @grantordeny, @rightsaction, @objectname, @schemaid +WHILE @@FETCH_STATUS = 0 +BEGIN + + IF @typeofobject = ''DB'' + BEGIN + IF EXISTS(SELECT 1 FROM sys.fn_builtin_permissions(''DATABASE'') WHERE permission_name = '''' + @rightsaction + '''') + BEGIN + SET @Command = @Command + @grantordeny + '' '' + @rightsaction + '' TO ['' + @RoleName + ''] +'' + END + END + + IF @typeofobject = ''SCHEMA'' + BEGIN + SET @Command = @Command + '' +IF EXISTS (SELECT 1 FROM sys.schemas WHERE name = '''''' + @schemaid + '''''') +BEGIN + IF EXISTS(SELECT 1 FROM sys.fn_builtin_permissions(''''SCHEMA'''') WHERE permission_name = '''''' + @rightsaction + '''''') + BEGIN + '' + @grantordeny + '' '' + @rightsaction + '' ON SCHEMA::'' + @schemaid + '' TO ['' + @RoleName + ''] + END +END + +'' + END + + IF @typeofobject in(''TABLE'',''SP'',''FUNCTIONS'',''VIEWS'') + BEGIN + + IF @objectname like ''%[%]%'' + BEGIN + + IF @typeofobject = ''TABLE'' + BEGIN + SET @sysTarget = ''sys.tables'' + SET @sysType = '''' + END + + IF @typeofobject = ''SP'' + BEGIN + SET @sysTarget = ''sys.procedures'' + SET @sysType = '''' + END + + IF @typeofobject = ''FUNCTIONS'' + BEGIN + SET @sysTarget = ''sys.objects'' + SET @sysType = '' and p.Type IN ( N''''FN'''', N''''IF'''', N''''TF'''', N''''FS'''', N''''FT'''' )'' + END + + IF @typeofobject = ''VIEWS'' + BEGIN + SET @sysTarget = ''sys.views'' + SET @sysType = '''' + END + + SET @Command = @Command + '' +DECLARE SP_cursor CURSOR FOR +SELECT p.name FROM '' + @sysTarget + '' p JOIN sys.schemas s ON s.schema_id = p.schema_id WHERE (p.name like '''''' + @objectname + '''''') and s.name = '''''' + @schemaid + '''' + @sysType + '''''' + +OPEN SP_cursor +FETCH NEXT FROM SP_cursor INTO @SP_Name +WHILE @@FETCH_STATUS = 0 +BEGIN + IF EXISTS(SELECT 1 FROM sys.fn_builtin_permissions(''''OBJECT'''') WHERE permission_name = '''''' + @rightsaction + '''''') + BEGIN + EXEC('''''' + @grantordeny + '' '' + @rightsaction + '' ON ['' + @schemaid + ''].['''' + @SP_Name + ''''] TO ['' + @RoleName + '']'''') + END + FETCH NEXT FROM SP_cursor INTO @SP_Name +END + +CLOSE SP_cursor +DEALLOCATE SP_cursor + +'' + + END + ELSE + BEGIN + + SET @Command = @Command + '' +IF EXISTS(SELECT 1 FROM sys.objects o WITH (NOLOCK) JOIN sys.schemas s ON s.schema_id = o.schema_id WHERE o.name = '''''' + @objectname + '''''' AND o.type IN (N''''U'''',''''P'''',''''V'''',''''FN'''',''''IF'''',''''TF'''') AND s.name = '''''' + @schemaid + '''''') +BEGIN + IF EXISTS(SELECT 1 FROM sys.fn_builtin_permissions(''''OBJECT'''') WHERE permission_name = '''''' + @rightsaction + '''''') + BEGIN + '' + @grantordeny + '' '' + @rightsaction + '' ON ['' + @schemaid + ''].['' + @objectname + ''] TO ['' + @RoleName + ''] + END +END + +'' + END +END + +IF @typeofobject = ''ASSEMBLIES'' +BEGIN + SET @Command = @Command + '' +IF EXISTS(SELECT 1 FROM sys.assemblies WHERE NAME = '''''' + @objectname + '''''') +BEGIN + IF EXISTS(SELECT 1 FROM sys.fn_builtin_permissions(''''ASSEMBLY'''') WHERE permission_name = '''''' + @rightsaction + '''''') + BEGIN + '' + @grantordeny + '' '' + @rightsaction + ''::['' + @objectname + ''] TO ['' + @RoleName + ''] + END +END + +'' +END + +IF @typeofobject = ''ROLE'' +BEGIN + SET @Command = @Command + '' +IF NOT EXISTS (SELECT 1 FROM sys.database_role_members JOIN sys.database_principals roles ON database_role_members.role_principal_id = roles.principal_id JOIN sys.database_principals members ON database_role_members.member_principal_id = members.principal_id WHERE roles.name = '''''' + @rightsaction + '''''' AND members.name = '''''' + @RoleName + '''''') +BEGIN + EXEC sp_addrolemember N'''''' + @rightsaction + '''''', N'''''' + @RoleName + '''''' +END + +'' +END + +FETCH NEXT FROM SecurablesCurs INTO @typeofobject, @grantordeny, @rightsaction, @objectname, @schemaid +END + +CLOSE SecurablesCurs +DEALLOCATE SecurablesCurs + +PRINT ''SET ALL SECURABLES ON ROLE ['' + @RoleName + '']'' +EXEC sp_executesql @Command + +/* ADD USER */ +DECLARE UsersCurs CURSOR FOR +SELECT username + FROM #UsersOnRole + +OPEN UsersCurs + +FETCH NEXT FROM UsersCurs INTO @Users +WHILE @@FETCH_STATUS = 0 +BEGIN + + SELECT @Command = '' +EXEC sp_addrolemember N'''''' + @RoleName + '''''', N'''''' + @Users + '''''' +PRINT ''''ADD USER ['' + @Users + ''] ON ROLE ['' + @RoleName + '']'''' +'' + +FETCH NEXT FROM UsersCurs INTO @Users +END + +CLOSE UsersCurs +DEALLOCATE UsersCurs + +EXEC sp_executesql @Command + + +/*============================================================================= + Drop temp tables +=============================================================================*/ +DROP TABLE #Securables +DROP TABLE #UsersOnRole +','ActivePos_read','Pharmacies') + +INSERT INTO #AllRoles(STR_Definition,STR_Database,STR_Product)VALUES(' + +/*============================================================================= + + Script to create dbRoleQAtesters role. + + Role Name: dbRoleQAtesters + TEMPLATE: Default + + EXAMPLE OF SECURABLES TO SET: + + INSERT INTO #Securables + VALUES + (''DB'',''GRANT'',''VIEW DEFINITION'','''',''''), + (''SCHEMA'',''GRANT'',''SELECT,EXECUTE,INSERT,UPDATE,DELETE'','''',''AP''), + (''TABLE'',''GRANT'',''INSERT,UPDATE'',''Address'',''dbo''), + (''SP'',''GRANT'',''EXECUTE'',''sp_bmc_GetNextID'',''dbo''), + (''ROLE'',''GRANT'',''db_datareader'','''','''') + + ----------------------------------------------- + +Generate date : 2023-05-12 / up208700 + +=============================================================================*/ + +DECLARE @Command nvarchar(max), + @RoleName varchar(60), + @Users varchar(255), + @typeofobject varchar(50), + @grantordeny varchar(10), + @rightsaction varchar(255), + @objectname varchar(255), + @schemaid varchar(10), + @sysTarget varchar(255), + @sysType varchar(255) + +SET @RoleName = ''dbRoleQAtesters'' +SET @Command = '''' + +/* TEMP TABLES */ +CREATE TABLE #UsersOnRole(username varchar(255)) +CREATE TABLE #Securables(typeofobject varchar(50), grantordeny varchar(10), rightsaction varchar(255), objectname varchar(255), schemaid varchar(10),N2 bit) + +/* !!! LIST OF SECURABLES TO CHANGE !!! */ + +INSERT INTO #Securables +VALUES +(''ROLE'',''GRANT'',''DB_DATAREADER'','''',''dbo'',0) + + +/* GET ALL USERS ON THIS ROLE */ +INSERT INTO #UsersOnRole +SELECT + members.name +FROM sys.database_role_members + JOIN sys.database_principals roles ON database_role_members.role_principal_id = roles.principal_id + JOIN sys.database_principals members ON database_role_members.member_principal_id = members.principal_id +WHERE roles.name = @RoleName + +/* CREATE ROLE */ +SELECT @Command = '' +IF NOT EXISTS (SELECT 1 FROM sys.database_principals WHERE name = '''''' + @RoleName + '''''' AND type = ''''R'''') +BEGIN + CREATE ROLE ['' + @RoleName + ''] AUTHORIZATION [dbo] + PRINT ''''CREATE ROLE ['' + @RoleName + '']'''' +END +'' +EXEC sp_executesql @Command + +SET @Command = '' +DECLARE @SP_Name varchar(255) + +'' + +/* SET ALL ROLE SECURABLES */ +DECLARE SecurablesCurs CURSOR FOR +SELECT typeofobject, grantordeny, rightsaction, objectname, schemaid +FROM #Securables +WHERE N2 = 0 + +OPEN SecurablesCurs +FETCH NEXT FROM SecurablesCurs INTO @typeofobject, @grantordeny, @rightsaction, @objectname, @schemaid +WHILE @@FETCH_STATUS = 0 +BEGIN + + IF @typeofobject = ''DB'' + BEGIN + IF EXISTS(SELECT 1 FROM sys.fn_builtin_permissions(''DATABASE'') WHERE permission_name = '''' + @rightsaction + '''') + BEGIN + SET @Command = @Command + @grantordeny + '' '' + @rightsaction + '' TO ['' + @RoleName + ''] +'' + END + END + + IF @typeofobject = ''SCHEMA'' + BEGIN + SET @Command = @Command + '' +IF EXISTS (SELECT 1 FROM sys.schemas WHERE name = '''''' + @schemaid + '''''') +BEGIN + IF EXISTS(SELECT 1 FROM sys.fn_builtin_permissions(''''SCHEMA'''') WHERE permission_name = '''''' + @rightsaction + '''''') + BEGIN + '' + @grantordeny + '' '' + @rightsaction + '' ON SCHEMA::'' + @schemaid + '' TO ['' + @RoleName + ''] + END +END + +'' + END + + IF @typeofobject in(''TABLE'',''SP'',''FUNCTIONS'',''VIEWS'') + BEGIN + + IF @objectname like ''%[%]%'' + BEGIN + + IF @typeofobject = ''TABLE'' + BEGIN + SET @sysTarget = ''sys.tables'' + SET @sysType = '''' + END + + IF @typeofobject = ''SP'' + BEGIN + SET @sysTarget = ''sys.procedures'' + SET @sysType = '''' + END + + IF @typeofobject = ''FUNCTIONS'' + BEGIN + SET @sysTarget = ''sys.objects'' + SET @sysType = '' and p.Type IN ( N''''FN'''', N''''IF'''', N''''TF'''', N''''FS'''', N''''FT'''' )'' + END + + IF @typeofobject = ''VIEWS'' + BEGIN + SET @sysTarget = ''sys.views'' + SET @sysType = '''' + END + + SET @Command = @Command + '' +DECLARE SP_cursor CURSOR FOR +SELECT p.name FROM '' + @sysTarget + '' p JOIN sys.schemas s ON s.schema_id = p.schema_id WHERE (p.name like '''''' + @objectname + '''''') and s.name = '''''' + @schemaid + '''' + @sysType + '''''' + +OPEN SP_cursor +FETCH NEXT FROM SP_cursor INTO @SP_Name +WHILE @@FETCH_STATUS = 0 +BEGIN + IF EXISTS(SELECT 1 FROM sys.fn_builtin_permissions(''''OBJECT'''') WHERE permission_name = '''''' + @rightsaction + '''''') + BEGIN + EXEC('''''' + @grantordeny + '' '' + @rightsaction + '' ON ['' + @schemaid + ''].['''' + @SP_Name + ''''] TO ['' + @RoleName + '']'''') + END + FETCH NEXT FROM SP_cursor INTO @SP_Name +END + +CLOSE SP_cursor +DEALLOCATE SP_cursor + +'' + + END + ELSE + BEGIN + + SET @Command = @Command + '' +IF EXISTS(SELECT 1 FROM sys.objects o WITH (NOLOCK) JOIN sys.schemas s ON s.schema_id = o.schema_id WHERE o.name = '''''' + @objectname + '''''' AND o.type IN (N''''U'''',''''P'''',''''V'''',''''FN'''',''''IF'''',''''TF'''') AND s.name = '''''' + @schemaid + '''''') +BEGIN + IF EXISTS(SELECT 1 FROM sys.fn_builtin_permissions(''''OBJECT'''') WHERE permission_name = '''''' + @rightsaction + '''''') + BEGIN + '' + @grantordeny + '' '' + @rightsaction + '' ON ['' + @schemaid + ''].['' + @objectname + ''] TO ['' + @RoleName + ''] + END +END + +'' + END +END + +IF @typeofobject = ''ASSEMBLIES'' +BEGIN + SET @Command = @Command + '' +IF EXISTS(SELECT 1 FROM sys.assemblies WHERE NAME = '''''' + @objectname + '''''') +BEGIN + IF EXISTS(SELECT 1 FROM sys.fn_builtin_permissions(''''ASSEMBLY'''') WHERE permission_name = '''''' + @rightsaction + '''''') + BEGIN + '' + @grantordeny + '' '' + @rightsaction + ''::['' + @objectname + ''] TO ['' + @RoleName + ''] + END +END + +'' +END + +IF @typeofobject = ''ROLE'' +BEGIN + SET @Command = @Command + '' +IF NOT EXISTS (SELECT 1 FROM sys.database_role_members JOIN sys.database_principals roles ON database_role_members.role_principal_id = roles.principal_id JOIN sys.database_principals members ON database_role_members.member_principal_id = members.principal_id WHERE roles.name = '''''' + @rightsaction + '''''' AND members.name = '''''' + @RoleName + '''''') +BEGIN + EXEC sp_addrolemember N'''''' + @rightsaction + '''''', N'''''' + @RoleName + '''''' +END + +'' +END + +FETCH NEXT FROM SecurablesCurs INTO @typeofobject, @grantordeny, @rightsaction, @objectname, @schemaid +END + +CLOSE SecurablesCurs +DEALLOCATE SecurablesCurs + +PRINT ''SET ALL SECURABLES ON ROLE ['' + @RoleName + '']'' +EXEC sp_executesql @Command + +/* ADD USER */ +DECLARE UsersCurs CURSOR FOR +SELECT username + FROM #UsersOnRole + +OPEN UsersCurs + +FETCH NEXT FROM UsersCurs INTO @Users +WHILE @@FETCH_STATUS = 0 +BEGIN + + SELECT @Command = '' +EXEC sp_addrolemember N'''''' + @RoleName + '''''', N'''''' + @Users + '''''' +PRINT ''''ADD USER ['' + @Users + ''] ON ROLE ['' + @RoleName + '']'''' +'' + +FETCH NEXT FROM UsersCurs INTO @Users +END + +CLOSE UsersCurs +DEALLOCATE UsersCurs + +EXEC sp_executesql @Command + + +/*============================================================================= + Drop temp tables +=============================================================================*/ +DROP TABLE #Securables +DROP TABLE #UsersOnRole +','ActivePos_server','Pharmacies') + +INSERT INTO #AllRoles(STR_Definition,STR_Database,STR_Product)VALUES(' + +/*============================================================================= + + Script to create dbRoleQAtesters role. + + Role Name: dbRoleQAtesters + TEMPLATE: Default + + EXAMPLE OF SECURABLES TO SET: + + INSERT INTO #Securables + VALUES + (''DB'',''GRANT'',''VIEW DEFINITION'','''',''''), + (''SCHEMA'',''GRANT'',''SELECT,EXECUTE,INSERT,UPDATE,DELETE'','''',''AP''), + (''TABLE'',''GRANT'',''INSERT,UPDATE'',''Address'',''dbo''), + (''SP'',''GRANT'',''EXECUTE'',''sp_bmc_GetNextID'',''dbo''), + (''ROLE'',''GRANT'',''db_datareader'','''','''') + + ----------------------------------------------- + +Generate date : 2023-05-12 / up208700 + +=============================================================================*/ + +DECLARE @Command nvarchar(max), + @RoleName varchar(60), + @Users varchar(255), + @typeofobject varchar(50), + @grantordeny varchar(10), + @rightsaction varchar(255), + @objectname varchar(255), + @schemaid varchar(10), + @sysTarget varchar(255), + @sysType varchar(255) + +SET @RoleName = ''dbRoleQAtesters'' +SET @Command = '''' + +/* TEMP TABLES */ +CREATE TABLE #UsersOnRole(username varchar(255)) +CREATE TABLE #Securables(typeofobject varchar(50), grantordeny varchar(10), rightsaction varchar(255), objectname varchar(255), schemaid varchar(10),N2 bit) + +/* !!! LIST OF SECURABLES TO CHANGE !!! */ + +INSERT INTO #Securables +VALUES +(''ROLE'',''GRANT'',''DB_DATAREADER'','''',''dbo'',0) + + +/* GET ALL USERS ON THIS ROLE */ +INSERT INTO #UsersOnRole +SELECT + members.name +FROM sys.database_role_members + JOIN sys.database_principals roles ON database_role_members.role_principal_id = roles.principal_id + JOIN sys.database_principals members ON database_role_members.member_principal_id = members.principal_id +WHERE roles.name = @RoleName + +/* CREATE ROLE */ +SELECT @Command = '' +IF NOT EXISTS (SELECT 1 FROM sys.database_principals WHERE name = '''''' + @RoleName + '''''' AND type = ''''R'''') +BEGIN + CREATE ROLE ['' + @RoleName + ''] AUTHORIZATION [dbo] + PRINT ''''CREATE ROLE ['' + @RoleName + '']'''' +END +'' +EXEC sp_executesql @Command + +SET @Command = '' +DECLARE @SP_Name varchar(255) + +'' + +/* SET ALL ROLE SECURABLES */ +DECLARE SecurablesCurs CURSOR FOR +SELECT typeofobject, grantordeny, rightsaction, objectname, schemaid +FROM #Securables +WHERE N2 = 0 + +OPEN SecurablesCurs +FETCH NEXT FROM SecurablesCurs INTO @typeofobject, @grantordeny, @rightsaction, @objectname, @schemaid +WHILE @@FETCH_STATUS = 0 +BEGIN + + IF @typeofobject = ''DB'' + BEGIN + IF EXISTS(SELECT 1 FROM sys.fn_builtin_permissions(''DATABASE'') WHERE permission_name = '''' + @rightsaction + '''') + BEGIN + SET @Command = @Command + @grantordeny + '' '' + @rightsaction + '' TO ['' + @RoleName + ''] +'' + END + END + + IF @typeofobject = ''SCHEMA'' + BEGIN + SET @Command = @Command + '' +IF EXISTS (SELECT 1 FROM sys.schemas WHERE name = '''''' + @schemaid + '''''') +BEGIN + IF EXISTS(SELECT 1 FROM sys.fn_builtin_permissions(''''SCHEMA'''') WHERE permission_name = '''''' + @rightsaction + '''''') + BEGIN + '' + @grantordeny + '' '' + @rightsaction + '' ON SCHEMA::'' + @schemaid + '' TO ['' + @RoleName + ''] + END +END + +'' + END + + IF @typeofobject in(''TABLE'',''SP'',''FUNCTIONS'',''VIEWS'') + BEGIN + + IF @objectname like ''%[%]%'' + BEGIN + + IF @typeofobject = ''TABLE'' + BEGIN + SET @sysTarget = ''sys.tables'' + SET @sysType = '''' + END + + IF @typeofobject = ''SP'' + BEGIN + SET @sysTarget = ''sys.procedures'' + SET @sysType = '''' + END + + IF @typeofobject = ''FUNCTIONS'' + BEGIN + SET @sysTarget = ''sys.objects'' + SET @sysType = '' and p.Type IN ( N''''FN'''', N''''IF'''', N''''TF'''', N''''FS'''', N''''FT'''' )'' + END + + IF @typeofobject = ''VIEWS'' + BEGIN + SET @sysTarget = ''sys.views'' + SET @sysType = '''' + END + + SET @Command = @Command + '' +DECLARE SP_cursor CURSOR FOR +SELECT p.name FROM '' + @sysTarget + '' p JOIN sys.schemas s ON s.schema_id = p.schema_id WHERE (p.name like '''''' + @objectname + '''''') and s.name = '''''' + @schemaid + '''' + @sysType + '''''' + +OPEN SP_cursor +FETCH NEXT FROM SP_cursor INTO @SP_Name +WHILE @@FETCH_STATUS = 0 +BEGIN + IF EXISTS(SELECT 1 FROM sys.fn_builtin_permissions(''''OBJECT'''') WHERE permission_name = '''''' + @rightsaction + '''''') + BEGIN + EXEC('''''' + @grantordeny + '' '' + @rightsaction + '' ON ['' + @schemaid + ''].['''' + @SP_Name + ''''] TO ['' + @RoleName + '']'''') + END + FETCH NEXT FROM SP_cursor INTO @SP_Name +END + +CLOSE SP_cursor +DEALLOCATE SP_cursor + +'' + + END + ELSE + BEGIN + + SET @Command = @Command + '' +IF EXISTS(SELECT 1 FROM sys.objects o WITH (NOLOCK) JOIN sys.schemas s ON s.schema_id = o.schema_id WHERE o.name = '''''' + @objectname + '''''' AND o.type IN (N''''U'''',''''P'''',''''V'''',''''FN'''',''''IF'''',''''TF'''') AND s.name = '''''' + @schemaid + '''''') +BEGIN + IF EXISTS(SELECT 1 FROM sys.fn_builtin_permissions(''''OBJECT'''') WHERE permission_name = '''''' + @rightsaction + '''''') + BEGIN + '' + @grantordeny + '' '' + @rightsaction + '' ON ['' + @schemaid + ''].['' + @objectname + ''] TO ['' + @RoleName + ''] + END +END + +'' + END +END + +IF @typeofobject = ''ASSEMBLIES'' +BEGIN + SET @Command = @Command + '' +IF EXISTS(SELECT 1 FROM sys.assemblies WHERE NAME = '''''' + @objectname + '''''') +BEGIN + IF EXISTS(SELECT 1 FROM sys.fn_builtin_permissions(''''ASSEMBLY'''') WHERE permission_name = '''''' + @rightsaction + '''''') + BEGIN + '' + @grantordeny + '' '' + @rightsaction + ''::['' + @objectname + ''] TO ['' + @RoleName + ''] + END +END + +'' +END + +IF @typeofobject = ''ROLE'' +BEGIN + SET @Command = @Command + '' +IF NOT EXISTS (SELECT 1 FROM sys.database_role_members JOIN sys.database_principals roles ON database_role_members.role_principal_id = roles.principal_id JOIN sys.database_principals members ON database_role_members.member_principal_id = members.principal_id WHERE roles.name = '''''' + @rightsaction + '''''' AND members.name = '''''' + @RoleName + '''''') +BEGIN + EXEC sp_addrolemember N'''''' + @rightsaction + '''''', N'''''' + @RoleName + '''''' +END + +'' +END + +FETCH NEXT FROM SecurablesCurs INTO @typeofobject, @grantordeny, @rightsaction, @objectname, @schemaid +END + +CLOSE SecurablesCurs +DEALLOCATE SecurablesCurs + +PRINT ''SET ALL SECURABLES ON ROLE ['' + @RoleName + '']'' +EXEC sp_executesql @Command + +/* ADD USER */ +DECLARE UsersCurs CURSOR FOR +SELECT username + FROM #UsersOnRole + +OPEN UsersCurs + +FETCH NEXT FROM UsersCurs INTO @Users +WHILE @@FETCH_STATUS = 0 +BEGIN + + SELECT @Command = '' +EXEC sp_addrolemember N'''''' + @RoleName + '''''', N'''''' + @Users + '''''' +PRINT ''''ADD USER ['' + @Users + ''] ON ROLE ['' + @RoleName + '']'''' +'' + +FETCH NEXT FROM UsersCurs INTO @Users +END + +CLOSE UsersCurs +DEALLOCATE UsersCurs + +EXEC sp_executesql @Command + + +/*============================================================================= + Drop temp tables +=============================================================================*/ +DROP TABLE #Securables +DROP TABLE #UsersOnRole +','ActivePos_write','Pharmacies') + +INSERT INTO #AllRoles(STR_Definition,STR_Database,STR_Product)VALUES(' + +/*============================================================================= + + Script to create dbRoleQAtesters role. + + Role Name: dbRoleQAtesters + TEMPLATE: Default + + EXAMPLE OF SECURABLES TO SET: + + INSERT INTO #Securables + VALUES + (''DB'',''GRANT'',''VIEW DEFINITION'','''',''''), + (''SCHEMA'',''GRANT'',''SELECT,EXECUTE,INSERT,UPDATE,DELETE'','''',''AP''), + (''TABLE'',''GRANT'',''INSERT,UPDATE'',''Address'',''dbo''), + (''SP'',''GRANT'',''EXECUTE'',''sp_bmc_GetNextID'',''dbo''), + (''ROLE'',''GRANT'',''db_datareader'','''','''') + + ----------------------------------------------- + +Generate date : 2023-05-12 / up208700 + +=============================================================================*/ + +DECLARE @Command nvarchar(max), + @RoleName varchar(60), + @Users varchar(255), + @typeofobject varchar(50), + @grantordeny varchar(10), + @rightsaction varchar(255), + @objectname varchar(255), + @schemaid varchar(10), + @sysTarget varchar(255), + @sysType varchar(255) + +SET @RoleName = ''dbRoleQAtesters'' +SET @Command = '''' + +/* TEMP TABLES */ +CREATE TABLE #UsersOnRole(username varchar(255)) +CREATE TABLE #Securables(typeofobject varchar(50), grantordeny varchar(10), rightsaction varchar(255), objectname varchar(255), schemaid varchar(10),N2 bit) + +/* !!! LIST OF SECURABLES TO CHANGE !!! */ + +INSERT INTO #Securables +VALUES +(''ROLE'',''GRANT'',''DB_DATAREADER'','''',''dbo'',0) + + +/* GET ALL USERS ON THIS ROLE */ +INSERT INTO #UsersOnRole +SELECT + members.name +FROM sys.database_role_members + JOIN sys.database_principals roles ON database_role_members.role_principal_id = roles.principal_id + JOIN sys.database_principals members ON database_role_members.member_principal_id = members.principal_id +WHERE roles.name = @RoleName + +/* CREATE ROLE */ +SELECT @Command = '' +IF NOT EXISTS (SELECT 1 FROM sys.database_principals WHERE name = '''''' + @RoleName + '''''' AND type = ''''R'''') +BEGIN + CREATE ROLE ['' + @RoleName + ''] AUTHORIZATION [dbo] + PRINT ''''CREATE ROLE ['' + @RoleName + '']'''' +END +'' +EXEC sp_executesql @Command + +SET @Command = '' +DECLARE @SP_Name varchar(255) + +'' + +/* SET ALL ROLE SECURABLES */ +DECLARE SecurablesCurs CURSOR FOR +SELECT typeofobject, grantordeny, rightsaction, objectname, schemaid +FROM #Securables +WHERE N2 = 0 + +OPEN SecurablesCurs +FETCH NEXT FROM SecurablesCurs INTO @typeofobject, @grantordeny, @rightsaction, @objectname, @schemaid +WHILE @@FETCH_STATUS = 0 +BEGIN + + IF @typeofobject = ''DB'' + BEGIN + IF EXISTS(SELECT 1 FROM sys.fn_builtin_permissions(''DATABASE'') WHERE permission_name = '''' + @rightsaction + '''') + BEGIN + SET @Command = @Command + @grantordeny + '' '' + @rightsaction + '' TO ['' + @RoleName + ''] +'' + END + END + + IF @typeofobject = ''SCHEMA'' + BEGIN + SET @Command = @Command + '' +IF EXISTS (SELECT 1 FROM sys.schemas WHERE name = '''''' + @schemaid + '''''') +BEGIN + IF EXISTS(SELECT 1 FROM sys.fn_builtin_permissions(''''SCHEMA'''') WHERE permission_name = '''''' + @rightsaction + '''''') + BEGIN + '' + @grantordeny + '' '' + @rightsaction + '' ON SCHEMA::'' + @schemaid + '' TO ['' + @RoleName + ''] + END +END + +'' + END + + IF @typeofobject in(''TABLE'',''SP'',''FUNCTIONS'',''VIEWS'') + BEGIN + + IF @objectname like ''%[%]%'' + BEGIN + + IF @typeofobject = ''TABLE'' + BEGIN + SET @sysTarget = ''sys.tables'' + SET @sysType = '''' + END + + IF @typeofobject = ''SP'' + BEGIN + SET @sysTarget = ''sys.procedures'' + SET @sysType = '''' + END + + IF @typeofobject = ''FUNCTIONS'' + BEGIN + SET @sysTarget = ''sys.objects'' + SET @sysType = '' and p.Type IN ( N''''FN'''', N''''IF'''', N''''TF'''', N''''FS'''', N''''FT'''' )'' + END + + IF @typeofobject = ''VIEWS'' + BEGIN + SET @sysTarget = ''sys.views'' + SET @sysType = '''' + END + + SET @Command = @Command + '' +DECLARE SP_cursor CURSOR FOR +SELECT p.name FROM '' + @sysTarget + '' p JOIN sys.schemas s ON s.schema_id = p.schema_id WHERE (p.name like '''''' + @objectname + '''''') and s.name = '''''' + @schemaid + '''' + @sysType + '''''' + +OPEN SP_cursor +FETCH NEXT FROM SP_cursor INTO @SP_Name +WHILE @@FETCH_STATUS = 0 +BEGIN + IF EXISTS(SELECT 1 FROM sys.fn_builtin_permissions(''''OBJECT'''') WHERE permission_name = '''''' + @rightsaction + '''''') + BEGIN + EXEC('''''' + @grantordeny + '' '' + @rightsaction + '' ON ['' + @schemaid + ''].['''' + @SP_Name + ''''] TO ['' + @RoleName + '']'''') + END + FETCH NEXT FROM SP_cursor INTO @SP_Name +END + +CLOSE SP_cursor +DEALLOCATE SP_cursor + +'' + + END + ELSE + BEGIN + + SET @Command = @Command + '' +IF EXISTS(SELECT 1 FROM sys.objects o WITH (NOLOCK) JOIN sys.schemas s ON s.schema_id = o.schema_id WHERE o.name = '''''' + @objectname + '''''' AND o.type IN (N''''U'''',''''P'''',''''V'''',''''FN'''',''''IF'''',''''TF'''') AND s.name = '''''' + @schemaid + '''''') +BEGIN + IF EXISTS(SELECT 1 FROM sys.fn_builtin_permissions(''''OBJECT'''') WHERE permission_name = '''''' + @rightsaction + '''''') + BEGIN + '' + @grantordeny + '' '' + @rightsaction + '' ON ['' + @schemaid + ''].['' + @objectname + ''] TO ['' + @RoleName + ''] + END +END + +'' + END +END + +IF @typeofobject = ''ASSEMBLIES'' +BEGIN + SET @Command = @Command + '' +IF EXISTS(SELECT 1 FROM sys.assemblies WHERE NAME = '''''' + @objectname + '''''') +BEGIN + IF EXISTS(SELECT 1 FROM sys.fn_builtin_permissions(''''ASSEMBLY'''') WHERE permission_name = '''''' + @rightsaction + '''''') + BEGIN + '' + @grantordeny + '' '' + @rightsaction + ''::['' + @objectname + ''] TO ['' + @RoleName + ''] + END +END + +'' +END + +IF @typeofobject = ''ROLE'' +BEGIN + SET @Command = @Command + '' +IF NOT EXISTS (SELECT 1 FROM sys.database_role_members JOIN sys.database_principals roles ON database_role_members.role_principal_id = roles.principal_id JOIN sys.database_principals members ON database_role_members.member_principal_id = members.principal_id WHERE roles.name = '''''' + @rightsaction + '''''' AND members.name = '''''' + @RoleName + '''''') +BEGIN + EXEC sp_addrolemember N'''''' + @rightsaction + '''''', N'''''' + @RoleName + '''''' +END + +'' +END + +FETCH NEXT FROM SecurablesCurs INTO @typeofobject, @grantordeny, @rightsaction, @objectname, @schemaid +END + +CLOSE SecurablesCurs +DEALLOCATE SecurablesCurs + +PRINT ''SET ALL SECURABLES ON ROLE ['' + @RoleName + '']'' +EXEC sp_executesql @Command + +/* ADD USER */ +DECLARE UsersCurs CURSOR FOR +SELECT username + FROM #UsersOnRole + +OPEN UsersCurs + +FETCH NEXT FROM UsersCurs INTO @Users +WHILE @@FETCH_STATUS = 0 +BEGIN + + SELECT @Command = '' +EXEC sp_addrolemember N'''''' + @RoleName + '''''', N'''''' + @Users + '''''' +PRINT ''''ADD USER ['' + @Users + ''] ON ROLE ['' + @RoleName + '']'''' +'' + +FETCH NEXT FROM UsersCurs INTO @Users +END + +CLOSE UsersCurs +DEALLOCATE UsersCurs + +EXEC sp_executesql @Command + + +/*============================================================================= + Drop temp tables +=============================================================================*/ +DROP TABLE #Securables +DROP TABLE #UsersOnRole +','ActiveSystemClient','Pharmacies') + +INSERT INTO #AllRoles(STR_Definition,STR_Database,STR_Product)VALUES(' + +/*============================================================================= + + Script to create dbRoleQAtesters role. + + Role Name: dbRoleQAtesters + TEMPLATE: Default + + EXAMPLE OF SECURABLES TO SET: + + INSERT INTO #Securables + VALUES + (''DB'',''GRANT'',''VIEW DEFINITION'','''',''''), + (''SCHEMA'',''GRANT'',''SELECT,EXECUTE,INSERT,UPDATE,DELETE'','''',''AP''), + (''TABLE'',''GRANT'',''INSERT,UPDATE'',''Address'',''dbo''), + (''SP'',''GRANT'',''EXECUTE'',''sp_bmc_GetNextID'',''dbo''), + (''ROLE'',''GRANT'',''db_datareader'','''','''') + + ----------------------------------------------- + +Generate date : 2023-05-12 / up208700 + +=============================================================================*/ + +DECLARE @Command nvarchar(max), + @RoleName varchar(60), + @Users varchar(255), + @typeofobject varchar(50), + @grantordeny varchar(10), + @rightsaction varchar(255), + @objectname varchar(255), + @schemaid varchar(10), + @sysTarget varchar(255), + @sysType varchar(255) + +SET @RoleName = ''dbRoleQAtesters'' +SET @Command = '''' + +/* TEMP TABLES */ +CREATE TABLE #UsersOnRole(username varchar(255)) +CREATE TABLE #Securables(typeofobject varchar(50), grantordeny varchar(10), rightsaction varchar(255), objectname varchar(255), schemaid varchar(10),N2 bit) + +/* !!! LIST OF SECURABLES TO CHANGE !!! */ + +INSERT INTO #Securables +VALUES +(''ROLE'',''GRANT'',''DB_DATAREADER'','''',''dbo'',0) + + +/* GET ALL USERS ON THIS ROLE */ +INSERT INTO #UsersOnRole +SELECT + members.name +FROM sys.database_role_members + JOIN sys.database_principals roles ON database_role_members.role_principal_id = roles.principal_id + JOIN sys.database_principals members ON database_role_members.member_principal_id = members.principal_id +WHERE roles.name = @RoleName + +/* CREATE ROLE */ +SELECT @Command = '' +IF NOT EXISTS (SELECT 1 FROM sys.database_principals WHERE name = '''''' + @RoleName + '''''' AND type = ''''R'''') +BEGIN + CREATE ROLE ['' + @RoleName + ''] AUTHORIZATION [dbo] + PRINT ''''CREATE ROLE ['' + @RoleName + '']'''' +END +'' +EXEC sp_executesql @Command + +SET @Command = '' +DECLARE @SP_Name varchar(255) + +'' + +/* SET ALL ROLE SECURABLES */ +DECLARE SecurablesCurs CURSOR FOR +SELECT typeofobject, grantordeny, rightsaction, objectname, schemaid +FROM #Securables +WHERE N2 = 0 + +OPEN SecurablesCurs +FETCH NEXT FROM SecurablesCurs INTO @typeofobject, @grantordeny, @rightsaction, @objectname, @schemaid +WHILE @@FETCH_STATUS = 0 +BEGIN + + IF @typeofobject = ''DB'' + BEGIN + IF EXISTS(SELECT 1 FROM sys.fn_builtin_permissions(''DATABASE'') WHERE permission_name = '''' + @rightsaction + '''') + BEGIN + SET @Command = @Command + @grantordeny + '' '' + @rightsaction + '' TO ['' + @RoleName + ''] +'' + END + END + + IF @typeofobject = ''SCHEMA'' + BEGIN + SET @Command = @Command + '' +IF EXISTS (SELECT 1 FROM sys.schemas WHERE name = '''''' + @schemaid + '''''') +BEGIN + IF EXISTS(SELECT 1 FROM sys.fn_builtin_permissions(''''SCHEMA'''') WHERE permission_name = '''''' + @rightsaction + '''''') + BEGIN + '' + @grantordeny + '' '' + @rightsaction + '' ON SCHEMA::'' + @schemaid + '' TO ['' + @RoleName + ''] + END +END + +'' + END + + IF @typeofobject in(''TABLE'',''SP'',''FUNCTIONS'',''VIEWS'') + BEGIN + + IF @objectname like ''%[%]%'' + BEGIN + + IF @typeofobject = ''TABLE'' + BEGIN + SET @sysTarget = ''sys.tables'' + SET @sysType = '''' + END + + IF @typeofobject = ''SP'' + BEGIN + SET @sysTarget = ''sys.procedures'' + SET @sysType = '''' + END + + IF @typeofobject = ''FUNCTIONS'' + BEGIN + SET @sysTarget = ''sys.objects'' + SET @sysType = '' and p.Type IN ( N''''FN'''', N''''IF'''', N''''TF'''', N''''FS'''', N''''FT'''' )'' + END + + IF @typeofobject = ''VIEWS'' + BEGIN + SET @sysTarget = ''sys.views'' + SET @sysType = '''' + END + + SET @Command = @Command + '' +DECLARE SP_cursor CURSOR FOR +SELECT p.name FROM '' + @sysTarget + '' p JOIN sys.schemas s ON s.schema_id = p.schema_id WHERE (p.name like '''''' + @objectname + '''''') and s.name = '''''' + @schemaid + '''' + @sysType + '''''' + +OPEN SP_cursor +FETCH NEXT FROM SP_cursor INTO @SP_Name +WHILE @@FETCH_STATUS = 0 +BEGIN + IF EXISTS(SELECT 1 FROM sys.fn_builtin_permissions(''''OBJECT'''') WHERE permission_name = '''''' + @rightsaction + '''''') + BEGIN + EXEC('''''' + @grantordeny + '' '' + @rightsaction + '' ON ['' + @schemaid + ''].['''' + @SP_Name + ''''] TO ['' + @RoleName + '']'''') + END + FETCH NEXT FROM SP_cursor INTO @SP_Name +END + +CLOSE SP_cursor +DEALLOCATE SP_cursor + +'' + + END + ELSE + BEGIN + + SET @Command = @Command + '' +IF EXISTS(SELECT 1 FROM sys.objects o WITH (NOLOCK) JOIN sys.schemas s ON s.schema_id = o.schema_id WHERE o.name = '''''' + @objectname + '''''' AND o.type IN (N''''U'''',''''P'''',''''V'''',''''FN'''',''''IF'''',''''TF'''') AND s.name = '''''' + @schemaid + '''''') +BEGIN + IF EXISTS(SELECT 1 FROM sys.fn_builtin_permissions(''''OBJECT'''') WHERE permission_name = '''''' + @rightsaction + '''''') + BEGIN + '' + @grantordeny + '' '' + @rightsaction + '' ON ['' + @schemaid + ''].['' + @objectname + ''] TO ['' + @RoleName + ''] + END +END + +'' + END +END + +IF @typeofobject = ''ASSEMBLIES'' +BEGIN + SET @Command = @Command + '' +IF EXISTS(SELECT 1 FROM sys.assemblies WHERE NAME = '''''' + @objectname + '''''') +BEGIN + IF EXISTS(SELECT 1 FROM sys.fn_builtin_permissions(''''ASSEMBLY'''') WHERE permission_name = '''''' + @rightsaction + '''''') + BEGIN + '' + @grantordeny + '' '' + @rightsaction + ''::['' + @objectname + ''] TO ['' + @RoleName + ''] + END +END + +'' +END + +IF @typeofobject = ''ROLE'' +BEGIN + SET @Command = @Command + '' +IF NOT EXISTS (SELECT 1 FROM sys.database_role_members JOIN sys.database_principals roles ON database_role_members.role_principal_id = roles.principal_id JOIN sys.database_principals members ON database_role_members.member_principal_id = members.principal_id WHERE roles.name = '''''' + @rightsaction + '''''' AND members.name = '''''' + @RoleName + '''''') +BEGIN + EXEC sp_addrolemember N'''''' + @rightsaction + '''''', N'''''' + @RoleName + '''''' +END + +'' +END + +FETCH NEXT FROM SecurablesCurs INTO @typeofobject, @grantordeny, @rightsaction, @objectname, @schemaid +END + +CLOSE SecurablesCurs +DEALLOCATE SecurablesCurs + +PRINT ''SET ALL SECURABLES ON ROLE ['' + @RoleName + '']'' +EXEC sp_executesql @Command + +/* ADD USER */ +DECLARE UsersCurs CURSOR FOR +SELECT username + FROM #UsersOnRole + +OPEN UsersCurs + +FETCH NEXT FROM UsersCurs INTO @Users +WHILE @@FETCH_STATUS = 0 +BEGIN + + SELECT @Command = '' +EXEC sp_addrolemember N'''''' + @RoleName + '''''', N'''''' + @Users + '''''' +PRINT ''''ADD USER ['' + @Users + ''] ON ROLE ['' + @RoleName + '']'''' +'' + +FETCH NEXT FROM UsersCurs INTO @Users +END + +CLOSE UsersCurs +DEALLOCATE UsersCurs + +EXEC sp_executesql @Command + + +/*============================================================================= + Drop temp tables +=============================================================================*/ +DROP TABLE #Securables +DROP TABLE #UsersOnRole +','ActiveSystemServer','Pharmacies') + +INSERT INTO #AllRoles(STR_Definition,STR_Database,STR_Product)VALUES(' + +/*============================================================================= + + Script to create dbRoleQAtesters role. + + Role Name: dbRoleQAtesters + TEMPLATE: Default + + EXAMPLE OF SECURABLES TO SET: + + INSERT INTO #Securables + VALUES + (''DB'',''GRANT'',''VIEW DEFINITION'','''',''''), + (''SCHEMA'',''GRANT'',''SELECT,EXECUTE,INSERT,UPDATE,DELETE'','''',''AP''), + (''TABLE'',''GRANT'',''INSERT,UPDATE'',''Address'',''dbo''), + (''SP'',''GRANT'',''EXECUTE'',''sp_bmc_GetNextID'',''dbo''), + (''ROLE'',''GRANT'',''db_datareader'','''','''') + + ----------------------------------------------- + +Generate date : 2023-05-12 / up208700 + +=============================================================================*/ + +DECLARE @Command nvarchar(max), + @RoleName varchar(60), + @Users varchar(255), + @typeofobject varchar(50), + @grantordeny varchar(10), + @rightsaction varchar(255), + @objectname varchar(255), + @schemaid varchar(10), + @sysTarget varchar(255), + @sysType varchar(255) + +SET @RoleName = ''dbRoleQAtesters'' +SET @Command = '''' + +/* TEMP TABLES */ +CREATE TABLE #UsersOnRole(username varchar(255)) +CREATE TABLE #Securables(typeofobject varchar(50), grantordeny varchar(10), rightsaction varchar(255), objectname varchar(255), schemaid varchar(10),N2 bit) + +/* !!! LIST OF SECURABLES TO CHANGE !!! */ + +INSERT INTO #Securables +VALUES +(''ROLE'',''GRANT'',''DB_DATAREADER'','''',''dbo'',0) + + +/* GET ALL USERS ON THIS ROLE */ +INSERT INTO #UsersOnRole +SELECT + members.name +FROM sys.database_role_members + JOIN sys.database_principals roles ON database_role_members.role_principal_id = roles.principal_id + JOIN sys.database_principals members ON database_role_members.member_principal_id = members.principal_id +WHERE roles.name = @RoleName + +/* CREATE ROLE */ +SELECT @Command = '' +IF NOT EXISTS (SELECT 1 FROM sys.database_principals WHERE name = '''''' + @RoleName + '''''' AND type = ''''R'''') +BEGIN + CREATE ROLE ['' + @RoleName + ''] AUTHORIZATION [dbo] + PRINT ''''CREATE ROLE ['' + @RoleName + '']'''' +END +'' +EXEC sp_executesql @Command + +SET @Command = '' +DECLARE @SP_Name varchar(255) + +'' + +/* SET ALL ROLE SECURABLES */ +DECLARE SecurablesCurs CURSOR FOR +SELECT typeofobject, grantordeny, rightsaction, objectname, schemaid +FROM #Securables +WHERE N2 = 0 + +OPEN SecurablesCurs +FETCH NEXT FROM SecurablesCurs INTO @typeofobject, @grantordeny, @rightsaction, @objectname, @schemaid +WHILE @@FETCH_STATUS = 0 +BEGIN + + IF @typeofobject = ''DB'' + BEGIN + IF EXISTS(SELECT 1 FROM sys.fn_builtin_permissions(''DATABASE'') WHERE permission_name = '''' + @rightsaction + '''') + BEGIN + SET @Command = @Command + @grantordeny + '' '' + @rightsaction + '' TO ['' + @RoleName + ''] +'' + END + END + + IF @typeofobject = ''SCHEMA'' + BEGIN + SET @Command = @Command + '' +IF EXISTS (SELECT 1 FROM sys.schemas WHERE name = '''''' + @schemaid + '''''') +BEGIN + IF EXISTS(SELECT 1 FROM sys.fn_builtin_permissions(''''SCHEMA'''') WHERE permission_name = '''''' + @rightsaction + '''''') + BEGIN + '' + @grantordeny + '' '' + @rightsaction + '' ON SCHEMA::'' + @schemaid + '' TO ['' + @RoleName + ''] + END +END + +'' + END + + IF @typeofobject in(''TABLE'',''SP'',''FUNCTIONS'',''VIEWS'') + BEGIN + + IF @objectname like ''%[%]%'' + BEGIN + + IF @typeofobject = ''TABLE'' + BEGIN + SET @sysTarget = ''sys.tables'' + SET @sysType = '''' + END + + IF @typeofobject = ''SP'' + BEGIN + SET @sysTarget = ''sys.procedures'' + SET @sysType = '''' + END + + IF @typeofobject = ''FUNCTIONS'' + BEGIN + SET @sysTarget = ''sys.objects'' + SET @sysType = '' and p.Type IN ( N''''FN'''', N''''IF'''', N''''TF'''', N''''FS'''', N''''FT'''' )'' + END + + IF @typeofobject = ''VIEWS'' + BEGIN + SET @sysTarget = ''sys.views'' + SET @sysType = '''' + END + + SET @Command = @Command + '' +DECLARE SP_cursor CURSOR FOR +SELECT p.name FROM '' + @sysTarget + '' p JOIN sys.schemas s ON s.schema_id = p.schema_id WHERE (p.name like '''''' + @objectname + '''''') and s.name = '''''' + @schemaid + '''' + @sysType + '''''' + +OPEN SP_cursor +FETCH NEXT FROM SP_cursor INTO @SP_Name +WHILE @@FETCH_STATUS = 0 +BEGIN + IF EXISTS(SELECT 1 FROM sys.fn_builtin_permissions(''''OBJECT'''') WHERE permission_name = '''''' + @rightsaction + '''''') + BEGIN + EXEC('''''' + @grantordeny + '' '' + @rightsaction + '' ON ['' + @schemaid + ''].['''' + @SP_Name + ''''] TO ['' + @RoleName + '']'''') + END + FETCH NEXT FROM SP_cursor INTO @SP_Name +END + +CLOSE SP_cursor +DEALLOCATE SP_cursor + +'' + + END + ELSE + BEGIN + + SET @Command = @Command + '' +IF EXISTS(SELECT 1 FROM sys.objects o WITH (NOLOCK) JOIN sys.schemas s ON s.schema_id = o.schema_id WHERE o.name = '''''' + @objectname + '''''' AND o.type IN (N''''U'''',''''P'''',''''V'''',''''FN'''',''''IF'''',''''TF'''') AND s.name = '''''' + @schemaid + '''''') +BEGIN + IF EXISTS(SELECT 1 FROM sys.fn_builtin_permissions(''''OBJECT'''') WHERE permission_name = '''''' + @rightsaction + '''''') + BEGIN + '' + @grantordeny + '' '' + @rightsaction + '' ON ['' + @schemaid + ''].['' + @objectname + ''] TO ['' + @RoleName + ''] + END +END + +'' + END +END + +IF @typeofobject = ''ASSEMBLIES'' +BEGIN + SET @Command = @Command + '' +IF EXISTS(SELECT 1 FROM sys.assemblies WHERE NAME = '''''' + @objectname + '''''') +BEGIN + IF EXISTS(SELECT 1 FROM sys.fn_builtin_permissions(''''ASSEMBLY'''') WHERE permission_name = '''''' + @rightsaction + '''''') + BEGIN + '' + @grantordeny + '' '' + @rightsaction + ''::['' + @objectname + ''] TO ['' + @RoleName + ''] + END +END + +'' +END + +IF @typeofobject = ''ROLE'' +BEGIN + SET @Command = @Command + '' +IF NOT EXISTS (SELECT 1 FROM sys.database_role_members JOIN sys.database_principals roles ON database_role_members.role_principal_id = roles.principal_id JOIN sys.database_principals members ON database_role_members.member_principal_id = members.principal_id WHERE roles.name = '''''' + @rightsaction + '''''' AND members.name = '''''' + @RoleName + '''''') +BEGIN + EXEC sp_addrolemember N'''''' + @rightsaction + '''''', N'''''' + @RoleName + '''''' +END + +'' +END + +FETCH NEXT FROM SecurablesCurs INTO @typeofobject, @grantordeny, @rightsaction, @objectname, @schemaid +END + +CLOSE SecurablesCurs +DEALLOCATE SecurablesCurs + +PRINT ''SET ALL SECURABLES ON ROLE ['' + @RoleName + '']'' +EXEC sp_executesql @Command + +/* ADD USER */ +DECLARE UsersCurs CURSOR FOR +SELECT username + FROM #UsersOnRole + +OPEN UsersCurs + +FETCH NEXT FROM UsersCurs INTO @Users +WHILE @@FETCH_STATUS = 0 +BEGIN + + SELECT @Command = '' +EXEC sp_addrolemember N'''''' + @RoleName + '''''', N'''''' + @Users + '''''' +PRINT ''''ADD USER ['' + @Users + ''] ON ROLE ['' + @RoleName + '']'''' +'' + +FETCH NEXT FROM UsersCurs INTO @Users +END + +CLOSE UsersCurs +DEALLOCATE UsersCurs + +EXEC sp_executesql @Command + + +/*============================================================================= + Drop temp tables +=============================================================================*/ +DROP TABLE #Securables +DROP TABLE #UsersOnRole +','Arizona','Pharmacies') + +INSERT INTO #AllRoles(STR_Definition,STR_Database,STR_Product)VALUES(' + +/*============================================================================= + + Script to create dbRoleQAtesters role. + + Role Name: dbRoleQAtesters + TEMPLATE: Default + + EXAMPLE OF SECURABLES TO SET: + + INSERT INTO #Securables + VALUES + (''DB'',''GRANT'',''VIEW DEFINITION'','''',''''), + (''SCHEMA'',''GRANT'',''SELECT,EXECUTE,INSERT,UPDATE,DELETE'','''',''AP''), + (''TABLE'',''GRANT'',''INSERT,UPDATE'',''Address'',''dbo''), + (''SP'',''GRANT'',''EXECUTE'',''sp_bmc_GetNextID'',''dbo''), + (''ROLE'',''GRANT'',''db_datareader'','''','''') + + ----------------------------------------------- + +Generate date : 2023-05-12 / up208700 + +=============================================================================*/ + +DECLARE @Command nvarchar(max), + @RoleName varchar(60), + @Users varchar(255), + @typeofobject varchar(50), + @grantordeny varchar(10), + @rightsaction varchar(255), + @objectname varchar(255), + @schemaid varchar(10), + @sysTarget varchar(255), + @sysType varchar(255) + +SET @RoleName = ''dbRoleQAtesters'' +SET @Command = '''' + +/* TEMP TABLES */ +CREATE TABLE #UsersOnRole(username varchar(255)) +CREATE TABLE #Securables(typeofobject varchar(50), grantordeny varchar(10), rightsaction varchar(255), objectname varchar(255), schemaid varchar(10),N2 bit) + +/* !!! LIST OF SECURABLES TO CHANGE !!! */ + +INSERT INTO #Securables +VALUES +(''ROLE'',''GRANT'',''DB_DATAREADER'','''',''dbo'',0) + + +/* GET ALL USERS ON THIS ROLE */ +INSERT INTO #UsersOnRole +SELECT + members.name +FROM sys.database_role_members + JOIN sys.database_principals roles ON database_role_members.role_principal_id = roles.principal_id + JOIN sys.database_principals members ON database_role_members.member_principal_id = members.principal_id +WHERE roles.name = @RoleName + +/* CREATE ROLE */ +SELECT @Command = '' +IF NOT EXISTS (SELECT 1 FROM sys.database_principals WHERE name = '''''' + @RoleName + '''''' AND type = ''''R'''') +BEGIN + CREATE ROLE ['' + @RoleName + ''] AUTHORIZATION [dbo] + PRINT ''''CREATE ROLE ['' + @RoleName + '']'''' +END +'' +EXEC sp_executesql @Command + +SET @Command = '' +DECLARE @SP_Name varchar(255) + +'' + +/* SET ALL ROLE SECURABLES */ +DECLARE SecurablesCurs CURSOR FOR +SELECT typeofobject, grantordeny, rightsaction, objectname, schemaid +FROM #Securables +WHERE N2 = 0 + +OPEN SecurablesCurs +FETCH NEXT FROM SecurablesCurs INTO @typeofobject, @grantordeny, @rightsaction, @objectname, @schemaid +WHILE @@FETCH_STATUS = 0 +BEGIN + + IF @typeofobject = ''DB'' + BEGIN + IF EXISTS(SELECT 1 FROM sys.fn_builtin_permissions(''DATABASE'') WHERE permission_name = '''' + @rightsaction + '''') + BEGIN + SET @Command = @Command + @grantordeny + '' '' + @rightsaction + '' TO ['' + @RoleName + ''] +'' + END + END + + IF @typeofobject = ''SCHEMA'' + BEGIN + SET @Command = @Command + '' +IF EXISTS (SELECT 1 FROM sys.schemas WHERE name = '''''' + @schemaid + '''''') +BEGIN + IF EXISTS(SELECT 1 FROM sys.fn_builtin_permissions(''''SCHEMA'''') WHERE permission_name = '''''' + @rightsaction + '''''') + BEGIN + '' + @grantordeny + '' '' + @rightsaction + '' ON SCHEMA::'' + @schemaid + '' TO ['' + @RoleName + ''] + END +END + +'' + END + + IF @typeofobject in(''TABLE'',''SP'',''FUNCTIONS'',''VIEWS'') + BEGIN + + IF @objectname like ''%[%]%'' + BEGIN + + IF @typeofobject = ''TABLE'' + BEGIN + SET @sysTarget = ''sys.tables'' + SET @sysType = '''' + END + + IF @typeofobject = ''SP'' + BEGIN + SET @sysTarget = ''sys.procedures'' + SET @sysType = '''' + END + + IF @typeofobject = ''FUNCTIONS'' + BEGIN + SET @sysTarget = ''sys.objects'' + SET @sysType = '' and p.Type IN ( N''''FN'''', N''''IF'''', N''''TF'''', N''''FS'''', N''''FT'''' )'' + END + + IF @typeofobject = ''VIEWS'' + BEGIN + SET @sysTarget = ''sys.views'' + SET @sysType = '''' + END + + SET @Command = @Command + '' +DECLARE SP_cursor CURSOR FOR +SELECT p.name FROM '' + @sysTarget + '' p JOIN sys.schemas s ON s.schema_id = p.schema_id WHERE (p.name like '''''' + @objectname + '''''') and s.name = '''''' + @schemaid + '''' + @sysType + '''''' + +OPEN SP_cursor +FETCH NEXT FROM SP_cursor INTO @SP_Name +WHILE @@FETCH_STATUS = 0 +BEGIN + IF EXISTS(SELECT 1 FROM sys.fn_builtin_permissions(''''OBJECT'''') WHERE permission_name = '''''' + @rightsaction + '''''') + BEGIN + EXEC('''''' + @grantordeny + '' '' + @rightsaction + '' ON ['' + @schemaid + ''].['''' + @SP_Name + ''''] TO ['' + @RoleName + '']'''') + END + FETCH NEXT FROM SP_cursor INTO @SP_Name +END + +CLOSE SP_cursor +DEALLOCATE SP_cursor + +'' + + END + ELSE + BEGIN + + SET @Command = @Command + '' +IF EXISTS(SELECT 1 FROM sys.objects o WITH (NOLOCK) JOIN sys.schemas s ON s.schema_id = o.schema_id WHERE o.name = '''''' + @objectname + '''''' AND o.type IN (N''''U'''',''''P'''',''''V'''',''''FN'''',''''IF'''',''''TF'''') AND s.name = '''''' + @schemaid + '''''') +BEGIN + IF EXISTS(SELECT 1 FROM sys.fn_builtin_permissions(''''OBJECT'''') WHERE permission_name = '''''' + @rightsaction + '''''') + BEGIN + '' + @grantordeny + '' '' + @rightsaction + '' ON ['' + @schemaid + ''].['' + @objectname + ''] TO ['' + @RoleName + ''] + END +END + +'' + END +END + +IF @typeofobject = ''ASSEMBLIES'' +BEGIN + SET @Command = @Command + '' +IF EXISTS(SELECT 1 FROM sys.assemblies WHERE NAME = '''''' + @objectname + '''''') +BEGIN + IF EXISTS(SELECT 1 FROM sys.fn_builtin_permissions(''''ASSEMBLY'''') WHERE permission_name = '''''' + @rightsaction + '''''') + BEGIN + '' + @grantordeny + '' '' + @rightsaction + ''::['' + @objectname + ''] TO ['' + @RoleName + ''] + END +END + +'' +END + +IF @typeofobject = ''ROLE'' +BEGIN + SET @Command = @Command + '' +IF NOT EXISTS (SELECT 1 FROM sys.database_role_members JOIN sys.database_principals roles ON database_role_members.role_principal_id = roles.principal_id JOIN sys.database_principals members ON database_role_members.member_principal_id = members.principal_id WHERE roles.name = '''''' + @rightsaction + '''''' AND members.name = '''''' + @RoleName + '''''') +BEGIN + EXEC sp_addrolemember N'''''' + @rightsaction + '''''', N'''''' + @RoleName + '''''' +END + +'' +END + +FETCH NEXT FROM SecurablesCurs INTO @typeofobject, @grantordeny, @rightsaction, @objectname, @schemaid +END + +CLOSE SecurablesCurs +DEALLOCATE SecurablesCurs + +PRINT ''SET ALL SECURABLES ON ROLE ['' + @RoleName + '']'' +EXEC sp_executesql @Command + +/* ADD USER */ +DECLARE UsersCurs CURSOR FOR +SELECT username + FROM #UsersOnRole + +OPEN UsersCurs + +FETCH NEXT FROM UsersCurs INTO @Users +WHILE @@FETCH_STATUS = 0 +BEGIN + + SELECT @Command = '' +EXEC sp_addrolemember N'''''' + @RoleName + '''''', N'''''' + @Users + '''''' +PRINT ''''ADD USER ['' + @Users + ''] ON ROLE ['' + @RoleName + '']'''' +'' + +FETCH NEXT FROM UsersCurs INTO @Users +END + +CLOSE UsersCurs +DEALLOCATE UsersCurs + +EXEC sp_executesql @Command + + +/*============================================================================= + Drop temp tables +=============================================================================*/ +DROP TABLE #Securables +DROP TABLE #UsersOnRole +','ArizonaCASH','Pharmacies') + +INSERT INTO #AllRoles(STR_Definition,STR_Database,STR_Product)VALUES(' + +/*============================================================================= + + Script to create dbRoleQAtesters role. + + Role Name: dbRoleQAtesters + TEMPLATE: Default + + EXAMPLE OF SECURABLES TO SET: + + INSERT INTO #Securables + VALUES + (''DB'',''GRANT'',''VIEW DEFINITION'','''',''''), + (''SCHEMA'',''GRANT'',''SELECT,EXECUTE,INSERT,UPDATE,DELETE'','''',''AP''), + (''TABLE'',''GRANT'',''INSERT,UPDATE'',''Address'',''dbo''), + (''SP'',''GRANT'',''EXECUTE'',''sp_bmc_GetNextID'',''dbo''), + (''ROLE'',''GRANT'',''db_datareader'','''','''') + + ----------------------------------------------- + +Generate date : 2023-05-12 / up208700 + +=============================================================================*/ + +DECLARE @Command nvarchar(max), + @RoleName varchar(60), + @Users varchar(255), + @typeofobject varchar(50), + @grantordeny varchar(10), + @rightsaction varchar(255), + @objectname varchar(255), + @schemaid varchar(10), + @sysTarget varchar(255), + @sysType varchar(255) + +SET @RoleName = ''dbRoleQAtesters'' +SET @Command = '''' + +/* TEMP TABLES */ +CREATE TABLE #UsersOnRole(username varchar(255)) +CREATE TABLE #Securables(typeofobject varchar(50), grantordeny varchar(10), rightsaction varchar(255), objectname varchar(255), schemaid varchar(10),N2 bit) + +/* !!! LIST OF SECURABLES TO CHANGE !!! */ + +INSERT INTO #Securables +VALUES +(''ROLE'',''GRANT'',''DB_DATAREADER'','''',''dbo'',0) + + +/* GET ALL USERS ON THIS ROLE */ +INSERT INTO #UsersOnRole +SELECT + members.name +FROM sys.database_role_members + JOIN sys.database_principals roles ON database_role_members.role_principal_id = roles.principal_id + JOIN sys.database_principals members ON database_role_members.member_principal_id = members.principal_id +WHERE roles.name = @RoleName + +/* CREATE ROLE */ +SELECT @Command = '' +IF NOT EXISTS (SELECT 1 FROM sys.database_principals WHERE name = '''''' + @RoleName + '''''' AND type = ''''R'''') +BEGIN + CREATE ROLE ['' + @RoleName + ''] AUTHORIZATION [dbo] + PRINT ''''CREATE ROLE ['' + @RoleName + '']'''' +END +'' +EXEC sp_executesql @Command + +SET @Command = '' +DECLARE @SP_Name varchar(255) + +'' + +/* SET ALL ROLE SECURABLES */ +DECLARE SecurablesCurs CURSOR FOR +SELECT typeofobject, grantordeny, rightsaction, objectname, schemaid +FROM #Securables +WHERE N2 = 0 + +OPEN SecurablesCurs +FETCH NEXT FROM SecurablesCurs INTO @typeofobject, @grantordeny, @rightsaction, @objectname, @schemaid +WHILE @@FETCH_STATUS = 0 +BEGIN + + IF @typeofobject = ''DB'' + BEGIN + IF EXISTS(SELECT 1 FROM sys.fn_builtin_permissions(''DATABASE'') WHERE permission_name = '''' + @rightsaction + '''') + BEGIN + SET @Command = @Command + @grantordeny + '' '' + @rightsaction + '' TO ['' + @RoleName + ''] +'' + END + END + + IF @typeofobject = ''SCHEMA'' + BEGIN + SET @Command = @Command + '' +IF EXISTS (SELECT 1 FROM sys.schemas WHERE name = '''''' + @schemaid + '''''') +BEGIN + IF EXISTS(SELECT 1 FROM sys.fn_builtin_permissions(''''SCHEMA'''') WHERE permission_name = '''''' + @rightsaction + '''''') + BEGIN + '' + @grantordeny + '' '' + @rightsaction + '' ON SCHEMA::'' + @schemaid + '' TO ['' + @RoleName + ''] + END +END + +'' + END + + IF @typeofobject in(''TABLE'',''SP'',''FUNCTIONS'',''VIEWS'') + BEGIN + + IF @objectname like ''%[%]%'' + BEGIN + + IF @typeofobject = ''TABLE'' + BEGIN + SET @sysTarget = ''sys.tables'' + SET @sysType = '''' + END + + IF @typeofobject = ''SP'' + BEGIN + SET @sysTarget = ''sys.procedures'' + SET @sysType = '''' + END + + IF @typeofobject = ''FUNCTIONS'' + BEGIN + SET @sysTarget = ''sys.objects'' + SET @sysType = '' and p.Type IN ( N''''FN'''', N''''IF'''', N''''TF'''', N''''FS'''', N''''FT'''' )'' + END + + IF @typeofobject = ''VIEWS'' + BEGIN + SET @sysTarget = ''sys.views'' + SET @sysType = '''' + END + + SET @Command = @Command + '' +DECLARE SP_cursor CURSOR FOR +SELECT p.name FROM '' + @sysTarget + '' p JOIN sys.schemas s ON s.schema_id = p.schema_id WHERE (p.name like '''''' + @objectname + '''''') and s.name = '''''' + @schemaid + '''' + @sysType + '''''' + +OPEN SP_cursor +FETCH NEXT FROM SP_cursor INTO @SP_Name +WHILE @@FETCH_STATUS = 0 +BEGIN + IF EXISTS(SELECT 1 FROM sys.fn_builtin_permissions(''''OBJECT'''') WHERE permission_name = '''''' + @rightsaction + '''''') + BEGIN + EXEC('''''' + @grantordeny + '' '' + @rightsaction + '' ON ['' + @schemaid + ''].['''' + @SP_Name + ''''] TO ['' + @RoleName + '']'''') + END + FETCH NEXT FROM SP_cursor INTO @SP_Name +END + +CLOSE SP_cursor +DEALLOCATE SP_cursor + +'' + + END + ELSE + BEGIN + + SET @Command = @Command + '' +IF EXISTS(SELECT 1 FROM sys.objects o WITH (NOLOCK) JOIN sys.schemas s ON s.schema_id = o.schema_id WHERE o.name = '''''' + @objectname + '''''' AND o.type IN (N''''U'''',''''P'''',''''V'''',''''FN'''',''''IF'''',''''TF'''') AND s.name = '''''' + @schemaid + '''''') +BEGIN + IF EXISTS(SELECT 1 FROM sys.fn_builtin_permissions(''''OBJECT'''') WHERE permission_name = '''''' + @rightsaction + '''''') + BEGIN + '' + @grantordeny + '' '' + @rightsaction + '' ON ['' + @schemaid + ''].['' + @objectname + ''] TO ['' + @RoleName + ''] + END +END + +'' + END +END + +IF @typeofobject = ''ASSEMBLIES'' +BEGIN + SET @Command = @Command + '' +IF EXISTS(SELECT 1 FROM sys.assemblies WHERE NAME = '''''' + @objectname + '''''') +BEGIN + IF EXISTS(SELECT 1 FROM sys.fn_builtin_permissions(''''ASSEMBLY'''') WHERE permission_name = '''''' + @rightsaction + '''''') + BEGIN + '' + @grantordeny + '' '' + @rightsaction + ''::['' + @objectname + ''] TO ['' + @RoleName + ''] + END +END + +'' +END + +IF @typeofobject = ''ROLE'' +BEGIN + SET @Command = @Command + '' +IF NOT EXISTS (SELECT 1 FROM sys.database_role_members JOIN sys.database_principals roles ON database_role_members.role_principal_id = roles.principal_id JOIN sys.database_principals members ON database_role_members.member_principal_id = members.principal_id WHERE roles.name = '''''' + @rightsaction + '''''' AND members.name = '''''' + @RoleName + '''''') +BEGIN + EXEC sp_addrolemember N'''''' + @rightsaction + '''''', N'''''' + @RoleName + '''''' +END + +'' +END + +FETCH NEXT FROM SecurablesCurs INTO @typeofobject, @grantordeny, @rightsaction, @objectname, @schemaid +END + +CLOSE SecurablesCurs +DEALLOCATE SecurablesCurs + +PRINT ''SET ALL SECURABLES ON ROLE ['' + @RoleName + '']'' +EXEC sp_executesql @Command + +/* ADD USER */ +DECLARE UsersCurs CURSOR FOR +SELECT username + FROM #UsersOnRole + +OPEN UsersCurs + +FETCH NEXT FROM UsersCurs INTO @Users +WHILE @@FETCH_STATUS = 0 +BEGIN + + SELECT @Command = '' +EXEC sp_addrolemember N'''''' + @RoleName + '''''', N'''''' + @Users + '''''' +PRINT ''''ADD USER ['' + @Users + ''] ON ROLE ['' + @RoleName + '']'''' +'' + +FETCH NEXT FROM UsersCurs INTO @Users +END + +CLOSE UsersCurs +DEALLOCATE UsersCurs + +EXEC sp_executesql @Command + + +/*============================================================================= + Drop temp tables +=============================================================================*/ +DROP TABLE #Securables +DROP TABLE #UsersOnRole +','ArizonaCUST','Pharmacies') + +INSERT INTO #AllRoles(STR_Definition,STR_Database,STR_Product)VALUES(' + +/*============================================================================= + + Script to create dbRoleQAtesters role. + + Role Name: dbRoleQAtesters + TEMPLATE: Default + + EXAMPLE OF SECURABLES TO SET: + + INSERT INTO #Securables + VALUES + (''DB'',''GRANT'',''VIEW DEFINITION'','''',''''), + (''SCHEMA'',''GRANT'',''SELECT,EXECUTE,INSERT,UPDATE,DELETE'','''',''AP''), + (''TABLE'',''GRANT'',''INSERT,UPDATE'',''Address'',''dbo''), + (''SP'',''GRANT'',''EXECUTE'',''sp_bmc_GetNextID'',''dbo''), + (''ROLE'',''GRANT'',''db_datareader'','''','''') + + ----------------------------------------------- + +Generate date : 2023-05-12 / up208700 + +=============================================================================*/ + +DECLARE @Command nvarchar(max), + @RoleName varchar(60), + @Users varchar(255), + @typeofobject varchar(50), + @grantordeny varchar(10), + @rightsaction varchar(255), + @objectname varchar(255), + @schemaid varchar(10), + @sysTarget varchar(255), + @sysType varchar(255) + +SET @RoleName = ''dbRoleQAtesters'' +SET @Command = '''' + +/* TEMP TABLES */ +CREATE TABLE #UsersOnRole(username varchar(255)) +CREATE TABLE #Securables(typeofobject varchar(50), grantordeny varchar(10), rightsaction varchar(255), objectname varchar(255), schemaid varchar(10),N2 bit) + +/* !!! LIST OF SECURABLES TO CHANGE !!! */ + +INSERT INTO #Securables +VALUES +(''ROLE'',''GRANT'',''DB_DATAREADER'','''',''dbo'',0) + + +/* GET ALL USERS ON THIS ROLE */ +INSERT INTO #UsersOnRole +SELECT + members.name +FROM sys.database_role_members + JOIN sys.database_principals roles ON database_role_members.role_principal_id = roles.principal_id + JOIN sys.database_principals members ON database_role_members.member_principal_id = members.principal_id +WHERE roles.name = @RoleName + +/* CREATE ROLE */ +SELECT @Command = '' +IF NOT EXISTS (SELECT 1 FROM sys.database_principals WHERE name = '''''' + @RoleName + '''''' AND type = ''''R'''') +BEGIN + CREATE ROLE ['' + @RoleName + ''] AUTHORIZATION [dbo] + PRINT ''''CREATE ROLE ['' + @RoleName + '']'''' +END +'' +EXEC sp_executesql @Command + +SET @Command = '' +DECLARE @SP_Name varchar(255) + +'' + +/* SET ALL ROLE SECURABLES */ +DECLARE SecurablesCurs CURSOR FOR +SELECT typeofobject, grantordeny, rightsaction, objectname, schemaid +FROM #Securables +WHERE N2 = 0 + +OPEN SecurablesCurs +FETCH NEXT FROM SecurablesCurs INTO @typeofobject, @grantordeny, @rightsaction, @objectname, @schemaid +WHILE @@FETCH_STATUS = 0 +BEGIN + + IF @typeofobject = ''DB'' + BEGIN + IF EXISTS(SELECT 1 FROM sys.fn_builtin_permissions(''DATABASE'') WHERE permission_name = '''' + @rightsaction + '''') + BEGIN + SET @Command = @Command + @grantordeny + '' '' + @rightsaction + '' TO ['' + @RoleName + ''] +'' + END + END + + IF @typeofobject = ''SCHEMA'' + BEGIN + SET @Command = @Command + '' +IF EXISTS (SELECT 1 FROM sys.schemas WHERE name = '''''' + @schemaid + '''''') +BEGIN + IF EXISTS(SELECT 1 FROM sys.fn_builtin_permissions(''''SCHEMA'''') WHERE permission_name = '''''' + @rightsaction + '''''') + BEGIN + '' + @grantordeny + '' '' + @rightsaction + '' ON SCHEMA::'' + @schemaid + '' TO ['' + @RoleName + ''] + END +END + +'' + END + + IF @typeofobject in(''TABLE'',''SP'',''FUNCTIONS'',''VIEWS'') + BEGIN + + IF @objectname like ''%[%]%'' + BEGIN + + IF @typeofobject = ''TABLE'' + BEGIN + SET @sysTarget = ''sys.tables'' + SET @sysType = '''' + END + + IF @typeofobject = ''SP'' + BEGIN + SET @sysTarget = ''sys.procedures'' + SET @sysType = '''' + END + + IF @typeofobject = ''FUNCTIONS'' + BEGIN + SET @sysTarget = ''sys.objects'' + SET @sysType = '' and p.Type IN ( N''''FN'''', N''''IF'''', N''''TF'''', N''''FS'''', N''''FT'''' )'' + END + + IF @typeofobject = ''VIEWS'' + BEGIN + SET @sysTarget = ''sys.views'' + SET @sysType = '''' + END + + SET @Command = @Command + '' +DECLARE SP_cursor CURSOR FOR +SELECT p.name FROM '' + @sysTarget + '' p JOIN sys.schemas s ON s.schema_id = p.schema_id WHERE (p.name like '''''' + @objectname + '''''') and s.name = '''''' + @schemaid + '''' + @sysType + '''''' + +OPEN SP_cursor +FETCH NEXT FROM SP_cursor INTO @SP_Name +WHILE @@FETCH_STATUS = 0 +BEGIN + IF EXISTS(SELECT 1 FROM sys.fn_builtin_permissions(''''OBJECT'''') WHERE permission_name = '''''' + @rightsaction + '''''') + BEGIN + EXEC('''''' + @grantordeny + '' '' + @rightsaction + '' ON ['' + @schemaid + ''].['''' + @SP_Name + ''''] TO ['' + @RoleName + '']'''') + END + FETCH NEXT FROM SP_cursor INTO @SP_Name +END + +CLOSE SP_cursor +DEALLOCATE SP_cursor + +'' + + END + ELSE + BEGIN + + SET @Command = @Command + '' +IF EXISTS(SELECT 1 FROM sys.objects o WITH (NOLOCK) JOIN sys.schemas s ON s.schema_id = o.schema_id WHERE o.name = '''''' + @objectname + '''''' AND o.type IN (N''''U'''',''''P'''',''''V'''',''''FN'''',''''IF'''',''''TF'''') AND s.name = '''''' + @schemaid + '''''') +BEGIN + IF EXISTS(SELECT 1 FROM sys.fn_builtin_permissions(''''OBJECT'''') WHERE permission_name = '''''' + @rightsaction + '''''') + BEGIN + '' + @grantordeny + '' '' + @rightsaction + '' ON ['' + @schemaid + ''].['' + @objectname + ''] TO ['' + @RoleName + ''] + END +END + +'' + END +END + +IF @typeofobject = ''ASSEMBLIES'' +BEGIN + SET @Command = @Command + '' +IF EXISTS(SELECT 1 FROM sys.assemblies WHERE NAME = '''''' + @objectname + '''''') +BEGIN + IF EXISTS(SELECT 1 FROM sys.fn_builtin_permissions(''''ASSEMBLY'''') WHERE permission_name = '''''' + @rightsaction + '''''') + BEGIN + '' + @grantordeny + '' '' + @rightsaction + ''::['' + @objectname + ''] TO ['' + @RoleName + ''] + END +END + +'' +END + +IF @typeofobject = ''ROLE'' +BEGIN + SET @Command = @Command + '' +IF NOT EXISTS (SELECT 1 FROM sys.database_role_members JOIN sys.database_principals roles ON database_role_members.role_principal_id = roles.principal_id JOIN sys.database_principals members ON database_role_members.member_principal_id = members.principal_id WHERE roles.name = '''''' + @rightsaction + '''''' AND members.name = '''''' + @RoleName + '''''') +BEGIN + EXEC sp_addrolemember N'''''' + @rightsaction + '''''', N'''''' + @RoleName + '''''' +END + +'' +END + +FETCH NEXT FROM SecurablesCurs INTO @typeofobject, @grantordeny, @rightsaction, @objectname, @schemaid +END + +CLOSE SecurablesCurs +DEALLOCATE SecurablesCurs + +PRINT ''SET ALL SECURABLES ON ROLE ['' + @RoleName + '']'' +EXEC sp_executesql @Command + +/* ADD USER */ +DECLARE UsersCurs CURSOR FOR +SELECT username + FROM #UsersOnRole + +OPEN UsersCurs + +FETCH NEXT FROM UsersCurs INTO @Users +WHILE @@FETCH_STATUS = 0 +BEGIN + + SELECT @Command = '' +EXEC sp_addrolemember N'''''' + @RoleName + '''''', N'''''' + @Users + '''''' +PRINT ''''ADD USER ['' + @Users + ''] ON ROLE ['' + @RoleName + '']'''' +'' + +FETCH NEXT FROM UsersCurs INTO @Users +END + +CLOSE UsersCurs +DEALLOCATE UsersCurs + +EXEC sp_executesql @Command + + +/*============================================================================= + Drop temp tables +=============================================================================*/ +DROP TABLE #Securables +DROP TABLE #UsersOnRole +','ArizonaLD','Pharmacies') + +INSERT INTO #AllRoles(STR_Definition,STR_Database,STR_Product)VALUES(' + +/*============================================================================= + + Script to create dbRoleTPSSIS role. + + Role Name: dbRoleTPSSIS + TEMPLATE: Default + + EXAMPLE OF SECURABLES TO SET: + + INSERT INTO #Securables + VALUES + (''DB'',''GRANT'',''VIEW DEFINITION'','''',''''), + (''SCHEMA'',''GRANT'',''SELECT,EXECUTE,INSERT,UPDATE,DELETE'','''',''AP''), + (''TABLE'',''GRANT'',''INSERT,UPDATE'',''Address'',''dbo''), + (''SP'',''GRANT'',''EXECUTE'',''sp_bmc_GetNextID'',''dbo''), + (''ROLE'',''GRANT'',''db_datareader'','''','''') + + ----------------------------------------------- + +Generate date : 2023-05-12 / up208700 + +=============================================================================*/ + +DECLARE @Command nvarchar(max), + @RoleName varchar(60), + @Users varchar(255), + @typeofobject varchar(50), + @grantordeny varchar(10), + @rightsaction varchar(255), + @objectname varchar(255), + @schemaid varchar(10), + @sysTarget varchar(255), + @sysType varchar(255) + +SET @RoleName = ''dbRoleTPSSIS'' +SET @Command = '''' + +/* TEMP TABLES */ +CREATE TABLE #UsersOnRole(username varchar(255)) +CREATE TABLE #Securables(typeofobject varchar(50), grantordeny varchar(10), rightsaction varchar(255), objectname varchar(255), schemaid varchar(10),N2 bit) + +/* !!! LIST OF SECURABLES TO CHANGE !!! */ + +INSERT INTO #Securables +VALUES +(''ROLE'',''GRANT'',''DB_DATAREADER'','''',''dbo'',0) + + +/* GET ALL USERS ON THIS ROLE */ +INSERT INTO #UsersOnRole +SELECT + members.name +FROM sys.database_role_members + JOIN sys.database_principals roles ON database_role_members.role_principal_id = roles.principal_id + JOIN sys.database_principals members ON database_role_members.member_principal_id = members.principal_id +WHERE roles.name = @RoleName + +/* CREATE ROLE */ +SELECT @Command = '' +IF NOT EXISTS (SELECT 1 FROM sys.database_principals WHERE name = '''''' + @RoleName + '''''' AND type = ''''R'''') +BEGIN + CREATE ROLE ['' + @RoleName + ''] AUTHORIZATION [dbo] + PRINT ''''CREATE ROLE ['' + @RoleName + '']'''' +END +'' +EXEC sp_executesql @Command + +SET @Command = '' +DECLARE @SP_Name varchar(255) + +'' + +/* SET ALL ROLE SECURABLES */ +DECLARE SecurablesCurs CURSOR FOR +SELECT typeofobject, grantordeny, rightsaction, objectname, schemaid +FROM #Securables +WHERE N2 = 0 + +OPEN SecurablesCurs +FETCH NEXT FROM SecurablesCurs INTO @typeofobject, @grantordeny, @rightsaction, @objectname, @schemaid +WHILE @@FETCH_STATUS = 0 +BEGIN + + IF @typeofobject = ''DB'' + BEGIN + IF EXISTS(SELECT 1 FROM sys.fn_builtin_permissions(''DATABASE'') WHERE permission_name = '''' + @rightsaction + '''') + BEGIN + SET @Command = @Command + @grantordeny + '' '' + @rightsaction + '' TO ['' + @RoleName + ''] +'' + END + END + + IF @typeofobject = ''SCHEMA'' + BEGIN + SET @Command = @Command + '' +IF EXISTS (SELECT 1 FROM sys.schemas WHERE name = '''''' + @schemaid + '''''') +BEGIN + IF EXISTS(SELECT 1 FROM sys.fn_builtin_permissions(''''SCHEMA'''') WHERE permission_name = '''''' + @rightsaction + '''''') + BEGIN + '' + @grantordeny + '' '' + @rightsaction + '' ON SCHEMA::'' + @schemaid + '' TO ['' + @RoleName + ''] + END +END + +'' + END + + IF @typeofobject in(''TABLE'',''SP'',''FUNCTIONS'',''VIEWS'') + BEGIN + + IF @objectname like ''%[%]%'' + BEGIN + + IF @typeofobject = ''TABLE'' + BEGIN + SET @sysTarget = ''sys.tables'' + SET @sysType = '''' + END + + IF @typeofobject = ''SP'' + BEGIN + SET @sysTarget = ''sys.procedures'' + SET @sysType = '''' + END + + IF @typeofobject = ''FUNCTIONS'' + BEGIN + SET @sysTarget = ''sys.objects'' + SET @sysType = '' and p.Type IN ( N''''FN'''', N''''IF'''', N''''TF'''', N''''FS'''', N''''FT'''' )'' + END + + IF @typeofobject = ''VIEWS'' + BEGIN + SET @sysTarget = ''sys.views'' + SET @sysType = '''' + END + + SET @Command = @Command + '' +DECLARE SP_cursor CURSOR FOR +SELECT p.name FROM '' + @sysTarget + '' p JOIN sys.schemas s ON s.schema_id = p.schema_id WHERE (p.name like '''''' + @objectname + '''''') and s.name = '''''' + @schemaid + '''' + @sysType + '''''' + +OPEN SP_cursor +FETCH NEXT FROM SP_cursor INTO @SP_Name +WHILE @@FETCH_STATUS = 0 +BEGIN + IF EXISTS(SELECT 1 FROM sys.fn_builtin_permissions(''''OBJECT'''') WHERE permission_name = '''''' + @rightsaction + '''''') + BEGIN + EXEC('''''' + @grantordeny + '' '' + @rightsaction + '' ON ['' + @schemaid + ''].['''' + @SP_Name + ''''] TO ['' + @RoleName + '']'''') + END + FETCH NEXT FROM SP_cursor INTO @SP_Name +END + +CLOSE SP_cursor +DEALLOCATE SP_cursor + +'' + + END + ELSE + BEGIN + + SET @Command = @Command + '' +IF EXISTS(SELECT 1 FROM sys.objects o WITH (NOLOCK) JOIN sys.schemas s ON s.schema_id = o.schema_id WHERE o.name = '''''' + @objectname + '''''' AND o.type IN (N''''U'''',''''P'''',''''V'''',''''FN'''',''''IF'''',''''TF'''') AND s.name = '''''' + @schemaid + '''''') +BEGIN + IF EXISTS(SELECT 1 FROM sys.fn_builtin_permissions(''''OBJECT'''') WHERE permission_name = '''''' + @rightsaction + '''''') + BEGIN + '' + @grantordeny + '' '' + @rightsaction + '' ON ['' + @schemaid + ''].['' + @objectname + ''] TO ['' + @RoleName + ''] + END +END + +'' + END +END + +IF @typeofobject = ''ASSEMBLIES'' +BEGIN + SET @Command = @Command + '' +IF EXISTS(SELECT 1 FROM sys.assemblies WHERE NAME = '''''' + @objectname + '''''') +BEGIN + IF EXISTS(SELECT 1 FROM sys.fn_builtin_permissions(''''ASSEMBLY'''') WHERE permission_name = '''''' + @rightsaction + '''''') + BEGIN + '' + @grantordeny + '' '' + @rightsaction + ''::['' + @objectname + ''] TO ['' + @RoleName + ''] + END +END + +'' +END + +IF @typeofobject = ''ROLE'' +BEGIN + SET @Command = @Command + '' +IF NOT EXISTS (SELECT 1 FROM sys.database_role_members JOIN sys.database_principals roles ON database_role_members.role_principal_id = roles.principal_id JOIN sys.database_principals members ON database_role_members.member_principal_id = members.principal_id WHERE roles.name = '''''' + @rightsaction + '''''' AND members.name = '''''' + @RoleName + '''''') +BEGIN + EXEC sp_addrolemember N'''''' + @rightsaction + '''''', N'''''' + @RoleName + '''''' +END + +'' +END + +FETCH NEXT FROM SecurablesCurs INTO @typeofobject, @grantordeny, @rightsaction, @objectname, @schemaid +END + +CLOSE SecurablesCurs +DEALLOCATE SecurablesCurs + +PRINT ''SET ALL SECURABLES ON ROLE ['' + @RoleName + '']'' +EXEC sp_executesql @Command + +/* ADD USER */ +DECLARE UsersCurs CURSOR FOR +SELECT username + FROM #UsersOnRole + +OPEN UsersCurs + +FETCH NEXT FROM UsersCurs INTO @Users +WHILE @@FETCH_STATUS = 0 +BEGIN + + SELECT @Command = '' +EXEC sp_addrolemember N'''''' + @RoleName + '''''', N'''''' + @Users + '''''' +PRINT ''''ADD USER ['' + @Users + ''] ON ROLE ['' + @RoleName + '']'''' +'' + +FETCH NEXT FROM UsersCurs INTO @Users +END + +CLOSE UsersCurs +DEALLOCATE UsersCurs + +EXEC sp_executesql @Command + + +/*============================================================================= + Drop temp tables +=============================================================================*/ +DROP TABLE #Securables +DROP TABLE #UsersOnRole +','Arizona','Pharmacies') + +INSERT INTO #AllRoles(STR_Definition,STR_Database,STR_Product)VALUES(' + +/*============================================================================= + + Script to create dbRolePOUsr role. + + Role Name: dbRolePOUsr + TEMPLATE: Default + + EXAMPLE OF SECURABLES TO SET: + + INSERT INTO #Securables + VALUES + (''DB'',''GRANT'',''VIEW DEFINITION'','''',''''), + (''SCHEMA'',''GRANT'',''SELECT,EXECUTE,INSERT,UPDATE,DELETE'','''',''AP''), + (''TABLE'',''GRANT'',''INSERT,UPDATE'',''Address'',''dbo''), + (''SP'',''GRANT'',''EXECUTE'',''sp_bmc_GetNextID'',''dbo''), + (''ROLE'',''GRANT'',''db_datareader'','''','''') + + ----------------------------------------------- + +Generate date : 2023-05-12 / up208700 + +=============================================================================*/ + +DECLARE @Command nvarchar(max), + @RoleName varchar(60), + @Users varchar(255), + @typeofobject varchar(50), + @grantordeny varchar(10), + @rightsaction varchar(255), + @objectname varchar(255), + @schemaid varchar(10), + @sysTarget varchar(255), + @sysType varchar(255) + +SET @RoleName = ''dbRolePOUsr'' +SET @Command = '''' + +/* TEMP TABLES */ +CREATE TABLE #UsersOnRole(username varchar(255)) +CREATE TABLE #Securables(typeofobject varchar(50), grantordeny varchar(10), rightsaction varchar(255), objectname varchar(255), schemaid varchar(10),N2 bit) + +/* !!! LIST OF SECURABLES TO CHANGE !!! */ + +INSERT INTO #Securables +VALUES +(''ROLE'',''GRANT'',''DB_DATAREADER'','''',''dbo'',0) + + +/* GET ALL USERS ON THIS ROLE */ +INSERT INTO #UsersOnRole +SELECT + members.name +FROM sys.database_role_members + JOIN sys.database_principals roles ON database_role_members.role_principal_id = roles.principal_id + JOIN sys.database_principals members ON database_role_members.member_principal_id = members.principal_id +WHERE roles.name = @RoleName + +/* CREATE ROLE */ +SELECT @Command = '' +IF NOT EXISTS (SELECT 1 FROM sys.database_principals WHERE name = '''''' + @RoleName + '''''' AND type = ''''R'''') +BEGIN + CREATE ROLE ['' + @RoleName + ''] AUTHORIZATION [dbo] + PRINT ''''CREATE ROLE ['' + @RoleName + '']'''' +END +'' +EXEC sp_executesql @Command + +SET @Command = '' +DECLARE @SP_Name varchar(255) + +'' + +/* SET ALL ROLE SECURABLES */ +DECLARE SecurablesCurs CURSOR FOR +SELECT typeofobject, grantordeny, rightsaction, objectname, schemaid +FROM #Securables +WHERE N2 = 0 + +OPEN SecurablesCurs +FETCH NEXT FROM SecurablesCurs INTO @typeofobject, @grantordeny, @rightsaction, @objectname, @schemaid +WHILE @@FETCH_STATUS = 0 +BEGIN + + IF @typeofobject = ''DB'' + BEGIN + IF EXISTS(SELECT 1 FROM sys.fn_builtin_permissions(''DATABASE'') WHERE permission_name = '''' + @rightsaction + '''') + BEGIN + SET @Command = @Command + @grantordeny + '' '' + @rightsaction + '' TO ['' + @RoleName + ''] +'' + END + END + + IF @typeofobject = ''SCHEMA'' + BEGIN + SET @Command = @Command + '' +IF EXISTS (SELECT 1 FROM sys.schemas WHERE name = '''''' + @schemaid + '''''') +BEGIN + IF EXISTS(SELECT 1 FROM sys.fn_builtin_permissions(''''SCHEMA'''') WHERE permission_name = '''''' + @rightsaction + '''''') + BEGIN + '' + @grantordeny + '' '' + @rightsaction + '' ON SCHEMA::'' + @schemaid + '' TO ['' + @RoleName + ''] + END +END + +'' + END + + IF @typeofobject in(''TABLE'',''SP'',''FUNCTIONS'',''VIEWS'') + BEGIN + + IF @objectname like ''%[%]%'' + BEGIN + + IF @typeofobject = ''TABLE'' + BEGIN + SET @sysTarget = ''sys.tables'' + SET @sysType = '''' + END + + IF @typeofobject = ''SP'' + BEGIN + SET @sysTarget = ''sys.procedures'' + SET @sysType = '''' + END + + IF @typeofobject = ''FUNCTIONS'' + BEGIN + SET @sysTarget = ''sys.objects'' + SET @sysType = '' and p.Type IN ( N''''FN'''', N''''IF'''', N''''TF'''', N''''FS'''', N''''FT'''' )'' + END + + IF @typeofobject = ''VIEWS'' + BEGIN + SET @sysTarget = ''sys.views'' + SET @sysType = '''' + END + + SET @Command = @Command + '' +DECLARE SP_cursor CURSOR FOR +SELECT p.name FROM '' + @sysTarget + '' p JOIN sys.schemas s ON s.schema_id = p.schema_id WHERE (p.name like '''''' + @objectname + '''''') and s.name = '''''' + @schemaid + '''' + @sysType + '''''' + +OPEN SP_cursor +FETCH NEXT FROM SP_cursor INTO @SP_Name +WHILE @@FETCH_STATUS = 0 +BEGIN + IF EXISTS(SELECT 1 FROM sys.fn_builtin_permissions(''''OBJECT'''') WHERE permission_name = '''''' + @rightsaction + '''''') + BEGIN + EXEC('''''' + @grantordeny + '' '' + @rightsaction + '' ON ['' + @schemaid + ''].['''' + @SP_Name + ''''] TO ['' + @RoleName + '']'''') + END + FETCH NEXT FROM SP_cursor INTO @SP_Name +END + +CLOSE SP_cursor +DEALLOCATE SP_cursor + +'' + + END + ELSE + BEGIN + + SET @Command = @Command + '' +IF EXISTS(SELECT 1 FROM sys.objects o WITH (NOLOCK) JOIN sys.schemas s ON s.schema_id = o.schema_id WHERE o.name = '''''' + @objectname + '''''' AND o.type IN (N''''U'''',''''P'''',''''V'''',''''FN'''',''''IF'''',''''TF'''') AND s.name = '''''' + @schemaid + '''''') +BEGIN + IF EXISTS(SELECT 1 FROM sys.fn_builtin_permissions(''''OBJECT'''') WHERE permission_name = '''''' + @rightsaction + '''''') + BEGIN + '' + @grantordeny + '' '' + @rightsaction + '' ON ['' + @schemaid + ''].['' + @objectname + ''] TO ['' + @RoleName + ''] + END +END + +'' + END +END + +IF @typeofobject = ''ASSEMBLIES'' +BEGIN + SET @Command = @Command + '' +IF EXISTS(SELECT 1 FROM sys.assemblies WHERE NAME = '''''' + @objectname + '''''') +BEGIN + IF EXISTS(SELECT 1 FROM sys.fn_builtin_permissions(''''ASSEMBLY'''') WHERE permission_name = '''''' + @rightsaction + '''''') + BEGIN + '' + @grantordeny + '' '' + @rightsaction + ''::['' + @objectname + ''] TO ['' + @RoleName + ''] + END +END + +'' +END + +IF @typeofobject = ''ROLE'' +BEGIN + SET @Command = @Command + '' +IF NOT EXISTS (SELECT 1 FROM sys.database_role_members JOIN sys.database_principals roles ON database_role_members.role_principal_id = roles.principal_id JOIN sys.database_principals members ON database_role_members.member_principal_id = members.principal_id WHERE roles.name = '''''' + @rightsaction + '''''' AND members.name = '''''' + @RoleName + '''''') +BEGIN + EXEC sp_addrolemember N'''''' + @rightsaction + '''''', N'''''' + @RoleName + '''''' +END + +'' +END + +FETCH NEXT FROM SecurablesCurs INTO @typeofobject, @grantordeny, @rightsaction, @objectname, @schemaid +END + +CLOSE SecurablesCurs +DEALLOCATE SecurablesCurs + +PRINT ''SET ALL SECURABLES ON ROLE ['' + @RoleName + '']'' +EXEC sp_executesql @Command + +/* ADD USER */ +DECLARE UsersCurs CURSOR FOR +SELECT username + FROM #UsersOnRole + +OPEN UsersCurs + +FETCH NEXT FROM UsersCurs INTO @Users +WHILE @@FETCH_STATUS = 0 +BEGIN + + SELECT @Command = '' +EXEC sp_addrolemember N'''''' + @RoleName + '''''', N'''''' + @Users + '''''' +PRINT ''''ADD USER ['' + @Users + ''] ON ROLE ['' + @RoleName + '']'''' +'' + +FETCH NEXT FROM UsersCurs INTO @Users +END + +CLOSE UsersCurs +DEALLOCATE UsersCurs + +EXEC sp_executesql @Command + + +/*============================================================================= + Drop temp tables +=============================================================================*/ +DROP TABLE #Securables +DROP TABLE #UsersOnRole +','ActivePos_read','Pharmacies') + +INSERT INTO #AllRoles(STR_Definition,STR_Database,STR_Product)VALUES(' + +/*============================================================================= + + Script to create dbRolePOUsr role. + + Role Name: dbRolePOUsr + TEMPLATE: Default + + EXAMPLE OF SECURABLES TO SET: + + INSERT INTO #Securables + VALUES + (''DB'',''GRANT'',''VIEW DEFINITION'','''',''''), + (''SCHEMA'',''GRANT'',''SELECT,EXECUTE,INSERT,UPDATE,DELETE'','''',''AP''), + (''TABLE'',''GRANT'',''INSERT,UPDATE'',''Address'',''dbo''), + (''SP'',''GRANT'',''EXECUTE'',''sp_bmc_GetNextID'',''dbo''), + (''ROLE'',''GRANT'',''db_datareader'','''','''') + + ----------------------------------------------- + +Generate date : 2023-05-12 / up208700 + +=============================================================================*/ + +DECLARE @Command nvarchar(max), + @RoleName varchar(60), + @Users varchar(255), + @typeofobject varchar(50), + @grantordeny varchar(10), + @rightsaction varchar(255), + @objectname varchar(255), + @schemaid varchar(10), + @sysTarget varchar(255), + @sysType varchar(255) + +SET @RoleName = ''dbRolePOUsr'' +SET @Command = '''' + +/* TEMP TABLES */ +CREATE TABLE #UsersOnRole(username varchar(255)) +CREATE TABLE #Securables(typeofobject varchar(50), grantordeny varchar(10), rightsaction varchar(255), objectname varchar(255), schemaid varchar(10),N2 bit) + +/* !!! LIST OF SECURABLES TO CHANGE !!! */ + +INSERT INTO #Securables +VALUES +(''ROLE'',''GRANT'',''DB_DATAREADER'','''',''dbo'',0) + + +/* GET ALL USERS ON THIS ROLE */ +INSERT INTO #UsersOnRole +SELECT + members.name +FROM sys.database_role_members + JOIN sys.database_principals roles ON database_role_members.role_principal_id = roles.principal_id + JOIN sys.database_principals members ON database_role_members.member_principal_id = members.principal_id +WHERE roles.name = @RoleName + +/* CREATE ROLE */ +SELECT @Command = '' +IF NOT EXISTS (SELECT 1 FROM sys.database_principals WHERE name = '''''' + @RoleName + '''''' AND type = ''''R'''') +BEGIN + CREATE ROLE ['' + @RoleName + ''] AUTHORIZATION [dbo] + PRINT ''''CREATE ROLE ['' + @RoleName + '']'''' +END +'' +EXEC sp_executesql @Command + +SET @Command = '' +DECLARE @SP_Name varchar(255) + +'' + +/* SET ALL ROLE SECURABLES */ +DECLARE SecurablesCurs CURSOR FOR +SELECT typeofobject, grantordeny, rightsaction, objectname, schemaid +FROM #Securables +WHERE N2 = 0 + +OPEN SecurablesCurs +FETCH NEXT FROM SecurablesCurs INTO @typeofobject, @grantordeny, @rightsaction, @objectname, @schemaid +WHILE @@FETCH_STATUS = 0 +BEGIN + + IF @typeofobject = ''DB'' + BEGIN + IF EXISTS(SELECT 1 FROM sys.fn_builtin_permissions(''DATABASE'') WHERE permission_name = '''' + @rightsaction + '''') + BEGIN + SET @Command = @Command + @grantordeny + '' '' + @rightsaction + '' TO ['' + @RoleName + ''] +'' + END + END + + IF @typeofobject = ''SCHEMA'' + BEGIN + SET @Command = @Command + '' +IF EXISTS (SELECT 1 FROM sys.schemas WHERE name = '''''' + @schemaid + '''''') +BEGIN + IF EXISTS(SELECT 1 FROM sys.fn_builtin_permissions(''''SCHEMA'''') WHERE permission_name = '''''' + @rightsaction + '''''') + BEGIN + '' + @grantordeny + '' '' + @rightsaction + '' ON SCHEMA::'' + @schemaid + '' TO ['' + @RoleName + ''] + END +END + +'' + END + + IF @typeofobject in(''TABLE'',''SP'',''FUNCTIONS'',''VIEWS'') + BEGIN + + IF @objectname like ''%[%]%'' + BEGIN + + IF @typeofobject = ''TABLE'' + BEGIN + SET @sysTarget = ''sys.tables'' + SET @sysType = '''' + END + + IF @typeofobject = ''SP'' + BEGIN + SET @sysTarget = ''sys.procedures'' + SET @sysType = '''' + END + + IF @typeofobject = ''FUNCTIONS'' + BEGIN + SET @sysTarget = ''sys.objects'' + SET @sysType = '' and p.Type IN ( N''''FN'''', N''''IF'''', N''''TF'''', N''''FS'''', N''''FT'''' )'' + END + + IF @typeofobject = ''VIEWS'' + BEGIN + SET @sysTarget = ''sys.views'' + SET @sysType = '''' + END + + SET @Command = @Command + '' +DECLARE SP_cursor CURSOR FOR +SELECT p.name FROM '' + @sysTarget + '' p JOIN sys.schemas s ON s.schema_id = p.schema_id WHERE (p.name like '''''' + @objectname + '''''') and s.name = '''''' + @schemaid + '''' + @sysType + '''''' + +OPEN SP_cursor +FETCH NEXT FROM SP_cursor INTO @SP_Name +WHILE @@FETCH_STATUS = 0 +BEGIN + IF EXISTS(SELECT 1 FROM sys.fn_builtin_permissions(''''OBJECT'''') WHERE permission_name = '''''' + @rightsaction + '''''') + BEGIN + EXEC('''''' + @grantordeny + '' '' + @rightsaction + '' ON ['' + @schemaid + ''].['''' + @SP_Name + ''''] TO ['' + @RoleName + '']'''') + END + FETCH NEXT FROM SP_cursor INTO @SP_Name +END + +CLOSE SP_cursor +DEALLOCATE SP_cursor + +'' + + END + ELSE + BEGIN + + SET @Command = @Command + '' +IF EXISTS(SELECT 1 FROM sys.objects o WITH (NOLOCK) JOIN sys.schemas s ON s.schema_id = o.schema_id WHERE o.name = '''''' + @objectname + '''''' AND o.type IN (N''''U'''',''''P'''',''''V'''',''''FN'''',''''IF'''',''''TF'''') AND s.name = '''''' + @schemaid + '''''') +BEGIN + IF EXISTS(SELECT 1 FROM sys.fn_builtin_permissions(''''OBJECT'''') WHERE permission_name = '''''' + @rightsaction + '''''') + BEGIN + '' + @grantordeny + '' '' + @rightsaction + '' ON ['' + @schemaid + ''].['' + @objectname + ''] TO ['' + @RoleName + ''] + END +END + +'' + END +END + +IF @typeofobject = ''ASSEMBLIES'' +BEGIN + SET @Command = @Command + '' +IF EXISTS(SELECT 1 FROM sys.assemblies WHERE NAME = '''''' + @objectname + '''''') +BEGIN + IF EXISTS(SELECT 1 FROM sys.fn_builtin_permissions(''''ASSEMBLY'''') WHERE permission_name = '''''' + @rightsaction + '''''') + BEGIN + '' + @grantordeny + '' '' + @rightsaction + ''::['' + @objectname + ''] TO ['' + @RoleName + ''] + END +END + +'' +END + +IF @typeofobject = ''ROLE'' +BEGIN + SET @Command = @Command + '' +IF NOT EXISTS (SELECT 1 FROM sys.database_role_members JOIN sys.database_principals roles ON database_role_members.role_principal_id = roles.principal_id JOIN sys.database_principals members ON database_role_members.member_principal_id = members.principal_id WHERE roles.name = '''''' + @rightsaction + '''''' AND members.name = '''''' + @RoleName + '''''') +BEGIN + EXEC sp_addrolemember N'''''' + @rightsaction + '''''', N'''''' + @RoleName + '''''' +END + +'' +END + +FETCH NEXT FROM SecurablesCurs INTO @typeofobject, @grantordeny, @rightsaction, @objectname, @schemaid +END + +CLOSE SecurablesCurs +DEALLOCATE SecurablesCurs + +PRINT ''SET ALL SECURABLES ON ROLE ['' + @RoleName + '']'' +EXEC sp_executesql @Command + +/* ADD USER */ +DECLARE UsersCurs CURSOR FOR +SELECT username + FROM #UsersOnRole + +OPEN UsersCurs + +FETCH NEXT FROM UsersCurs INTO @Users +WHILE @@FETCH_STATUS = 0 +BEGIN + + SELECT @Command = '' +EXEC sp_addrolemember N'''''' + @RoleName + '''''', N'''''' + @Users + '''''' +PRINT ''''ADD USER ['' + @Users + ''] ON ROLE ['' + @RoleName + '']'''' +'' + +FETCH NEXT FROM UsersCurs INTO @Users +END + +CLOSE UsersCurs +DEALLOCATE UsersCurs + +EXEC sp_executesql @Command + + +/*============================================================================= + Drop temp tables +=============================================================================*/ +DROP TABLE #Securables +DROP TABLE #UsersOnRole +','ActivePos_server','Pharmacies') + +INSERT INTO #AllRoles(STR_Definition,STR_Database,STR_Product)VALUES(' + +/*============================================================================= + + Script to create dbRolePOUsr role. + + Role Name: dbRolePOUsr + TEMPLATE: Default + + EXAMPLE OF SECURABLES TO SET: + + INSERT INTO #Securables + VALUES + (''DB'',''GRANT'',''VIEW DEFINITION'','''',''''), + (''SCHEMA'',''GRANT'',''SELECT,EXECUTE,INSERT,UPDATE,DELETE'','''',''AP''), + (''TABLE'',''GRANT'',''INSERT,UPDATE'',''Address'',''dbo''), + (''SP'',''GRANT'',''EXECUTE'',''sp_bmc_GetNextID'',''dbo''), + (''ROLE'',''GRANT'',''db_datareader'','''','''') + + ----------------------------------------------- + +Generate date : 2023-05-12 / up208700 + +=============================================================================*/ + +DECLARE @Command nvarchar(max), + @RoleName varchar(60), + @Users varchar(255), + @typeofobject varchar(50), + @grantordeny varchar(10), + @rightsaction varchar(255), + @objectname varchar(255), + @schemaid varchar(10), + @sysTarget varchar(255), + @sysType varchar(255) + +SET @RoleName = ''dbRolePOUsr'' +SET @Command = '''' + +/* TEMP TABLES */ +CREATE TABLE #UsersOnRole(username varchar(255)) +CREATE TABLE #Securables(typeofobject varchar(50), grantordeny varchar(10), rightsaction varchar(255), objectname varchar(255), schemaid varchar(10),N2 bit) + +/* !!! LIST OF SECURABLES TO CHANGE !!! */ + +INSERT INTO #Securables +VALUES +(''ROLE'',''GRANT'',''DB_DATAREADER'','''',''dbo'',0) + + +/* GET ALL USERS ON THIS ROLE */ +INSERT INTO #UsersOnRole +SELECT + members.name +FROM sys.database_role_members + JOIN sys.database_principals roles ON database_role_members.role_principal_id = roles.principal_id + JOIN sys.database_principals members ON database_role_members.member_principal_id = members.principal_id +WHERE roles.name = @RoleName + +/* CREATE ROLE */ +SELECT @Command = '' +IF NOT EXISTS (SELECT 1 FROM sys.database_principals WHERE name = '''''' + @RoleName + '''''' AND type = ''''R'''') +BEGIN + CREATE ROLE ['' + @RoleName + ''] AUTHORIZATION [dbo] + PRINT ''''CREATE ROLE ['' + @RoleName + '']'''' +END +'' +EXEC sp_executesql @Command + +SET @Command = '' +DECLARE @SP_Name varchar(255) + +'' + +/* SET ALL ROLE SECURABLES */ +DECLARE SecurablesCurs CURSOR FOR +SELECT typeofobject, grantordeny, rightsaction, objectname, schemaid +FROM #Securables +WHERE N2 = 0 + +OPEN SecurablesCurs +FETCH NEXT FROM SecurablesCurs INTO @typeofobject, @grantordeny, @rightsaction, @objectname, @schemaid +WHILE @@FETCH_STATUS = 0 +BEGIN + + IF @typeofobject = ''DB'' + BEGIN + IF EXISTS(SELECT 1 FROM sys.fn_builtin_permissions(''DATABASE'') WHERE permission_name = '''' + @rightsaction + '''') + BEGIN + SET @Command = @Command + @grantordeny + '' '' + @rightsaction + '' TO ['' + @RoleName + ''] +'' + END + END + + IF @typeofobject = ''SCHEMA'' + BEGIN + SET @Command = @Command + '' +IF EXISTS (SELECT 1 FROM sys.schemas WHERE name = '''''' + @schemaid + '''''') +BEGIN + IF EXISTS(SELECT 1 FROM sys.fn_builtin_permissions(''''SCHEMA'''') WHERE permission_name = '''''' + @rightsaction + '''''') + BEGIN + '' + @grantordeny + '' '' + @rightsaction + '' ON SCHEMA::'' + @schemaid + '' TO ['' + @RoleName + ''] + END +END + +'' + END + + IF @typeofobject in(''TABLE'',''SP'',''FUNCTIONS'',''VIEWS'') + BEGIN + + IF @objectname like ''%[%]%'' + BEGIN + + IF @typeofobject = ''TABLE'' + BEGIN + SET @sysTarget = ''sys.tables'' + SET @sysType = '''' + END + + IF @typeofobject = ''SP'' + BEGIN + SET @sysTarget = ''sys.procedures'' + SET @sysType = '''' + END + + IF @typeofobject = ''FUNCTIONS'' + BEGIN + SET @sysTarget = ''sys.objects'' + SET @sysType = '' and p.Type IN ( N''''FN'''', N''''IF'''', N''''TF'''', N''''FS'''', N''''FT'''' )'' + END + + IF @typeofobject = ''VIEWS'' + BEGIN + SET @sysTarget = ''sys.views'' + SET @sysType = '''' + END + + SET @Command = @Command + '' +DECLARE SP_cursor CURSOR FOR +SELECT p.name FROM '' + @sysTarget + '' p JOIN sys.schemas s ON s.schema_id = p.schema_id WHERE (p.name like '''''' + @objectname + '''''') and s.name = '''''' + @schemaid + '''' + @sysType + '''''' + +OPEN SP_cursor +FETCH NEXT FROM SP_cursor INTO @SP_Name +WHILE @@FETCH_STATUS = 0 +BEGIN + IF EXISTS(SELECT 1 FROM sys.fn_builtin_permissions(''''OBJECT'''') WHERE permission_name = '''''' + @rightsaction + '''''') + BEGIN + EXEC('''''' + @grantordeny + '' '' + @rightsaction + '' ON ['' + @schemaid + ''].['''' + @SP_Name + ''''] TO ['' + @RoleName + '']'''') + END + FETCH NEXT FROM SP_cursor INTO @SP_Name +END + +CLOSE SP_cursor +DEALLOCATE SP_cursor + +'' + + END + ELSE + BEGIN + + SET @Command = @Command + '' +IF EXISTS(SELECT 1 FROM sys.objects o WITH (NOLOCK) JOIN sys.schemas s ON s.schema_id = o.schema_id WHERE o.name = '''''' + @objectname + '''''' AND o.type IN (N''''U'''',''''P'''',''''V'''',''''FN'''',''''IF'''',''''TF'''') AND s.name = '''''' + @schemaid + '''''') +BEGIN + IF EXISTS(SELECT 1 FROM sys.fn_builtin_permissions(''''OBJECT'''') WHERE permission_name = '''''' + @rightsaction + '''''') + BEGIN + '' + @grantordeny + '' '' + @rightsaction + '' ON ['' + @schemaid + ''].['' + @objectname + ''] TO ['' + @RoleName + ''] + END +END + +'' + END +END + +IF @typeofobject = ''ASSEMBLIES'' +BEGIN + SET @Command = @Command + '' +IF EXISTS(SELECT 1 FROM sys.assemblies WHERE NAME = '''''' + @objectname + '''''') +BEGIN + IF EXISTS(SELECT 1 FROM sys.fn_builtin_permissions(''''ASSEMBLY'''') WHERE permission_name = '''''' + @rightsaction + '''''') + BEGIN + '' + @grantordeny + '' '' + @rightsaction + ''::['' + @objectname + ''] TO ['' + @RoleName + ''] + END +END + +'' +END + +IF @typeofobject = ''ROLE'' +BEGIN + SET @Command = @Command + '' +IF NOT EXISTS (SELECT 1 FROM sys.database_role_members JOIN sys.database_principals roles ON database_role_members.role_principal_id = roles.principal_id JOIN sys.database_principals members ON database_role_members.member_principal_id = members.principal_id WHERE roles.name = '''''' + @rightsaction + '''''' AND members.name = '''''' + @RoleName + '''''') +BEGIN + EXEC sp_addrolemember N'''''' + @rightsaction + '''''', N'''''' + @RoleName + '''''' +END + +'' +END + +FETCH NEXT FROM SecurablesCurs INTO @typeofobject, @grantordeny, @rightsaction, @objectname, @schemaid +END + +CLOSE SecurablesCurs +DEALLOCATE SecurablesCurs + +PRINT ''SET ALL SECURABLES ON ROLE ['' + @RoleName + '']'' +EXEC sp_executesql @Command + +/* ADD USER */ +DECLARE UsersCurs CURSOR FOR +SELECT username + FROM #UsersOnRole + +OPEN UsersCurs + +FETCH NEXT FROM UsersCurs INTO @Users +WHILE @@FETCH_STATUS = 0 +BEGIN + + SELECT @Command = '' +EXEC sp_addrolemember N'''''' + @RoleName + '''''', N'''''' + @Users + '''''' +PRINT ''''ADD USER ['' + @Users + ''] ON ROLE ['' + @RoleName + '']'''' +'' + +FETCH NEXT FROM UsersCurs INTO @Users +END + +CLOSE UsersCurs +DEALLOCATE UsersCurs + +EXEC sp_executesql @Command + + +/*============================================================================= + Drop temp tables +=============================================================================*/ +DROP TABLE #Securables +DROP TABLE #UsersOnRole +','ActivePos_write','Pharmacies') + +INSERT INTO #AllRoles(STR_Definition,STR_Database,STR_Product)VALUES(' + +/*============================================================================= + + Script to create dbRolePOUsr role. + + Role Name: dbRolePOUsr + TEMPLATE: Default + + EXAMPLE OF SECURABLES TO SET: + + INSERT INTO #Securables + VALUES + (''DB'',''GRANT'',''VIEW DEFINITION'','''',''''), + (''SCHEMA'',''GRANT'',''SELECT,EXECUTE,INSERT,UPDATE,DELETE'','''',''AP''), + (''TABLE'',''GRANT'',''INSERT,UPDATE'',''Address'',''dbo''), + (''SP'',''GRANT'',''EXECUTE'',''sp_bmc_GetNextID'',''dbo''), + (''ROLE'',''GRANT'',''db_datareader'','''','''') + + ----------------------------------------------- + +Generate date : 2023-05-12 / up208700 + +=============================================================================*/ + +DECLARE @Command nvarchar(max), + @RoleName varchar(60), + @Users varchar(255), + @typeofobject varchar(50), + @grantordeny varchar(10), + @rightsaction varchar(255), + @objectname varchar(255), + @schemaid varchar(10), + @sysTarget varchar(255), + @sysType varchar(255) + +SET @RoleName = ''dbRolePOUsr'' +SET @Command = '''' + +/* TEMP TABLES */ +CREATE TABLE #UsersOnRole(username varchar(255)) +CREATE TABLE #Securables(typeofobject varchar(50), grantordeny varchar(10), rightsaction varchar(255), objectname varchar(255), schemaid varchar(10),N2 bit) + +/* !!! LIST OF SECURABLES TO CHANGE !!! */ + +INSERT INTO #Securables +VALUES +(''ROLE'',''GRANT'',''DB_DATAREADER'','''',''dbo'',0) + + +/* GET ALL USERS ON THIS ROLE */ +INSERT INTO #UsersOnRole +SELECT + members.name +FROM sys.database_role_members + JOIN sys.database_principals roles ON database_role_members.role_principal_id = roles.principal_id + JOIN sys.database_principals members ON database_role_members.member_principal_id = members.principal_id +WHERE roles.name = @RoleName + +/* CREATE ROLE */ +SELECT @Command = '' +IF NOT EXISTS (SELECT 1 FROM sys.database_principals WHERE name = '''''' + @RoleName + '''''' AND type = ''''R'''') +BEGIN + CREATE ROLE ['' + @RoleName + ''] AUTHORIZATION [dbo] + PRINT ''''CREATE ROLE ['' + @RoleName + '']'''' +END +'' +EXEC sp_executesql @Command + +SET @Command = '' +DECLARE @SP_Name varchar(255) + +'' + +/* SET ALL ROLE SECURABLES */ +DECLARE SecurablesCurs CURSOR FOR +SELECT typeofobject, grantordeny, rightsaction, objectname, schemaid +FROM #Securables +WHERE N2 = 0 + +OPEN SecurablesCurs +FETCH NEXT FROM SecurablesCurs INTO @typeofobject, @grantordeny, @rightsaction, @objectname, @schemaid +WHILE @@FETCH_STATUS = 0 +BEGIN + + IF @typeofobject = ''DB'' + BEGIN + IF EXISTS(SELECT 1 FROM sys.fn_builtin_permissions(''DATABASE'') WHERE permission_name = '''' + @rightsaction + '''') + BEGIN + SET @Command = @Command + @grantordeny + '' '' + @rightsaction + '' TO ['' + @RoleName + ''] +'' + END + END + + IF @typeofobject = ''SCHEMA'' + BEGIN + SET @Command = @Command + '' +IF EXISTS (SELECT 1 FROM sys.schemas WHERE name = '''''' + @schemaid + '''''') +BEGIN + IF EXISTS(SELECT 1 FROM sys.fn_builtin_permissions(''''SCHEMA'''') WHERE permission_name = '''''' + @rightsaction + '''''') + BEGIN + '' + @grantordeny + '' '' + @rightsaction + '' ON SCHEMA::'' + @schemaid + '' TO ['' + @RoleName + ''] + END +END + +'' + END + + IF @typeofobject in(''TABLE'',''SP'',''FUNCTIONS'',''VIEWS'') + BEGIN + + IF @objectname like ''%[%]%'' + BEGIN + + IF @typeofobject = ''TABLE'' + BEGIN + SET @sysTarget = ''sys.tables'' + SET @sysType = '''' + END + + IF @typeofobject = ''SP'' + BEGIN + SET @sysTarget = ''sys.procedures'' + SET @sysType = '''' + END + + IF @typeofobject = ''FUNCTIONS'' + BEGIN + SET @sysTarget = ''sys.objects'' + SET @sysType = '' and p.Type IN ( N''''FN'''', N''''IF'''', N''''TF'''', N''''FS'''', N''''FT'''' )'' + END + + IF @typeofobject = ''VIEWS'' + BEGIN + SET @sysTarget = ''sys.views'' + SET @sysType = '''' + END + + SET @Command = @Command + '' +DECLARE SP_cursor CURSOR FOR +SELECT p.name FROM '' + @sysTarget + '' p JOIN sys.schemas s ON s.schema_id = p.schema_id WHERE (p.name like '''''' + @objectname + '''''') and s.name = '''''' + @schemaid + '''' + @sysType + '''''' + +OPEN SP_cursor +FETCH NEXT FROM SP_cursor INTO @SP_Name +WHILE @@FETCH_STATUS = 0 +BEGIN + IF EXISTS(SELECT 1 FROM sys.fn_builtin_permissions(''''OBJECT'''') WHERE permission_name = '''''' + @rightsaction + '''''') + BEGIN + EXEC('''''' + @grantordeny + '' '' + @rightsaction + '' ON ['' + @schemaid + ''].['''' + @SP_Name + ''''] TO ['' + @RoleName + '']'''') + END + FETCH NEXT FROM SP_cursor INTO @SP_Name +END + +CLOSE SP_cursor +DEALLOCATE SP_cursor + +'' + + END + ELSE + BEGIN + + SET @Command = @Command + '' +IF EXISTS(SELECT 1 FROM sys.objects o WITH (NOLOCK) JOIN sys.schemas s ON s.schema_id = o.schema_id WHERE o.name = '''''' + @objectname + '''''' AND o.type IN (N''''U'''',''''P'''',''''V'''',''''FN'''',''''IF'''',''''TF'''') AND s.name = '''''' + @schemaid + '''''') +BEGIN + IF EXISTS(SELECT 1 FROM sys.fn_builtin_permissions(''''OBJECT'''') WHERE permission_name = '''''' + @rightsaction + '''''') + BEGIN + '' + @grantordeny + '' '' + @rightsaction + '' ON ['' + @schemaid + ''].['' + @objectname + ''] TO ['' + @RoleName + ''] + END +END + +'' + END +END + +IF @typeofobject = ''ASSEMBLIES'' +BEGIN + SET @Command = @Command + '' +IF EXISTS(SELECT 1 FROM sys.assemblies WHERE NAME = '''''' + @objectname + '''''') +BEGIN + IF EXISTS(SELECT 1 FROM sys.fn_builtin_permissions(''''ASSEMBLY'''') WHERE permission_name = '''''' + @rightsaction + '''''') + BEGIN + '' + @grantordeny + '' '' + @rightsaction + ''::['' + @objectname + ''] TO ['' + @RoleName + ''] + END +END + +'' +END + +IF @typeofobject = ''ROLE'' +BEGIN + SET @Command = @Command + '' +IF NOT EXISTS (SELECT 1 FROM sys.database_role_members JOIN sys.database_principals roles ON database_role_members.role_principal_id = roles.principal_id JOIN sys.database_principals members ON database_role_members.member_principal_id = members.principal_id WHERE roles.name = '''''' + @rightsaction + '''''' AND members.name = '''''' + @RoleName + '''''') +BEGIN + EXEC sp_addrolemember N'''''' + @rightsaction + '''''', N'''''' + @RoleName + '''''' +END + +'' +END + +FETCH NEXT FROM SecurablesCurs INTO @typeofobject, @grantordeny, @rightsaction, @objectname, @schemaid +END + +CLOSE SecurablesCurs +DEALLOCATE SecurablesCurs + +PRINT ''SET ALL SECURABLES ON ROLE ['' + @RoleName + '']'' +EXEC sp_executesql @Command + +/* ADD USER */ +DECLARE UsersCurs CURSOR FOR +SELECT username + FROM #UsersOnRole + +OPEN UsersCurs + +FETCH NEXT FROM UsersCurs INTO @Users +WHILE @@FETCH_STATUS = 0 +BEGIN + + SELECT @Command = '' +EXEC sp_addrolemember N'''''' + @RoleName + '''''', N'''''' + @Users + '''''' +PRINT ''''ADD USER ['' + @Users + ''] ON ROLE ['' + @RoleName + '']'''' +'' + +FETCH NEXT FROM UsersCurs INTO @Users +END + +CLOSE UsersCurs +DEALLOCATE UsersCurs + +EXEC sp_executesql @Command + + +/*============================================================================= + Drop temp tables +=============================================================================*/ +DROP TABLE #Securables +DROP TABLE #UsersOnRole +','ActiveSystemClient','Pharmacies') + +INSERT INTO #AllRoles(STR_Definition,STR_Database,STR_Product)VALUES(' + +/*============================================================================= + + Script to create dbRolePOUsr role. + + Role Name: dbRolePOUsr + TEMPLATE: Default + + EXAMPLE OF SECURABLES TO SET: + + INSERT INTO #Securables + VALUES + (''DB'',''GRANT'',''VIEW DEFINITION'','''',''''), + (''SCHEMA'',''GRANT'',''SELECT,EXECUTE,INSERT,UPDATE,DELETE'','''',''AP''), + (''TABLE'',''GRANT'',''INSERT,UPDATE'',''Address'',''dbo''), + (''SP'',''GRANT'',''EXECUTE'',''sp_bmc_GetNextID'',''dbo''), + (''ROLE'',''GRANT'',''db_datareader'','''','''') + + ----------------------------------------------- + +Generate date : 2023-05-12 / up208700 + +=============================================================================*/ + +DECLARE @Command nvarchar(max), + @RoleName varchar(60), + @Users varchar(255), + @typeofobject varchar(50), + @grantordeny varchar(10), + @rightsaction varchar(255), + @objectname varchar(255), + @schemaid varchar(10), + @sysTarget varchar(255), + @sysType varchar(255) + +SET @RoleName = ''dbRolePOUsr'' +SET @Command = '''' + +/* TEMP TABLES */ +CREATE TABLE #UsersOnRole(username varchar(255)) +CREATE TABLE #Securables(typeofobject varchar(50), grantordeny varchar(10), rightsaction varchar(255), objectname varchar(255), schemaid varchar(10),N2 bit) + +/* !!! LIST OF SECURABLES TO CHANGE !!! */ + +INSERT INTO #Securables +VALUES +(''ROLE'',''GRANT'',''DB_DATAREADER'','''',''dbo'',0) + + +/* GET ALL USERS ON THIS ROLE */ +INSERT INTO #UsersOnRole +SELECT + members.name +FROM sys.database_role_members + JOIN sys.database_principals roles ON database_role_members.role_principal_id = roles.principal_id + JOIN sys.database_principals members ON database_role_members.member_principal_id = members.principal_id +WHERE roles.name = @RoleName + +/* CREATE ROLE */ +SELECT @Command = '' +IF NOT EXISTS (SELECT 1 FROM sys.database_principals WHERE name = '''''' + @RoleName + '''''' AND type = ''''R'''') +BEGIN + CREATE ROLE ['' + @RoleName + ''] AUTHORIZATION [dbo] + PRINT ''''CREATE ROLE ['' + @RoleName + '']'''' +END +'' +EXEC sp_executesql @Command + +SET @Command = '' +DECLARE @SP_Name varchar(255) + +'' + +/* SET ALL ROLE SECURABLES */ +DECLARE SecurablesCurs CURSOR FOR +SELECT typeofobject, grantordeny, rightsaction, objectname, schemaid +FROM #Securables +WHERE N2 = 0 + +OPEN SecurablesCurs +FETCH NEXT FROM SecurablesCurs INTO @typeofobject, @grantordeny, @rightsaction, @objectname, @schemaid +WHILE @@FETCH_STATUS = 0 +BEGIN + + IF @typeofobject = ''DB'' + BEGIN + IF EXISTS(SELECT 1 FROM sys.fn_builtin_permissions(''DATABASE'') WHERE permission_name = '''' + @rightsaction + '''') + BEGIN + SET @Command = @Command + @grantordeny + '' '' + @rightsaction + '' TO ['' + @RoleName + ''] +'' + END + END + + IF @typeofobject = ''SCHEMA'' + BEGIN + SET @Command = @Command + '' +IF EXISTS (SELECT 1 FROM sys.schemas WHERE name = '''''' + @schemaid + '''''') +BEGIN + IF EXISTS(SELECT 1 FROM sys.fn_builtin_permissions(''''SCHEMA'''') WHERE permission_name = '''''' + @rightsaction + '''''') + BEGIN + '' + @grantordeny + '' '' + @rightsaction + '' ON SCHEMA::'' + @schemaid + '' TO ['' + @RoleName + ''] + END +END + +'' + END + + IF @typeofobject in(''TABLE'',''SP'',''FUNCTIONS'',''VIEWS'') + BEGIN + + IF @objectname like ''%[%]%'' + BEGIN + + IF @typeofobject = ''TABLE'' + BEGIN + SET @sysTarget = ''sys.tables'' + SET @sysType = '''' + END + + IF @typeofobject = ''SP'' + BEGIN + SET @sysTarget = ''sys.procedures'' + SET @sysType = '''' + END + + IF @typeofobject = ''FUNCTIONS'' + BEGIN + SET @sysTarget = ''sys.objects'' + SET @sysType = '' and p.Type IN ( N''''FN'''', N''''IF'''', N''''TF'''', N''''FS'''', N''''FT'''' )'' + END + + IF @typeofobject = ''VIEWS'' + BEGIN + SET @sysTarget = ''sys.views'' + SET @sysType = '''' + END + + SET @Command = @Command + '' +DECLARE SP_cursor CURSOR FOR +SELECT p.name FROM '' + @sysTarget + '' p JOIN sys.schemas s ON s.schema_id = p.schema_id WHERE (p.name like '''''' + @objectname + '''''') and s.name = '''''' + @schemaid + '''' + @sysType + '''''' + +OPEN SP_cursor +FETCH NEXT FROM SP_cursor INTO @SP_Name +WHILE @@FETCH_STATUS = 0 +BEGIN + IF EXISTS(SELECT 1 FROM sys.fn_builtin_permissions(''''OBJECT'''') WHERE permission_name = '''''' + @rightsaction + '''''') + BEGIN + EXEC('''''' + @grantordeny + '' '' + @rightsaction + '' ON ['' + @schemaid + ''].['''' + @SP_Name + ''''] TO ['' + @RoleName + '']'''') + END + FETCH NEXT FROM SP_cursor INTO @SP_Name +END + +CLOSE SP_cursor +DEALLOCATE SP_cursor + +'' + + END + ELSE + BEGIN + + SET @Command = @Command + '' +IF EXISTS(SELECT 1 FROM sys.objects o WITH (NOLOCK) JOIN sys.schemas s ON s.schema_id = o.schema_id WHERE o.name = '''''' + @objectname + '''''' AND o.type IN (N''''U'''',''''P'''',''''V'''',''''FN'''',''''IF'''',''''TF'''') AND s.name = '''''' + @schemaid + '''''') +BEGIN + IF EXISTS(SELECT 1 FROM sys.fn_builtin_permissions(''''OBJECT'''') WHERE permission_name = '''''' + @rightsaction + '''''') + BEGIN + '' + @grantordeny + '' '' + @rightsaction + '' ON ['' + @schemaid + ''].['' + @objectname + ''] TO ['' + @RoleName + ''] + END +END + +'' + END +END + +IF @typeofobject = ''ASSEMBLIES'' +BEGIN + SET @Command = @Command + '' +IF EXISTS(SELECT 1 FROM sys.assemblies WHERE NAME = '''''' + @objectname + '''''') +BEGIN + IF EXISTS(SELECT 1 FROM sys.fn_builtin_permissions(''''ASSEMBLY'''') WHERE permission_name = '''''' + @rightsaction + '''''') + BEGIN + '' + @grantordeny + '' '' + @rightsaction + ''::['' + @objectname + ''] TO ['' + @RoleName + ''] + END +END + +'' +END + +IF @typeofobject = ''ROLE'' +BEGIN + SET @Command = @Command + '' +IF NOT EXISTS (SELECT 1 FROM sys.database_role_members JOIN sys.database_principals roles ON database_role_members.role_principal_id = roles.principal_id JOIN sys.database_principals members ON database_role_members.member_principal_id = members.principal_id WHERE roles.name = '''''' + @rightsaction + '''''' AND members.name = '''''' + @RoleName + '''''') +BEGIN + EXEC sp_addrolemember N'''''' + @rightsaction + '''''', N'''''' + @RoleName + '''''' +END + +'' +END + +FETCH NEXT FROM SecurablesCurs INTO @typeofobject, @grantordeny, @rightsaction, @objectname, @schemaid +END + +CLOSE SecurablesCurs +DEALLOCATE SecurablesCurs + +PRINT ''SET ALL SECURABLES ON ROLE ['' + @RoleName + '']'' +EXEC sp_executesql @Command + +/* ADD USER */ +DECLARE UsersCurs CURSOR FOR +SELECT username + FROM #UsersOnRole + +OPEN UsersCurs + +FETCH NEXT FROM UsersCurs INTO @Users +WHILE @@FETCH_STATUS = 0 +BEGIN + + SELECT @Command = '' +EXEC sp_addrolemember N'''''' + @RoleName + '''''', N'''''' + @Users + '''''' +PRINT ''''ADD USER ['' + @Users + ''] ON ROLE ['' + @RoleName + '']'''' +'' + +FETCH NEXT FROM UsersCurs INTO @Users +END + +CLOSE UsersCurs +DEALLOCATE UsersCurs + +EXEC sp_executesql @Command + + +/*============================================================================= + Drop temp tables +=============================================================================*/ +DROP TABLE #Securables +DROP TABLE #UsersOnRole +','ActiveSystemServer','Pharmacies') + +INSERT INTO #AllRoles(STR_Definition,STR_Database,STR_Product)VALUES(' + +/*============================================================================= + + Script to create dbRolePOUsr role. + + Role Name: dbRolePOUsr + TEMPLATE: Default + + EXAMPLE OF SECURABLES TO SET: + + INSERT INTO #Securables + VALUES + (''DB'',''GRANT'',''VIEW DEFINITION'','''',''''), + (''SCHEMA'',''GRANT'',''SELECT,EXECUTE,INSERT,UPDATE,DELETE'','''',''AP''), + (''TABLE'',''GRANT'',''INSERT,UPDATE'',''Address'',''dbo''), + (''SP'',''GRANT'',''EXECUTE'',''sp_bmc_GetNextID'',''dbo''), + (''ROLE'',''GRANT'',''db_datareader'','''','''') + + ----------------------------------------------- + +Generate date : 2023-05-12 / up208700 + +=============================================================================*/ + +DECLARE @Command nvarchar(max), + @RoleName varchar(60), + @Users varchar(255), + @typeofobject varchar(50), + @grantordeny varchar(10), + @rightsaction varchar(255), + @objectname varchar(255), + @schemaid varchar(10), + @sysTarget varchar(255), + @sysType varchar(255) + +SET @RoleName = ''dbRolePOUsr'' +SET @Command = '''' + +/* TEMP TABLES */ +CREATE TABLE #UsersOnRole(username varchar(255)) +CREATE TABLE #Securables(typeofobject varchar(50), grantordeny varchar(10), rightsaction varchar(255), objectname varchar(255), schemaid varchar(10),N2 bit) + +/* !!! LIST OF SECURABLES TO CHANGE !!! */ + +INSERT INTO #Securables +VALUES +(''ROLE'',''GRANT'',''DB_DATAREADER'','''',''dbo'',0) + + +/* GET ALL USERS ON THIS ROLE */ +INSERT INTO #UsersOnRole +SELECT + members.name +FROM sys.database_role_members + JOIN sys.database_principals roles ON database_role_members.role_principal_id = roles.principal_id + JOIN sys.database_principals members ON database_role_members.member_principal_id = members.principal_id +WHERE roles.name = @RoleName + +/* CREATE ROLE */ +SELECT @Command = '' +IF NOT EXISTS (SELECT 1 FROM sys.database_principals WHERE name = '''''' + @RoleName + '''''' AND type = ''''R'''') +BEGIN + CREATE ROLE ['' + @RoleName + ''] AUTHORIZATION [dbo] + PRINT ''''CREATE ROLE ['' + @RoleName + '']'''' +END +'' +EXEC sp_executesql @Command + +SET @Command = '' +DECLARE @SP_Name varchar(255) + +'' + +/* SET ALL ROLE SECURABLES */ +DECLARE SecurablesCurs CURSOR FOR +SELECT typeofobject, grantordeny, rightsaction, objectname, schemaid +FROM #Securables +WHERE N2 = 0 + +OPEN SecurablesCurs +FETCH NEXT FROM SecurablesCurs INTO @typeofobject, @grantordeny, @rightsaction, @objectname, @schemaid +WHILE @@FETCH_STATUS = 0 +BEGIN + + IF @typeofobject = ''DB'' + BEGIN + IF EXISTS(SELECT 1 FROM sys.fn_builtin_permissions(''DATABASE'') WHERE permission_name = '''' + @rightsaction + '''') + BEGIN + SET @Command = @Command + @grantordeny + '' '' + @rightsaction + '' TO ['' + @RoleName + ''] +'' + END + END + + IF @typeofobject = ''SCHEMA'' + BEGIN + SET @Command = @Command + '' +IF EXISTS (SELECT 1 FROM sys.schemas WHERE name = '''''' + @schemaid + '''''') +BEGIN + IF EXISTS(SELECT 1 FROM sys.fn_builtin_permissions(''''SCHEMA'''') WHERE permission_name = '''''' + @rightsaction + '''''') + BEGIN + '' + @grantordeny + '' '' + @rightsaction + '' ON SCHEMA::'' + @schemaid + '' TO ['' + @RoleName + ''] + END +END + +'' + END + + IF @typeofobject in(''TABLE'',''SP'',''FUNCTIONS'',''VIEWS'') + BEGIN + + IF @objectname like ''%[%]%'' + BEGIN + + IF @typeofobject = ''TABLE'' + BEGIN + SET @sysTarget = ''sys.tables'' + SET @sysType = '''' + END + + IF @typeofobject = ''SP'' + BEGIN + SET @sysTarget = ''sys.procedures'' + SET @sysType = '''' + END + + IF @typeofobject = ''FUNCTIONS'' + BEGIN + SET @sysTarget = ''sys.objects'' + SET @sysType = '' and p.Type IN ( N''''FN'''', N''''IF'''', N''''TF'''', N''''FS'''', N''''FT'''' )'' + END + + IF @typeofobject = ''VIEWS'' + BEGIN + SET @sysTarget = ''sys.views'' + SET @sysType = '''' + END + + SET @Command = @Command + '' +DECLARE SP_cursor CURSOR FOR +SELECT p.name FROM '' + @sysTarget + '' p JOIN sys.schemas s ON s.schema_id = p.schema_id WHERE (p.name like '''''' + @objectname + '''''') and s.name = '''''' + @schemaid + '''' + @sysType + '''''' + +OPEN SP_cursor +FETCH NEXT FROM SP_cursor INTO @SP_Name +WHILE @@FETCH_STATUS = 0 +BEGIN + IF EXISTS(SELECT 1 FROM sys.fn_builtin_permissions(''''OBJECT'''') WHERE permission_name = '''''' + @rightsaction + '''''') + BEGIN + EXEC('''''' + @grantordeny + '' '' + @rightsaction + '' ON ['' + @schemaid + ''].['''' + @SP_Name + ''''] TO ['' + @RoleName + '']'''') + END + FETCH NEXT FROM SP_cursor INTO @SP_Name +END + +CLOSE SP_cursor +DEALLOCATE SP_cursor + +'' + + END + ELSE + BEGIN + + SET @Command = @Command + '' +IF EXISTS(SELECT 1 FROM sys.objects o WITH (NOLOCK) JOIN sys.schemas s ON s.schema_id = o.schema_id WHERE o.name = '''''' + @objectname + '''''' AND o.type IN (N''''U'''',''''P'''',''''V'''',''''FN'''',''''IF'''',''''TF'''') AND s.name = '''''' + @schemaid + '''''') +BEGIN + IF EXISTS(SELECT 1 FROM sys.fn_builtin_permissions(''''OBJECT'''') WHERE permission_name = '''''' + @rightsaction + '''''') + BEGIN + '' + @grantordeny + '' '' + @rightsaction + '' ON ['' + @schemaid + ''].['' + @objectname + ''] TO ['' + @RoleName + ''] + END +END + +'' + END +END + +IF @typeofobject = ''ASSEMBLIES'' +BEGIN + SET @Command = @Command + '' +IF EXISTS(SELECT 1 FROM sys.assemblies WHERE NAME = '''''' + @objectname + '''''') +BEGIN + IF EXISTS(SELECT 1 FROM sys.fn_builtin_permissions(''''ASSEMBLY'''') WHERE permission_name = '''''' + @rightsaction + '''''') + BEGIN + '' + @grantordeny + '' '' + @rightsaction + ''::['' + @objectname + ''] TO ['' + @RoleName + ''] + END +END + +'' +END + +IF @typeofobject = ''ROLE'' +BEGIN + SET @Command = @Command + '' +IF NOT EXISTS (SELECT 1 FROM sys.database_role_members JOIN sys.database_principals roles ON database_role_members.role_principal_id = roles.principal_id JOIN sys.database_principals members ON database_role_members.member_principal_id = members.principal_id WHERE roles.name = '''''' + @rightsaction + '''''' AND members.name = '''''' + @RoleName + '''''') +BEGIN + EXEC sp_addrolemember N'''''' + @rightsaction + '''''', N'''''' + @RoleName + '''''' +END + +'' +END + +FETCH NEXT FROM SecurablesCurs INTO @typeofobject, @grantordeny, @rightsaction, @objectname, @schemaid +END + +CLOSE SecurablesCurs +DEALLOCATE SecurablesCurs + +PRINT ''SET ALL SECURABLES ON ROLE ['' + @RoleName + '']'' +EXEC sp_executesql @Command + +/* ADD USER */ +DECLARE UsersCurs CURSOR FOR +SELECT username + FROM #UsersOnRole + +OPEN UsersCurs + +FETCH NEXT FROM UsersCurs INTO @Users +WHILE @@FETCH_STATUS = 0 +BEGIN + + SELECT @Command = '' +EXEC sp_addrolemember N'''''' + @RoleName + '''''', N'''''' + @Users + '''''' +PRINT ''''ADD USER ['' + @Users + ''] ON ROLE ['' + @RoleName + '']'''' +'' + +FETCH NEXT FROM UsersCurs INTO @Users +END + +CLOSE UsersCurs +DEALLOCATE UsersCurs + +EXEC sp_executesql @Command + + +/*============================================================================= + Drop temp tables +=============================================================================*/ +DROP TABLE #Securables +DROP TABLE #UsersOnRole +','Arizona','Pharmacies') + +INSERT INTO #AllRoles(STR_Definition,STR_Database,STR_Product)VALUES(' + +/*============================================================================= + + Script to create dbRolePOUsr role. + + Role Name: dbRolePOUsr + TEMPLATE: Default + + EXAMPLE OF SECURABLES TO SET: + + INSERT INTO #Securables + VALUES + (''DB'',''GRANT'',''VIEW DEFINITION'','''',''''), + (''SCHEMA'',''GRANT'',''SELECT,EXECUTE,INSERT,UPDATE,DELETE'','''',''AP''), + (''TABLE'',''GRANT'',''INSERT,UPDATE'',''Address'',''dbo''), + (''SP'',''GRANT'',''EXECUTE'',''sp_bmc_GetNextID'',''dbo''), + (''ROLE'',''GRANT'',''db_datareader'','''','''') + + ----------------------------------------------- + +Generate date : 2023-05-12 / up208700 + +=============================================================================*/ + +DECLARE @Command nvarchar(max), + @RoleName varchar(60), + @Users varchar(255), + @typeofobject varchar(50), + @grantordeny varchar(10), + @rightsaction varchar(255), + @objectname varchar(255), + @schemaid varchar(10), + @sysTarget varchar(255), + @sysType varchar(255) + +SET @RoleName = ''dbRolePOUsr'' +SET @Command = '''' + +/* TEMP TABLES */ +CREATE TABLE #UsersOnRole(username varchar(255)) +CREATE TABLE #Securables(typeofobject varchar(50), grantordeny varchar(10), rightsaction varchar(255), objectname varchar(255), schemaid varchar(10),N2 bit) + +/* !!! LIST OF SECURABLES TO CHANGE !!! */ + +INSERT INTO #Securables +VALUES +(''ROLE'',''GRANT'',''DB_DATAREADER'','''',''dbo'',0) + + +/* GET ALL USERS ON THIS ROLE */ +INSERT INTO #UsersOnRole +SELECT + members.name +FROM sys.database_role_members + JOIN sys.database_principals roles ON database_role_members.role_principal_id = roles.principal_id + JOIN sys.database_principals members ON database_role_members.member_principal_id = members.principal_id +WHERE roles.name = @RoleName + +/* CREATE ROLE */ +SELECT @Command = '' +IF NOT EXISTS (SELECT 1 FROM sys.database_principals WHERE name = '''''' + @RoleName + '''''' AND type = ''''R'''') +BEGIN + CREATE ROLE ['' + @RoleName + ''] AUTHORIZATION [dbo] + PRINT ''''CREATE ROLE ['' + @RoleName + '']'''' +END +'' +EXEC sp_executesql @Command + +SET @Command = '' +DECLARE @SP_Name varchar(255) + +'' + +/* SET ALL ROLE SECURABLES */ +DECLARE SecurablesCurs CURSOR FOR +SELECT typeofobject, grantordeny, rightsaction, objectname, schemaid +FROM #Securables +WHERE N2 = 0 + +OPEN SecurablesCurs +FETCH NEXT FROM SecurablesCurs INTO @typeofobject, @grantordeny, @rightsaction, @objectname, @schemaid +WHILE @@FETCH_STATUS = 0 +BEGIN + + IF @typeofobject = ''DB'' + BEGIN + IF EXISTS(SELECT 1 FROM sys.fn_builtin_permissions(''DATABASE'') WHERE permission_name = '''' + @rightsaction + '''') + BEGIN + SET @Command = @Command + @grantordeny + '' '' + @rightsaction + '' TO ['' + @RoleName + ''] +'' + END + END + + IF @typeofobject = ''SCHEMA'' + BEGIN + SET @Command = @Command + '' +IF EXISTS (SELECT 1 FROM sys.schemas WHERE name = '''''' + @schemaid + '''''') +BEGIN + IF EXISTS(SELECT 1 FROM sys.fn_builtin_permissions(''''SCHEMA'''') WHERE permission_name = '''''' + @rightsaction + '''''') + BEGIN + '' + @grantordeny + '' '' + @rightsaction + '' ON SCHEMA::'' + @schemaid + '' TO ['' + @RoleName + ''] + END +END + +'' + END + + IF @typeofobject in(''TABLE'',''SP'',''FUNCTIONS'',''VIEWS'') + BEGIN + + IF @objectname like ''%[%]%'' + BEGIN + + IF @typeofobject = ''TABLE'' + BEGIN + SET @sysTarget = ''sys.tables'' + SET @sysType = '''' + END + + IF @typeofobject = ''SP'' + BEGIN + SET @sysTarget = ''sys.procedures'' + SET @sysType = '''' + END + + IF @typeofobject = ''FUNCTIONS'' + BEGIN + SET @sysTarget = ''sys.objects'' + SET @sysType = '' and p.Type IN ( N''''FN'''', N''''IF'''', N''''TF'''', N''''FS'''', N''''FT'''' )'' + END + + IF @typeofobject = ''VIEWS'' + BEGIN + SET @sysTarget = ''sys.views'' + SET @sysType = '''' + END + + SET @Command = @Command + '' +DECLARE SP_cursor CURSOR FOR +SELECT p.name FROM '' + @sysTarget + '' p JOIN sys.schemas s ON s.schema_id = p.schema_id WHERE (p.name like '''''' + @objectname + '''''') and s.name = '''''' + @schemaid + '''' + @sysType + '''''' + +OPEN SP_cursor +FETCH NEXT FROM SP_cursor INTO @SP_Name +WHILE @@FETCH_STATUS = 0 +BEGIN + IF EXISTS(SELECT 1 FROM sys.fn_builtin_permissions(''''OBJECT'''') WHERE permission_name = '''''' + @rightsaction + '''''') + BEGIN + EXEC('''''' + @grantordeny + '' '' + @rightsaction + '' ON ['' + @schemaid + ''].['''' + @SP_Name + ''''] TO ['' + @RoleName + '']'''') + END + FETCH NEXT FROM SP_cursor INTO @SP_Name +END + +CLOSE SP_cursor +DEALLOCATE SP_cursor + +'' + + END + ELSE + BEGIN + + SET @Command = @Command + '' +IF EXISTS(SELECT 1 FROM sys.objects o WITH (NOLOCK) JOIN sys.schemas s ON s.schema_id = o.schema_id WHERE o.name = '''''' + @objectname + '''''' AND o.type IN (N''''U'''',''''P'''',''''V'''',''''FN'''',''''IF'''',''''TF'''') AND s.name = '''''' + @schemaid + '''''') +BEGIN + IF EXISTS(SELECT 1 FROM sys.fn_builtin_permissions(''''OBJECT'''') WHERE permission_name = '''''' + @rightsaction + '''''') + BEGIN + '' + @grantordeny + '' '' + @rightsaction + '' ON ['' + @schemaid + ''].['' + @objectname + ''] TO ['' + @RoleName + ''] + END +END + +'' + END +END + +IF @typeofobject = ''ASSEMBLIES'' +BEGIN + SET @Command = @Command + '' +IF EXISTS(SELECT 1 FROM sys.assemblies WHERE NAME = '''''' + @objectname + '''''') +BEGIN + IF EXISTS(SELECT 1 FROM sys.fn_builtin_permissions(''''ASSEMBLY'''') WHERE permission_name = '''''' + @rightsaction + '''''') + BEGIN + '' + @grantordeny + '' '' + @rightsaction + ''::['' + @objectname + ''] TO ['' + @RoleName + ''] + END +END + +'' +END + +IF @typeofobject = ''ROLE'' +BEGIN + SET @Command = @Command + '' +IF NOT EXISTS (SELECT 1 FROM sys.database_role_members JOIN sys.database_principals roles ON database_role_members.role_principal_id = roles.principal_id JOIN sys.database_principals members ON database_role_members.member_principal_id = members.principal_id WHERE roles.name = '''''' + @rightsaction + '''''' AND members.name = '''''' + @RoleName + '''''') +BEGIN + EXEC sp_addrolemember N'''''' + @rightsaction + '''''', N'''''' + @RoleName + '''''' +END + +'' +END + +FETCH NEXT FROM SecurablesCurs INTO @typeofobject, @grantordeny, @rightsaction, @objectname, @schemaid +END + +CLOSE SecurablesCurs +DEALLOCATE SecurablesCurs + +PRINT ''SET ALL SECURABLES ON ROLE ['' + @RoleName + '']'' +EXEC sp_executesql @Command + +/* ADD USER */ +DECLARE UsersCurs CURSOR FOR +SELECT username + FROM #UsersOnRole + +OPEN UsersCurs + +FETCH NEXT FROM UsersCurs INTO @Users +WHILE @@FETCH_STATUS = 0 +BEGIN + + SELECT @Command = '' +EXEC sp_addrolemember N'''''' + @RoleName + '''''', N'''''' + @Users + '''''' +PRINT ''''ADD USER ['' + @Users + ''] ON ROLE ['' + @RoleName + '']'''' +'' + +FETCH NEXT FROM UsersCurs INTO @Users +END + +CLOSE UsersCurs +DEALLOCATE UsersCurs + +EXEC sp_executesql @Command + + +/*============================================================================= + Drop temp tables +=============================================================================*/ +DROP TABLE #Securables +DROP TABLE #UsersOnRole +','ArizonaCASH','Pharmacies') + +INSERT INTO #AllRoles(STR_Definition,STR_Database,STR_Product)VALUES(' + +/*============================================================================= + + Script to create dbRolePOUsr role. + + Role Name: dbRolePOUsr + TEMPLATE: Default + + EXAMPLE OF SECURABLES TO SET: + + INSERT INTO #Securables + VALUES + (''DB'',''GRANT'',''VIEW DEFINITION'','''',''''), + (''SCHEMA'',''GRANT'',''SELECT,EXECUTE,INSERT,UPDATE,DELETE'','''',''AP''), + (''TABLE'',''GRANT'',''INSERT,UPDATE'',''Address'',''dbo''), + (''SP'',''GRANT'',''EXECUTE'',''sp_bmc_GetNextID'',''dbo''), + (''ROLE'',''GRANT'',''db_datareader'','''','''') + + ----------------------------------------------- + +Generate date : 2023-05-12 / up208700 + +=============================================================================*/ + +DECLARE @Command nvarchar(max), + @RoleName varchar(60), + @Users varchar(255), + @typeofobject varchar(50), + @grantordeny varchar(10), + @rightsaction varchar(255), + @objectname varchar(255), + @schemaid varchar(10), + @sysTarget varchar(255), + @sysType varchar(255) + +SET @RoleName = ''dbRolePOUsr'' +SET @Command = '''' + +/* TEMP TABLES */ +CREATE TABLE #UsersOnRole(username varchar(255)) +CREATE TABLE #Securables(typeofobject varchar(50), grantordeny varchar(10), rightsaction varchar(255), objectname varchar(255), schemaid varchar(10),N2 bit) + +/* !!! LIST OF SECURABLES TO CHANGE !!! */ + +INSERT INTO #Securables +VALUES +(''ROLE'',''GRANT'',''DB_DATAREADER'','''',''dbo'',0) + + +/* GET ALL USERS ON THIS ROLE */ +INSERT INTO #UsersOnRole +SELECT + members.name +FROM sys.database_role_members + JOIN sys.database_principals roles ON database_role_members.role_principal_id = roles.principal_id + JOIN sys.database_principals members ON database_role_members.member_principal_id = members.principal_id +WHERE roles.name = @RoleName + +/* CREATE ROLE */ +SELECT @Command = '' +IF NOT EXISTS (SELECT 1 FROM sys.database_principals WHERE name = '''''' + @RoleName + '''''' AND type = ''''R'''') +BEGIN + CREATE ROLE ['' + @RoleName + ''] AUTHORIZATION [dbo] + PRINT ''''CREATE ROLE ['' + @RoleName + '']'''' +END +'' +EXEC sp_executesql @Command + +SET @Command = '' +DECLARE @SP_Name varchar(255) + +'' + +/* SET ALL ROLE SECURABLES */ +DECLARE SecurablesCurs CURSOR FOR +SELECT typeofobject, grantordeny, rightsaction, objectname, schemaid +FROM #Securables +WHERE N2 = 0 + +OPEN SecurablesCurs +FETCH NEXT FROM SecurablesCurs INTO @typeofobject, @grantordeny, @rightsaction, @objectname, @schemaid +WHILE @@FETCH_STATUS = 0 +BEGIN + + IF @typeofobject = ''DB'' + BEGIN + IF EXISTS(SELECT 1 FROM sys.fn_builtin_permissions(''DATABASE'') WHERE permission_name = '''' + @rightsaction + '''') + BEGIN + SET @Command = @Command + @grantordeny + '' '' + @rightsaction + '' TO ['' + @RoleName + ''] +'' + END + END + + IF @typeofobject = ''SCHEMA'' + BEGIN + SET @Command = @Command + '' +IF EXISTS (SELECT 1 FROM sys.schemas WHERE name = '''''' + @schemaid + '''''') +BEGIN + IF EXISTS(SELECT 1 FROM sys.fn_builtin_permissions(''''SCHEMA'''') WHERE permission_name = '''''' + @rightsaction + '''''') + BEGIN + '' + @grantordeny + '' '' + @rightsaction + '' ON SCHEMA::'' + @schemaid + '' TO ['' + @RoleName + ''] + END +END + +'' + END + + IF @typeofobject in(''TABLE'',''SP'',''FUNCTIONS'',''VIEWS'') + BEGIN + + IF @objectname like ''%[%]%'' + BEGIN + + IF @typeofobject = ''TABLE'' + BEGIN + SET @sysTarget = ''sys.tables'' + SET @sysType = '''' + END + + IF @typeofobject = ''SP'' + BEGIN + SET @sysTarget = ''sys.procedures'' + SET @sysType = '''' + END + + IF @typeofobject = ''FUNCTIONS'' + BEGIN + SET @sysTarget = ''sys.objects'' + SET @sysType = '' and p.Type IN ( N''''FN'''', N''''IF'''', N''''TF'''', N''''FS'''', N''''FT'''' )'' + END + + IF @typeofobject = ''VIEWS'' + BEGIN + SET @sysTarget = ''sys.views'' + SET @sysType = '''' + END + + SET @Command = @Command + '' +DECLARE SP_cursor CURSOR FOR +SELECT p.name FROM '' + @sysTarget + '' p JOIN sys.schemas s ON s.schema_id = p.schema_id WHERE (p.name like '''''' + @objectname + '''''') and s.name = '''''' + @schemaid + '''' + @sysType + '''''' + +OPEN SP_cursor +FETCH NEXT FROM SP_cursor INTO @SP_Name +WHILE @@FETCH_STATUS = 0 +BEGIN + IF EXISTS(SELECT 1 FROM sys.fn_builtin_permissions(''''OBJECT'''') WHERE permission_name = '''''' + @rightsaction + '''''') + BEGIN + EXEC('''''' + @grantordeny + '' '' + @rightsaction + '' ON ['' + @schemaid + ''].['''' + @SP_Name + ''''] TO ['' + @RoleName + '']'''') + END + FETCH NEXT FROM SP_cursor INTO @SP_Name +END + +CLOSE SP_cursor +DEALLOCATE SP_cursor + +'' + + END + ELSE + BEGIN + + SET @Command = @Command + '' +IF EXISTS(SELECT 1 FROM sys.objects o WITH (NOLOCK) JOIN sys.schemas s ON s.schema_id = o.schema_id WHERE o.name = '''''' + @objectname + '''''' AND o.type IN (N''''U'''',''''P'''',''''V'''',''''FN'''',''''IF'''',''''TF'''') AND s.name = '''''' + @schemaid + '''''') +BEGIN + IF EXISTS(SELECT 1 FROM sys.fn_builtin_permissions(''''OBJECT'''') WHERE permission_name = '''''' + @rightsaction + '''''') + BEGIN + '' + @grantordeny + '' '' + @rightsaction + '' ON ['' + @schemaid + ''].['' + @objectname + ''] TO ['' + @RoleName + ''] + END +END + +'' + END +END + +IF @typeofobject = ''ASSEMBLIES'' +BEGIN + SET @Command = @Command + '' +IF EXISTS(SELECT 1 FROM sys.assemblies WHERE NAME = '''''' + @objectname + '''''') +BEGIN + IF EXISTS(SELECT 1 FROM sys.fn_builtin_permissions(''''ASSEMBLY'''') WHERE permission_name = '''''' + @rightsaction + '''''') + BEGIN + '' + @grantordeny + '' '' + @rightsaction + ''::['' + @objectname + ''] TO ['' + @RoleName + ''] + END +END + +'' +END + +IF @typeofobject = ''ROLE'' +BEGIN + SET @Command = @Command + '' +IF NOT EXISTS (SELECT 1 FROM sys.database_role_members JOIN sys.database_principals roles ON database_role_members.role_principal_id = roles.principal_id JOIN sys.database_principals members ON database_role_members.member_principal_id = members.principal_id WHERE roles.name = '''''' + @rightsaction + '''''' AND members.name = '''''' + @RoleName + '''''') +BEGIN + EXEC sp_addrolemember N'''''' + @rightsaction + '''''', N'''''' + @RoleName + '''''' +END + +'' +END + +FETCH NEXT FROM SecurablesCurs INTO @typeofobject, @grantordeny, @rightsaction, @objectname, @schemaid +END + +CLOSE SecurablesCurs +DEALLOCATE SecurablesCurs + +PRINT ''SET ALL SECURABLES ON ROLE ['' + @RoleName + '']'' +EXEC sp_executesql @Command + +/* ADD USER */ +DECLARE UsersCurs CURSOR FOR +SELECT username + FROM #UsersOnRole + +OPEN UsersCurs + +FETCH NEXT FROM UsersCurs INTO @Users +WHILE @@FETCH_STATUS = 0 +BEGIN + + SELECT @Command = '' +EXEC sp_addrolemember N'''''' + @RoleName + '''''', N'''''' + @Users + '''''' +PRINT ''''ADD USER ['' + @Users + ''] ON ROLE ['' + @RoleName + '']'''' +'' + +FETCH NEXT FROM UsersCurs INTO @Users +END + +CLOSE UsersCurs +DEALLOCATE UsersCurs + +EXEC sp_executesql @Command + + +/*============================================================================= + Drop temp tables +=============================================================================*/ +DROP TABLE #Securables +DROP TABLE #UsersOnRole +','ArizonaCUST','Pharmacies') + +INSERT INTO #AllRoles(STR_Definition,STR_Database,STR_Product)VALUES(' + +/*============================================================================= + + Script to create dbRolePOUsr role. + + Role Name: dbRolePOUsr + TEMPLATE: Default + + EXAMPLE OF SECURABLES TO SET: + + INSERT INTO #Securables + VALUES + (''DB'',''GRANT'',''VIEW DEFINITION'','''',''''), + (''SCHEMA'',''GRANT'',''SELECT,EXECUTE,INSERT,UPDATE,DELETE'','''',''AP''), + (''TABLE'',''GRANT'',''INSERT,UPDATE'',''Address'',''dbo''), + (''SP'',''GRANT'',''EXECUTE'',''sp_bmc_GetNextID'',''dbo''), + (''ROLE'',''GRANT'',''db_datareader'','''','''') + + ----------------------------------------------- + +Generate date : 2023-05-12 / up208700 + +=============================================================================*/ + +DECLARE @Command nvarchar(max), + @RoleName varchar(60), + @Users varchar(255), + @typeofobject varchar(50), + @grantordeny varchar(10), + @rightsaction varchar(255), + @objectname varchar(255), + @schemaid varchar(10), + @sysTarget varchar(255), + @sysType varchar(255) + +SET @RoleName = ''dbRolePOUsr'' +SET @Command = '''' + +/* TEMP TABLES */ +CREATE TABLE #UsersOnRole(username varchar(255)) +CREATE TABLE #Securables(typeofobject varchar(50), grantordeny varchar(10), rightsaction varchar(255), objectname varchar(255), schemaid varchar(10),N2 bit) + +/* !!! LIST OF SECURABLES TO CHANGE !!! */ + +INSERT INTO #Securables +VALUES +(''ROLE'',''GRANT'',''DB_DATAREADER'','''',''dbo'',0) + + +/* GET ALL USERS ON THIS ROLE */ +INSERT INTO #UsersOnRole +SELECT + members.name +FROM sys.database_role_members + JOIN sys.database_principals roles ON database_role_members.role_principal_id = roles.principal_id + JOIN sys.database_principals members ON database_role_members.member_principal_id = members.principal_id +WHERE roles.name = @RoleName + +/* CREATE ROLE */ +SELECT @Command = '' +IF NOT EXISTS (SELECT 1 FROM sys.database_principals WHERE name = '''''' + @RoleName + '''''' AND type = ''''R'''') +BEGIN + CREATE ROLE ['' + @RoleName + ''] AUTHORIZATION [dbo] + PRINT ''''CREATE ROLE ['' + @RoleName + '']'''' +END +'' +EXEC sp_executesql @Command + +SET @Command = '' +DECLARE @SP_Name varchar(255) + +'' + +/* SET ALL ROLE SECURABLES */ +DECLARE SecurablesCurs CURSOR FOR +SELECT typeofobject, grantordeny, rightsaction, objectname, schemaid +FROM #Securables +WHERE N2 = 0 + +OPEN SecurablesCurs +FETCH NEXT FROM SecurablesCurs INTO @typeofobject, @grantordeny, @rightsaction, @objectname, @schemaid +WHILE @@FETCH_STATUS = 0 +BEGIN + + IF @typeofobject = ''DB'' + BEGIN + IF EXISTS(SELECT 1 FROM sys.fn_builtin_permissions(''DATABASE'') WHERE permission_name = '''' + @rightsaction + '''') + BEGIN + SET @Command = @Command + @grantordeny + '' '' + @rightsaction + '' TO ['' + @RoleName + ''] +'' + END + END + + IF @typeofobject = ''SCHEMA'' + BEGIN + SET @Command = @Command + '' +IF EXISTS (SELECT 1 FROM sys.schemas WHERE name = '''''' + @schemaid + '''''') +BEGIN + IF EXISTS(SELECT 1 FROM sys.fn_builtin_permissions(''''SCHEMA'''') WHERE permission_name = '''''' + @rightsaction + '''''') + BEGIN + '' + @grantordeny + '' '' + @rightsaction + '' ON SCHEMA::'' + @schemaid + '' TO ['' + @RoleName + ''] + END +END + +'' + END + + IF @typeofobject in(''TABLE'',''SP'',''FUNCTIONS'',''VIEWS'') + BEGIN + + IF @objectname like ''%[%]%'' + BEGIN + + IF @typeofobject = ''TABLE'' + BEGIN + SET @sysTarget = ''sys.tables'' + SET @sysType = '''' + END + + IF @typeofobject = ''SP'' + BEGIN + SET @sysTarget = ''sys.procedures'' + SET @sysType = '''' + END + + IF @typeofobject = ''FUNCTIONS'' + BEGIN + SET @sysTarget = ''sys.objects'' + SET @sysType = '' and p.Type IN ( N''''FN'''', N''''IF'''', N''''TF'''', N''''FS'''', N''''FT'''' )'' + END + + IF @typeofobject = ''VIEWS'' + BEGIN + SET @sysTarget = ''sys.views'' + SET @sysType = '''' + END + + SET @Command = @Command + '' +DECLARE SP_cursor CURSOR FOR +SELECT p.name FROM '' + @sysTarget + '' p JOIN sys.schemas s ON s.schema_id = p.schema_id WHERE (p.name like '''''' + @objectname + '''''') and s.name = '''''' + @schemaid + '''' + @sysType + '''''' + +OPEN SP_cursor +FETCH NEXT FROM SP_cursor INTO @SP_Name +WHILE @@FETCH_STATUS = 0 +BEGIN + IF EXISTS(SELECT 1 FROM sys.fn_builtin_permissions(''''OBJECT'''') WHERE permission_name = '''''' + @rightsaction + '''''') + BEGIN + EXEC('''''' + @grantordeny + '' '' + @rightsaction + '' ON ['' + @schemaid + ''].['''' + @SP_Name + ''''] TO ['' + @RoleName + '']'''') + END + FETCH NEXT FROM SP_cursor INTO @SP_Name +END + +CLOSE SP_cursor +DEALLOCATE SP_cursor + +'' + + END + ELSE + BEGIN + + SET @Command = @Command + '' +IF EXISTS(SELECT 1 FROM sys.objects o WITH (NOLOCK) JOIN sys.schemas s ON s.schema_id = o.schema_id WHERE o.name = '''''' + @objectname + '''''' AND o.type IN (N''''U'''',''''P'''',''''V'''',''''FN'''',''''IF'''',''''TF'''') AND s.name = '''''' + @schemaid + '''''') +BEGIN + IF EXISTS(SELECT 1 FROM sys.fn_builtin_permissions(''''OBJECT'''') WHERE permission_name = '''''' + @rightsaction + '''''') + BEGIN + '' + @grantordeny + '' '' + @rightsaction + '' ON ['' + @schemaid + ''].['' + @objectname + ''] TO ['' + @RoleName + ''] + END +END + +'' + END +END + +IF @typeofobject = ''ASSEMBLIES'' +BEGIN + SET @Command = @Command + '' +IF EXISTS(SELECT 1 FROM sys.assemblies WHERE NAME = '''''' + @objectname + '''''') +BEGIN + IF EXISTS(SELECT 1 FROM sys.fn_builtin_permissions(''''ASSEMBLY'''') WHERE permission_name = '''''' + @rightsaction + '''''') + BEGIN + '' + @grantordeny + '' '' + @rightsaction + ''::['' + @objectname + ''] TO ['' + @RoleName + ''] + END +END + +'' +END + +IF @typeofobject = ''ROLE'' +BEGIN + SET @Command = @Command + '' +IF NOT EXISTS (SELECT 1 FROM sys.database_role_members JOIN sys.database_principals roles ON database_role_members.role_principal_id = roles.principal_id JOIN sys.database_principals members ON database_role_members.member_principal_id = members.principal_id WHERE roles.name = '''''' + @rightsaction + '''''' AND members.name = '''''' + @RoleName + '''''') +BEGIN + EXEC sp_addrolemember N'''''' + @rightsaction + '''''', N'''''' + @RoleName + '''''' +END + +'' +END + +FETCH NEXT FROM SecurablesCurs INTO @typeofobject, @grantordeny, @rightsaction, @objectname, @schemaid +END + +CLOSE SecurablesCurs +DEALLOCATE SecurablesCurs + +PRINT ''SET ALL SECURABLES ON ROLE ['' + @RoleName + '']'' +EXEC sp_executesql @Command + +/* ADD USER */ +DECLARE UsersCurs CURSOR FOR +SELECT username + FROM #UsersOnRole + +OPEN UsersCurs + +FETCH NEXT FROM UsersCurs INTO @Users +WHILE @@FETCH_STATUS = 0 +BEGIN + + SELECT @Command = '' +EXEC sp_addrolemember N'''''' + @RoleName + '''''', N'''''' + @Users + '''''' +PRINT ''''ADD USER ['' + @Users + ''] ON ROLE ['' + @RoleName + '']'''' +'' + +FETCH NEXT FROM UsersCurs INTO @Users +END + +CLOSE UsersCurs +DEALLOCATE UsersCurs + +EXEC sp_executesql @Command + + +/*============================================================================= + Drop temp tables +=============================================================================*/ +DROP TABLE #Securables +DROP TABLE #UsersOnRole +','ArizonaLD','Pharmacies') + +INSERT INTO #AllRoles(STR_Definition,STR_Database,STR_Product)VALUES(' + +/*============================================================================= + + Script to create dbRoleAppMgrUsr role. + + Role Name: dbRoleAppMgrUsr + TEMPLATE: Default + + EXAMPLE OF SECURABLES TO SET: + + INSERT INTO #Securables + VALUES + (''DB'',''GRANT'',''VIEW DEFINITION'','''',''''), + (''SCHEMA'',''GRANT'',''SELECT,EXECUTE,INSERT,UPDATE,DELETE'','''',''AP''), + (''TABLE'',''GRANT'',''INSERT,UPDATE'',''Address'',''dbo''), + (''SP'',''GRANT'',''EXECUTE'',''sp_bmc_GetNextID'',''dbo''), + (''ROLE'',''GRANT'',''db_datareader'','''','''') + + ----------------------------------------------- + +Generate date : 2023-05-12 / up208700 + +=============================================================================*/ + +DECLARE @Command nvarchar(max), + @RoleName varchar(60), + @Users varchar(255), + @typeofobject varchar(50), + @grantordeny varchar(10), + @rightsaction varchar(255), + @objectname varchar(255), + @schemaid varchar(10), + @sysTarget varchar(255), + @sysType varchar(255) + +SET @RoleName = ''dbRoleAppMgrUsr'' +SET @Command = '''' + +/* TEMP TABLES */ +CREATE TABLE #UsersOnRole(username varchar(255)) +CREATE TABLE #Securables(typeofobject varchar(50), grantordeny varchar(10), rightsaction varchar(255), objectname varchar(255), schemaid varchar(10),N2 bit) + +/* !!! LIST OF SECURABLES TO CHANGE !!! */ + +INSERT INTO #Securables +VALUES +(''ROLE'',''GRANT'',''DB_DATAREADER'','''',''dbo'',0) + + +/* GET ALL USERS ON THIS ROLE */ +INSERT INTO #UsersOnRole +SELECT + members.name +FROM sys.database_role_members + JOIN sys.database_principals roles ON database_role_members.role_principal_id = roles.principal_id + JOIN sys.database_principals members ON database_role_members.member_principal_id = members.principal_id +WHERE roles.name = @RoleName + +/* CREATE ROLE */ +SELECT @Command = '' +IF NOT EXISTS (SELECT 1 FROM sys.database_principals WHERE name = '''''' + @RoleName + '''''' AND type = ''''R'''') +BEGIN + CREATE ROLE ['' + @RoleName + ''] AUTHORIZATION [dbo] + PRINT ''''CREATE ROLE ['' + @RoleName + '']'''' +END +'' +EXEC sp_executesql @Command + +SET @Command = '' +DECLARE @SP_Name varchar(255) + +'' + +/* SET ALL ROLE SECURABLES */ +DECLARE SecurablesCurs CURSOR FOR +SELECT typeofobject, grantordeny, rightsaction, objectname, schemaid +FROM #Securables +WHERE N2 = 0 + +OPEN SecurablesCurs +FETCH NEXT FROM SecurablesCurs INTO @typeofobject, @grantordeny, @rightsaction, @objectname, @schemaid +WHILE @@FETCH_STATUS = 0 +BEGIN + + IF @typeofobject = ''DB'' + BEGIN + IF EXISTS(SELECT 1 FROM sys.fn_builtin_permissions(''DATABASE'') WHERE permission_name = '''' + @rightsaction + '''') + BEGIN + SET @Command = @Command + @grantordeny + '' '' + @rightsaction + '' TO ['' + @RoleName + ''] +'' + END + END + + IF @typeofobject = ''SCHEMA'' + BEGIN + SET @Command = @Command + '' +IF EXISTS (SELECT 1 FROM sys.schemas WHERE name = '''''' + @schemaid + '''''') +BEGIN + IF EXISTS(SELECT 1 FROM sys.fn_builtin_permissions(''''SCHEMA'''') WHERE permission_name = '''''' + @rightsaction + '''''') + BEGIN + '' + @grantordeny + '' '' + @rightsaction + '' ON SCHEMA::'' + @schemaid + '' TO ['' + @RoleName + ''] + END +END + +'' + END + + IF @typeofobject in(''TABLE'',''SP'',''FUNCTIONS'',''VIEWS'') + BEGIN + + IF @objectname like ''%[%]%'' + BEGIN + + IF @typeofobject = ''TABLE'' + BEGIN + SET @sysTarget = ''sys.tables'' + SET @sysType = '''' + END + + IF @typeofobject = ''SP'' + BEGIN + SET @sysTarget = ''sys.procedures'' + SET @sysType = '''' + END + + IF @typeofobject = ''FUNCTIONS'' + BEGIN + SET @sysTarget = ''sys.objects'' + SET @sysType = '' and p.Type IN ( N''''FN'''', N''''IF'''', N''''TF'''', N''''FS'''', N''''FT'''' )'' + END + + IF @typeofobject = ''VIEWS'' + BEGIN + SET @sysTarget = ''sys.views'' + SET @sysType = '''' + END + + SET @Command = @Command + '' +DECLARE SP_cursor CURSOR FOR +SELECT p.name FROM '' + @sysTarget + '' p JOIN sys.schemas s ON s.schema_id = p.schema_id WHERE (p.name like '''''' + @objectname + '''''') and s.name = '''''' + @schemaid + '''' + @sysType + '''''' + +OPEN SP_cursor +FETCH NEXT FROM SP_cursor INTO @SP_Name +WHILE @@FETCH_STATUS = 0 +BEGIN + IF EXISTS(SELECT 1 FROM sys.fn_builtin_permissions(''''OBJECT'''') WHERE permission_name = '''''' + @rightsaction + '''''') + BEGIN + EXEC('''''' + @grantordeny + '' '' + @rightsaction + '' ON ['' + @schemaid + ''].['''' + @SP_Name + ''''] TO ['' + @RoleName + '']'''') + END + FETCH NEXT FROM SP_cursor INTO @SP_Name +END + +CLOSE SP_cursor +DEALLOCATE SP_cursor + +'' + + END + ELSE + BEGIN + + SET @Command = @Command + '' +IF EXISTS(SELECT 1 FROM sys.objects o WITH (NOLOCK) JOIN sys.schemas s ON s.schema_id = o.schema_id WHERE o.name = '''''' + @objectname + '''''' AND o.type IN (N''''U'''',''''P'''',''''V'''',''''FN'''',''''IF'''',''''TF'''') AND s.name = '''''' + @schemaid + '''''') +BEGIN + IF EXISTS(SELECT 1 FROM sys.fn_builtin_permissions(''''OBJECT'''') WHERE permission_name = '''''' + @rightsaction + '''''') + BEGIN + '' + @grantordeny + '' '' + @rightsaction + '' ON ['' + @schemaid + ''].['' + @objectname + ''] TO ['' + @RoleName + ''] + END +END + +'' + END +END + +IF @typeofobject = ''ASSEMBLIES'' +BEGIN + SET @Command = @Command + '' +IF EXISTS(SELECT 1 FROM sys.assemblies WHERE NAME = '''''' + @objectname + '''''') +BEGIN + IF EXISTS(SELECT 1 FROM sys.fn_builtin_permissions(''''ASSEMBLY'''') WHERE permission_name = '''''' + @rightsaction + '''''') + BEGIN + '' + @grantordeny + '' '' + @rightsaction + ''::['' + @objectname + ''] TO ['' + @RoleName + ''] + END +END + +'' +END + +IF @typeofobject = ''ROLE'' +BEGIN + SET @Command = @Command + '' +IF NOT EXISTS (SELECT 1 FROM sys.database_role_members JOIN sys.database_principals roles ON database_role_members.role_principal_id = roles.principal_id JOIN sys.database_principals members ON database_role_members.member_principal_id = members.principal_id WHERE roles.name = '''''' + @rightsaction + '''''' AND members.name = '''''' + @RoleName + '''''') +BEGIN + EXEC sp_addrolemember N'''''' + @rightsaction + '''''', N'''''' + @RoleName + '''''' +END + +'' +END + +FETCH NEXT FROM SecurablesCurs INTO @typeofobject, @grantordeny, @rightsaction, @objectname, @schemaid +END + +CLOSE SecurablesCurs +DEALLOCATE SecurablesCurs + +PRINT ''SET ALL SECURABLES ON ROLE ['' + @RoleName + '']'' +EXEC sp_executesql @Command + +/* ADD USER */ +DECLARE UsersCurs CURSOR FOR +SELECT username + FROM #UsersOnRole + +OPEN UsersCurs + +FETCH NEXT FROM UsersCurs INTO @Users +WHILE @@FETCH_STATUS = 0 +BEGIN + + SELECT @Command = '' +EXEC sp_addrolemember N'''''' + @RoleName + '''''', N'''''' + @Users + '''''' +PRINT ''''ADD USER ['' + @Users + ''] ON ROLE ['' + @RoleName + '']'''' +'' + +FETCH NEXT FROM UsersCurs INTO @Users +END + +CLOSE UsersCurs +DEALLOCATE UsersCurs + +EXEC sp_executesql @Command + + +/*============================================================================= + Drop temp tables +=============================================================================*/ +DROP TABLE #Securables +DROP TABLE #UsersOnRole +','Arizona','Pharmacies') + + +/*============================================================================= + Script to create / map all users and execute every roles on databases +=============================================================================*/ + +DECLARE @Command nvarchar(max), + @RoleName varchar(60), + @username varchar(255), + @Database VARCHAR(255) + +SET @rolename = '' +SET @username = '' +SET @Command = '' +SET @Database = '' + +CREATE TABLE #AllUsersAndRoles(databasename varchar(255), rolename varchar(255), username varchar(255)) + +INSERT INTO #AllUsersAndRoles +VALUES +('ActivePos_read','dbRoleActivePharmacy','sqlAppAPHUsr'), +('ActivePos_read','dbRoleCsltUsr','AMAVITA\L-AM-AP-SQL-AMA-Pharmacy_Servers_Applications_Services'), +('ActivePos_read','dbRoleCsltUsr','AMAVITA\L-AM-AP-SQL-AMA-Pharmacy_Workstations_Applications_Services'), +('ActivePos_read','dbRoleCsltUsr','CENTRALINFRA\L-CI-AP-SQL-AMA-Pharmacy_Servers_Applications_Services'), +('ActivePos_read','dbRoleCsltUsr','CENTRALINFRA\L-CI-AP-SQL-AMA-Pharmacy_Workstations_Applications_Services'), +('ActivePos_read','dbRoleCsltUsr','CENTRALINFRA\L-CI-AP-SQL-CVI-Pharmacy_Servers_Applications_Services'), +('ActivePos_read','dbRoleCsltUsr','CENTRALINFRA\L-CI-AP-SQL-CVI-Pharmacy_Workstations_Applications_Services'), +('ActivePos_read','dbRoleCsltUsr','CENTRALINFRA\L-CI-AP-SQL-SUN-Pharmacy_Servers_Applications_Services'), +('ActivePos_read','dbRoleCsltUsr','CENTRALINFRA\L-CI-AP-SQL-SUN-Pharmacy_Workstations_Applications_Services'), +('ActivePos_read','dbRoleCsltUsr','COOP-VITALITY\L-CV-AP-SQL-CVI-Pharmacy_Servers_Applications_Services'), +('ActivePos_read','dbRoleCsltUsr','COOP-VITALITY\L-CV-AP-SQL-CVI-Pharmacy_Workstations_Applications_Services'), +('ActivePos_read','dbRoleCsltUsr','SUNSTORE\L-SU-AP-SQL-SUN-Pharmacy_Servers_Applications_Services'), +('ActivePos_read','dbRoleCsltUsr','SUNSTORE\L-SU-AP-SQL-SUN-Pharmacy_Workstations_Applications_Services'), +('ActivePos_read','dbRoleDevUsr','AMAVITA\L-AM-AP-SQL-AMA-Pharmacy_Servers_Development'), +('ActivePos_read','dbRoleDevUsr','AMAVITA\L-AM-AP-SQL-AMA-Pharmacy_Workstations_Development'), +('ActivePos_read','dbRoleDevUsr','CENTRALINFRA\L-CI-AP-SQL-AMA-Pharmacy_Servers_Development'), +('ActivePos_read','dbRoleDevUsr','CENTRALINFRA\L-CI-AP-SQL-AMA-Pharmacy_Workstations_Development'), +('ActivePos_read','dbRoleDevUsr','CENTRALINFRA\L-CI-AP-SQL-CVI-Pharmacy_Servers_Development'), +('ActivePos_read','dbRoleDevUsr','CENTRALINFRA\L-CI-AP-SQL-CVI-Pharmacy_Workstations_Development'), +('ActivePos_read','dbRoleDevUsr','CENTRALINFRA\L-CI-AP-SQL-SUN-Pharmacy_Servers_Development'), +('ActivePos_read','dbRoleDevUsr','CENTRALINFRA\L-CI-AP-SQL-SUN-Pharmacy_Workstations_Development'), +('ActivePos_read','dbRoleDevUsr','COOP-VITALITY\L-CV-AP-SQL-CVI-Pharmacy_Servers_Development'), +('ActivePos_read','dbRoleDevUsr','COOP-VITALITY\L-CV-AP-SQL-CVI-Pharmacy_Workstations_Development'), +('ActivePos_read','dbRoleDevUsr','SUNSTORE\L-SU-AP-SQL-SUN-Pharmacy_Servers_Development'), +('ActivePos_read','dbRoleDevUsr','SUNSTORE\L-SU-AP-SQL-SUN-Pharmacy_Workstations_Development'), +('ActivePos_read','dbRoleIttechUsr','AMAVITA\L-AM-AP-SQL-AMA-Pharmacy_Servers_IT_Field'), +('ActivePos_read','dbRoleIttechUsr','CENTRALINFRA\L-CI-AP-SQL-AMA-Pharmacy_Servers_IT_Field'), +('ActivePos_read','dbRoleIttechUsr','CENTRALINFRA\L-CI-AP-SQL-CVI-Pharmacy_Servers_IT_Field'), +('ActivePos_read','dbRoleIttechUsr','CENTRALINFRA\L-CI-AP-SQL-SUN-Pharmacy_Servers_IT_Field'), +('ActivePos_read','dbRoleIttechUsr','COOP-VITALITY\L-CV-AP-SQL-CVI-Pharmacy_Servers_IT_Field'), +('ActivePos_read','dbRoleIttechUsr','SUNSTORE\L-SU-AP-SQL-SUN-Pharmacy_Servers_IT_Field'), +('ActivePos_read','dbRolePOUsr','AMAVITA\L-AM-AP-SQL-AMA_Pharmacy_Servers_Product_Owner'), +('ActivePos_read','dbRolePOUsr','CENTRALINFRA\L-CI-AP-SQL-AMA-Pharmacy_Servers_Product_Owner'), +('ActivePos_read','dbRolePOUsr','CENTRALINFRA\L-CI-AP-SQL-CVI-Pharmacy_Servers_Product_Owner'), +('ActivePos_read','dbRolePOUsr','CENTRALINFRA\L-CI-AP-SQL-SUN-Pharmacy_Servers_Product_Owner'), +('ActivePos_read','dbRolePOUsr','COOP-VITALITY\L-CV-AP-SQL-CVI_Pharmacy_Servers_Product_Owner'), +('ActivePos_read','dbRolePOUsr','SUNSTORE\L-SU-AP-SQL-SUN_Pharmacy_Servers_Product_Owner'), +('ActivePos_read','dbRoleQAtesters','AMAVITA\L-AM-AP-SQL-AMA-Pharmacy_Servers_QA_Testers'), +('ActivePos_read','dbRoleQAtesters','CENTRALINFRA\L-CI-AP-SQL-AMA-Pharmacy_Servers_QA_Testers'), +('ActivePos_read','dbRoleQAtesters','CENTRALINFRA\L-CI-AP-SQL-CVI-Pharmacy_Servers_QA_Testers'), +('ActivePos_read','dbRoleQAtesters','CENTRALINFRA\L-CI-AP-SQL-SUN-Pharmacy_Servers_QA_Testers'), +('ActivePos_read','dbRoleQAtesters','COOP-VITALITY\L-CV-AP-SQL-CVI-Pharmacy_Servers_QA_Testers'), +('ActivePos_read','dbRoleQAtesters','SUNSTORE\L-SU-AP-SQL-SUN-Pharmacy_Servers_QA_Testers'), +('ActivePos_read','dbRoleSupUsr','AMAVITA\L-AM-AP-SQL-AMA-Pharmacy_Servers_User_Support_Training'), +('ActivePos_read','dbRoleSupUsr','AMAVITA\L-AM-AP-SQL-AMA-Pharmacy_Workstations_User_Support_Training'), +('ActivePos_read','dbRoleSupUsr','CENTRALINFRA\L-CI-AP-SQL-AMA-Pharmacy_Servers_User_Support_Training'), +('ActivePos_read','dbRoleSupUsr','CENTRALINFRA\L-CI-AP-SQL-AMA-Pharmacy_Workstations_User_Support_Training'), +('ActivePos_read','dbRoleSupUsr','CENTRALINFRA\L-CI-AP-SQL-CVI-Pharmacy_Servers_User_Support_Training'), +('ActivePos_read','dbRoleSupUsr','CENTRALINFRA\L-CI-AP-SQL-cvi-Pharmacy_Workstations_User_Support_Training'), +('ActivePos_read','dbRoleSupUsr','CENTRALINFRA\L-CI-AP-SQL-SUN-Pharmacy_Servers_User_Support_Training'), +('ActivePos_read','dbRoleSupUsr','CENTRALINFRA\L-CI-AP-SQL-SUN-Pharmacy_Workstations_User_Support_Training'), +('ActivePos_read','dbRoleSupUsr','COOP-VITALITY\L-CV-AP-SQL-CVI-Pharmacy_Servers_User_Support_Training'), +('ActivePos_read','dbRoleSupUsr','COOP-VITALITY\L-CV-AP-SQL-CVI-Pharmacy_Workstations_User_Support_Training'), +('ActivePos_read','dbRoleSupUsr','SUNSTORE\L-SU-AP-SQL-SUN-Pharmacy_Servers_User_Support_Training'), +('ActivePos_read','dbRoleSupUsr','SUNSTORE\L-SU-AP-SQL-SUN-Pharmacy_Workstations_User_Support_Training'), +('ActivePos_read','dbRoleTPPos','sqlLksrvTPPosusr'), +('ActivePos_server','dbRoleActiveConfig','ActiveConfig'), +('ActivePos_server','dbRoleActivePharmacy','sqlAppAPHUsr'), +('ActivePos_server','dbRoleCsltUsr','AMAVITA\L-AM-AP-SQL-AMA-Pharmacy_Servers_Applications_Services'), +('ActivePos_server','dbRoleCsltUsr','CENTRALINFRA\L-CI-AP-SQL-AMA-Pharmacy_Servers_Applications_Services'), +('ActivePos_server','dbRoleCsltUsr','CENTRALINFRA\L-CI-AP-SQL-CVI-Pharmacy_Servers_Applications_Services'), +('ActivePos_server','dbRoleCsltUsr','CENTRALINFRA\L-CI-AP-SQL-SUN-Pharmacy_Servers_Applications_Services'), +('ActivePos_server','dbRoleCsltUsr','COOP-VITALITY\L-CV-AP-SQL-CVI-Pharmacy_Servers_Applications_Services'), +('ActivePos_server','dbRoleCsltUsr','SUNSTORE\L-SU-AP-SQL-SUN-Pharmacy_Servers_Applications_Services'), +('ActivePos_server','dbRoleDevUsr','AMAVITA\L-AM-AP-SQL-AMA-Pharmacy_Servers_Development'), +('ActivePos_server','dbRoleDevUsr','CENTRALINFRA\L-CI-AP-SQL-AMA-Pharmacy_Servers_Development'), +('ActivePos_server','dbRoleDevUsr','CENTRALINFRA\L-CI-AP-SQL-CVI-Pharmacy_Servers_Development'), +('ActivePos_server','dbRoleDevUsr','CENTRALINFRA\L-CI-AP-SQL-SUN-Pharmacy_Servers_Development'), +('ActivePos_server','dbRoleDevUsr','COOP-VITALITY\L-CV-AP-SQL-CVI-Pharmacy_Servers_Development'), +('ActivePos_server','dbRoleDevUsr','SUNSTORE\L-SU-AP-SQL-SUN-Pharmacy_Servers_Development'), +('ActivePos_server','dbRoleIttechUsr','AMAVITA\L-AM-AP-SQL-AMA-Pharmacy_Servers_IT_Field'), +('ActivePos_server','dbRoleIttechUsr','CENTRALINFRA\L-CI-AP-SQL-AMA-Pharmacy_Servers_IT_Field'), +('ActivePos_server','dbRoleIttechUsr','CENTRALINFRA\L-CI-AP-SQL-CVI-Pharmacy_Servers_IT_Field'), +('ActivePos_server','dbRoleIttechUsr','CENTRALINFRA\L-CI-AP-SQL-SUN-Pharmacy_Servers_IT_Field'), +('ActivePos_server','dbRoleIttechUsr','COOP-VITALITY\L-CV-AP-SQL-CVI-Pharmacy_Servers_IT_Field'), +('ActivePos_server','dbRoleIttechUsr','SUNSTORE\L-SU-AP-SQL-SUN-Pharmacy_Servers_IT_Field'), +('ActivePos_server','dbRolePOUsr','AMAVITA\L-AM-AP-SQL-AMA_Pharmacy_Servers_Product_Owner'), +('ActivePos_server','dbRolePOUsr','CENTRALINFRA\L-CI-AP-SQL-AMA-Pharmacy_Servers_Product_Owner'), +('ActivePos_server','dbRolePOUsr','CENTRALINFRA\L-CI-AP-SQL-CVI-Pharmacy_Servers_Product_Owner'), +('ActivePos_server','dbRolePOUsr','CENTRALINFRA\L-CI-AP-SQL-SUN-Pharmacy_Servers_Product_Owner'), +('ActivePos_server','dbRolePOUsr','COOP-VITALITY\L-CV-AP-SQL-CVI_Pharmacy_Servers_Product_Owner'), +('ActivePos_server','dbRolePOUsr','SUNSTORE\L-SU-AP-SQL-SUN_Pharmacy_Servers_Product_Owner'), +('ActivePos_server','dbRoleQAtesters','AMAVITA\L-AM-AP-SQL-AMA-Pharmacy_Servers_QA_Testers'), +('ActivePos_server','dbRoleQAtesters','CENTRALINFRA\L-CI-AP-SQL-AMA-Pharmacy_Servers_QA_Testers'), +('ActivePos_server','dbRoleQAtesters','CENTRALINFRA\L-CI-AP-SQL-CVI-Pharmacy_Servers_QA_Testers'), +('ActivePos_server','dbRoleQAtesters','CENTRALINFRA\L-CI-AP-SQL-SUN-Pharmacy_Servers_QA_Testers'), +('ActivePos_server','dbRoleQAtesters','COOP-VITALITY\L-CV-AP-SQL-CVI-Pharmacy_Servers_QA_Testers'), +('ActivePos_server','dbRoleQAtesters','SUNSTORE\L-SU-AP-SQL-SUN-Pharmacy_Servers_QA_Testers'), +('ActivePos_server','dbRoleSupUsr','AMAVITA\L-AM-AP-SQL-AMA-Pharmacy_Servers_User_Support_Training'), +('ActivePos_server','dbRoleSupUsr','CENTRALINFRA\L-CI-AP-SQL-AMA-Pharmacy_Servers_User_Support_Training'), +('ActivePos_server','dbRoleSupUsr','CENTRALINFRA\L-CI-AP-SQL-CVI-Pharmacy_Servers_User_Support_Training'), +('ActivePos_server','dbRoleSupUsr','CENTRALINFRA\L-CI-AP-SQL-SUN-Pharmacy_Servers_User_Support_Training'), +('ActivePos_server','dbRoleSupUsr','COOP-VITALITY\L-CV-AP-SQL-CVI-Pharmacy_Servers_User_Support_Training'), +('ActivePos_server','dbRoleSupUsr','SUNSTORE\L-SU-AP-SQL-SUN-Pharmacy_Servers_User_Support_Training'), +('ActivePos_server','dbRoleTPPos','sqlLksrvTPPosusr'), +('ActivePos_write','dbRoleActiveConfig','ActiveConfig'), +('ActivePos_write','dbRoleActivePharmacy','sqlAppAPHUsr'), +('ActivePos_write','dbRoleCsltUsr','AMAVITA\L-AM-AP-SQL-AMA-Pharmacy_Servers_Applications_Services'), +('ActivePos_write','dbRoleCsltUsr','AMAVITA\L-AM-AP-SQL-AMA-Pharmacy_Workstations_Applications_Services'), +('ActivePos_write','dbRoleCsltUsr','CENTRALINFRA\L-CI-AP-SQL-AMA-Pharmacy_Servers_Applications_Services'), +('ActivePos_write','dbRoleCsltUsr','CENTRALINFRA\L-CI-AP-SQL-AMA-Pharmacy_Workstations_Applications_Services'), +('ActivePos_write','dbRoleCsltUsr','CENTRALINFRA\L-CI-AP-SQL-CVI-Pharmacy_Servers_Applications_Services'), +('ActivePos_write','dbRoleCsltUsr','CENTRALINFRA\L-CI-AP-SQL-CVI-Pharmacy_Workstations_Applications_Services'), +('ActivePos_write','dbRoleCsltUsr','CENTRALINFRA\L-CI-AP-SQL-SUN-Pharmacy_Servers_Applications_Services'), +('ActivePos_write','dbRoleCsltUsr','CENTRALINFRA\L-CI-AP-SQL-SUN-Pharmacy_Workstations_Applications_Services'), +('ActivePos_write','dbRoleCsltUsr','COOP-VITALITY\L-CV-AP-SQL-CVI-Pharmacy_Servers_Applications_Services'), +('ActivePos_write','dbRoleCsltUsr','COOP-VITALITY\L-CV-AP-SQL-CVI-Pharmacy_Workstations_Applications_Services'), +('ActivePos_write','dbRoleCsltUsr','SUNSTORE\L-SU-AP-SQL-SUN-Pharmacy_Servers_Applications_Services'), +('ActivePos_write','dbRoleCsltUsr','SUNSTORE\L-SU-AP-SQL-SUN-Pharmacy_Workstations_Applications_Services'), +('ActivePos_write','dbRoleDevUsr','AMAVITA\L-AM-AP-SQL-AMA-Pharmacy_Servers_Development'), +('ActivePos_write','dbRoleDevUsr','AMAVITA\L-AM-AP-SQL-AMA-Pharmacy_Workstations_Development'), +('ActivePos_write','dbRoleDevUsr','CENTRALINFRA\L-CI-AP-SQL-AMA-Pharmacy_Servers_Development'), +('ActivePos_write','dbRoleDevUsr','CENTRALINFRA\L-CI-AP-SQL-AMA-Pharmacy_Workstations_Development'), +('ActivePos_write','dbRoleDevUsr','CENTRALINFRA\L-CI-AP-SQL-CVI-Pharmacy_Servers_Development'), +('ActivePos_write','dbRoleDevUsr','CENTRALINFRA\L-CI-AP-SQL-CVI-Pharmacy_Workstations_Development'), +('ActivePos_write','dbRoleDevUsr','CENTRALINFRA\L-CI-AP-SQL-SUN-Pharmacy_Servers_Development'), +('ActivePos_write','dbRoleDevUsr','CENTRALINFRA\L-CI-AP-SQL-SUN-Pharmacy_Workstations_Development'), +('ActivePos_write','dbRoleDevUsr','COOP-VITALITY\L-CV-AP-SQL-CVI-Pharmacy_Servers_Development'), +('ActivePos_write','dbRoleDevUsr','COOP-VITALITY\L-CV-AP-SQL-CVI-Pharmacy_Workstations_Development'), +('ActivePos_write','dbRoleDevUsr','SUNSTORE\L-SU-AP-SQL-SUN-Pharmacy_Servers_Development'), +('ActivePos_write','dbRoleDevUsr','SUNSTORE\L-SU-AP-SQL-SUN-Pharmacy_Workstations_Development'), +('ActivePos_write','dbRoleIttechUsr','AMAVITA\L-AM-AP-SQL-AMA-Pharmacy_Servers_IT_Field'), +('ActivePos_write','dbRoleIttechUsr','CENTRALINFRA\L-CI-AP-SQL-AMA-Pharmacy_Servers_IT_Field'), +('ActivePos_write','dbRoleIttechUsr','CENTRALINFRA\L-CI-AP-SQL-CVI-Pharmacy_Servers_IT_Field'), +('ActivePos_write','dbRoleIttechUsr','CENTRALINFRA\L-CI-AP-SQL-SUN-Pharmacy_Servers_IT_Field'), +('ActivePos_write','dbRoleIttechUsr','COOP-VITALITY\L-CV-AP-SQL-CVI-Pharmacy_Servers_IT_Field'), +('ActivePos_write','dbRoleIttechUsr','SUNSTORE\L-SU-AP-SQL-SUN-Pharmacy_Servers_IT_Field'), +('ActivePos_write','dbRolePOUsr','AMAVITA\L-AM-AP-SQL-AMA_Pharmacy_Servers_Product_Owner'), +('ActivePos_write','dbRolePOUsr','CENTRALINFRA\L-CI-AP-SQL-AMA-Pharmacy_Servers_Product_Owner'), +('ActivePos_write','dbRolePOUsr','CENTRALINFRA\L-CI-AP-SQL-CVI-Pharmacy_Servers_Product_Owner'), +('ActivePos_write','dbRolePOUsr','CENTRALINFRA\L-CI-AP-SQL-SUN-Pharmacy_Servers_Product_Owner'), +('ActivePos_write','dbRolePOUsr','COOP-VITALITY\L-CV-AP-SQL-CVI_Pharmacy_Servers_Product_Owner'), +('ActivePos_write','dbRolePOUsr','SUNSTORE\L-SU-AP-SQL-SUN_Pharmacy_Servers_Product_Owner'), +('ActivePos_write','dbRoleQAtesters','AMAVITA\L-AM-AP-SQL-AMA-Pharmacy_Servers_QA_Testers'), +('ActivePos_write','dbRoleQAtesters','CENTRALINFRA\L-CI-AP-SQL-AMA-Pharmacy_Servers_QA_Testers'), +('ActivePos_write','dbRoleQAtesters','CENTRALINFRA\L-CI-AP-SQL-CVI-Pharmacy_Servers_QA_Testers'), +('ActivePos_write','dbRoleQAtesters','CENTRALINFRA\L-CI-AP-SQL-SUN-Pharmacy_Servers_QA_Testers'), +('ActivePos_write','dbRoleQAtesters','COOP-VITALITY\L-CV-AP-SQL-CVI-Pharmacy_Servers_QA_Testers'), +('ActivePos_write','dbRoleQAtesters','SUNSTORE\L-SU-AP-SQL-SUN-Pharmacy_Servers_QA_Testers'), +('ActivePos_write','dbRoleSupUsr','AMAVITA\L-AM-AP-SQL-AMA-Pharmacy_Servers_User_Support_Training'), +('ActivePos_write','dbRoleSupUsr','AMAVITA\L-AM-AP-SQL-AMA-Pharmacy_Workstations_User_Support_Training'), +('ActivePos_write','dbRoleSupUsr','CENTRALINFRA\L-CI-AP-SQL-AMA-Pharmacy_Servers_User_Support_Training'), +('ActivePos_write','dbRoleSupUsr','CENTRALINFRA\L-CI-AP-SQL-AMA-Pharmacy_Workstations_User_Support_Training'), +('ActivePos_write','dbRoleSupUsr','CENTRALINFRA\L-CI-AP-SQL-CVI-Pharmacy_Servers_User_Support_Training'), +('ActivePos_write','dbRoleSupUsr','CENTRALINFRA\L-CI-AP-SQL-cvi-Pharmacy_Workstations_User_Support_Training'), +('ActivePos_write','dbRoleSupUsr','CENTRALINFRA\L-CI-AP-SQL-SUN-Pharmacy_Servers_User_Support_Training'), +('ActivePos_write','dbRoleSupUsr','CENTRALINFRA\L-CI-AP-SQL-SUN-Pharmacy_Workstations_User_Support_Training'), +('ActivePos_write','dbRoleSupUsr','COOP-VITALITY\L-CV-AP-SQL-CVI-Pharmacy_Servers_User_Support_Training'), +('ActivePos_write','dbRoleSupUsr','COOP-VITALITY\L-CV-AP-SQL-CVI-Pharmacy_Workstations_User_Support_Training'), +('ActivePos_write','dbRoleSupUsr','SUNSTORE\L-SU-AP-SQL-SUN-Pharmacy_Servers_User_Support_Training'), +('ActivePos_write','dbRoleSupUsr','SUNSTORE\L-SU-AP-SQL-SUN-Pharmacy_Workstations_User_Support_Training'), +('ActivePos_write','dbRoleTPPos','sqlLksrvTPPosusr'), +('ActiveSystemClient','dbRoleActiveConfig','ActiveConfig'), +('ActiveSystemClient','dbRoleActivePharmacy','sqlAppAPHUsr'), +('ActiveSystemClient','dbRoleCsltUsr','AMAVITA\L-AM-AP-SQL-AMA-Pharmacy_Servers_Applications_Services'), +('ActiveSystemClient','dbRoleCsltUsr','AMAVITA\L-AM-AP-SQL-AMA-Pharmacy_Workstations_Applications_Services'), +('ActiveSystemClient','dbRoleCsltUsr','CENTRALINFRA\L-CI-AP-SQL-AMA-Pharmacy_Servers_Applications_Services'), +('ActiveSystemClient','dbRoleCsltUsr','CENTRALINFRA\L-CI-AP-SQL-AMA-Pharmacy_Workstations_Applications_Services'), +('ActiveSystemClient','dbRoleCsltUsr','CENTRALINFRA\L-CI-AP-SQL-AMA-Pharmacy_Workstations_User_Support_Training'), +('ActiveSystemClient','dbRoleCsltUsr','CENTRALINFRA\L-CI-AP-SQL-CVI-Pharmacy_Servers_Applications_Services'), +('ActiveSystemClient','dbRoleCsltUsr','CENTRALINFRA\L-CI-AP-SQL-CVI-Pharmacy_Workstations_Applications_Services'), +('ActiveSystemClient','dbRoleCsltUsr','CENTRALINFRA\L-CI-AP-SQL-cvi-Pharmacy_Workstations_User_Support_Training'), +('ActiveSystemClient','dbRoleCsltUsr','CENTRALINFRA\L-CI-AP-SQL-SUN-Pharmacy_Servers_Applications_Services'), +('ActiveSystemClient','dbRoleCsltUsr','CENTRALINFRA\L-CI-AP-SQL-SUN-Pharmacy_Workstations_User_Support_Training'), +('ActiveSystemClient','dbRoleCsltUsr','CENTRALINFRA\L-CI-AP-SQL-SUN-Pharmacy_Workstations_Windows_Operations'), +('ActiveSystemClient','dbRoleCsltUsr','COOP-VITALITY\L-CV-AP-SQL-CVI-Pharmacy_Servers_Applications_Services'), +('ActiveSystemClient','dbRoleCsltUsr','COOP-VITALITY\L-CV-AP-SQL-CVI-Pharmacy_Workstations_Applications_Services'), +('ActiveSystemClient','dbRoleCsltUsr','SUNSTORE\L-SU-AP-SQL-SUN-Pharmacy_Servers_Applications_Services'), +('ActiveSystemClient','dbRoleCsltUsr','SUNSTORE\L-SU-AP-SQL-SUN-Pharmacy_Workstations_Applications_Services'), +('ActiveSystemClient','dbRoleDevUsr','AMAVITA\L-AM-AP-SQL-AMA-Pharmacy_Servers_Development'), +('ActiveSystemClient','dbRoleDevUsr','AMAVITA\L-AM-AP-SQL-AMA-Pharmacy_Workstations_Development'), +('ActiveSystemClient','dbRoleDevUsr','CENTRALINFRA\L-CI-AP-SQL-AMA-Pharmacy_Servers_Development'), +('ActiveSystemClient','dbRoleDevUsr','CENTRALINFRA\L-CI-AP-SQL-AMA-Pharmacy_Workstations_Development'), +('ActiveSystemClient','dbRoleDevUsr','CENTRALINFRA\L-CI-AP-SQL-CVI-Pharmacy_Servers_Development'), +('ActiveSystemClient','dbRoleDevUsr','CENTRALINFRA\L-CI-AP-SQL-CVI-Pharmacy_Workstations_Development'), +('ActiveSystemClient','dbRoleDevUsr','CENTRALINFRA\L-CI-AP-SQL-cvi-Pharmacy_Workstations_User_Support_Training'), +('ActiveSystemClient','dbRoleDevUsr','CENTRALINFRA\L-CI-AP-SQL-SUN-Pharmacy_Servers_Development'), +('ActiveSystemClient','dbRoleDevUsr','COOP-VITALITY\L-CV-AP-SQL-CVI-Pharmacy_Servers_Development'), +('ActiveSystemClient','dbRoleDevUsr','COOP-VITALITY\L-CV-AP-SQL-CVI-Pharmacy_Workstations_Development'), +('ActiveSystemClient','dbRoleDevUsr','SUNSTORE\L-SU-AP-SQL-SUN-Pharmacy_Servers_Development'), +('ActiveSystemClient','dbRoleDevUsr','SUNSTORE\L-SU-AP-SQL-SUN-Pharmacy_Workstations_Development'), +('ActiveSystemClient','dbRoleIttechUsr','AMAVITA\L-AM-AP-SQL-AMA-Pharmacy_Servers_IT_Field'), +('ActiveSystemClient','dbRoleIttechUsr','CENTRALINFRA\L-CI-AP-SQL-AMA-Pharmacy_Servers_IT_Field'), +('ActiveSystemClient','dbRoleIttechUsr','CENTRALINFRA\L-CI-AP-SQL-CVI-Pharmacy_Servers_IT_Field'), +('ActiveSystemClient','dbRoleIttechUsr','CENTRALINFRA\L-CI-AP-SQL-SUN-Pharmacy_Servers_IT_Field'), +('ActiveSystemClient','dbRoleIttechUsr','COOP-VITALITY\L-CV-AP-SQL-CVI-Pharmacy_Servers_IT_Field'), +('ActiveSystemClient','dbRoleIttechUsr','SUNSTORE\L-SU-AP-SQL-SUN-Pharmacy_Servers_IT_Field'), +('ActiveSystemClient','dbRolePOUsr','AMAVITA\L-AM-AP-SQL-AMA_Pharmacy_Servers_Product_Owner'), +('ActiveSystemClient','dbRolePOUsr','CENTRALINFRA\L-CI-AP-SQL-AMA-Pharmacy_Servers_Product_Owner'), +('ActiveSystemClient','dbRolePOUsr','CENTRALINFRA\L-CI-AP-SQL-CVI-Pharmacy_Servers_Product_Owner'), +('ActiveSystemClient','dbRolePOUsr','CENTRALINFRA\L-CI-AP-SQL-SUN-Pharmacy_Servers_Product_Owner'), +('ActiveSystemClient','dbRolePOUsr','COOP-VITALITY\L-CV-AP-SQL-CVI_Pharmacy_Servers_Product_Owner'), +('ActiveSystemClient','dbRolePOUsr','SUNSTORE\L-SU-AP-SQL-SUN_Pharmacy_Servers_Product_Owner'), +('ActiveSystemClient','dbRoleQAtesters','AMAVITA\L-AM-AP-SQL-AMA-Pharmacy_Servers_QA_Testers'), +('ActiveSystemClient','dbRoleQAtesters','CENTRALINFRA\L-CI-AP-SQL-AMA-Pharmacy_Servers_QA_Testers'), +('ActiveSystemClient','dbRoleQAtesters','CENTRALINFRA\L-CI-AP-SQL-CVI-Pharmacy_Servers_QA_Testers'), +('ActiveSystemClient','dbRoleQAtesters','CENTRALINFRA\L-CI-AP-SQL-SUN-Pharmacy_Servers_QA_Testers'), +('ActiveSystemClient','dbRoleQAtesters','COOP-VITALITY\L-CV-AP-SQL-CVI-Pharmacy_Servers_QA_Testers'), +('ActiveSystemClient','dbRoleQAtesters','SUNSTORE\L-SU-AP-SQL-SUN-Pharmacy_Servers_QA_Testers'), +('ActiveSystemClient','dbRoleSupUsr','AMAVITA\L-AM-AP-SQL-AMA-Pharmacy_Servers_User_Support_Training'), +('ActiveSystemClient','dbRoleSupUsr','AMAVITA\L-AM-AP-SQL-AMA-Pharmacy_Workstations_User_Support_Training'), +('ActiveSystemClient','dbRoleSupUsr','CENTRALINFRA\L-CI-AP-SQL-AMA-Pharmacy_Servers_User_Support_Training'), +('ActiveSystemClient','dbRoleSupUsr','CENTRALINFRA\L-CI-AP-SQL-AMA-Pharmacy_Workstations_User_Support_Training'), +('ActiveSystemClient','dbRoleSupUsr','CENTRALINFRA\L-CI-AP-SQL-CVI-Pharmacy_Servers_User_Support_Training'), +('ActiveSystemClient','dbRoleSupUsr','CENTRALINFRA\L-CI-AP-SQL-cvi-Pharmacy_Workstations_User_Support_Training'), +('ActiveSystemClient','dbRoleSupUsr','CENTRALINFRA\L-CI-AP-SQL-SUN-Pharmacy_Servers_User_Support_Training'), +('ActiveSystemClient','dbRoleSupUsr','CENTRALINFRA\L-CI-AP-SQL-SUN-Pharmacy_Workstations_User_Support_Training'), +('ActiveSystemClient','dbRoleSupUsr','COOP-VITALITY\L-CV-AP-SQL-CVI-Pharmacy_Servers_User_Support_Training'), +('ActiveSystemClient','dbRoleSupUsr','COOP-VITALITY\L-CV-AP-SQL-CVI-Pharmacy_Workstations_User_Support_Training'), +('ActiveSystemClient','dbRoleSupUsr','SUNSTORE\L-SU-AP-SQL-SUN-Pharmacy_Servers_User_Support_Training'), +('ActiveSystemClient','dbRoleSupUsr','SUNSTORE\L-SU-AP-SQL-SUN-Pharmacy_Workstations_User_Support_Training'), +('ActiveSystemServer','dbRoleActiveConfig','ActiveConfig'), +('ActiveSystemServer','dbRoleActivePharmacy','sqlAppAPHUsr'), +('ActiveSystemServer','dbRoleCsltUsr','AMAVITA\L-AM-AP-SQL-AMA-Pharmacy_Servers_Applications_Services'), +('ActiveSystemServer','dbRoleCsltUsr','CENTRALINFRA\L-CI-AP-SQL-AMA-Pharmacy_Servers_Applications_Services'), +('ActiveSystemServer','dbRoleCsltUsr','CENTRALINFRA\L-CI-AP-SQL-CVI-Pharmacy_Servers_Applications_Services'), +('ActiveSystemServer','dbRoleCsltUsr','CENTRALINFRA\L-CI-AP-SQL-SUN-Pharmacy_Servers_Applications_Services'), +('ActiveSystemServer','dbRoleCsltUsr','COOP-VITALITY\L-CV-AP-SQL-CVI-Pharmacy_Servers_Applications_Services'), +('ActiveSystemServer','dbRoleCsltUsr','SUNSTORE\L-SU-AP-SQL-SUN-Pharmacy_Servers_Applications_Services'), +('ActiveSystemServer','dbRoleDevUsr','AMAVITA\L-AM-AP-SQL-AMA-Pharmacy_Servers_Development'), +('ActiveSystemServer','dbRoleDevUsr','CENTRALINFRA\L-CI-AP-SQL-AMA-Pharmacy_Servers_Development'), +('ActiveSystemServer','dbRoleDevUsr','CENTRALINFRA\L-CI-AP-SQL-CVI-Pharmacy_Servers_Development'), +('ActiveSystemServer','dbRoleDevUsr','CENTRALINFRA\L-CI-AP-SQL-SUN-Pharmacy_Servers_Development'), +('ActiveSystemServer','dbRoleDevUsr','COOP-VITALITY\L-CV-AP-SQL-CVI-Pharmacy_Servers_Development'), +('ActiveSystemServer','dbRoleDevUsr','SUNSTORE\L-SU-AP-SQL-SUN-Pharmacy_Servers_Development'), +('ActiveSystemServer','dbRoleIttechUsr','AMAVITA\L-AM-AP-SQL-AMA-Pharmacy_Servers_IT_Field'), +('ActiveSystemServer','dbRoleIttechUsr','CENTRALINFRA\L-CI-AP-SQL-AMA-Pharmacy_Servers_IT_Field'), +('ActiveSystemServer','dbRoleIttechUsr','CENTRALINFRA\L-CI-AP-SQL-CVI-Pharmacy_Servers_IT_Field'), +('ActiveSystemServer','dbRoleIttechUsr','CENTRALINFRA\L-CI-AP-SQL-SUN-Pharmacy_Servers_IT_Field'), +('ActiveSystemServer','dbRoleIttechUsr','COOP-VITALITY\L-CV-AP-SQL-CVI-Pharmacy_Servers_IT_Field'), +('ActiveSystemServer','dbRoleIttechUsr','SUNSTORE\L-SU-AP-SQL-SUN-Pharmacy_Servers_IT_Field'), +('ActiveSystemServer','dbRolePOUsr','AMAVITA\L-AM-AP-SQL-AMA_Pharmacy_Servers_Product_Owner'), +('ActiveSystemServer','dbRolePOUsr','CENTRALINFRA\L-CI-AP-SQL-AMA-Pharmacy_Servers_Product_Owner'), +('ActiveSystemServer','dbRolePOUsr','CENTRALINFRA\L-CI-AP-SQL-CVI-Pharmacy_Servers_Product_Owner'), +('ActiveSystemServer','dbRolePOUsr','CENTRALINFRA\L-CI-AP-SQL-SUN-Pharmacy_Servers_Product_Owner'), +('ActiveSystemServer','dbRolePOUsr','COOP-VITALITY\L-CV-AP-SQL-CVI_Pharmacy_Servers_Product_Owner'), +('ActiveSystemServer','dbRolePOUsr','SUNSTORE\L-SU-AP-SQL-SUN_Pharmacy_Servers_Product_Owner'), +('ActiveSystemServer','dbRoleQAtesters','AMAVITA\L-AM-AP-SQL-AMA-Pharmacy_Servers_QA_Testers'), +('ActiveSystemServer','dbRoleQAtesters','CENTRALINFRA\L-CI-AP-SQL-AMA-Pharmacy_Servers_QA_Testers'), +('ActiveSystemServer','dbRoleQAtesters','CENTRALINFRA\L-CI-AP-SQL-CVI-Pharmacy_Servers_QA_Testers'), +('ActiveSystemServer','dbRoleQAtesters','CENTRALINFRA\L-CI-AP-SQL-SUN-Pharmacy_Servers_QA_Testers'), +('ActiveSystemServer','dbRoleQAtesters','COOP-VITALITY\L-CV-AP-SQL-CVI-Pharmacy_Servers_QA_Testers'), +('ActiveSystemServer','dbRoleQAtesters','SUNSTORE\L-SU-AP-SQL-SUN-Pharmacy_Servers_QA_Testers'), +('ActiveSystemServer','dbRoleSupUsr','AMAVITA\L-AM-AP-SQL-AMA-Pharmacy_Servers_User_Support_Training'), +('ActiveSystemServer','dbRoleSupUsr','CENTRALINFRA\L-CI-AP-SQL-AMA-Pharmacy_Servers_User_Support_Training'), +('ActiveSystemServer','dbRoleSupUsr','CENTRALINFRA\L-CI-AP-SQL-CVI-Pharmacy_Servers_User_Support_Training'), +('ActiveSystemServer','dbRoleSupUsr','CENTRALINFRA\L-CI-AP-SQL-SUN-Pharmacy_Servers_User_Support_Training'), +('ActiveSystemServer','dbRoleSupUsr','COOP-VITALITY\L-CV-AP-SQL-CVI-Pharmacy_Servers_User_Support_Training'), +('ActiveSystemServer','dbRoleSupUsr','SUNSTORE\L-SU-AP-SQL-SUN-Pharmacy_Servers_User_Support_Training'), +('ActiveSystemServer','dbRoleTPPos','sqlLksrvTPPosusr'), +('Arizona','dbRoleActivePharmacy','sqlAppAPHUsr'), +('Arizona','dbRoleAppMgrUsr','AMAVITA\L-AM-AP-SQL-AMA-Pharmacy_Servers_Application_Manager'), +('Arizona','dbRoleAppMgrUsr','CENTRALINFRA\L-CI-AP-SQL-AMA-Pharmacy_Servers_Application_Manager'), +('Arizona','dbRoleAppMgrUsr','CENTRALINFRA\L-CI-AP-SQL-CVI-Pharmacy_Servers_Application_Manager'), +('Arizona','dbRoleAppMgrUsr','CENTRALINFRA\L-CI-AP-SQL-SUN-Pharmacy_Servers_Application_Manager'), +('Arizona','dbRoleAppMgrUsr','COOP-VITALITY\L-CV-AP-SQL-CVI-Pharmacy_Servers_Application_Manager'), +('Arizona','dbRoleAppMgrUsr','SUNSTORE\L-SU-AP-SQL-SUN-Pharmacy_Servers_Application_Manager'), +('Arizona','dbRoleArizonaCASH','arizonacash'), +('Arizona','dbRoleAtlas','AMAVITA\L-AM-AP-SQL-Atlas-W'), +('Arizona','dbRoleAtlas','AMAVITA\L-AM-AP-SQL-Atlas_Dev-W'), +('Arizona','dbRoleAtlas','CENTRALINFRA\L-CI-AP-SQL-Atlas-W'), +('Arizona','dbRoleAtlas','CENTRALINFRA\L-CI-AP-SQL-Atlas_Dev-W'), +('Arizona','dbRoleAtlas','COOP-VITALITY\L-CV-AP-SQL-Atlas-W'), +('Arizona','dbRoleAtlas','COOP-VITALITY\L-CV-AP-SQL-Atlas_Dev-W'), +('Arizona','dbRoleAtlas','SUNSTORE\L-SU-AP-SQL-Atlas-W'), +('Arizona','dbRoleAtlas','SUNSTORE\L-SU-AP-SQL-Atlas_Dev-W'), +('Arizona','dbRoleCsltUsr','AMAVITA\L-AM-AP-SQL-AMA-Pharmacy_Servers_Applications_Services'), +('Arizona','dbRoleCsltUsr','CENTRALINFRA\L-CI-AP-SQL-AMA-Pharmacy_Servers_Applications_Services'), +('Arizona','dbRoleCsltUsr','CENTRALINFRA\L-CI-AP-SQL-CVI-Pharmacy_Servers_Applications_Services'), +('Arizona','dbRoleCsltUsr','CENTRALINFRA\L-CI-AP-SQL-SUN-Pharmacy_Servers_Applications_Services'), +('Arizona','dbRoleCsltUsr','COOP-VITALITY\L-CV-AP-SQL-CVI-Pharmacy_Servers_Applications_Services'), +('Arizona','dbRoleCsltUsr','SUNSTORE\L-SU-AP-SQL-SUN-Pharmacy_Servers_Applications_Services'), +('Arizona','dbRoleDataMonitoring','datamonitoring'), +('Arizona','dbRoleDevUsr','AMAVITA\L-AM-AP-SQL-AMA-Pharmacy_Servers_Development'), +('Arizona','dbRoleDevUsr','CENTRALINFRA\L-CI-AP-SQL-AMA-Pharmacy_Servers_Development'), +('Arizona','dbRoleDevUsr','CENTRALINFRA\L-CI-AP-SQL-CVI-Pharmacy_Servers_Development'), +('Arizona','dbRoleDevUsr','CENTRALINFRA\L-CI-AP-SQL-SUN-Pharmacy_Servers_Development'), +('Arizona','dbRoleDevUsr','COOP-VITALITY\L-CV-AP-SQL-CVI-Pharmacy_Servers_Development'), +('Arizona','dbRoleDevUsr','SUNSTORE\L-SU-AP-SQL-SUN-Pharmacy_Servers_Development'), +('Arizona','dbRoleGaia','sqlAppGaiaUsr'), +('Arizona','dbRoleGcStock','gcstock'), +('Arizona','dbRoleGroupRepetition','sqlSyncDmUsr'), +('Arizona','dbRoleIttechUsr','AMAVITA\L-AM-AP-SQL-AMA-Pharmacy_Servers_IT_Field'), +('Arizona','dbRoleIttechUsr','CENTRALINFRA\L-CI-AP-SQL-AMA-Pharmacy_Servers_IT_Field'), +('Arizona','dbRoleIttechUsr','CENTRALINFRA\L-CI-AP-SQL-CVI-Pharmacy_Servers_IT_Field'), +('Arizona','dbRoleIttechUsr','CENTRALINFRA\L-CI-AP-SQL-SUN-Pharmacy_Servers_IT_Field'), +('Arizona','dbRoleIttechUsr','COOP-VITALITY\L-CV-AP-SQL-CVI-Pharmacy_Servers_IT_Field'), +('Arizona','dbRoleIttechUsr','SUNSTORE\L-SU-AP-SQL-SUN-Pharmacy_Servers_IT_Field'), +('Arizona','dbRolePOUsr','AMAVITA\L-AM-AP-SQL-AMA_Pharmacy_Servers_Product_Owner'), +('Arizona','dbRolePOUsr','CENTRALINFRA\L-CI-AP-SQL-AMA-Pharmacy_Servers_Product_Owner'), +('Arizona','dbRolePOUsr','CENTRALINFRA\L-CI-AP-SQL-CVI-Pharmacy_Servers_Product_Owner'), +('Arizona','dbRolePOUsr','CENTRALINFRA\L-CI-AP-SQL-SUN-Pharmacy_Servers_Product_Owner'), +('Arizona','dbRolePOUsr','COOP-VITALITY\L-CV-AP-SQL-CVI_Pharmacy_Servers_Product_Owner'), +('Arizona','dbRolePOUsr','SUNSTORE\L-SU-AP-SQL-SUN_Pharmacy_Servers_Product_Owner'), +('Arizona','dbRoleQAtesters','AMAVITA\L-AM-AP-SQL-AMA-Pharmacy_Servers_QA_Testers'), +('Arizona','dbRoleQAtesters','CENTRALINFRA\L-CI-AP-SQL-AMA-Pharmacy_Servers_QA_Testers'), +('Arizona','dbRoleQAtesters','CENTRALINFRA\L-CI-AP-SQL-CVI-Pharmacy_Servers_QA_Testers'), +('Arizona','dbRoleQAtesters','CENTRALINFRA\L-CI-AP-SQL-SUN-Pharmacy_Servers_QA_Testers'), +('Arizona','dbRoleQAtesters','COOP-VITALITY\L-CV-AP-SQL-CVI-Pharmacy_Servers_QA_Testers'), +('Arizona','dbRoleQAtesters','SUNSTORE\L-SU-AP-SQL-SUN-Pharmacy_Servers_QA_Testers'), +('Arizona','dbRoleSupUsr','AMAVITA\L-AM-AP-SQL-AMA-Pharmacy_Servers_User_Support_Training'), +('Arizona','dbRoleSupUsr','CENTRALINFRA\L-CI-AP-SQL-AMA-Pharmacy_Servers_User_Support_Training'), +('Arizona','dbRoleSupUsr','CENTRALINFRA\L-CI-AP-SQL-CVI-Pharmacy_Servers_User_Support_Training'), +('Arizona','dbRoleSupUsr','CENTRALINFRA\L-CI-AP-SQL-SUN-Pharmacy_Servers_User_Support_Training'), +('Arizona','dbRoleSupUsr','COOP-VITALITY\L-CV-AP-SQL-CVI-Pharmacy_Servers_User_Support_Training'), +('Arizona','dbRoleSupUsr','SUNSTORE\L-SU-AP-SQL-SUN-Pharmacy_Servers_User_Support_Training'), +('Arizona','dbRoleSyncAccountingExtraction','sqlSyncAccountingExtractionUsr'), +('Arizona','dbRoleTPPos','sqlLksrvTPPosusr'), +('Arizona','dbRoleTPSSIS','sqlSSISTPUsr'), +('Arizona','dbRoleTriapharmChangeTracking','sqlSyncDmUsr'), +('Arizona','dbRoleTriapharmCounter','apscounter'), +('Arizona','dbRoleTriapharmUser','bmcarizona'), +('ArizonaCASH','dbRoleActivePharmacy','sqlAppAPHUsr'), +('ArizonaCASH','dbRoleArizonaCASH','arizonacash'), +('ArizonaCASH','dbRoleAtlas','AMAVITA\L-AM-AP-SQL-Atlas-W'), +('ArizonaCASH','dbRoleAtlas','AMAVITA\L-AM-AP-SQL-Atlas_Dev-W'), +('ArizonaCASH','dbRoleAtlas','CENTRALINFRA\L-CI-AP-SQL-Atlas-W'), +('ArizonaCASH','dbRoleAtlas','CENTRALINFRA\L-CI-AP-SQL-Atlas_Dev-W'), +('ArizonaCASH','dbRoleAtlas','COOP-VITALITY\L-CV-AP-SQL-Atlas-W'), +('ArizonaCASH','dbRoleAtlas','COOP-VITALITY\L-CV-AP-SQL-Atlas_Dev-W'), +('ArizonaCASH','dbRoleAtlas','SUNSTORE\L-SU-AP-SQL-Atlas-W'), +('ArizonaCASH','dbRoleAtlas','SUNSTORE\L-SU-AP-SQL-Atlas_Dev-W'), +('ArizonaCASH','dbRoleCsltUsr','AMAVITA\L-AM-AP-SQL-AMA-Pharmacy_Servers_Applications_Services'), +('ArizonaCASH','dbRoleCsltUsr','CENTRALINFRA\L-CI-AP-SQL-AMA-Pharmacy_Servers_Applications_Services'), +('ArizonaCASH','dbRoleCsltUsr','CENTRALINFRA\L-CI-AP-SQL-CVI-Pharmacy_Servers_Applications_Services'), +('ArizonaCASH','dbRoleCsltUsr','CENTRALINFRA\L-CI-AP-SQL-SUN-Pharmacy_Servers_Applications_Services'), +('ArizonaCASH','dbRoleCsltUsr','COOP-VITALITY\L-CV-AP-SQL-CVI-Pharmacy_Servers_Applications_Services'), +('ArizonaCASH','dbRoleCsltUsr','SUNSTORE\L-SU-AP-SQL-SUN-Pharmacy_Servers_Applications_Services'), +('ArizonaCASH','dbRoleDevUsr','AMAVITA\L-AM-AP-SQL-AMA-Pharmacy_Servers_Development'), +('ArizonaCASH','dbRoleDevUsr','CENTRALINFRA\L-CI-AP-SQL-AMA-Pharmacy_Servers_Development'), +('ArizonaCASH','dbRoleDevUsr','CENTRALINFRA\L-CI-AP-SQL-CVI-Pharmacy_Servers_Development'), +('ArizonaCASH','dbRoleDevUsr','CENTRALINFRA\L-CI-AP-SQL-SUN-Pharmacy_Servers_Development'), +('ArizonaCASH','dbRoleDevUsr','COOP-VITALITY\L-CV-AP-SQL-CVI-Pharmacy_Servers_Development'), +('ArizonaCASH','dbRoleDevUsr','SUNSTORE\L-SU-AP-SQL-SUN-Pharmacy_Servers_Development'), +('ArizonaCASH','dbRoleIttechUsr','AMAVITA\L-AM-AP-SQL-AMA-Pharmacy_Servers_IT_Field'), +('ArizonaCASH','dbRoleIttechUsr','CENTRALINFRA\L-CI-AP-SQL-AMA-Pharmacy_Servers_IT_Field'), +('ArizonaCASH','dbRoleIttechUsr','CENTRALINFRA\L-CI-AP-SQL-CVI-Pharmacy_Servers_IT_Field'), +('ArizonaCASH','dbRoleIttechUsr','CENTRALINFRA\L-CI-AP-SQL-SUN-Pharmacy_Servers_IT_Field'), +('ArizonaCASH','dbRoleIttechUsr','COOP-VITALITY\L-CV-AP-SQL-CVI-Pharmacy_Servers_IT_Field'), +('ArizonaCASH','dbRoleIttechUsr','SUNSTORE\L-SU-AP-SQL-SUN-Pharmacy_Servers_IT_Field'), +('ArizonaCASH','dbRolePOUsr','AMAVITA\L-AM-AP-SQL-AMA_Pharmacy_Servers_Product_Owner'), +('ArizonaCASH','dbRolePOUsr','CENTRALINFRA\L-CI-AP-SQL-AMA-Pharmacy_Servers_Product_Owner'), +('ArizonaCASH','dbRolePOUsr','CENTRALINFRA\L-CI-AP-SQL-CVI-Pharmacy_Servers_Product_Owner'), +('ArizonaCASH','dbRolePOUsr','CENTRALINFRA\L-CI-AP-SQL-SUN-Pharmacy_Servers_Product_Owner'), +('ArizonaCASH','dbRolePOUsr','COOP-VITALITY\L-CV-AP-SQL-CVI_Pharmacy_Servers_Product_Owner'), +('ArizonaCASH','dbRolePOUsr','SUNSTORE\L-SU-AP-SQL-SUN_Pharmacy_Servers_Product_Owner'), +('ArizonaCASH','dbRoleQAtesters','AMAVITA\L-AM-AP-SQL-AMA-Pharmacy_Servers_QA_Testers'), +('ArizonaCASH','dbRoleQAtesters','CENTRALINFRA\L-CI-AP-SQL-AMA-Pharmacy_Servers_QA_Testers'), +('ArizonaCASH','dbRoleQAtesters','CENTRALINFRA\L-CI-AP-SQL-CVI-Pharmacy_Servers_QA_Testers'), +('ArizonaCASH','dbRoleQAtesters','CENTRALINFRA\L-CI-AP-SQL-SUN-Pharmacy_Servers_QA_Testers'), +('ArizonaCASH','dbRoleQAtesters','COOP-VITALITY\L-CV-AP-SQL-CVI-Pharmacy_Servers_QA_Testers'), +('ArizonaCASH','dbRoleQAtesters','SUNSTORE\L-SU-AP-SQL-SUN-Pharmacy_Servers_QA_Testers'), +('ArizonaCASH','dbRoleSupUsr','AMAVITA\L-AM-AP-SQL-AMA-Pharmacy_Servers_User_Support_Training'), +('ArizonaCASH','dbRoleSupUsr','CENTRALINFRA\L-CI-AP-SQL-AMA-Pharmacy_Servers_User_Support_Training'), +('ArizonaCASH','dbRoleSupUsr','CENTRALINFRA\L-CI-AP-SQL-CVI-Pharmacy_Servers_User_Support_Training'), +('ArizonaCASH','dbRoleSupUsr','CENTRALINFRA\L-CI-AP-SQL-SUN-Pharmacy_Servers_User_Support_Training'), +('ArizonaCASH','dbRoleSupUsr','COOP-VITALITY\L-CV-AP-SQL-CVI-Pharmacy_Servers_User_Support_Training'), +('ArizonaCASH','dbRoleSupUsr','SUNSTORE\L-SU-AP-SQL-SUN-Pharmacy_Servers_User_Support_Training'), +('ArizonaCASH','dbRoleSyncAccountingExtraction','sqlSyncAccountingExtractionUsr'), +('ArizonaCASH','dbRoleTPPos','sqlLksrvTPPosusr'), +('ArizonaCASH','dbRoleTriapharmUser','bmcarizona'), +('ArizonaCUST','dbRoleCsltUsr','AMAVITA\L-AM-AP-SQL-AMA-Pharmacy_Servers_Applications_Services'), +('ArizonaCUST','dbRoleCsltUsr','CENTRALINFRA\L-CI-AP-SQL-AMA-Pharmacy_Servers_Applications_Services'), +('ArizonaCUST','dbRoleCsltUsr','CENTRALINFRA\L-CI-AP-SQL-CVI-Pharmacy_Servers_Applications_Services'), +('ArizonaCUST','dbRoleCsltUsr','CENTRALINFRA\L-CI-AP-SQL-SUN-Pharmacy_Servers_Applications_Services'), +('ArizonaCUST','dbRoleCsltUsr','COOP-VITALITY\L-CV-AP-SQL-CVI-Pharmacy_Servers_Applications_Services'), +('ArizonaCUST','dbRoleCsltUsr','SUNSTORE\L-SU-AP-SQL-SUN-Pharmacy_Servers_Applications_Services'), +('ArizonaCUST','dbRoleDevUsr','AMAVITA\L-AM-AP-SQL-AMA-Pharmacy_Servers_Development'), +('ArizonaCUST','dbRoleDevUsr','CENTRALINFRA\L-CI-AP-SQL-AMA-Pharmacy_Servers_Development'), +('ArizonaCUST','dbRoleDevUsr','CENTRALINFRA\L-CI-AP-SQL-CVI-Pharmacy_Servers_Development'), +('ArizonaCUST','dbRoleDevUsr','CENTRALINFRA\L-CI-AP-SQL-SUN-Pharmacy_Servers_Development'), +('ArizonaCUST','dbRoleDevUsr','COOP-VITALITY\L-CV-AP-SQL-CVI-Pharmacy_Servers_Development'), +('ArizonaCUST','dbRoleDevUsr','SUNSTORE\L-SU-AP-SQL-SUN-Pharmacy_Servers_Development'), +('ArizonaCUST','dbRoleIttechUsr','AMAVITA\L-AM-AP-SQL-AMA-Pharmacy_Servers_IT_Field'), +('ArizonaCUST','dbRoleIttechUsr','CENTRALINFRA\L-CI-AP-SQL-AMA-Pharmacy_Servers_IT_Field'), +('ArizonaCUST','dbRoleIttechUsr','CENTRALINFRA\L-CI-AP-SQL-CVI-Pharmacy_Servers_IT_Field'), +('ArizonaCUST','dbRoleIttechUsr','CENTRALINFRA\L-CI-AP-SQL-SUN-Pharmacy_Servers_IT_Field'), +('ArizonaCUST','dbRoleIttechUsr','COOP-VITALITY\L-CV-AP-SQL-CVI-Pharmacy_Servers_IT_Field'), +('ArizonaCUST','dbRoleIttechUsr','SUNSTORE\L-SU-AP-SQL-SUN-Pharmacy_Servers_IT_Field'), +('ArizonaCUST','dbRolePOUsr','AMAVITA\L-AM-AP-SQL-AMA_Pharmacy_Servers_Product_Owner'), +('ArizonaCUST','dbRolePOUsr','CENTRALINFRA\L-CI-AP-SQL-AMA-Pharmacy_Servers_Product_Owner'), +('ArizonaCUST','dbRolePOUsr','CENTRALINFRA\L-CI-AP-SQL-CVI-Pharmacy_Servers_Product_Owner'), +('ArizonaCUST','dbRolePOUsr','CENTRALINFRA\L-CI-AP-SQL-SUN-Pharmacy_Servers_Product_Owner'), +('ArizonaCUST','dbRolePOUsr','COOP-VITALITY\L-CV-AP-SQL-CVI_Pharmacy_Servers_Product_Owner'), +('ArizonaCUST','dbRolePOUsr','SUNSTORE\L-SU-AP-SQL-SUN_Pharmacy_Servers_Product_Owner'), +('ArizonaCUST','dbRoleQAtesters','AMAVITA\L-AM-AP-SQL-AMA-Pharmacy_Servers_QA_Testers'), +('ArizonaCUST','dbRoleQAtesters','CENTRALINFRA\L-CI-AP-SQL-AMA-Pharmacy_Servers_QA_Testers'), +('ArizonaCUST','dbRoleQAtesters','CENTRALINFRA\L-CI-AP-SQL-CVI-Pharmacy_Servers_QA_Testers'), +('ArizonaCUST','dbRoleQAtesters','CENTRALINFRA\L-CI-AP-SQL-SUN-Pharmacy_Servers_QA_Testers'), +('ArizonaCUST','dbRoleQAtesters','COOP-VITALITY\L-CV-AP-SQL-CVI-Pharmacy_Servers_QA_Testers'), +('ArizonaCUST','dbRoleQAtesters','SUNSTORE\L-SU-AP-SQL-SUN-Pharmacy_Servers_QA_Testers'), +('ArizonaCUST','dbRoleSupUsr','AMAVITA\L-AM-AP-SQL-AMA-Pharmacy_Servers_User_Support_Training'), +('ArizonaCUST','dbRoleSupUsr','CENTRALINFRA\L-CI-AP-SQL-AMA-Pharmacy_Servers_User_Support_Training'), +('ArizonaCUST','dbRoleSupUsr','CENTRALINFRA\L-CI-AP-SQL-CVI-Pharmacy_Servers_User_Support_Training'), +('ArizonaCUST','dbRoleSupUsr','CENTRALINFRA\L-CI-AP-SQL-SUN-Pharmacy_Servers_User_Support_Training'), +('ArizonaCUST','dbRoleSupUsr','COOP-VITALITY\L-CV-AP-SQL-CVI-Pharmacy_Servers_User_Support_Training'), +('ArizonaCUST','dbRoleSupUsr','SUNSTORE\L-SU-AP-SQL-SUN-Pharmacy_Servers_User_Support_Training'), +('ArizonaCUST','dbRoleSyncAccountingExtraction','sqlSyncAccountingExtractionUsr'), +('ArizonaLD','dbRoleCsltUsr','AMAVITA\L-AM-AP-SQL-AMA-Pharmacy_Servers_Applications_Services'), +('ArizonaLD','dbRoleCsltUsr','CENTRALINFRA\L-CI-AP-SQL-AMA-Pharmacy_Servers_Applications_Services'), +('ArizonaLD','dbRoleCsltUsr','CENTRALINFRA\L-CI-AP-SQL-CVI-Pharmacy_Servers_Applications_Services'), +('ArizonaLD','dbRoleCsltUsr','CENTRALINFRA\L-CI-AP-SQL-SUN-Pharmacy_Servers_Applications_Services'), +('ArizonaLD','dbRoleCsltUsr','COOP-VITALITY\L-CV-AP-SQL-CVI-Pharmacy_Servers_Applications_Services'), +('ArizonaLD','dbRoleCsltUsr','SUNSTORE\L-SU-AP-SQL-SUN-Pharmacy_Servers_Applications_Services'), +('ArizonaLD','dbRoleDevUsr','AMAVITA\L-AM-AP-SQL-AMA-Pharmacy_Servers_Development'), +('ArizonaLD','dbRoleDevUsr','CENTRALINFRA\L-CI-AP-SQL-AMA-Pharmacy_Servers_Development'), +('ArizonaLD','dbRoleDevUsr','CENTRALINFRA\L-CI-AP-SQL-CVI-Pharmacy_Servers_Development'), +('ArizonaLD','dbRoleDevUsr','CENTRALINFRA\L-CI-AP-SQL-SUN-Pharmacy_Servers_Development'), +('ArizonaLD','dbRoleDevUsr','COOP-VITALITY\L-CV-AP-SQL-CVI-Pharmacy_Servers_Development'), +('ArizonaLD','dbRoleDevUsr','SUNSTORE\L-SU-AP-SQL-SUN-Pharmacy_Servers_Development'), +('ArizonaLD','dbRoleIttechUsr','AMAVITA\L-AM-AP-SQL-AMA-Pharmacy_Servers_IT_Field'), +('ArizonaLD','dbRoleIttechUsr','CENTRALINFRA\L-CI-AP-SQL-AMA-Pharmacy_Servers_IT_Field'), +('ArizonaLD','dbRoleIttechUsr','CENTRALINFRA\L-CI-AP-SQL-CVI-Pharmacy_Servers_IT_Field'), +('ArizonaLD','dbRoleIttechUsr','CENTRALINFRA\L-CI-AP-SQL-SUN-Pharmacy_Servers_IT_Field'), +('ArizonaLD','dbRoleIttechUsr','COOP-VITALITY\L-CV-AP-SQL-CVI-Pharmacy_Servers_IT_Field'), +('ArizonaLD','dbRoleIttechUsr','SUNSTORE\L-SU-AP-SQL-SUN-Pharmacy_Servers_IT_Field'), +('ArizonaLD','dbRolePOUsr','AMAVITA\L-AM-AP-SQL-AMA_Pharmacy_Servers_Product_Owner'), +('ArizonaLD','dbRolePOUsr','CENTRALINFRA\L-CI-AP-SQL-AMA-Pharmacy_Servers_Product_Owner'), +('ArizonaLD','dbRolePOUsr','CENTRALINFRA\L-CI-AP-SQL-CVI-Pharmacy_Servers_Product_Owner'), +('ArizonaLD','dbRolePOUsr','CENTRALINFRA\L-CI-AP-SQL-SUN-Pharmacy_Servers_Product_Owner'), +('ArizonaLD','dbRolePOUsr','COOP-VITALITY\L-CV-AP-SQL-CVI_Pharmacy_Servers_Product_Owner'), +('ArizonaLD','dbRolePOUsr','SUNSTORE\L-SU-AP-SQL-SUN_Pharmacy_Servers_Product_Owner'), +('ArizonaLD','dbRoleQAtesters','AMAVITA\L-AM-AP-SQL-AMA-Pharmacy_Servers_QA_Testers'), +('ArizonaLD','dbRoleQAtesters','CENTRALINFRA\L-CI-AP-SQL-AMA-Pharmacy_Servers_QA_Testers'), +('ArizonaLD','dbRoleQAtesters','CENTRALINFRA\L-CI-AP-SQL-CVI-Pharmacy_Servers_QA_Testers'), +('ArizonaLD','dbRoleQAtesters','CENTRALINFRA\L-CI-AP-SQL-SUN-Pharmacy_Servers_QA_Testers'), +('ArizonaLD','dbRoleQAtesters','COOP-VITALITY\L-CV-AP-SQL-CVI-Pharmacy_Servers_QA_Testers'), +('ArizonaLD','dbRoleQAtesters','SUNSTORE\L-SU-AP-SQL-SUN-Pharmacy_Servers_QA_Testers'), +('ArizonaLD','dbRoleSupUsr','AMAVITA\L-AM-AP-SQL-AMA-Pharmacy_Servers_User_Support_Training'), +('ArizonaLD','dbRoleSupUsr','CENTRALINFRA\L-CI-AP-SQL-AMA-Pharmacy_Servers_User_Support_Training'), +('ArizonaLD','dbRoleSupUsr','CENTRALINFRA\L-CI-AP-SQL-CVI-Pharmacy_Servers_User_Support_Training'), +('ArizonaLD','dbRoleSupUsr','CENTRALINFRA\L-CI-AP-SQL-SUN-Pharmacy_Servers_User_Support_Training'), +('ArizonaLD','dbRoleSupUsr','COOP-VITALITY\L-CV-AP-SQL-CVI-Pharmacy_Servers_User_Support_Training'), +('ArizonaLD','dbRoleSupUsr','SUNSTORE\L-SU-AP-SQL-SUN-Pharmacy_Servers_User_Support_Training'), +('ArizonaTest','dbRoleCsltUsr','AMAVITA\L-AM-AP-SQL-AMA-Pharmacy_Servers_Applications_Services'), +('ArizonaTest','dbRoleCsltUsr','CENTRALINFRA\L-CI-AP-SQL-AMA-Pharmacy_Servers_Applications_Services'), +('ArizonaTest','dbRoleCsltUsr','CENTRALINFRA\L-CI-AP-SQL-CVI-Pharmacy_Servers_Applications_Services'), +('ArizonaTest','dbRoleCsltUsr','CENTRALINFRA\L-CI-AP-SQL-SUN-Pharmacy_Servers_Applications_Services'), +('ArizonaTest','dbRoleCsltUsr','COOP-VITALITY\L-CV-AP-SQL-CVI-Pharmacy_Servers_Applications_Services'), +('ArizonaTest','dbRoleCsltUsr','SUNSTORE\L-SU-AP-SQL-SUN-Pharmacy_Servers_Applications_Services'), +('ArizonaTest','dbRoleDevUsr','AMAVITA\L-AM-AP-SQL-AMA-Pharmacy_Servers_Development'), +('ArizonaTest','dbRoleDevUsr','CENTRALINFRA\L-CI-AP-SQL-AMA-Pharmacy_Servers_Development'), +('ArizonaTest','dbRoleDevUsr','CENTRALINFRA\L-CI-AP-SQL-CVI-Pharmacy_Servers_Development'), +('ArizonaTest','dbRoleDevUsr','CENTRALINFRA\L-CI-AP-SQL-SUN-Pharmacy_Servers_Development'), +('ArizonaTest','dbRoleDevUsr','COOP-VITALITY\L-CV-AP-SQL-CVI-Pharmacy_Servers_Development'), +('ArizonaTest','dbRoleDevUsr','SUNSTORE\L-SU-AP-SQL-SUN-Pharmacy_Servers_Development'), +('ArizonaTest','dbRoleIttechUsr','AMAVITA\L-AM-AP-SQL-AMA-Pharmacy_Servers_IT_Field'), +('ArizonaTest','dbRoleIttechUsr','CENTRALINFRA\L-CI-AP-SQL-AMA-Pharmacy_Servers_IT_Field'), +('ArizonaTest','dbRoleIttechUsr','CENTRALINFRA\L-CI-AP-SQL-CVI-Pharmacy_Servers_IT_Field'), +('ArizonaTest','dbRoleIttechUsr','CENTRALINFRA\L-CI-AP-SQL-SUN-Pharmacy_Servers_IT_Field'), +('ArizonaTest','dbRoleIttechUsr','COOP-VITALITY\L-CV-AP-SQL-CVI-Pharmacy_Servers_IT_Field'), +('ArizonaTest','dbRoleIttechUsr','SUNSTORE\L-SU-AP-SQL-SUN-Pharmacy_Servers_IT_Field'), +('ArizonaTest','dbRoleSupUsr','AMAVITA\L-AM-AP-SQL-AMA-Pharmacy_Servers_User_Support_Training'), +('ArizonaTest','dbRoleSupUsr','CENTRALINFRA\L-CI-AP-SQL-AMA-Pharmacy_Servers_User_Support_Training'), +('ArizonaTest','dbRoleSupUsr','CENTRALINFRA\L-CI-AP-SQL-CVI-Pharmacy_Servers_User_Support_Training'), +('ArizonaTest','dbRoleSupUsr','CENTRALINFRA\L-CI-AP-SQL-SUN-Pharmacy_Servers_User_Support_Training'), +('ArizonaTest','dbRoleSupUsr','COOP-VITALITY\L-CV-AP-SQL-CVI-Pharmacy_Servers_User_Support_Training'), +('ArizonaTest','dbRoleSupUsr','SUNSTORE\L-SU-AP-SQL-SUN-Pharmacy_Servers_User_Support_Training'), +('distribution','dbRoleCsltUsr','AMAVITA\L-AM-AP-SQL-AMA-Pharmacy_Servers_Applications_Services'), +('distribution','dbRoleCsltUsr','CENTRALINFRA\L-CI-AP-SQL-AMA-Pharmacy_Servers_Applications_Services'), +('distribution','dbRoleCsltUsr','CENTRALINFRA\L-CI-AP-SQL-CVI-Pharmacy_Servers_Applications_Services'), +('distribution','dbRoleCsltUsr','CENTRALINFRA\L-CI-AP-SQL-GCA-PharmINDEX_Applications_Services'), +('distribution','dbRoleCsltUsr','CENTRALINFRA\L-CI-AP-SQL-GCA-TriaFACT_Applications_Services'), +('distribution','dbRoleCsltUsr','CENTRALINFRA\L-CI-AP-SQL-SUN-Pharmacy_Servers_Applications_Services'), +('distribution','dbRoleCsltUsr','COOP-VITALITY\L-CV-AP-SQL-CVI-Pharmacy_Servers_Applications_Services'), +('distribution','dbRoleCsltUsr','SUNSTORE\L-SU-AP-SQL-SUN-Pharmacy_Servers_Applications_Services'), +('distribution','dbRoleDevUsr','AMAVITA\L-AM-AP-SQL-AMA-Pharmacy_Servers_Development'), +('distribution','dbRoleDevUsr','CENTRALINFRA\L-CI-AP-SQL-AMA-Pharmacy_Servers_Development'), +('distribution','dbRoleDevUsr','CENTRALINFRA\L-CI-AP-SQL-CVI-Pharmacy_Servers_Development'), +('distribution','dbRoleDevUsr','CENTRALINFRA\L-CI-AP-SQL-GCA-PharmINDEX_Development'), +('distribution','dbRoleDevUsr','CENTRALINFRA\L-CI-AP-SQL-GCA-TriaFACT_Development'), +('distribution','dbRoleDevUsr','CENTRALINFRA\L-CI-AP-SQL-SUN-Pharmacy_Servers_Development'), +('distribution','dbRoleDevUsr','COOP-VITALITY\L-CV-AP-SQL-CVI-Pharmacy_Servers_Development'), +('distribution','dbRoleDevUsr','SUNSTORE\L-SU-AP-SQL-SUN-Pharmacy_Servers_Development'), +('distribution','dbRoleIttechUsr','AMAVITA\L-AM-AP-SQL-AMA-Pharmacy_Servers_IT_Field'), +('distribution','dbRoleIttechUsr','CENTRALINFRA\L-CI-AP-SQL-AMA-Pharmacy_Servers_IT_Field'), +('distribution','dbRoleIttechUsr','CENTRALINFRA\L-CI-AP-SQL-CVI-Pharmacy_Servers_IT_Field'), +('distribution','dbRoleIttechUsr','CENTRALINFRA\L-CI-AP-SQL-SUN-Pharmacy_Servers_IT_Field'), +('distribution','dbRoleIttechUsr','COOP-VITALITY\L-CV-AP-SQL-CVI-Pharmacy_Servers_IT_Field'), +('distribution','dbRoleIttechUsr','SUNSTORE\L-SU-AP-SQL-SUN-Pharmacy_Servers_IT_Field'), +('distribution','dbRoleSupUsr','AMAVITA\L-AM-AP-SQL-AMA-Pharmacy_Servers_User_Support_Training'), +('distribution','dbRoleSupUsr','CENTRALINFRA\L-CI-AP-SQL-AMA-Pharmacy_Servers_User_Support_Training'), +('distribution','dbRoleSupUsr','CENTRALINFRA\L-CI-AP-SQL-CVI-Pharmacy_Servers_User_Support_Training'), +('distribution','dbRoleSupUsr','CENTRALINFRA\L-CI-AP-SQL-SUN-Pharmacy_Servers_User_Support_Training'), +('distribution','dbRoleSupUsr','COOP-VITALITY\L-CV-AP-SQL-CVI-Pharmacy_Servers_User_Support_Training'), +('distribution','dbRoleSupUsr','SUNSTORE\L-SU-AP-SQL-SUN-Pharmacy_Servers_User_Support_Training'), +('distribution','dbRoleTPPos','sqlLksrvTPPosusr'), +('Golabo','dbRoleDevUsr','AMAVITA\L-AM-AP-SQL-AMA-Pharmacy_Servers_Development'), +('Golabo','dbRoleDevUsr','CENTRALINFRA\L-CI-AP-SQL-AMA-Pharmacy_Servers_Development'), +('Golabo','dbRoleDevUsr','CENTRALINFRA\L-CI-AP-SQL-CVI-Pharmacy_Servers_Development'), +('Golabo','dbRoleDevUsr','CENTRALINFRA\L-CI-AP-SQL-SUN-Pharmacy_Servers_Development'), +('Golabo','dbRoleDevUsr','COOP-VITALITY\L-CV-AP-SQL-CVI-Pharmacy_Servers_Development'), +('Golabo','dbRoleDevUsr','SUNSTORE\L-SU-AP-SQL-SUN-Pharmacy_Servers_Development'), +('HCITools','dbRoleCsltUsr','AAI\L-AA-AP-SQL-AAI-Datamart_Applications_Services'), +('HCITools','dbRoleCsltUsr','AMAVITA\L-AM-AP-SQL-AMA-Address_Repository_Applications_Services'), +('HCITools','dbRoleCsltUsr','AMAVITA\L-AM-AP-SQL-AMA-Pharmacy_Servers_Applications_Services'), +('HCITools','dbRoleCsltUsr','CENTRALINFRA\L-CI-AP-SQL-AMA-Pharmacy_Servers_Applications_Services'), +('HCITools','dbRoleCsltUsr','CENTRALINFRA\L-CI-AP-SQL-CVI-Pharmacy_Servers_Applications_Services'), +('HCITools','dbRoleCsltUsr','CENTRALINFRA\L-CI-AP-SQL-GCA-Atlas_Applications_Services'), +('HCITools','dbRoleCsltUsr','CENTRALINFRA\L-CI-AP-SQL-GCA-Datamart_Applications_Services'), +('HCITools','dbRoleCsltUsr','CENTRALINFRA\L-CI-AP-SQL-GCA-Gaia_Applications_Services'), +('HCITools','dbRoleCsltUsr','CENTRALINFRA\L-CI-AP-SQL-GCA-PharmINDEX_Applications_Services'), +('HCITools','dbRoleCsltUsr','CENTRALINFRA\L-CI-AP-SQL-GCA-Pricing_Applications_Services'), +('HCITools','dbRoleCsltUsr','CENTRALINFRA\L-CI-AP-SQL-GCA-TriaFACT_Applications_Services'), +('HCITools','dbRoleCsltUsr','CENTRALINFRA\L-CI-AP-SQL-GCA-triaSCAN_Applications_Services'), +('HCITools','dbRoleCsltUsr','CENTRALINFRA\L-CI-AP-SQL-GCM-J2I_Database_Administrator'), +('HCITools','dbRoleCsltUsr','CENTRALINFRA\L-CI-AP-SQL-SUN-Pharmacy_Servers_Applications_Services'), +('HCITools','dbRoleCsltUsr','COOP-VITALITY\L-CV-AP-SQL-CVI-Address_Repository_Applications_Services'), +('HCITools','dbRoleCsltUsr','COOP-VITALITY\L-CV-AP-SQL-CVI-Pharmacy_Servers_Applications_Services'), +('HCITools','dbRoleCsltUsr','SUNSTORE\L-SU-AP-SQL-SUN-Address_Repository_Applications_Services'), +('HCITools','dbRoleCsltUsr','SUNSTORE\L-SU-AP-SQL-SUN-Pharmacy_Servers_Applications_Services'), +('HCITools','dbRoleDataMonitoring','datamonitoring'), +('HCITools','dbRoleDevUsr','AAI\L-AA-AP-SQL-AAI-Datamart_Development'), +('HCITools','dbRoleDevUsr','AMAVITA\L-AM-AP-SQL-AMA-Address_Repository_Development'), +('HCITools','dbRoleDevUsr','AMAVITA\L-AM-AP-SQL-AMA-Pharmacy_Servers_Development'), +('HCITools','dbRoleDevUsr','CENTRALINFRA\L-CI-AP-SQL-AMA-Pharmacy_Servers_Development'), +('HCITools','dbRoleDevUsr','CENTRALINFRA\L-CI-AP-SQL-CVI-Pharmacy_Servers_Development'), +('HCITools','dbRoleDevUsr','CENTRALINFRA\L-CI-AP-SQL-GCA-Atlas_Development'), +('HCITools','dbRoleDevUsr','CENTRALINFRA\L-CI-AP-SQL-GCA-Datamart_Development'), +('HCITools','dbRoleDevUsr','CENTRALINFRA\L-CI-AP-SQL-GCA-Gaia_Development'), +('HCITools','dbRoleDevUsr','CENTRALINFRA\L-CI-AP-SQL-GCA-Monitoring_Development'), +('HCITools','dbRoleDevUsr','CENTRALINFRA\L-CI-AP-SQL-GCA-PharmINDEX_Development'), +('HCITools','dbRoleDevUsr','CENTRALINFRA\L-CI-AP-SQL-GCA-Pricing_Development'), +('HCITools','dbRoleDevUsr','CENTRALINFRA\L-CI-AP-SQL-GCA-TriaFACT_Development'), +('HCITools','dbRoleDevUsr','CENTRALINFRA\L-CI-AP-SQL-GCA-triaSCAN_Development'), +('HCITools','dbRoleDevUsr','CENTRALINFRA\L-CI-AP-SQL-GCM-J2I_Development'), +('HCITools','dbRoleDevUsr','CENTRALINFRA\L-CI-AP-SQL-SUN-Pharmacy_Servers_Development'), +('HCITools','dbRoleDevUsr','COOP-VITALITY\L-CV-AP-SQL-CVI-Address_Repository_Development'), +('HCITools','dbRoleDevUsr','COOP-VITALITY\L-CV-AP-SQL-CVI-Pharmacy_Servers_Development'), +('HCITools','dbRoleDevUsr','SUNSTORE\L-SU-AP-SQL-SUN-Address_Repository_Development'), +('HCITools','dbRoleDevUsr','SUNSTORE\L-SU-AP-SQL-SUN-Pharmacy_Servers_Development'), +('HCITools','dbRoleIttechUsr','AMAVITA\L-AM-AP-SQL-AMA-Pharmacy_Servers_IT_Field'), +('HCITools','dbRoleIttechUsr','CENTRALINFRA\L-CI-AP-SQL-AMA-Pharmacy_Servers_IT_Field'), +('HCITools','dbRoleIttechUsr','CENTRALINFRA\L-CI-AP-SQL-CVI-Pharmacy_Servers_IT_Field'), +('HCITools','dbRoleIttechUsr','CENTRALINFRA\L-CI-AP-SQL-SUN-Pharmacy_Servers_IT_Field'), +('HCITools','dbRoleIttechUsr','COOP-VITALITY\L-CV-AP-SQL-CVI-Pharmacy_Servers_IT_Field'), +('HCITools','dbRoleIttechUsr','SUNSTORE\L-SU-AP-SQL-SUN-Pharmacy_Servers_IT_Field'), +('HCITools','dbRoleNagiosMonitoring','sqlMonNagiosUsr'), +('HCITools','dbRoleSSRSMonitoring','sqlMonSSRSUsr'), +('HCITools','dbRoleSupUsr','AMAVITA\L-AM-AP-SQL-AMA-Pharmacy_Servers_User_Support_Training'), +('HCITools','dbRoleSupUsr','CENTRALINFRA\L-CI-AP-SQL-AMA-Pharmacy_Servers_User_Support_Training'), +('HCITools','dbRoleSupUsr','CENTRALINFRA\L-CI-AP-SQL-CVI-Pharmacy_Servers_User_Support_Training'), +('HCITools','dbRoleSupUsr','CENTRALINFRA\L-CI-AP-SQL-SUN-Pharmacy_Servers_User_Support_Training'), +('HCITools','dbRoleSupUsr','COOP-VITALITY\L-CV-AP-SQL-CVI-Pharmacy_Servers_User_Support_Training'), +('HCITools','dbRoleSupUsr','SUNSTORE\L-SU-AP-SQL-SUN-Pharmacy_Servers_User_Support_Training'), +('master','dbRoleAtlas','AMAVITA\L-AM-AP-SQL-Atlas-W'), +('master','dbRoleAtlas','AMAVITA\L-AM-AP-SQL-Atlas_Dev-W'), +('master','dbRoleAtlas','CENTRALINFRA\L-CI-AP-SQL-Atlas-W'), +('master','dbRoleAtlas','CENTRALINFRA\L-CI-AP-SQL-Atlas_Dev-W'), +('master','dbRoleAtlas','COOP-VITALITY\L-CV-AP-SQL-Atlas-W'), +('master','dbRoleAtlas','COOP-VITALITY\L-CV-AP-SQL-Atlas_Dev-W'), +('master','dbRoleAtlas','SUNSTORE\L-SU-AP-SQL-Atlas-W'), +('master','dbRoleAtlas','SUNSTORE\L-SU-AP-SQL-Atlas_Dev-W'), +('master','dbRoleSyncAccountingExtraction','sqlSyncAccountingExtractionUsr'), +('master','dbRoleTPPos','sqlLksrvTPPosusr'), +('msdb','dbRoleCsltUsr','AAI\L-AA-AP-SQL-AAI-Datamart_Applications_Services'), +('msdb','dbRoleCsltUsr','AMAVITA\L-AM-AP-SQL-AMA-Address_Repository_Applications_Services'), +('msdb','dbRoleCsltUsr','AMAVITA\L-AM-AP-SQL-AMA-Pharmacy_Servers_Applications_Services'), +('msdb','dbRoleCsltUsr','CENTRALINFRA\L-CI-AP-SQL-AMA-Pharmacy_Servers_Applications_Services'), +('msdb','dbRoleCsltUsr','CENTRALINFRA\L-CI-AP-SQL-CVI-Pharmacy_Servers_Applications_Services'), +('msdb','dbRoleCsltUsr','CENTRALINFRA\L-CI-AP-SQL-GCA-Atlas_Applications_Services'), +('msdb','dbRoleCsltUsr','CENTRALINFRA\L-CI-AP-SQL-GCA-Datamart_Applications_Services'), +('msdb','dbRoleCsltUsr','CENTRALINFRA\L-CI-AP-SQL-GCA-Gaia_Applications_Services'), +('msdb','dbRoleCsltUsr','CENTRALINFRA\L-CI-AP-SQL-GCA-PharmINDEX_Applications_Services'), +('msdb','dbRoleCsltUsr','CENTRALINFRA\L-CI-AP-SQL-GCA-Pricing_Applications_Services'), +('msdb','dbRoleCsltUsr','CENTRALINFRA\L-CI-AP-SQL-GCA-TriaFACT_Applications_Services'), +('msdb','dbRoleCsltUsr','CENTRALINFRA\L-CI-AP-SQL-GCA-triaSCAN_Applications_Services'), +('msdb','dbRoleCsltUsr','CENTRALINFRA\L-CI-AP-SQL-GCM-J2I_Applications_Services'), +('msdb','dbRoleCsltUsr','CENTRALINFRA\L-CI-AP-SQL-SUN-Pharmacy_Servers_Applications_Services'), +('msdb','dbRoleCsltUsr','COOP-VITALITY\L-CV-AP-SQL-CVI-Address_Repository_Applications_Services'), +('msdb','dbRoleCsltUsr','COOP-VITALITY\L-CV-AP-SQL-CVI-Pharmacy_Servers_Applications_Services'), +('msdb','dbRoleCsltUsr','SUNSTORE\L-SU-AP-SQL-SUN-Address_Repository_Applications_Services'), +('msdb','dbRoleCsltUsr','SUNSTORE\L-SU-AP-SQL-SUN-Pharmacy_Servers_Applications_Services'), +('msdb','dbRoleDataMonitoring','datamonitoring'), +('msdb','dbRoleDevUsr','AAI\L-AA-AP-SQL-AAI-Datamart_Development'), +('msdb','dbRoleDevUsr','AMAVITA\L-AM-AP-SQL-AMA-Address_Repository_Development'), +('msdb','dbRoleDevUsr','AMAVITA\L-AM-AP-SQL-AMA-Pharmacy_Servers_Development'), +('msdb','dbRoleDevUsr','CENTRALINFRA\L-CI-AP-SQL-AMA-Pharmacy_Servers_Development'), +('msdb','dbRoleDevUsr','CENTRALINFRA\L-CI-AP-SQL-CVI-Pharmacy_Servers_Development'), +('msdb','dbRoleDevUsr','CENTRALINFRA\L-CI-AP-SQL-GCA-Atlas_Development'), +('msdb','dbRoleDevUsr','CENTRALINFRA\L-CI-AP-SQL-GCA-Datamart_Development'), +('msdb','dbRoleDevUsr','CENTRALINFRA\L-CI-AP-SQL-GCA-Monitoring_Development'), +('msdb','dbRoleDevUsr','CENTRALINFRA\L-CI-AP-SQL-GCA-PharmINDEX_Development'), +('msdb','dbRoleDevUsr','CENTRALINFRA\L-CI-AP-SQL-GCA-Pricing_Development'), +('msdb','dbRoleDevUsr','CENTRALINFRA\L-CI-AP-SQL-GCA-TriaFACT_Development'), +('msdb','dbRoleDevUsr','CENTRALINFRA\L-CI-AP-SQL-GCA-triaSCAN_Development'), +('msdb','dbRoleDevUsr','CENTRALINFRA\L-CI-AP-SQL-GCM-J2I_Development'), +('msdb','dbRoleDevUsr','CENTRALINFRA\L-CI-AP-SQL-SUN-Pharmacy_Servers_Development'), +('msdb','dbRoleDevUsr','COOP-VITALITY\L-CV-AP-SQL-CVI-Address_Repository_Development'), +('msdb','dbRoleDevUsr','COOP-VITALITY\L-CV-AP-SQL-CVI-Pharmacy_Servers_Development'), +('msdb','dbRoleDevUsr','SUNSTORE\L-SU-AP-SQL-SUN-Address_Repository_Development'), +('msdb','dbRoleDevUsr','SUNSTORE\L-SU-AP-SQL-SUN-Pharmacy_Servers_Development'), +('msdb','dbRoleIttechUsr','AMAVITA\L-AM-AP-SQL-AMA-Pharmacy_Servers_IT_Field'), +('msdb','dbRoleIttechUsr','CENTRALINFRA\L-CI-AP-SQL-AMA-Pharmacy_Servers_IT_Field'), +('msdb','dbRoleIttechUsr','CENTRALINFRA\L-CI-AP-SQL-CVI-Pharmacy_Servers_IT_Field'), +('msdb','dbRoleIttechUsr','CENTRALINFRA\L-CI-AP-SQL-SUN-Pharmacy_Servers_IT_Field'), +('msdb','dbRoleIttechUsr','COOP-VITALITY\L-CV-AP-SQL-CVI-Pharmacy_Servers_IT_Field'), +('msdb','dbRoleIttechUsr','SUNSTORE\L-SU-AP-SQL-SUN-Pharmacy_Servers_IT_Field'), +('msdb','dbRoleSupUsr','AMAVITA\L-AM-AP-SQL-AMA-Pharmacy_Servers_User_Support_Training'), +('msdb','dbRoleSupUsr','CENTRALINFRA\L-CI-AP-SQL-AMA-Pharmacy_Servers_User_Support_Training'), +('msdb','dbRoleSupUsr','CENTRALINFRA\L-CI-AP-SQL-CVI-Pharmacy_Servers_User_Support_Training'), +('msdb','dbRoleSupUsr','CENTRALINFRA\L-CI-AP-SQL-SUN-Pharmacy_Servers_User_Support_Training'), +('msdb','dbRoleSupUsr','COOP-VITALITY\L-CV-AP-SQL-CVI-Pharmacy_Servers_User_Support_Training'), +('msdb','dbRoleSupUsr','SUNSTORE\L-SU-AP-SQL-SUN-Pharmacy_Servers_User_Support_Training'), +('msdb','dbRoleTPPos','sqlLksrvTPPosusr'), +('Symbiose','dbRoleCsltUsr','AMAVITA\L-AM-AP-SQL-AMA-Pharmacy_Servers_Applications_Services'), +('Symbiose','dbRoleCsltUsr','CENTRALINFRA\L-CI-AP-SQL-AMA-Pharmacy_Servers_Applications_Services'), +('Symbiose','dbRoleCsltUsr','CENTRALINFRA\L-CI-AP-SQL-CVI-Pharmacy_Servers_Applications_Services'), +('Symbiose','dbRoleCsltUsr','CENTRALINFRA\L-CI-AP-SQL-SUN-Pharmacy_Servers_Applications_Services'), +('Symbiose','dbRoleCsltUsr','COOP-VITALITY\L-CV-AP-SQL-CVI-Pharmacy_Servers_Applications_Services'), +('Symbiose','dbRoleCsltUsr','SUNSTORE\L-SU-AP-SQL-SUN-Pharmacy_Servers_Applications_Services'), +('Symbiose','dbRoleDevUsr','AMAVITA\L-AM-AP-SQL-AMA-Pharmacy_Servers_Development'), +('Symbiose','dbRoleDevUsr','CENTRALINFRA\L-CI-AP-SQL-AMA-Pharmacy_Servers_Development'), +('Symbiose','dbRoleDevUsr','CENTRALINFRA\L-CI-AP-SQL-CVI-Pharmacy_Servers_Development'), +('Symbiose','dbRoleDevUsr','CENTRALINFRA\L-CI-AP-SQL-SUN-Pharmacy_Servers_Development'), +('Symbiose','dbRoleDevUsr','COOP-VITALITY\L-CV-AP-SQL-CVI-Pharmacy_Servers_Development'), +('Symbiose','dbRoleDevUsr','SUNSTORE\L-SU-AP-SQL-SUN-Pharmacy_Servers_Development'), +('Symbiose','dbRoleIttechUsr','AMAVITA\L-AM-AP-SQL-AMA-Pharmacy_Servers_IT_Field'), +('Symbiose','dbRoleIttechUsr','CENTRALINFRA\L-CI-AP-SQL-AMA-Pharmacy_Servers_IT_Field'), +('Symbiose','dbRoleIttechUsr','CENTRALINFRA\L-CI-AP-SQL-CVI-Pharmacy_Servers_IT_Field'), +('Symbiose','dbRoleIttechUsr','CENTRALINFRA\L-CI-AP-SQL-SUN-Pharmacy_Servers_IT_Field'), +('Symbiose','dbRoleIttechUsr','COOP-VITALITY\L-CV-AP-SQL-CVI-Pharmacy_Servers_IT_Field'), +('Symbiose','dbRoleIttechUsr','SUNSTORE\L-SU-AP-SQL-SUN-Pharmacy_Servers_IT_Field'), +('Symbiose','dbRoleSupUsr','AMAVITA\L-AM-AP-SQL-AMA-Pharmacy_Servers_User_Support_Training'), +('Symbiose','dbRoleSupUsr','CENTRALINFRA\L-CI-AP-SQL-AMA-Pharmacy_Servers_User_Support_Training'), +('Symbiose','dbRoleSupUsr','CENTRALINFRA\L-CI-AP-SQL-CVI-Pharmacy_Servers_User_Support_Training'), +('Symbiose','dbRoleSupUsr','CENTRALINFRA\L-CI-AP-SQL-SUN-Pharmacy_Servers_User_Support_Training'), +('Symbiose','dbRoleSupUsr','COOP-VITALITY\L-CV-AP-SQL-CVI-Pharmacy_Servers_User_Support_Training'), +('Symbiose','dbRoleSupUsr','SUNSTORE\L-SU-AP-SQL-SUN-Pharmacy_Servers_User_Support_Training') + +DECLARE AllDb CURSOR FOR SELECT DISTINCT STR_Database FROM #AllRoles STR JOIN master.sys.databases D ON D.name = STR.STR_Database +OPEN AllDb + +FETCH NEXT FROM AllDb INTO @Database +WHILE @@FETCH_STATUS = 0 +BEGIN + + SELECT @Command = 'USE ' + @Database + ' + +DECLARE @Roles nvarchar(max) + + DECLARE AllRoles CURSOR FOR SELECT STR_Definition FROM #AllRoles WHERE STR_Database = ''' + @Database + ''' + OPEN AllRoles + + FETCH NEXT FROM AllRoles INTO @Roles + WHILE @@FETCH_STATUS = 0 + BEGIN + EXEC sp_executesql @Roles + FETCH NEXT FROM AllRoles INTO @Roles + END + +CLOSE AllRoles +DEALLOCATE AllRoles +' + +EXEC sp_executesql @Command + +FETCH NEXT FROM AllDb INTO @Database +END + +CLOSE AllDb +DEALLOCATE AllDb + +DECLARE MapUsersAndRolesCurs CURSOR FOR +SELECT databasename, rolename, username FROM #AllUsersAndRoles AUAR JOIN master.sys.databases D ON D.name = AUAR.databasename + +OPEN MapUsersAndRolesCurs +FETCH NEXT FROM MapUsersAndRolesCurs INTO @Database, @rolename, @username +WHILE @@FETCH_STATUS = 0 +BEGIN + + SET @Command = 'USE ' + @Database + ' +IF EXISTS (SELECT 1 FROM master.dbo.syslogins WHERE name = ''' + @username + ''') +BEGIN + IF EXISTS (SELECT 1 FROM sys.database_principals WHERE name = N''' + @rolename + ''' AND [type] = ''R'') + BEGIN + IF EXISTS (SELECT 1 FROM sys.database_principals WHERE name = N''' + @username + ''') + BEGIN + ALTER USER [' + @username + '] WITH LOGIN = [' + @username + '] + EXEC sp_addrolemember N''' + @rolename + ''', N''' + @username + ''' + END + ELSE + BEGIN + CREATE USER [' + @username + '] FOR LOGIN [' + @username + '] WITH DEFAULT_SCHEMA=[dbo] + EXEC sp_addrolemember N''' + @rolename + ''', N''' + @username + ''' + END + END +END +' + +EXEC sp_executesql @Command + +FETCH NEXT FROM MapUsersAndRolesCurs INTO @Database, @rolename, @username +END + +CLOSE MapUsersAndRolesCurs +DEALLOCATE MapUsersAndRolesCurs + +DROP TABLE #AllUsersAndRoles +DROP TABLE #AllRoles +GO diff --git a/TPDT-268 - ACP in task sequence/1_Configure_InstanceMemory.sql b/TPDT-268 - ACP in task sequence/1_Configure_InstanceMemory.sql new file mode 100644 index 0000000..3d582fd --- /dev/null +++ b/TPDT-268 - ACP in task sequence/1_Configure_InstanceMemory.sql @@ -0,0 +1,57 @@ +/* 23.06.2021 RTC TFS 65413 Optimize RAM configuration */ +EXEC sys.sp_configure N'show advanced options', N'1' RECONFIGURE WITH OVERRIDE +GO +EXEC sys.sp_configure N'min server memory (MB)', N'1024' +GO + +DECLARE @maxMem INT; +DECLARE @totSysMemKb INT; +DECLARE @NumOfCores INT; +DECLARE @NumOfProcessors INT; +DECLARE @NumOfSQLThreads INT; +DECLARE @isX64 BIT = 1; +DECLARE @ThreadStackSize INT; +DECLARE @osReserved INT; +DECLARE @newMaxMem INT; +DECLARE @appReserved INT = 0*1024*1024; --memory reserved for other apps on the server in Kb + +SELECT @totSysMemKb = [total_physical_memory_kb] +FROM [sys].[dm_os_sys_memory]; + +SELECT @NumOfCores = [cpu_count], @NumOfProcessors = [cpu_count] / [hyperthread_ratio] +FROM [sys].[dm_os_sys_info]; + +SELECT @isX64 = CHARINDEX('64-bit',CAST(SERVERPROPERTY('Edition') AS VARCHAR(MAX))); + +SELECT @ThreadStackSize = CASE WHEN @isX64=1 THEN 4096 ELSE 2048 END; + +SELECT @NumOfSQLThreads = 256 + (@NumOfProcessors - 4) * 8 * (CASE WHEN @NumOfProcessors >4 THEN @NumOfProcessors ELSE 0 END); + + +select @NumOfCores = 1, @NumOfProcessors = 8 + +SELECT @osReserved = CASE WHEN @totSysMemKb < (20*1024*1024) THEN @totSysMemKb * 0.2 ELSE @totSysMemKb * 0.125 END; + +PRINT' +@totSysMemKb: '+COALESCE(CAST(@totSysMemKb AS VARCHAR(MAX)),'null')+' +@NumOfCores: '+COALESCE(CAST(@NumOfCores AS VARCHAR(MAX)),'null')+' +@NumOfProcessors: '+COALESCE(CAST(@NumOfProcessors AS VARCHAR(MAX)),'null')+' +@NumOfSQLThreads: '+COALESCE(CAST(@NumOfSQLThreads AS VARCHAR(MAX)),'null')+' +@isX64: '+COALESCE(CAST(@isX64 AS VARCHAR(MAX)),'null')+' +@ThreadStackSize: '+COALESCE(CAST(@ThreadStackSize AS VARCHAR(MAX)),'null')+' +@osReserved: '+COALESCE(CAST(@osReserved AS VARCHAR(MAX)),'null')+' +@appReserved: '+COALESCE(CAST(@appReserved AS VARCHAR(MAX)),'null')+' +'; +SELECT @newMaxMem = @totSysMemKb - (@NumOfSQLThreads * @ThreadStackSize) - ((1* 1024 * 1024) * CEILING(@NumOfCores/4)) - @osReserved - @appReserved; + +SELECT @MaxMem = @newMaxMem / 1024 + +EXEC sys.sp_configure N'max server memory (MB)', @maxMem +RECONFIGURE WITH OVERRIDE +EXEC sys.sp_configure N'show advanced options', N'0' RECONFIGURE WITH OVERRIDE + +UPDATE HCITools.dbo.HCI_PARAMS +SET HCIP_value = @MaxMem +WHERE HCIP_key = 'MAXSRVMEM' + +GO diff --git a/TPDT-268 - ACP in task sequence/20_update_system_site_centrale.sql b/TPDT-268 - ACP in task sequence/20_update_system_site_centrale.sql new file mode 100644 index 0000000..7581739 --- /dev/null +++ b/TPDT-268 - ACP in task sequence/20_update_system_site_centrale.sql @@ -0,0 +1,69 @@ +/*============================================================================= +TPDT-283 + +Update central system_site values for a specific OU + +Parameters +---------------------- +In script parameters updated from Powershell are present: + @ou_id The id ofthe OU we need to update. This id is fetched from the local machine being migrated. + @fqdn The FQDN of the machine being migrated to Azure. This is fetched from a DNS request, not built. + @alias The alias of the machine being migrated to Azure. This is logically built from the FQDN + +Context +---------------------- +This script is called from a powershell in the task sequence during the migration to Azure. +The excution context is the local pharmacy being moved to Azure, but updating the central via the linked server arizonaCash. +It ensure that the system_site reflect the new hostname of the machine, so that labels are delivered correctly. + +Creation : 04.03.2024 / TSC +Modifications: + 07.03.2024 TSC Rewrote to connect to the central through the pharmacy linked server ArizonaCash + The values in the local pharmacy are updated as well +=============================================================================*/ +USE master; +GO + +DECLARE @ou_id INT; +DECLARE @fqdn VARCHAR(100) = '$fqdn'; +DECLARE @alias VARCHAR(100) = '$alias'; + +EXECUTE Arizona.[dbo].[sp_bmc_Bmc_Applic_Default] + @in_job_type = 3, + @in_param_int_1 = NULL, /* Company */ + @in_param_int_2 = NULL, /* Subsidiary */ + @in_param_varchar_1 = 'cvCurrentOrganizationalUnit', + @out_default_value = @ou_id OUTPUT, + @out_param_int_1 = NULL; + +--central +UPDATE ss + SET [ss].[SS_server_name] = @alias + , [ss].[SS_IP_server_address] = @alias + , [ss].[SS_domain_name] = @fqdn +FROM [arizonaCash].[arizona].[dbo].[Organizational_unit] ou + JOIN [arizonaCash].[arizona].[dbo].[System_site] ss ON ss.[System_site_ID] = ou.[OU_system_site] +WHERE ou.[Organizational_unit_ID] = @ou_id; + +UPDATE ssi + SET [ssi].[SSSI_SQL_instance_name] = @alias+'\APSSQL' +FROM [arizonaCash].[arizona].[dbo].[Organizational_unit] ou + JOIN [arizonaCash].[arizona].[dbo].[System_site] ss ON ss.[System_site_ID] = ou.[OU_system_site] + JOIN [arizonaCash].[arizona].[dbo].[System_site_SQL_instance] ssi ON ssi.[SSSI_system_site] = ss.[System_site_ID] +WHERE ou.[Organizational_unit_ID] = @ou_id; + +--local +UPDATE ss + SET [ss].[SS_server_name] = @alias + , [ss].[SS_IP_server_address] = @alias + , [ss].[SS_domain_name] = @fqdn +FROM [arizona].[dbo].[Organizational_unit] ou + JOIN [arizona].[dbo].[System_site] ss ON ss.[System_site_ID] = ou.[OU_system_site] +WHERE ou.[Organizational_unit_ID] = @ou_id; + +UPDATE ssi + SET [ssi].[SSSI_SQL_instance_name] = @alias+'\APSSQL' +FROM [arizona].[dbo].[Organizational_unit] ou + JOIN [arizona].[dbo].[System_site] ss ON ss.[System_site_ID] = ou.[OU_system_site] + JOIN [arizona].[dbo].[System_site_SQL_instance] ssi ON ssi.[SSSI_system_site] = ss.[System_site_ID] +WHERE ou.[Organizational_unit_ID] = @ou_id; diff --git a/TPDT-268 - ACP in task sequence/21_update_point_of_sale_centrale.sql b/TPDT-268 - ACP in task sequence/21_update_point_of_sale_centrale.sql new file mode 100644 index 0000000..8f5132e --- /dev/null +++ b/TPDT-268 - ACP in task sequence/21_update_point_of_sale_centrale.sql @@ -0,0 +1,53 @@ +/*============================================================================= +TPDT-283 + +Update central system_site values for a specific OU + +Parameters +---------------------- +In script parameters updated from Powershell are present: + @ou_id The id ofthe OU we need to update. This id is fetched from the local machine being migrated. + @fqdn The FQDN of the machine being migrated to Azure. This is fetched from a DNS request, not built. + @mac The MAC address fetched from the local machine + +Context +---------------------- +This script is called from a powershell in the task sequence during the migration to Azure. +The excution context is the local pharmacy being moved to Azure, but updating the central via the linked server arizonaCash. +It ensure that the point_of_sale table reflect the new hostname and mac address of the machine migrating to Azure + +Creation : 04.03.2024 / TSC +Modifications: + 07.03.2024 TSC Rewrote to connect to the central through the pharmacy linked server ArizonaCash + The values in the local pharmacy are updated as well +=============================================================================*/ +USE [master]; +GO + +DECLARE @ou_id INT; +DECLARE @fqdn VARCHAR(100) = '$fqdn'; +DECLARE @mac VARCHAR(100) = '$mac'; + +EXECUTE Arizona.[dbo].[sp_bmc_Bmc_Applic_Default] + @in_job_type = 3, + @in_param_int_1 = NULL, /* Company */ + @in_param_int_2 = NULL, /* Subsidiary */ + @in_param_varchar_1 = 'cvCurrentOrganizationalUnit', + @out_default_value = @ou_id OUTPUT, + @out_param_int_1 = NULL; + +--central +UPDATE ps + SET [ps].[POS_MAC_address] = @mac + , [ps].[POS_hostname] = @fqdn +FROM [arizonaCash].[arizona].[dbo].[Point_of_sale] ps +WHERE [ps].[POS_organizational_unit] = @ou_id +AND [ps].[POS_number]=99; + +--local +UPDATE ps + SET [ps].[POS_MAC_address] = @mac + , [ps].[POS_hostname] = @fqdn +FROM [arizona].[dbo].[Point_of_sale] ps +WHERE [ps].[POS_organizational_unit] = @ou_id +AND [ps].[POS_number]=99; \ No newline at end of file diff --git a/TPDT-268 - ACP in task sequence/2_Set_Identity.sql b/TPDT-268 - ACP in task sequence/2_Set_Identity.sql new file mode 100644 index 0000000..d930b8e --- /dev/null +++ b/TPDT-268 - ACP in task sequence/2_Set_Identity.sql @@ -0,0 +1,51 @@ + +IF (SELECT COUNT(*) FROM [master].[cfg].[Identity]) = 0 +BEGIN + INSERT INTO [master].[cfg].[Identity] + ([Format] + ,[DnsAlias] + ,[Remark] + ,[UpdateDate] + ,[Customer]) + VALUES + ('$format' + ,'$fqdn' + ,'Initialization DBA' + ,Default + ,'$customer') +END +ELSE +BEGIN + UPDATE [master].[cfg].[Identity] + SET [Format] = '$format' + ,[DnsAlias] = '$fqdn' + , [Remark] = 'DBA update after Rollout' + , [Customer] = '$customer' +END + +IF (SELECT COUNT(*) FROM [master].[cfg].[InstanceContext]) = 0 +BEGIN + INSERT INTO [master].[cfg].[InstanceContext] + (InstanceContextGuid + ,[Type] + ,[Business] + ,[Behavior] + ,[Remark] + ,[UpdateDate]) + VALUES + (Newid() + ,'$context' + ,'TPPHAR' + ,'Enable' + ,'Initialization DBA' + ,Default) +END +ELSE +BEGIN + IF EXISTS(SELECT 1 FROM [master].[cfg].[InstanceContext] WHERE [Type] = 'PREP') + UPDATE [master].[cfg].[InstanceContext] + SET [Type] = '$context' + ,[Business] = 'TPPHAR' + ,[Behavior] = 'Enable' + ,[Remark] = 'DBA update after Rollout' +END diff --git a/TPDT-268 - ACP in task sequence/3_Execute_CLR.sql b/TPDT-268 - ACP in task sequence/3_Execute_CLR.sql new file mode 100644 index 0000000..5eb50a8 --- /dev/null +++ b/TPDT-268 - ACP in task sequence/3_Execute_CLR.sql @@ -0,0 +1,11 @@ +exec master.dbo.sp_configure 'show advanced option', 1; +RECONFIGURE WITH OVERRIDE +exec master.dbo.sp_configure 'Ad Hoc Distributed Queries',1 +exec master.dbo.sp_configure 'xp_cmdshell',1 +exec master.dbo.sp_configure 'clr enabled',1 +exec master.dbo.sp_configure 'Database Mail XPs',1 +exec master.dbo.sp_configure 'show advanced option', 0; +RECONFIGURE WITH OVERRIDE + +EXECUTE [HCITools].[dbo].[apssys_CLR_Triapharm_Database_Tools] +GO \ No newline at end of file diff --git a/TPDT-268 - ACP in task sequence/6_Map_SQLUsers.sql b/TPDT-268 - ACP in task sequence/6_Map_SQLUsers.sql new file mode 100644 index 0000000..7cd504d --- /dev/null +++ b/TPDT-268 - ACP in task sequence/6_Map_SQLUsers.sql @@ -0,0 +1,239 @@ +USE [Arizona]; +GO + +IF EXISTS + (SELECT name + FROM master.sys.server_principals + WHERE name = 'apscounter') +BEGIN + +IF database_principal_id('apscounter') is not null + BEGIN + ALTER USER apscounter WITH LOGIN=apscounter + END +END + +IF EXISTS + (SELECT name + FROM master.sys.server_principals + WHERE name = 'arizonacash') +BEGIN + +IF database_principal_id('arizonacash') is not null + BEGIN + ALTER USER arizonacash WITH LOGIN=arizonacash + END +END + +IF EXISTS + (SELECT name + FROM master.sys.server_principals + WHERE name = 'bmcarizona') +BEGIN + +IF database_principal_id('bmcarizona') is not null + BEGIN + ALTER USER bmcarizona WITH LOGIN=bmcarizona + END +END + +IF EXISTS + (SELECT name + FROM master.sys.server_principals + WHERE name = 'datamonitoring') +BEGIN + +IF database_principal_id('datamonitoring') is not null + BEGIN + ALTER USER datamonitoring WITH LOGIN=datamonitoring + END +END + +IF EXISTS + (SELECT name + FROM master.sys.server_principals + WHERE name = 'extraction') +BEGIN + +IF database_principal_id('extraction') is not null + BEGIN + ALTER USER extraction WITH LOGIN=extraction + END +END + +IF EXISTS + (SELECT name + FROM master.sys.server_principals + WHERE name = 'gcstock') +BEGIN + +IF database_principal_id('gcstock') is not null + BEGIN + ALTER USER gcstock WITH LOGIN=gcstock + END +END + + +USE [ArizonaCUST]; +GO + +IF EXISTS + (SELECT name + FROM master.sys.server_principals + WHERE name = 'extraction') +BEGIN + +IF database_principal_id('extraction') is not null + BEGIN + ALTER USER extraction WITH LOGIN=extraction + END +END + + +USE [ArizonaLD]; +GO + +IF EXISTS + (SELECT name + FROM master.sys.server_principals + WHERE name = 'extraction') +BEGIN + +IF database_principal_id('extraction') is not null + BEGIN + ALTER USER extraction WITH LOGIN=extraction + END +END + + +USE [HCITools] +GO + +IF EXISTS + (SELECT name + FROM master.sys.server_principals + WHERE name = 'datamonitoring') +BEGIN + +IF database_principal_id('datamonitoring') is not null + BEGIN + ALTER USER datamonitoring WITH LOGIN=datamonitoring + END +END + +IF EXISTS + (SELECT name + FROM master.sys.server_principals + WHERE name = 'sqlMonPerfUsr') +BEGIN + +IF database_principal_id('sqlMonPerfUsr') is not null + BEGIN + ALTER USER sqlMonPerfUsr WITH LOGIN=sqlMonPerfUsr + END +END + +IF EXISTS + (SELECT name + FROM master.sys.server_principals + WHERE name = 'dba_monitoring') +BEGIN + +IF database_principal_id('dba_monitoring') is not null + BEGIN + ALTER USER dba_monitoring WITH LOGIN=dba_monitoring + END +END + + +USE [ActivePos_server] +GO + +IF EXISTS + (SELECT name + FROM master.sys.server_principals + WHERE name = 'ActiveConfig') +BEGIN + +IF database_principal_id('ActiveConfig') is not null + BEGIN + ALTER USER ActiveConfig WITH LOGIN=ActiveConfig + END +END + + +USE [ActivePos_write] +GO + +IF EXISTS + (SELECT name + FROM master.sys.server_principals + WHERE name = 'ActiveConfig') +BEGIN + +IF database_principal_id('ActiveConfig') is not null + BEGIN + ALTER USER ActiveConfig WITH LOGIN=ActiveConfig + END +END + +USE [ActiveSystemClient] +GO + +IF EXISTS + (SELECT name + FROM master.sys.server_principals + WHERE name = 'ActiveConfig') +BEGIN + +IF database_principal_id('ActiveConfig') is not null + BEGIN + ALTER USER ActiveConfig WITH LOGIN=ActiveConfig + END +END + +USE [ActiveSystemServer] +GO + +IF EXISTS + (SELECT name + FROM master.sys.server_principals + WHERE name = 'ActiveConfig') +BEGIN + +IF database_principal_id('ActiveConfig') is not null + BEGIN + ALTER USER ActiveConfig WITH LOGIN=ActiveConfig + END +END + +USE [MSDB] +GO + +IF NOT EXISTS + (SELECT name + FROM sys.sysusers + WHERE name = 'datamonitoring') +BEGIN + CREATE USER [datamonitoring] FOR LOGIN [datamonitoring] +END + +IF EXISTS + (SELECT name + FROM master.sys.server_principals + WHERE name = 'datamonitoring') +BEGIN + +IF database_principal_id('datamonitoring') is not null + BEGIN + ALTER USER [datamonitoring] WITH LOGIN=[datamonitoring] + ALTER USER [datamonitoring] WITH DEFAULT_SCHEMA=[dbo] + END +END + +GRANT EXECUTE ON [dbo].[agent_datetime] TO [datamonitoring] +GRANT SELECT ON [dbo].[sysjobactivity] TO [datamonitoring] +GRANT SELECT ON [dbo].[sysjobhistory] TO [datamonitoring] +GRANT SELECT ON [dbo].[sysjobs] TO [datamonitoring] +GRANT SELECT ON [dbo].[sysjobschedules] TO [datamonitoring] +GRANT SELECT ON [dbo].[sysschedules] TO [datamonitoring] diff --git a/TPDT-268 - ACP in task sequence/8_Remove_OrphanedSQLUsers.sql b/TPDT-268 - ACP in task sequence/8_Remove_OrphanedSQLUsers.sql new file mode 100644 index 0000000..bbfec03 --- /dev/null +++ b/TPDT-268 - ACP in task sequence/8_Remove_OrphanedSQLUsers.sql @@ -0,0 +1,61 @@ +declare @cmd varchar(8000), + @name varchar (255) + +USE master + +SET NOCOUNT ON + +declare c_databases cursor local forward_only static for + SELECT name + FROM sys.databases + WHERE name not in ('master','msdb','tempDB','model','SSISDB') + AND [is_read_only] = 0 + AND [state_desc] = 'ONLINE' + ORDER BY name +; +open c_databases +; +FETCH NEXT FROM c_databases + into @name +; +while @@fetch_status = 0 +begin + SET @cmd = 'declare @name varchar(50) + + declare c_users cursor local forward_only static for + SELECT dp.name + FROM '+@name+'.sys.database_principals AS dp + LEFT JOIN '+@name+'.sys.server_principals AS sp + ON dp.SID = sp.SID + WHERE sp.SID IS NULL + AND dp.type_desc = ''SQL_USER'' + AND dp.principal_id > 4; + + open c_users + + FETCH NEXT FROM c_users + into @name + + while @@fetch_status = 0 + begin + + EXEC (''USE ['+@name+']; DROP USER ''+@name+'''') + + FETCH NEXT FROM c_users + into @name + + end + close c_users + deallocate c_users + ' /* #fla01 */ + + exec (@cmd) + + FETCH NEXT FROM c_databases + into @name + ; +end +; +close c_databases +; +deallocate c_databases diff --git a/TPDT-268 - ACP in task sequence/9_Update_FTPLogin_Central.sql b/TPDT-268 - ACP in task sequence/9_Update_FTPLogin_Central.sql new file mode 100644 index 0000000..3023aa4 --- /dev/null +++ b/TPDT-268 - ACP in task sequence/9_Update_FTPLogin_Central.sql @@ -0,0 +1,67 @@ +/*============================================================================= + +Update the ftp password in system_site_transfert table on the central from a pharmacy, for this pharmacy + +Parameters +---------------------- + + +Context +---------------------- +This script is run in a pharmacy, during the preparation / migration of the pharmacy + +Creation : 07.03.2024 / TSC +Modifications: + +=============================================================================*/ +IF EXISTS ( SELECT 1 + FROM [ARIZONACASH].[Arizona].[dbo].[System_site] SS + JOIN [ARIZONACASH].[Arizona].[dbo].[System_site_transfer] SST + ON [SST].[SST_dest_system_site] = [SS].[System_site_ID] + WHERE [SS].[SS_server_name] = '$fqdn' + AND [SST].[SST_bmc_task] = 109) +BEGIN + + UPDATE [ARIZONACASH].[Arizona].[dbo].[System_site_transfer] + SET [SST_connection_info] = '' + FROM [ARIZONACASH].[Arizona].[dbo].[System_site] SS + JOIN [ARIZONACASH].[Arizona].[dbo].[System_site_transfer] SST + ON [SST].[SST_dest_system_site] = [SS].[System_site_ID] + WHERE [SS].[SS_server_name] = '$fqdn'; + +END; +ELSE +BEGIN + + IF EXISTS ( SELECT 1 + FROM [ARIZONACASH].Arizona.[dbo].[System_site] + WHERE [SS_server_name] = '$fqdn') + BEGIN + + UPDATE [ARIZONACASH].Arizona.[dbo].[Bmc_ID_counter] + SET [BMCID_last_number] = ( SELECT [BMCID_last_number] + 1 + FROM [ARIZONACASH].Arizona.[dbo].[Bmc_ID_counter] + WHERE [BMCID_key] = 'system_site_transfer') + FROM [ARIZONACASH].Arizona.[dbo].[Bmc_ID_counter] + WHERE [BMCID_key] = 'system_site_transfer'; + + INSERT INTO [ARIZONACASH].[Arizona].[dbo].[System_site_transfer] ([System_site_transfer_ID], + [SST_source_system_site], + [SST_dest_system_site], + [SST_bmc_task], + [SST_transfer_type], + [SST_VGUID], + [SST_master_ID], + [SST_connection_info], + [SST_start_date], + [SST_end_date]) + VALUES (( SELECT [BMCID_last_number] + FROM [ARIZONACASH].Arizona.[dbo].[Bmc_ID_counter] + WHERE [BMCID_key] = 'system_site_transfer'), 102, ( SELECT [System_site_ID] + FROM [ARIZONACASH].Arizona.[dbo].[System_site] + WHERE [SS_server_name] = '$fqdn'), 109, 1, DEFAULT, + NULL, '', + (SELECT CONVERT(CHAR(10), GETDATE(), 126)), NULL); + + END; +END; diff --git a/TPDT-268 - ACP in task sequence/acp_auto.ps1 b/TPDT-268 - ACP in task sequence/acp_auto.ps1 new file mode 100644 index 0000000..a1f4b2f --- /dev/null +++ b/TPDT-268 - ACP in task sequence/acp_auto.ps1 @@ -0,0 +1,566 @@ +<# +TPDT-268 + +Finalize the database setup after staging a new pharmacy +This script re-implements the autoConfigPharmacy of the DBA in an automated way with interactions with a keyvault to fetch secrets and certificate + +TSC 08.02.2024 Creation +#> +# param ( +# #[Parameter(Position=0,mandatory=$true)] +# [string] $SqlInstance ="SSUNB008VM01\APSSQL" +# ) + +#if ran from TSC computer, execute on sun008, otherwise execute locally +if($env:COMPUTERNAME -ne "CGAL41556"){ + $SqlInstance = "$($env:COMPUTERNAME)\APSSQL" + if (test-path "C:\Program Files\PackageManagement\Az.Accounts") {Import-Module "C:\Program Files\PackageManagement\Az.Accounts"}else{exit 42101} + if (test-path "C:\Program Files\PackageManagement\Az.keyvault") {Import-Module "C:\Program Files\PackageManagement\Az.keyvault"}else{exit 42101} + if (test-path "C:\Program Files\PackageManagement\Az.compute") {Import-Module "C:\Program Files\PackageManagement\Az.compute"}else{exit 42101} +} +else +{ + $SqlInstance ="SSUNB008VM01\APSSQL" + Import-Module Az.Accounts + Import-Module Az.keyvault + Import-Module Az.compute +} + + +#Import-Module SqlServer + +<# +.SYNOPSIS +Executes a T-SQL script on a SQL Server database without trying to parse variables. + +.DESCRIPTION +This function executes a T-SQL script on a specified SQL Server database. +The script is split into batches based on the GO statements and each batch is executed separately. +SQLCMD type variables like $(ESCAPE_SQUOTE(WMI(DatabaseName))) are NOT parsed and do not cause errors if they are present in dynamic sql + +.PARAMETER Server +The name of the SQL Server instance to connect to. + +.PARAMETER Database +The name of the database on the SQL Server instance to execute the script against. + +.PARAMETER ScriptPath +The file path of the T-SQL script to execute. + +.EXAMPLE +Invoke-SqlScript -Server "YourServer" -Database "YourDatabase" -ScriptPath "YourScript.sql" +Executes the T-SQL script "YourScript.sql" on the "YourDatabase" database of the "YourServer" SQL Server instance. + +.NOTES +Author: Thierry Schork +Date: 2024-02-13 +#> +function Invoke-SqlScript { + + param( + [string]$Server, + [string]$Database, + [string]$ScriptPath, + [string]$script + ) + + # Load the assembly containing the SqlCommand class + Add-Type -AssemblyName System.Data + + # Create a connection string + $connectionString = "Server=$Server;Database=$Database;Integrated Security=True" + + # Create a SqlConnection object + $connection = New-Object System.Data.SqlClient.SqlConnection($connectionString) + + # Open the connection + $connection.Open() + + # Read the content of the script file + if('' -ne $ScriptPath){ + $scriptContent = Get-Content -Path $ScriptPath -Raw + } + + if('' -ne $script){ + $scriptContent = $script + } + + # Split the script into batches based on the GO statements + $scriptBatches = $scriptContent -split [regex]'(?smi)^[\s]*GO[\s]*$' | Where-Object { $_.Trim() -ne '' } + + # Create a SqlCommand object + $command = $connection.CreateCommand() + + foreach ($batch in $scriptBatches) { + #$batch = $batch.Trim() + #$batch = $batch -replace '(?m)^GO\s*', '' + + if ($batch.ToLower() -ne "go"){ + try { + # Set the command text for the batch + $command.CommandText = $batch + + # Execute the command + $null = $command.ExecuteNonQuery() + } + catch { + Write-Error "Error in the file $fileShort" + Write-Error $_.Exception.Message + Write-Error "-------------------" + Write-Error $batch + } + + } + } + + # Close the connection + $connection.Close() +} + +$ErrorActionPreference = "Stop" +$DebugPreference = 'SilentlyContinue' + +#overrides +#$ErrorActionPreference = "continue" +#$DebugPreference = 'Continue' + +$rootFS = Get-Location + +#do we want to execute jobs from TiaPharm. No, because the package +#should have deployed them just before this script +$exec_triapharm = $false + +# Replace these values with your Azure AD service principal details +$clientId = "65d289fd-4bea-464f-a1cd-417f74d26888" #pcpl-ApoLsPoc-setupDataEncryptionwithKeyVault +$clientSecret = "dPQ8Q~N5btnUb7cj~H4YZaDDQo7kJNZlpxbRua2a" +$tenantId = "7844775a-a9cc-4c33-a5ae-36dcf6660f45" #galenica + +# Replace these values with your Azure Key Vault details +#$resourceGroupName = "rg-ApoLsPoc-Keyvault" +$keyVaultName = "kv-ApoLsPoc-Tde" + +#secret to fetch from the key vault +$secretFtpPassword ="centralinfra---svc-APH-trans" +$secretMasterKey ="MasterKey" +$secretTriaPharmSQLCert = "TriaPharmSQLCert" + +# Convert the client secret to a secure string +$securePassword = ConvertTo-SecureString -String $clientSecret -AsPlainText -Force + +# Create a PSCredential object +$psCred = New-Object System.Management.Automation.PSCredential -ArgumentList $clientId, $securePassword + +# Authenticate using the service principal +$null = Connect-AzAccount -ServicePrincipal -Credential $psCred -TenantId $tenantId + +# Get the secret from Azure Key Vault +# $secret = Get-AzKeyVaultSecret -VaultName $keyVaultName -Name $secretName +# write-host "domain: $($ua.Tags["domain"])" + +# Display the secret value +#Write-Host "Secret Value: $($secret.SecretValue | ConvertFrom-SecureString -AsPlainText)" + +##region derive alias from hostname +$hostname = $SqlInstance +$position = $hostname.IndexOf("\") +if ($position -gt 0){ + #remove instance name + $hostname = $hostname.SubString(0,$position) +} + +$ou = $null +$customer = $null +$clientpath = $null +$format = 'GCM' +if ($hostname.IndexOf("NB") -gt 0){ + #old hostname, like SSUNB661VM01 + $ou = $hostname.Substring(5,3) + if($hostname -like "SSUNB*"){ + $customer="SUN" + } + if($hostname -like "SAMNB*"){ + $customer="AMA" + } + if($hostname -like "SCVNB*"){ + $customer="CVI" + } +} +else{ + #new$customer, like SWAMA701VM23 + $ou = $hostname.Substring(5,3) + if($hostname -like "SWSUN*"){ + $customer="SUN" + } + if($hostname -like "SWAMA*"){ + $customer="AMA" + } + if($hostname -like "SWCVI*"){ + $customer="CVI" + } +} + +#used to map jobs scripts subfolders when executing scripts with customer abbreviation +switch ($Customer){ + 'AMA'{ $clientpath = 'AMAVITA' } + 'SUN'{ $clientpath = 'SUNSTORE' } + 'CVI'{ $clientpath = 'CVI' } +} + +if($null -eq $format){ + Write-Error "Format could not be derived from hostname $hostname" +} +if($null -eq $customer){ + Write-Error "Customer could not be derived from hostname $hostname" +} +if ($null -eq $ou){ + Write-Error "OU could not be derived from hostname $hostname" +} + +$alias = "$($customer)$($ou)APS" + +#region Server DEV/TEST/PROD +$PharmacyShortName = $customer + $ou +$PharmaciesDEV = "SUN007","SUN008","CVI506","AMA704" +$PharmaciesVALI = "SUN004","SUN006","CVI503","CVI504","AMA705","AMA707","AMA888","CVI888","SUN888" +$PharmaciesACCE = "SUN001","SUN002","CVI501","CVI502","AMA701","AMA702","AMA703","CVI505","SUN003" +$PharmaciesTRAINING = "SUN011","CVI507","CVI508","AMA988","AMA989" + +if ($PharmaciesDEV -match $PharmacyShortName) +{ + $ContextType = 'DEVE' + $CentraleServer = "SWINTDB01" +} +elseif ($PharmaciesVALI -match $PharmacyShortName) +{ + $ContextType = 'VALI' + $CentraleServer = "SWTSTDB01" +} +elseif ($PharmaciesACCE -match $PharmacyShortName) +{ + $ContextType = 'ACCE' + $CentraleServer = "SWPRDDB01" +} +elseif ($PharmaciesTRAINING -match $PharmacyShortName) +{ + $ContextType = 'FORM' + $CentraleServer = "SWPRDDB01" +} +else +{ + $ContextType = 'PROD' + $CentraleServer = "SWPRDDB01" +} +#endregion + +#endregion + +#define a db credential, for testing without hte service principal +#$DBpassword = Get-AzKeyVaultSecret -VaultName $keyVaultName -Name "ua208700" +#$dbCred = New-Object System.Management.Automation.PSCredential -ArgumentList 'ua208700@centralinfra.net', $DBpassword.SecretValue +#$dbCred = Get-SqlCredential -Name "centralinfra\ua208700" -Identity "centralinfra\ua208700" -Secret $DBpassword.SecretValue + +##Check if instance is reachable +$instanceReachable=$false +try { + $null = Invoke-Sqlcmd -ServerInstance $SqlInstance -Query "select 1" -QueryTimeout 5 -Database master + $instanceReachable=$true + Write-Debug "Connection to the SQL instance ok" +} +catch { + Write-Error "SQL instance '$($SqlInstance)' is not reachable or the principal doesn't have permissions to connect" +} + +##region check out triaOne release +$checkoutGit = $false +if($true -eq $checkoutGit){ + $FolderPath = "triaOne_jobs" + if (Test-Path -Path $FolderPath) { + # If the folder exists, remove its contents + Get-ChildItem -Path $FolderPath | Remove-Item -Force -Recurse + Write-Host "Cleaned existing folder: $FolderPath" + } else { + # If the folder doesn't exist, create it + New-Item -ItemType Directory -Path $FolderPath | Out-Null + Write-Host "Created new folder: $FolderPath" + } + + # Define the URL of the Git repository and the subfolder you want to check out + $repositoryUrl = "http://shcnbtfs01.hcisolutions.ch:8080/tfs/TriaPharmCollection/_git/TriaOne" + $subfolderPath = "SQL\Jobs" + $localRepo = "triaOne_repo" + + # Clone the Git repository without fetching files on the selected branch + git clone -n -b rel/23.6 $repositoryUrl $localRepo + + # Move to the cloned repository directory + Set-Location $localRepo + git checkout HEAD $subfolderPath + git pull + + # Move the subfolder to the desired location + $destination = Join-Path -Path $rootFS -ChildPath $FolderPath + Move-Item -Path $subfolderPath -Destination $destination -Force -Recurse + Set-Location $rootFS + #Remove-Item $localRepo -Force +} +#endregion + +#$instanceReachable = $false + +if($true -eq $instanceReachable){ + ##fetch OU details from control center + ## CLA: can be ignored due to SWITCH directly after this QUERY + <# + $query=@" + SELECT LOWER([SERV].[SE_DNS]) AS SE_DNS, + CASE + WHEN UPPER(LEFT([SERV].[SE_DNS], 3)) = 'SCV' THEN 'CVI' + WHEN UPPER(LEFT([SERV].[SE_DNS], 3)) = 'SSU' THEN 'SUN' + WHEN UPPER(LEFT([SERV].[SE_DNS], 3)) = 'SAM' THEN 'AMA' + ELSE UPPER(LEFT([SERV].[SE_DNS], 3))END AS [customer], + CASE + WHEN UPPER([SERV].[SE_designation]) LIKE '%ACCEPTANCE%' THEN 'ACCE' + WHEN UPPER([SERV].[SE_designation]) LIKE '%FORMATION%' THEN 'FORM' + WHEN UPPER([SERV].[SE_designation]) LIKE '%SCHULUNG%' THEN 'FORM' + ELSE 'PROD' END AS [context], + LEFT(LTRIM([cfg].[CF_value]), 4) AS [version], + LOWER([SERV].[SE_DNS] + '\' + [SERV].[SE_instance_name]) AS [aliasInstance] + FROM [ControlCenter].[dbo].[Server] SERV + JOIN [ControlCenter].[dbo].[Config] cfg + ON [cfg].[CF_server] = [SERV].[SE_id] + JOIN [ControlCenter].[dbo].[ConfigType] cfgt + ON [cfgt].[CFTY_id] = [cfg].[CF_configtype] + JOIN [ControlCenter].[dbo].[Entity] ent + ON [ent].[EN_id] = [SERV].[SE_entity] + WHERE [cfgt].[CFTY_type] = 'TriaPharmVersion' + AND [SERV].[SE_status] = 1 + AND ( ([SERV].[SE_end_prod_date] > GETDATE()) + OR ([SERV].[SE_end_prod_date] IS NULL)) + AND [SERV].[SE_designation] NOT LIKE '%Fermé%' + AND [SERV].[SE_designation] NOT LIKE '%REF%' + AND [ent].[EN_code] IN ( 'AMA', 'SUN', 'CVI' ) + AND LOWER([SERV].[SE_DNS]) LIKE '$alias%' + ORDER BY [SERV].[SE_entity], + SE_DNS; + +"@ #> + + # $dbacc = Invoke-Sqlcmd -ServerInstance hcimon -Database ControlCenter -Query $query + if($null -eq $dbacc){ + Write-Output "No results in HCIMON, faking them" + $dbacc = New-Object psobject + #$dbacc | Add-Member -MemberType NoteProperty -Name "context" -Value "DEVE" + $dbacc | Add-Member -MemberType NoteProperty -Name "context" -Value $ContextType + $dbacc | Add-Member -MemberType NoteProperty -Name "customer" -Value $customer + $dbacc | Add-Member -MemberType NoteProperty -Name "version" -Value -1 + $dbacc | Add-Member -MemberType NoteProperty -Name "SE_DNS" -Value $hostname + $dbacc | Add-Member -MemberType NoteProperty -Name "aliasInstance" -Value $sqlVariables + + } + ##step 1: configure SQL instance max memory + Invoke-Sqlcmd -ServerInstance $SqlInstance -Database master -InputFile .\1_Configure_InstanceMemory.sql + Write-Output "Executed 1_Configure_InstanceMemory.sql" + + ##step 2: set db identities + [string]$query = Get-Content -Path .\2_Set_Identity.sql + $query = $query.Replace("`$format", $format) + $query = $query.Replace("`$fqdn", $alias) + $query = $query.Replace("`$customer", $customer) + $query = $query.Replace("`$context", $dbacc.context) # ['context']) + + Invoke-Sqlcmd -ServerInstance $SqlInstance -Database master -Query $query + Write-Output "Executed 2_Set_Identity.sql" + + ##step 3: activate clr + Invoke-Sqlcmd -ServerInstance $SqlInstance -Database master -InputFile .\3_Execute_CLR.sql + Write-Output "Executed 3_Execute_CLR.sql" + + ##step 4: map sql users + Invoke-Sqlcmd -ServerInstance $SqlInstance -Database master -InputFile .\6_Map_SQLUsers.sql + Write-Output "Executed 6_Map_SQLUsers.sql" + + ##step 4: remove orphaned users + Invoke-Sqlcmd -ServerInstance $SqlInstance -Database master -InputFile .\8_Remove_OrphanedSQLUsers.sql + $orphans | Format-Table + Write-Output "Executed 8_Remove_OrphanedSQLUsers.sql" + + + ##step 5: FTP password modification on central server + $ftpPassword = Get-AzKeyVaultSecret -VaultName $keyVaultName -Name $secretFtpPassword + $query = Get-Content -Path .\9_Update_FTPLogin_Central.sql + $query = $query.Replace("`$ftppass", $($ftpPassword.SecretValue | ConvertFrom-SecureString )) ####################################### -AsPlainText)) + $query = $query.Replace("`$fqdn", $alias) + + #Invoke-Sqlcmd -ServerInstance gcmPrdCent -Database arizona -Query $query + Invoke-Sqlcmd -ServerInstance $SqlInstance -Database arizona -Query $query + Write-Output "Executed 9_Update_FTPLogin_Central.sql" + + + ##step 6: execute all DBA packages + $LogFile = "C:\Temp\DBApackagesCLA.log" + + try{ + Get-ChildItem -path .\dba_packages -Filter *.sql | ForEach-Object { + $file = $_ + $fileShort = Split-Path -Path $file -Leaf + + Invoke-SqlScript -Server $SqlInstance -Database master -ScriptPath $file.FullName + Write-Output "executed DBA package file $fileShort" + } + } + catch + { + $file | out-file -FilePath $LogFile -Append -Encoding utf8 + $_ | out-file -FilePath $LogFile -Append -Encoding utf8 + } + + ##step 7: execute all DBA structure scripts + Get-ChildItem -path .\dba_structure -Filter *.sql | ForEach-Object { + $file = $_ + $fileShort = Split-Path -Path $file -Leaf + + Invoke-SqlScript -Server $SqlInstance -Database master -ScriptPath $file.FullName + Write-Output "executed DBA structure file $fileShort" + } + + ##step 8: execute all DBA stored procedures scripts + Get-ChildItem -path .\dba_storedProcedures -Filter *.sql | ForEach-Object { + $file = $_ + $fileShort = Split-Path -Path $file -Leaf + + Invoke-SqlScript -Server $SqlInstance -Database master -ScriptPath $file.FullName + Write-Output "executed DBA stored procedure file $fileShort" + } + + ##region triaOne jobs + if($true -eq $exec_triapharm){ + ##step 9: execute triaOne pharmacy jobs scripts + Get-ChildItem -path .\cp_triaOne_jobs\pharmacy -Filter *.sql | ForEach-Object { + $file = $_ + $fileShort = Split-Path -Path $file -Leaf + + Invoke-SqlScript -Server $SqlInstance -Database master -ScriptPath $file.FullName + Write-Output "executed triaOne pharmacy job file $fileShort" + } + + ##step 10: execute triaOne pharmacy customer jobs scripts + Get-ChildItem -path .\cp_triaOne_jobs\pharmacy\$clientpath -Filter *.sql | ForEach-Object { + $file = $_ + $fileShort = Split-Path -Path $file -Leaf + + Invoke-SqlScript -Server $SqlInstance -Database master -ScriptPath $file.FullName + Write-Output "executed triaOne pharmacy customer job file $fileShort" + } + } + #endregion + + + ##region DBA jobs + ##step 11: execute all DBA global jobs scripts + Get-ChildItem -path .\dba_jobs\ -Filter *.sql | Where-Object {$_.Name -NotMatch "several"} | ForEach-Object { + $file = $_ + $fileShort = Split-Path -Path $file -Leaf + + Invoke-SqlScript -Server $SqlInstance -Database master -ScriptPath $file.FullName + Write-Output "executed DBA global job file $fileShort" + } + + ##step 12: execute all DBA pharmacy jobs scripts + Get-ChildItem -path .\dba_jobs\Pharmacy -Filter *.sql | ForEach-Object { + $file = $_ + $fileShort = Split-Path -Path $file -Leaf + + Invoke-SqlScript -Server $SqlInstance -Database master -ScriptPath $file.FullName + Write-Output "executed DBA pharmacy job file $fileShort" + } + + ##step 13: execute all DBA customer specific pharmacy jobs scripts + Get-ChildItem -path .\dba_jobs\Pharmacy\$clientpath -Filter *.sql | ForEach-Object { + $file = $_ + $fileShort = Split-Path -Path $file -Leaf + + Invoke-SqlScript -Server $SqlInstance -Database master -ScriptPath $file.FullName + Write-Output "executed DBA pharmacy $clientpath job file $fileShort" + } + + #endregion + + ##step 14: execute all DBA alerts scripts + Get-ChildItem -path .\dba_alerts -Filter *.sql | ForEach-Object { + $file = $_ + $fileShort = Split-Path -Path $file -Leaf + + Invoke-SqlScript -Server $SqlInstance -Database master -ScriptPath $file.FullName + Write-Output "executed DBA alert file $fileShort" + } + + ##step 15: execute schedule shuffle script + $null = Invoke-Sqlcmd -ServerInstance $SqlInstance -Database master -InputFile .\10_Change_Schedules_Subscriptions.sql + Write-Output "Executed 10_Change_Schedules_Subscriptions.sql" + + ##step 16: execute schedule shuffle script + $null = Invoke-Sqlcmd -ServerInstance $SqlInstance -Database master -InputFile .\11_Run_Job_CheckReplications.sql + Write-Output "Executed 11_Run_Job_CheckReplications.sql" + + + ##step 17: Atlas configuration + + $masterKey = Get-AzKeyVaultSecret -VaultName $keyVaultName -Name $secretMasterKey + $triapharmSqlCert = Get-AzKeyVaultSecret -VaultName $keyVaultName -Name $secretTriaPharmSQLCert + $bckcert = 'D:\SQLDatabaseDump\Certificates\MK\'+$alias.Substring(0,6).toupper()+'_master.bak' + + [string]$query = Get-Content -Path .\12_Broker_Config.sql + $query = $query.Replace("`$mk", $($masterKey.SecretValue | ConvertFrom-SecureString )) # -AsPlainText)) + $query = $query.Replace("`$cert", $($triapharmSqlCert.SecretValue | ConvertFrom-SecureString )) # -AsPlainText)) + $query = $query.Replace("`$bck", $bckcert) + + Invoke-Sqlcmd -ServerInstance $SqlInstance -Database arizona -Query $query + Write-Output "Executed 12_Broker_Config.sql" + + + ##step 18: create ad logins + Invoke-Sqlcmd -ServerInstance $SqlInstance -Database master -InputFile .\13_Create_AD_Logins.sql + Write-Output "Executed 13_Create_AD_Logins.sql" + + ##step 19: final check on pharmacy + #removed because does not brings any value + #in an automated run, as this requires a human to verify and act + + #Invoke-Sqlcmd -ServerInstance $SqlInstance -Database master -InputFile '.\Check Instance Pharmacy.sql' + #Write-Output "Executed Check Instance Pharmacy.sql" + + ##step 20: update system_site on the central + $fqdn = [System.Net.Dns]::GetHostByName($alias) + + #update the centrale + $query=Get-Content -Path .\20_update_system_site_centrale.sql + $query = $query.Replace("`$fqdn", $fqdn.HostName) + $query = $query.Replace("`$alias", $alias) + + Invoke-Sqlcmd -ServerInstance $SqlInstance -Database master -Query $query -Credential + Write-Output "Executed 20_update_system_site_centrale.sql" + + ##step 21: update Point_of_sale on the central + + #fetch a list of mac adresses + $macs = @{} + $pos = 0 + Get-NetAdapter | Select-Object ifIndex, Name, MacAddress | ForEach-Object { + $macs.Add($pos, $_.MacAddress) + $pos++ + } + + if($macs.Count -gt 1){ + #we have several mac addresses, unable to define which one should be used in point_of_sale + Write-Error "Several mac addresses are active, no clue which one to save in Point_of_sale" + } + else{ + $query=Get-Content -Path .\21_update_point_of_sale_centrale.sql + $query = $query.Replace("`$fqdn", $fqdn.HostName) + $query = $query.Replace("`$mac", $macs[0].value) + + Invoke-Sqlcmd -ServerInstance $SqlInstance -Database master -Query $query + Write-Output "Executed 21_update_point_of_sale_centrale.sql" + + } +} diff --git a/TPDT-268 - ACP in task sequence/acp_auto.ps1.bak b/TPDT-268 - ACP in task sequence/acp_auto.ps1.bak new file mode 100644 index 0000000..80a0ada --- /dev/null +++ b/TPDT-268 - ACP in task sequence/acp_auto.ps1.bak @@ -0,0 +1,579 @@ +<# +TPDT-268 + +Finalize the database setup after staging a new pharmacy +This script re-implements the autoConfigPharmacy of the DBA in an automated way with interactions with a keyvault to fetch secrets and certificate + +TSC 08.02.2024 Creation +#> +# param ( +# #[Parameter(Position=0,mandatory=$true)] +# [string] $SqlInstance ="SSUNB008VM01\APSSQL" +# ) + +#if ran from TSC computer, execute on sun008, otherwise execute locally +if($env:COMPUTERNAME -ne "CGAL41556"){ + $SqlInstance = "$($env:COMPUTERNAME)\APSSQL" +} +else{ + $SqlInstance ="SSUNB008VM01\APSSQL" +} + + +if (test-path "C:\Program Files\PackageManagement\Az.Accounts") {Import-Module "C:\Program Files\PackageManagement\Az.Accounts"}else{exit 42101} +if (test-path "C:\Program Files\PackageManagement\Az.keyvault") {Import-Module "C:\Program Files\PackageManagement\Az.keyvault"}else{exit 42101} +if (test-path "C:\Program Files\PackageManagement\Az.compute") {Import-Module "C:\Program Files\PackageManagement\Az.compute"}else{exit 42101} +#Import-Module SqlServer + +<# +.SYNOPSIS +Executes a T-SQL script on a SQL Server database without trying to parse variables. + +.DESCRIPTION +This function executes a T-SQL script on a specified SQL Server database. +The script is split into batches based on the GO statements and each batch is executed separately. +SQLCMD type variables like $(ESCAPE_SQUOTE(WMI(DatabaseName))) are NOT parsed and do not cause errors if they are present in dynamic sql + +.PARAMETER Server +The name of the SQL Server instance to connect to. + +.PARAMETER Database +The name of the database on the SQL Server instance to execute the script against. + +.PARAMETER ScriptPath +The file path of the T-SQL script to execute. + +.EXAMPLE +Invoke-SqlScript -Server "YourServer" -Database "YourDatabase" -ScriptPath "YourScript.sql" +Executes the T-SQL script "YourScript.sql" on the "YourDatabase" database of the "YourServer" SQL Server instance. + +.NOTES +Author: Thierry Schork +Date: 2024-02-13 +#> +function Invoke-SqlScript { + + param( + [string]$Server, + [string]$Database, + [string]$ScriptPath, + [string]$script + ) + + # Load the assembly containing the SqlCommand class + Add-Type -AssemblyName System.Data + + # Create a connection string + $connectionString = "Server=$Server;Database=$Database;Integrated Security=True" + + # Create a SqlConnection object + $connection = New-Object System.Data.SqlClient.SqlConnection($connectionString) + + # Open the connection + $connection.Open() + + # Read the content of the script file + if('' -ne $ScriptPath){ + $scriptContent = Get-Content -Path $ScriptPath -Raw + } + + if('' -ne $script){ + $scriptContent = $script + } + + # Split the script into batches based on the GO statements + $scriptBatches = $scriptContent -split [regex]'(?smi)^[\s]*GO[\s]*$' | Where-Object { $_.Trim() -ne '' } + + # Create a SqlCommand object + $command = $connection.CreateCommand() + + foreach ($batch in $scriptBatches) { + #$batch = $batch.Trim() + #$batch = $batch -replace '(?m)^GO\s*', '' + + if ($batch.ToLower() -ne "go"){ + try { + # Set the command text for the batch + $command.CommandText = $batch + + # Execute the command + $null = $command.ExecuteNonQuery() + } + catch { + Write-Error "Error in the file $fileShort" + Write-Error $_.Exception.Message + Write-Error "-------------------" + Write-Error $batch + } + + } + } + + # Close the connection + $connection.Close() +} + +$ErrorActionPreference = "Stop" +$DebugPreference = 'SilentlyContinue' + +#overrides +#$ErrorActionPreference = "continue" +#$DebugPreference = 'Continue' + +$rootFS = Get-Location + +#do we want to execute jobs from TiaPharm. No, because the package +#should have deployed them just before this script +$exec_triapharm = $false + +# Replace these values with your Azure AD service principal details +$clientId = "65d289fd-4bea-464f-a1cd-417f74d26888" #pcpl-ApoLsPoc-setupDataEncryptionwithKeyVault +$clientSecret = "dPQ8Q~N5btnUb7cj~H4YZaDDQo7kJNZlpxbRua2a" +$tenantId = "7844775a-a9cc-4c33-a5ae-36dcf6660f45" #galenica + +# Replace these values with your Azure Key Vault details +#$resourceGroupName = "rg-ApoLsPoc-Keyvault" +$keyVaultName = "kv-ApoLsPoc-Tde" + +#secret to fetch from the key vault +$secretFtpPassword ="centralinfra---svc-APH-trans" +$secretMasterKey ="MasterKey" +$secretTriaPharmSQLCert = "TriaPharmSQLCert" + +# Convert the client secret to a secure string +$securePassword = ConvertTo-SecureString -String $clientSecret -AsPlainText -Force + +# Create a PSCredential object +$psCred = New-Object System.Management.Automation.PSCredential -ArgumentList $clientId, $securePassword + +# Authenticate using the service principal +$null = Connect-AzAccount -ServicePrincipal -Credential $psCred -TenantId $tenantId + +# Get the secret from Azure Key Vault +# $secret = Get-AzKeyVaultSecret -VaultName $keyVaultName -Name $secretName +# write-host "domain: $($ua.Tags["domain"])" + +# Display the secret value +#Write-Host "Secret Value: $($secret.SecretValue | ConvertFrom-SecureString -AsPlainText)" + +##region derive alias from hostname +$hostname = $SqlInstance +$position = $hostname.IndexOf("\") +if ($position -gt 0){ + #remove instance name + $hostname = $hostname.SubString(0,$position) +} + +$ou = $null +$customer = $null +$clientpath = $null +$format = 'GCM' +if ($hostname.IndexOf("NB") -gt 0){ + #old hostname, like SSUNB661VM01 + $ou = $hostname.Substring(5,3) + if($hostname -like "SSUNB*"){ + $customer="SUN" + } + if($hostname -like "SAMNB*"){ + $customer="AMA" + } + if($hostname -like "SCVNB*"){ + $customer="CVI" + } +} +else{ + #new$customer, like SWAMA701VM23 + $ou = $hostname.Substring(5,3) + if($hostname -like "SWSUN*"){ + $customer="SUN" + } + if($hostname -like "SWAMA*"){ + $customer="AMA" + } + if($hostname -like "SWCVI*"){ + $customer="CVI" + } +} + +#used to map jobs scripts subfolders when executing scripts with customer abbreviation +switch ($Customer){ + 'AMA'{ $clientpath = 'AMAVITA' } + 'SUN'{ $clientpath = 'SUNSTORE' } + 'CVI'{ $clientpath = 'CVI' } +} + +if($null -eq $format){ + Write-Error "Format could not be derived from hostname $hostname" +} +if($null -eq $customer){ + Write-Error "Customer could not be derived from hostname $hostname" +} +if ($null -eq $ou){ + Write-Error "OU could not be derived from hostname $hostname" +} + +$alias = "$($customer)$($ou)APS" + +#region Server DEV/TEST/PROD +$PharmacyShortName = $customer + $ou +$PharmaciesDEV = "SUN007","SUN008","CVI506","AMA704" +$PharmaciesVALI = "SUN004","SUN006","CVI503","CVI504","AMA705","AMA707","AMA888","CVI888","SUN888" +$PharmaciesACCE = "SUN001","SUN002","CVI501","CVI502","AMA701","AMA702","AMA703","CVI505","SUN003" +$PharmaciesTRAINING = "SUN011","CVI507","CVI508","AMA988","AMA989" + +if ($PharmaciesDEV -match $PharmacyShortName) +{ + $ContextType = 'DEVE' + $CentraleServer = "SWINTDB01" +} +elseif ($PharmaciesVALI -match $PharmacyShortName) +{ + $ContextType = 'VALI' + $CentraleServer = "SWTSTDB01" +} +elseif ($PharmaciesACCE -match $PharmacyShortName) +{ + $ContextType = 'ACCE' + $CentraleServer = "SWPRDDB01" +} +elseif ($PharmaciesTRAINING -match $PharmacyShortName) +{ + $ContextType = 'FORM' + $CentraleServer = "SWPRDDB01" +} +else +{ + $ContextType = 'PROD' + $CentraleServer = "SWPRDDB01" +} +#endregion + +#endregion + +#define a db credential, for testing without hte service principal +#$DBpassword = Get-AzKeyVaultSecret -VaultName $keyVaultName -Name "ua208700" +#$dbCred = New-Object System.Management.Automation.PSCredential -ArgumentList 'ua208700@centralinfra.net', $DBpassword.SecretValue +#$dbCred = Get-SqlCredential -Name "centralinfra\ua208700" -Identity "centralinfra\ua208700" -Secret $DBpassword.SecretValue + +##Check if instance is reachable +$instanceReachable=$false +try { + $null = Invoke-Sqlcmd -ServerInstance $SqlInstance -Query "select 1" -QueryTimeout 5 -Database master + $instanceReachable=$true + Write-Debug "Connection to the SQL instance ok" +} +catch { + Write-Error "SQL instance '$($SqlInstance)' is not reachable or the principal doesn't have permissions to connect" +} + +##region check out triaOne release +$checkoutGit = $false +if($true -eq $checkoutGit){ + $FolderPath = "triaOne_jobs" + if (Test-Path -Path $FolderPath) { + # If the folder exists, remove its contents + Get-ChildItem -Path $FolderPath | Remove-Item -Force -Recurse + Write-Host "Cleaned existing folder: $FolderPath" + } else { + # If the folder doesn't exist, create it + New-Item -ItemType Directory -Path $FolderPath | Out-Null + Write-Host "Created new folder: $FolderPath" + } + + # Define the URL of the Git repository and the subfolder you want to check out + $repositoryUrl = "http://shcnbtfs01.hcisolutions.ch:8080/tfs/TriaPharmCollection/_git/TriaOne" + $subfolderPath = "SQL\Jobs" + $localRepo = "triaOne_repo" + + # Clone the Git repository without fetching files on the selected branch + git clone -n -b rel/23.6 $repositoryUrl $localRepo + + # Move to the cloned repository directory + Set-Location $localRepo + git checkout HEAD $subfolderPath + git pull + + # Move the subfolder to the desired location + $destination = Join-Path -Path $rootFS -ChildPath $FolderPath + Move-Item -Path $subfolderPath -Destination $destination -Force -Recurse + Set-Location $rootFS + #Remove-Item $localRepo -Force +} +#endregion + +#$instanceReachable = $false + +if($true -eq $instanceReachable){ + ##fetch OU details from control center + ## CLA: can be ignored due to SWITCH directly after this QUERY + <# + $query=@" + SELECT LOWER([SERV].[SE_DNS]) AS SE_DNS, + CASE + WHEN UPPER(LEFT([SERV].[SE_DNS], 3)) = 'SCV' THEN 'CVI' + WHEN UPPER(LEFT([SERV].[SE_DNS], 3)) = 'SSU' THEN 'SUN' + WHEN UPPER(LEFT([SERV].[SE_DNS], 3)) = 'SAM' THEN 'AMA' + ELSE UPPER(LEFT([SERV].[SE_DNS], 3))END AS [customer], + CASE + WHEN UPPER([SERV].[SE_designation]) LIKE '%ACCEPTANCE%' THEN 'ACCE' + WHEN UPPER([SERV].[SE_designation]) LIKE '%FORMATION%' THEN 'FORM' + WHEN UPPER([SERV].[SE_designation]) LIKE '%SCHULUNG%' THEN 'FORM' + ELSE 'PROD' END AS [context], + LEFT(LTRIM([cfg].[CF_value]), 4) AS [version], + LOWER([SERV].[SE_DNS] + '\' + [SERV].[SE_instance_name]) AS [aliasInstance] + FROM [ControlCenter].[dbo].[Server] SERV + JOIN [ControlCenter].[dbo].[Config] cfg + ON [cfg].[CF_server] = [SERV].[SE_id] + JOIN [ControlCenter].[dbo].[ConfigType] cfgt + ON [cfgt].[CFTY_id] = [cfg].[CF_configtype] + JOIN [ControlCenter].[dbo].[Entity] ent + ON [ent].[EN_id] = [SERV].[SE_entity] + WHERE [cfgt].[CFTY_type] = 'TriaPharmVersion' + AND [SERV].[SE_status] = 1 + AND ( ([SERV].[SE_end_prod_date] > GETDATE()) + OR ([SERV].[SE_end_prod_date] IS NULL)) + AND [SERV].[SE_designation] NOT LIKE '%Fermé%' + AND [SERV].[SE_designation] NOT LIKE '%REF%' + AND [ent].[EN_code] IN ( 'AMA', 'SUN', 'CVI' ) + AND LOWER([SERV].[SE_DNS]) LIKE '$alias%' + ORDER BY [SERV].[SE_entity], + SE_DNS; + +"@ #> + + # $dbacc = Invoke-Sqlcmd -ServerInstance hcimon -Database ControlCenter -Query $query + if($null -eq $dbacc){ + Write-Output "No results in HCIMON, faking them" + $dbacc = New-Object psobject + #$dbacc | Add-Member -MemberType NoteProperty -Name "context" -Value "DEVE" + $dbacc | Add-Member -MemberType NoteProperty -Name "context" -Value $ContextType + $dbacc | Add-Member -MemberType NoteProperty -Name "customer" -Value $customer + $dbacc | Add-Member -MemberType NoteProperty -Name "version" -Value -1 + $dbacc | Add-Member -MemberType NoteProperty -Name "SE_DNS" -Value $hostname + $dbacc | Add-Member -MemberType NoteProperty -Name "aliasInstance" -Value $sqlVariables + + } + ##step 1: configure SQL instance max memory + Invoke-Sqlcmd -ServerInstance $SqlInstance -Database master -InputFile .\1_Configure_InstanceMemory.sql + Write-Output "Executed 1_Configure_InstanceMemory.sql" + + ##step 2: set db identities + [string]$query = Get-Content -Path .\2_Set_Identity.sql + $query = $query.Replace("`$format", $format) + $query = $query.Replace("`$fqdn", $alias) + $query = $query.Replace("`$customer", $customer) + $query = $query.Replace("`$context", $dbacc.context) # ['context']) + + Invoke-Sqlcmd -ServerInstance $SqlInstance -Database master -Query $query + Write-Output "Executed 2_Set_Identity.sql" + + ##step 3: activate clr + Invoke-Sqlcmd -ServerInstance $SqlInstance -Database master -InputFile .\3_Execute_CLR.sql + Write-Output "Executed 3_Execute_CLR.sql" + + ##step 4: map sql users + Invoke-Sqlcmd -ServerInstance $SqlInstance -Database master -InputFile .\6_Map_SQLUsers.sql + Write-Output "Executed 6_Map_SQLUsers.sql" + + ##step 4: remove orphaned users + Invoke-Sqlcmd -ServerInstance $SqlInstance -Database master -InputFile .\8_Remove_OrphanedSQLUsers.sql + $orphans | Format-Table + Write-Output "Executed 8_Remove_OrphanedSQLUsers.sql" + + ##step 5: FTP password modification on central server + $ftpPassword = Get-AzKeyVaultSecret -VaultName $keyVaultName -Name $secretFtpPassword + $query = Get-Content -Path .\9_Update_FTPLogin_Central.sql + $query = $query.Replace("`$ftppass", $($ftpPassword.SecretValue | ConvertFrom-SecureString )) ####################################### -AsPlainText)) + $query = $query.Replace("`$fqdn", $alias) + + #Invoke-Sqlcmd -ServerInstance gcmPrdCent -Database arizona -Query $query + Invoke-Sqlcmd -ServerInstance $CentraleServer -Database arizona -Query $query + Write-Output "Executed 9_Update_FTPLogin_Central.sql" + + + ##step 6: execute all DBA packages + $LogFile = "C:\Temp\DBApackagesCLA.log" + + try{ + Get-ChildItem -path .\dba_packages -Filter *.sql | ForEach-Object { + $file = $_ + $fileShort = Split-Path -Path $file -Leaf + + Invoke-SqlScript -Server $SqlInstance -Database master -ScriptPath $file.FullName + Write-Output "executed DBA package file $fileShort" + } + } + catch + { + $file | out-file -FilePath $LogFile -Append -Encoding utf8 + $_ | out-file -FilePath $LogFile -Append -Encoding utf8 + } + + ##step 7: execute all DBA structure scripts + Get-ChildItem -path .\dba_structure -Filter *.sql | ForEach-Object { + $file = $_ + $fileShort = Split-Path -Path $file -Leaf + + Invoke-SqlScript -Server $SqlInstance -Database master -ScriptPath $file.FullName + Write-Output "executed DBA structure file $fileShort" + } + + ##step 8: execute all DBA stored procedures scripts + Get-ChildItem -path .\dba_storedProcedures -Filter *.sql | ForEach-Object { + $file = $_ + $fileShort = Split-Path -Path $file -Leaf + + Invoke-SqlScript -Server $SqlInstance -Database master -ScriptPath $file.FullName + Write-Output "executed DBA stored procedure file $fileShort" + } + + ##region triaOne jobs + if($true -eq $exec_triapharm){ + ##step 9: execute triaOne pharmacy jobs scripts + Get-ChildItem -path .\cp_triaOne_jobs\pharmacy -Filter *.sql | ForEach-Object { + $file = $_ + $fileShort = Split-Path -Path $file -Leaf + + Invoke-SqlScript -Server $SqlInstance -Database master -ScriptPath $file.FullName + Write-Output "executed triaOne pharmacy job file $fileShort" + } + + ##step 10: execute triaOne pharmacy customer jobs scripts + Get-ChildItem -path .\cp_triaOne_jobs\pharmacy\$clientpath -Filter *.sql | ForEach-Object { + $file = $_ + $fileShort = Split-Path -Path $file -Leaf + + Invoke-SqlScript -Server $SqlInstance -Database master -ScriptPath $file.FullName + Write-Output "executed triaOne pharmacy customer job file $fileShort" + } + } + #endregion + + + ##region DBA jobs + ##step 11: execute all DBA global jobs scripts + Get-ChildItem -path .\dba_jobs\ -Filter *.sql | Where-Object {$_.Name -NotMatch "several"} | ForEach-Object { + $file = $_ + $fileShort = Split-Path -Path $file -Leaf + + Invoke-SqlScript -Server $SqlInstance -Database master -ScriptPath $file.FullName + Write-Output "executed DBA global job file $fileShort" + } + + ##step 12: execute all DBA pharmacy jobs scripts + Get-ChildItem -path .\dba_jobs\Pharmacy -Filter *.sql | ForEach-Object { + $file = $_ + $fileShort = Split-Path -Path $file -Leaf + + Invoke-SqlScript -Server $SqlInstance -Database master -ScriptPath $file.FullName + Write-Output "executed DBA pharmacy job file $fileShort" + } + + ##step 13: execute all DBA customer specific pharmacy jobs scripts + Get-ChildItem -path .\dba_jobs\Pharmacy\$clientpath -Filter *.sql | ForEach-Object { + $file = $_ + $fileShort = Split-Path -Path $file -Leaf + + Invoke-SqlScript -Server $SqlInstance -Database master -ScriptPath $file.FullName + Write-Output "executed DBA pharmacy $clientpath job file $fileShort" + } + + #endregion + + ##step 14: execute all DBA alerts scripts + Get-ChildItem -path .\dba_alerts -Filter *.sql | ForEach-Object { + $file = $_ + $fileShort = Split-Path -Path $file -Leaf + + Invoke-SqlScript -Server $SqlInstance -Database master -ScriptPath $file.FullName + Write-Output "executed DBA alert file $fileShort" + } + + ##step 15: execute schedule shuffle script + $null = Invoke-Sqlcmd -ServerInstance $SqlInstance -Database master -InputFile .\10_Change_Schedules_Subscriptions.sql + Write-Output "Executed 10_Change_Schedules_Subscriptions.sql" + + ##step 16: execute schedule shuffle script + $null = Invoke-Sqlcmd -ServerInstance $SqlInstance -Database master -InputFile .\11_Run_Job_CheckReplications.sql + Write-Output "Executed 11_Run_Job_CheckReplications.sql" + + + ##step 17: Atlas configuration + + $masterKey = Get-AzKeyVaultSecret -VaultName $keyVaultName -Name $secretMasterKey + $triapharmSqlCert = Get-AzKeyVaultSecret -VaultName $keyVaultName -Name $secretTriaPharmSQLCert + $bckcert = 'D:\SQLDatabaseDump\Certificates\MK\'+$alias.Substring(0,6).toupper()+'_master.bak' + + [string]$query = Get-Content -Path .\12_Broker_Config.sql + $query = $query.Replace("`$mk", $($masterKey.SecretValue | ConvertFrom-SecureString )) # -AsPlainText)) + $query = $query.Replace("`$cert", $($triapharmSqlCert.SecretValue | ConvertFrom-SecureString )) # -AsPlainText)) + $query = $query.Replace("`$bck", $bckcert) + + Invoke-Sqlcmd -ServerInstance $SqlInstance -Database arizona -Query $query + Write-Output "Executed 12_Broker_Config.sql" + + + ##step 18: create ad logins + Invoke-Sqlcmd -ServerInstance $SqlInstance -Database master -InputFile .\13_Create_AD_Logins.sql + Write-Output "Executed 13_Create_AD_Logins.sql" + + ##step 19: final check on pharmacy + #removed because does not brings any value + #in an automated run, as this requires a human to verify and act + + #Invoke-Sqlcmd -ServerInstance $SqlInstance -Database master -InputFile '.\Check Instance Pharmacy.sql' + #Write-Output "Executed Check Instance Pharmacy.sql" + + ##step 20: update system_site on the central + $fqdn = [System.Net.Dns]::GetHostByName($env:computerName) + + #determine the OU id of the current pharmacy (ran locally) + $query =@" +USE [Arizona] +DECLARE @ou_id INT +EXEC Arizona.dbo.sp_bmc_Bmc_Applic_Default + @in_job_type = 3, + @in_param_int_1 = null, /* Company */ + @in_param_int_2 = null, /* Subsidiary */ + @in_param_varchar_1 = 'cvCurrentOrganizationalUnit', + @out_default_value = @ou_id output, + @out_param_int_1 = null + +SELECT @ou_id as ou_id +"@ + $local_ou = Invoke-Sqlcmd -ServerInstance $SqlInstance -Database arizona -Query $query + + #update the centrale + $query=Get-Content -Path .\20_update_system_site_centrale.sql + $query = $query.Replace("`$ou_id", $local_ou.ou_id) + $query = $query.Replace("`$fqdn", $fqdn.HostName) + $query = $query.Replace("`$alias", $alias) + + Invoke-Sqlcmd -ServerInstance gcmPrdCent -Database arizona -Query $query + Write-Output "Executed 20_update_system_site_centrale.sql" + + ##step 21: update Point_of_sale on the central + + #fetch a list of mac adresses + $macs = @{} + $pos = 0 + Get-NetAdapter | Select-Object ifIndex, Name, MacAddress | ForEach-Object { + $macs.Add($pos, $_.MacAddress) + $pos++ + } + + if($macs.Count -gt 1){ + #we have several mac addresses, unable to define which one should be used in point_of_sale + Write-Error "Several mac addresses are active, no clue which one to save in Point_of_sale" + } + else{ + $query=Get-Content -Path .\21_update_point_of_sale_centrale.sql + $query = $query.Replace("`$ou_id", $local_ou.ou_id) + $query = $query.Replace("`$fqdn", $fqdn.HostName) + $query = $query.Replace("`$mac", $macs[0].value) + + Invoke-Sqlcmd -ServerInstance gcmPrdCent -Database arizona -Query $query + Write-Output "Executed 21_update_point_of_sale_centrale.sql" + + } +} diff --git a/TPDT-268 - ACP in task sequence/cp_triaOne_jobs/Pharmacy/AMAVITA/D00506 - LifeStage_Invoices_Transfer.sql b/TPDT-268 - ACP in task sequence/cp_triaOne_jobs/Pharmacy/AMAVITA/D00506 - LifeStage_Invoices_Transfer.sql new file mode 100644 index 0000000..168bceb Binary files /dev/null and b/TPDT-268 - ACP in task sequence/cp_triaOne_jobs/Pharmacy/AMAVITA/D00506 - LifeStage_Invoices_Transfer.sql differ diff --git a/TPDT-268 - ACP in task sequence/cp_triaOne_jobs/Pharmacy/AMAVITA/M00402 - Insertion des prix moyens ponderes.sql b/TPDT-268 - ACP in task sequence/cp_triaOne_jobs/Pharmacy/AMAVITA/M00402 - Insertion des prix moyens ponderes.sql new file mode 100644 index 0000000..165dcc0 Binary files /dev/null and b/TPDT-268 - ACP in task sequence/cp_triaOne_jobs/Pharmacy/AMAVITA/M00402 - Insertion des prix moyens ponderes.sql differ diff --git a/TPDT-268 - ACP in task sequence/cp_triaOne_jobs/Pharmacy/AMAVITA/W00372 - Calculation LORE.sql b/TPDT-268 - ACP in task sequence/cp_triaOne_jobs/Pharmacy/AMAVITA/W00372 - Calculation LORE.sql new file mode 100644 index 0000000..336cfc4 Binary files /dev/null and b/TPDT-268 - ACP in task sequence/cp_triaOne_jobs/Pharmacy/AMAVITA/W00372 - Calculation LORE.sql differ diff --git a/TPDT-268 - ACP in task sequence/cp_triaOne_jobs/Pharmacy/AMAVITA/W00482 - Calcul de la rotation LoRe ABC.sql b/TPDT-268 - ACP in task sequence/cp_triaOne_jobs/Pharmacy/AMAVITA/W00482 - Calcul de la rotation LoRe ABC.sql new file mode 100644 index 0000000..4682b0b Binary files /dev/null and b/TPDT-268 - ACP in task sequence/cp_triaOne_jobs/Pharmacy/AMAVITA/W00482 - Calcul de la rotation LoRe ABC.sql differ diff --git a/TPDT-268 - ACP in task sequence/cp_triaOne_jobs/Pharmacy/AMAVITA/_D00182 - Ticino - Update or insert records of text in substitution language.sql b/TPDT-268 - ACP in task sequence/cp_triaOne_jobs/Pharmacy/AMAVITA/_D00182 - Ticino - Update or insert records of text in substitution language.sql new file mode 100644 index 0000000..0c4cf68 Binary files /dev/null and b/TPDT-268 - ACP in task sequence/cp_triaOne_jobs/Pharmacy/AMAVITA/_D00182 - Ticino - Update or insert records of text in substitution language.sql differ diff --git a/TPDT-268 - ACP in task sequence/cp_triaOne_jobs/Pharmacy/AMAVITA/_D00212 - APS_Create ADK type 5 for Customers.sql b/TPDT-268 - ACP in task sequence/cp_triaOne_jobs/Pharmacy/AMAVITA/_D00212 - APS_Create ADK type 5 for Customers.sql new file mode 100644 index 0000000..9cba84e Binary files /dev/null and b/TPDT-268 - ACP in task sequence/cp_triaOne_jobs/Pharmacy/AMAVITA/_D00212 - APS_Create ADK type 5 for Customers.sql differ diff --git a/TPDT-268 - ACP in task sequence/cp_triaOne_jobs/Pharmacy/AMAVITA/_D00412 - LORE, mise à jour des articles.sql b/TPDT-268 - ACP in task sequence/cp_triaOne_jobs/Pharmacy/AMAVITA/_D00412 - LORE, mise à jour des articles.sql new file mode 100644 index 0000000..5b757dc Binary files /dev/null and b/TPDT-268 - ACP in task sequence/cp_triaOne_jobs/Pharmacy/AMAVITA/_D00412 - LORE, mise à jour des articles.sql differ diff --git a/TPDT-268 - ACP in task sequence/cp_triaOne_jobs/Pharmacy/AMAVITA/__D00012 - Before working hours.sql b/TPDT-268 - ACP in task sequence/cp_triaOne_jobs/Pharmacy/AMAVITA/__D00012 - Before working hours.sql new file mode 100644 index 0000000..6aeb4dc Binary files /dev/null and b/TPDT-268 - ACP in task sequence/cp_triaOne_jobs/Pharmacy/AMAVITA/__D00012 - Before working hours.sql differ diff --git a/TPDT-268 - ACP in task sequence/cp_triaOne_jobs/Pharmacy/AMAVITA/__D00022 - After working hours.sql b/TPDT-268 - ACP in task sequence/cp_triaOne_jobs/Pharmacy/AMAVITA/__D00022 - After working hours.sql new file mode 100644 index 0000000..bedda4f Binary files /dev/null and b/TPDT-268 - ACP in task sequence/cp_triaOne_jobs/Pharmacy/AMAVITA/__D00022 - After working hours.sql differ diff --git a/TPDT-268 - ACP in task sequence/cp_triaOne_jobs/Pharmacy/Agent history clean up distribution.sql b/TPDT-268 - ACP in task sequence/cp_triaOne_jobs/Pharmacy/Agent history clean up distribution.sql new file mode 100644 index 0000000..dfbdbe4 --- /dev/null +++ b/TPDT-268 - ACP in task sequence/cp_triaOne_jobs/Pharmacy/Agent history clean up distribution.sql @@ -0,0 +1,69 @@ + +IF EXISTS (SELECT job_id FROM msdb.dbo.sysjobs_view WHERE name = 'Agent history clean up: distribution') +EXEC msdb.dbo.sp_delete_job @job_name=N'Agent history clean up: distribution', @delete_unused_schedule=1 +GO + +BEGIN TRANSACTION +DECLARE @ReturnCode INT +SELECT @ReturnCode = 0 +/****** Object: JobCategory [REPL-History Cleanup] Script Date: 06/12/2015 08:48:31 ******/ +IF NOT EXISTS (SELECT name FROM msdb.dbo.syscategories WHERE name=N'REPL-History Cleanup' AND category_class=1) +BEGIN +EXEC @ReturnCode = msdb.dbo.sp_add_category @class=N'JOB', @type=N'LOCAL', @name=N'REPL-History Cleanup' +IF (@@ERROR <> 0 OR @ReturnCode <> 0) GOTO QuitWithRollback + +END + +DECLARE @jobId BINARY(16) +EXEC @ReturnCode = msdb.dbo.sp_add_job @job_name=N'Agent history clean up: distribution', + @enabled=1, + @notify_level_eventlog=0, + @notify_level_email=0, + @notify_level_netsend=0, + @notify_level_page=0, + @delete_level=0, + @description=N'Removes replication agent history from the distribution database.', + @category_name=N'REPL-History Cleanup', + @owner_login_name=N'sa', @job_id = @jobId OUTPUT +IF (@@ERROR <> 0 OR @ReturnCode <> 0) GOTO QuitWithRollback +/****** Object: Step [Run agent.] Script Date: 06/12/2015 08:48:31 ******/ +EXEC @ReturnCode = msdb.dbo.sp_add_jobstep @job_id=@jobId, @step_name=N'Run agent.', + @step_id=1, + @cmdexec_success_code=0, + @on_success_action=1, + @on_success_step_id=0, + @on_fail_action=2, + @on_fail_step_id=0, + @retry_attempts=0, + @retry_interval=0, + @os_run_priority=0, @subsystem=N'TSQL', + @command=N'EXEC dbo.sp_MShistory_cleanup @history_retention = 48', + @database_name=N'distribution', + @flags=0 +IF (@@ERROR <> 0 OR @ReturnCode <> 0) GOTO QuitWithRollback +EXEC @ReturnCode = msdb.dbo.sp_update_job @job_id = @jobId, @start_step_id = 1 +IF (@@ERROR <> 0 OR @ReturnCode <> 0) GOTO QuitWithRollback +DECLARE @schedule_id int +EXEC @ReturnCode = msdb.dbo.sp_add_jobschedule @job_id=@jobId, @name=N'Replication agent schedule.', + @enabled=1, + @freq_type=4, + @freq_interval=1, + @freq_subday_type=4, + @freq_subday_interval=10, + @freq_relative_interval=1, + @freq_recurrence_factor=0, + @active_start_date=20150202, + @active_end_date=99991231, + @active_start_time=0, + @active_end_time=235959, @schedule_id = @schedule_id OUTPUT +select @schedule_id +IF (@@ERROR <> 0 OR @ReturnCode <> 0) GOTO QuitWithRollback +EXEC @ReturnCode = msdb.dbo.sp_add_jobserver @job_id = @jobId, @server_name = N'(local)' +IF (@@ERROR <> 0 OR @ReturnCode <> 0) GOTO QuitWithRollback +COMMIT TRANSACTION +GOTO EndSave +QuitWithRollback: + IF (@@TRANCOUNT > 0) ROLLBACK TRANSACTION +EndSave: + +GO diff --git a/TPDT-268 - ACP in task sequence/cp_triaOne_jobs/Pharmacy/CVI/M00404 - Insertion des prix moyens ponderes.sql b/TPDT-268 - ACP in task sequence/cp_triaOne_jobs/Pharmacy/CVI/M00404 - Insertion des prix moyens ponderes.sql new file mode 100644 index 0000000..65c587b Binary files /dev/null and b/TPDT-268 - ACP in task sequence/cp_triaOne_jobs/Pharmacy/CVI/M00404 - Insertion des prix moyens ponderes.sql differ diff --git a/TPDT-268 - ACP in task sequence/cp_triaOne_jobs/Pharmacy/CVI/W00374 - Calculation LORE.sql b/TPDT-268 - ACP in task sequence/cp_triaOne_jobs/Pharmacy/CVI/W00374 - Calculation LORE.sql new file mode 100644 index 0000000..6971746 Binary files /dev/null and b/TPDT-268 - ACP in task sequence/cp_triaOne_jobs/Pharmacy/CVI/W00374 - Calculation LORE.sql differ diff --git a/TPDT-268 - ACP in task sequence/cp_triaOne_jobs/Pharmacy/CVI/W00484 - Calcul de la rotation LoRe ABC.sql b/TPDT-268 - ACP in task sequence/cp_triaOne_jobs/Pharmacy/CVI/W00484 - Calcul de la rotation LoRe ABC.sql new file mode 100644 index 0000000..f2418dd Binary files /dev/null and b/TPDT-268 - ACP in task sequence/cp_triaOne_jobs/Pharmacy/CVI/W00484 - Calcul de la rotation LoRe ABC.sql differ diff --git a/TPDT-268 - ACP in task sequence/cp_triaOne_jobs/Pharmacy/CVI/_D00184 - Ticino - Update or insert records of text in substitution language.sql b/TPDT-268 - ACP in task sequence/cp_triaOne_jobs/Pharmacy/CVI/_D00184 - Ticino - Update or insert records of text in substitution language.sql new file mode 100644 index 0000000..d0b64f3 Binary files /dev/null and b/TPDT-268 - ACP in task sequence/cp_triaOne_jobs/Pharmacy/CVI/_D00184 - Ticino - Update or insert records of text in substitution language.sql differ diff --git a/TPDT-268 - ACP in task sequence/cp_triaOne_jobs/Pharmacy/CVI/_D00214 - APS_Create ADK type 5 for Customers.sql b/TPDT-268 - ACP in task sequence/cp_triaOne_jobs/Pharmacy/CVI/_D00214 - APS_Create ADK type 5 for Customers.sql new file mode 100644 index 0000000..ac66665 Binary files /dev/null and b/TPDT-268 - ACP in task sequence/cp_triaOne_jobs/Pharmacy/CVI/_D00214 - APS_Create ADK type 5 for Customers.sql differ diff --git a/TPDT-268 - ACP in task sequence/cp_triaOne_jobs/Pharmacy/CVI/_D00414 - LORE, mise à jour des articles.sql b/TPDT-268 - ACP in task sequence/cp_triaOne_jobs/Pharmacy/CVI/_D00414 - LORE, mise à jour des articles.sql new file mode 100644 index 0000000..a55b5a7 Binary files /dev/null and b/TPDT-268 - ACP in task sequence/cp_triaOne_jobs/Pharmacy/CVI/_D00414 - LORE, mise à jour des articles.sql differ diff --git a/TPDT-268 - ACP in task sequence/cp_triaOne_jobs/Pharmacy/CVI/__D00014 - Before working hours.sql b/TPDT-268 - ACP in task sequence/cp_triaOne_jobs/Pharmacy/CVI/__D00014 - Before working hours.sql new file mode 100644 index 0000000..0137e0c Binary files /dev/null and b/TPDT-268 - ACP in task sequence/cp_triaOne_jobs/Pharmacy/CVI/__D00014 - Before working hours.sql differ diff --git a/TPDT-268 - ACP in task sequence/cp_triaOne_jobs/Pharmacy/CVI/__D00024 - After working hours.sql b/TPDT-268 - ACP in task sequence/cp_triaOne_jobs/Pharmacy/CVI/__D00024 - After working hours.sql new file mode 100644 index 0000000..33af7d6 Binary files /dev/null and b/TPDT-268 - ACP in task sequence/cp_triaOne_jobs/Pharmacy/CVI/__D00024 - After working hours.sql differ diff --git a/TPDT-268 - ACP in task sequence/cp_triaOne_jobs/Pharmacy/D00110 - PerformancePointAggregationLevel1.sql b/TPDT-268 - ACP in task sequence/cp_triaOne_jobs/Pharmacy/D00110 - PerformancePointAggregationLevel1.sql new file mode 100644 index 0000000..d729d73 --- /dev/null +++ b/TPDT-268 - ACP in task sequence/cp_triaOne_jobs/Pharmacy/D00110 - PerformancePointAggregationLevel1.sql @@ -0,0 +1,199 @@ +/* Drop existing standard schedule for job */ +declare @schedule_id int +declare c_schedules cursor local forward_only static for + select ss.schedule_id + from msdb.dbo.sysjobschedules sjs +INNER JOIN msdb.dbo.sysschedules ss + ON sjs.schedule_id = ss.schedule_id + AND ss.name NOT LIKE '%#SPEC#' +INNER JOIN msdb.dbo.sysjobs sj + ON sjs.job_id = sj.job_id + WHERE sj.name = N'D00110 - PerformancePointAggregationLevel1' + +open c_schedules + +FETCH NEXT FROM c_schedules into @schedule_id +while @@fetch_status = 0 +begin + IF ((select COUNT(*) from msdb.dbo.sysjobschedules where schedule_id=@schedule_id) = 1) + EXEC msdb.dbo.sp_delete_schedule @schedule_id=@schedule_id, @force_delete = 1 +FETCH NEXT FROM c_schedules into @schedule_id +end + +close c_schedules + +deallocate c_schedules + +IF EXISTS (SELECT job_id FROM msdb.dbo.sysjobs_view WHERE name = N'D00110 - PerformancePointAggregationLevel1') +EXEC msdb.dbo.sp_delete_job @job_name = N'D00110 - PerformancePointAggregationLevel1', @delete_unused_schedule=0 +GO + +/* Creation Job and Steps*/ +BEGIN TRANSACTION +DECLARE @ReturnCode INT +SELECT @ReturnCode = 0 + +IF NOT EXISTS (SELECT name FROM msdb.dbo.syscategories WHERE name=N'TPH-Maintenance' AND category_class=1) +BEGIN +EXEC @ReturnCode = msdb.dbo.sp_add_category @class=N'JOB', @type=N'LOCAL', @name=N'TPH-Maintenance' +IF (@@ERROR <> 0 OR @ReturnCode <> 0) GOTO QuitWithRollback + +END + +/* Add Job */ +DECLARE @jobId BINARY(16) +EXEC @ReturnCode = msdb.dbo.sp_add_job @job_name=N'D00110 - PerformancePointAggregationLevel1', + @enabled=1, + @notify_level_eventlog=0, + @notify_level_email=0, + @notify_level_netsend=0, + @notify_level_page=0, + @delete_level=0, + @description=N'for replication initialization + 17.03.2022 - FLA : Change DBA mail', + @category_name=N'TPH-Maintenance', + @start_step_id=1, + @owner_login_name=N'sa', @job_id = @jobId OUTPUT +IF (@@ERROR <> 0 OR @ReturnCode <> 0) GOTO QuitWithRollback + +/* Add Step */ +EXEC @ReturnCode = msdb.dbo.sp_add_jobstep @job_id=@jobId, @step_name=N'Empty step', + @step_id=1, + @cmdexec_success_code=0, + @on_success_action=3, + @on_success_step_id=0, + @on_fail_action=3, + @on_fail_step_id=0, + @retry_attempts=0, + @retry_interval=0, + @os_run_priority=0, @subsystem=N'TSQL', + @command=N'/* Empty step */', + @database_name=N'master', + @output_file_name=NULL, + @flags=0, + @database_user_name=NULL, + @server=NULL, + @additional_parameters=NULL, + @proxy_id=NULL, + @proxy_name=NULL +IF (@@ERROR <> 0 OR @ReturnCode <> 0) GOTO QuitWithRollback +/* Add Step */ +EXEC @ReturnCode = msdb.dbo.sp_add_jobstep @job_id=@jobId, @step_name=N'Aggregate', + @step_id=2, + @cmdexec_success_code=0, + @on_success_action=3, + @on_success_step_id=0, + @on_fail_action=4, + @on_fail_step_id=4, + @retry_attempts=0, + @retry_interval=1, + @os_run_priority=0, @subsystem=N'TSQL', + @command=N' exec [dbo].[AggregatePerformancePoint]', + @database_name=N'ActiveSystemServer', + @output_file_name=NULL, + @flags=0, + @database_user_name=NULL, + @server=NULL, + @additional_parameters=NULL, + @proxy_id=NULL, + @proxy_name=NULL +IF (@@ERROR <> 0 OR @ReturnCode <> 0) GOTO QuitWithRollback +/* Add Step */ +EXEC @ReturnCode = msdb.dbo.sp_add_jobstep @job_id=@jobId, @step_name=N'Empty step for success', + @step_id=3, + @cmdexec_success_code=0, + @on_success_action=1, + @on_success_step_id=0, + @on_fail_action=4, + @on_fail_step_id=4, + @retry_attempts=0, + @retry_interval=0, + @os_run_priority=0, @subsystem=N'TSQL', + @command=N'/* Empty step */', + @database_name=N'master', + @output_file_name=NULL, + @flags=0, + @database_user_name=NULL, + @server=NULL, + @additional_parameters=NULL, + @proxy_id=NULL, + @proxy_name=NULL +IF (@@ERROR <> 0 OR @ReturnCode <> 0) GOTO QuitWithRollback +/* Add Step */ +EXEC @ReturnCode = msdb.dbo.sp_add_jobstep @job_id=@jobId, @step_name=N'Send email KO', + @step_id=4, + @cmdexec_success_code=0, + @on_success_action=2, + @on_success_step_id=0, + @on_fail_action=2, + @on_fail_step_id=0, + @retry_attempts=0, + @retry_interval=0, + @os_run_priority=0, @subsystem=N'TSQL', + @command=N'exec arizona.dbo.aps_Send_Mail_with_template + @in_param_varchar_2 = ''DBA_operator;'';', + @database_name=N'Arizona', + @output_file_name=NULL, + @flags=0, + @database_user_name=NULL, + @server=NULL, + @additional_parameters=NULL, + @proxy_id=NULL, + @proxy_name=NULL +IF (@@ERROR <> 0 OR @ReturnCode <> 0) GOTO QuitWithRollback +EXEC @ReturnCode = msdb.dbo.sp_update_job @job_id = @jobId, @start_step_id = 1 +IF (@@ERROR <> 0 OR @ReturnCode <> 0) GOTO QuitWithRollback + +/* Add Standard Schedule */ +EXEC @ReturnCode = msdb.dbo.sp_add_jobschedule @job_id=@jobId, @name=N'D00110-D', + @enabled=1, + @freq_type=4, + @freq_interval=1, + @freq_subday_type=1, + @freq_subday_interval=0, + @freq_relative_interval=0, + @freq_recurrence_factor=0, + @active_start_date=20150708, + @active_end_date=99991231, + @active_start_time=20000, + @active_end_time=235959 +IF (@@ERROR <> 0 OR @ReturnCode <> 0) GOTO QuitWithRollback + +/* Attach existing specific schedule for job */ +declare @enabled_schedule int, + @schedule_name nvarchar(50) +declare c_schedules cursor local forward_only static for +select enabled, name + from msdb.dbo.sysschedules + where name LIKE 'D00110%' + and name LIKE '%#SPEC#' + +open c_schedules + +FETCH NEXT FROM c_schedules into @enabled_schedule, @schedule_name +while @@fetch_status = 0 +begin + EXEC @ReturnCode = msdb.dbo.sp_attach_schedule @job_id = @jobId, @schedule_name=@schedule_name + IF(@enabled_schedule = 1) + begin + SET @schedule_name = SUBSTRING(@schedule_name,0,LEN(@schedule_name)-5) + IF EXISTS (select name from msdb.dbo.sysschedules where name = @schedule_name) + EXEC @ReturnCode = msdb.dbo.sp_update_schedule @name=@schedule_name, @enabled=0 + end + IF (@@ERROR <> 0 OR @ReturnCode <> 0) GOTO QuitWithRollback +FETCH NEXT FROM c_schedules into @enabled_schedule, @schedule_name +end + +close c_schedules + +deallocate c_schedules + +EXEC @ReturnCode = msdb.dbo.sp_add_jobserver @job_id = @jobId, @server_name = N'(local)' +IF (@@ERROR <> 0 OR @ReturnCode <> 0) GOTO QuitWithRollback +COMMIT TRANSACTION +GOTO EndSave +QuitWithRollback: + IF (@@TRANCOUNT > 0) ROLLBACK TRANSACTION +EndSave: + +GO diff --git a/TPDT-268 - ACP in task sequence/cp_triaOne_jobs/Pharmacy/D00120 - APH Connectic Check.sql b/TPDT-268 - ACP in task sequence/cp_triaOne_jobs/Pharmacy/D00120 - APH Connectic Check.sql new file mode 100644 index 0000000..eac4135 Binary files /dev/null and b/TPDT-268 - ACP in task sequence/cp_triaOne_jobs/Pharmacy/D00120 - APH Connectic Check.sql differ diff --git a/TPDT-268 - ACP in task sequence/cp_triaOne_jobs/Pharmacy/D00440 - Accounting Turnover Extraction.sql b/TPDT-268 - ACP in task sequence/cp_triaOne_jobs/Pharmacy/D00440 - Accounting Turnover Extraction.sql new file mode 100644 index 0000000..074b0a7 Binary files /dev/null and b/TPDT-268 - ACP in task sequence/cp_triaOne_jobs/Pharmacy/D00440 - Accounting Turnover Extraction.sql differ diff --git a/TPDT-268 - ACP in task sequence/cp_triaOne_jobs/Pharmacy/D00480 - ActivePos_read Snapshot.sql b/TPDT-268 - ACP in task sequence/cp_triaOne_jobs/Pharmacy/D00480 - ActivePos_read Snapshot.sql new file mode 100644 index 0000000..da411fe --- /dev/null +++ b/TPDT-268 - ACP in task sequence/cp_triaOne_jobs/Pharmacy/D00480 - ActivePos_read Snapshot.sql @@ -0,0 +1,196 @@ +/*Job only deploy once */ +IF EXISTS (SELECT job_id FROM msdb.dbo.sysjobs_view WHERE name = N'D00480 - ActivePos_read Snapshot') +RETURN + +/* Drop existing standard schedule for job */ +declare @schedule_id int +declare c_schedules cursor local forward_only static for + select ss.schedule_id + from msdb.dbo.sysjobschedules sjs +INNER JOIN msdb.dbo.sysschedules ss + ON sjs.schedule_id = ss.schedule_id + AND ss.name NOT LIKE '%#SPEC#' +INNER JOIN msdb.dbo.sysjobs sj + ON sjs.job_id = sj.job_id + WHERE sj.name = N'D00480 - ActivePos_read Snapshot' + +open c_schedules + +FETCH NEXT FROM c_schedules into @schedule_id +while @@fetch_status = 0 +begin + IF ((select COUNT(*) from msdb.dbo.sysjobschedules where schedule_id=@schedule_id) = 1) + EXEC msdb.dbo.sp_delete_schedule @schedule_id=@schedule_id, @force_delete = 1 +FETCH NEXT FROM c_schedules into @schedule_id +end + +close c_schedules + +deallocate c_schedules + +/* Creation Job and Steps*/ +BEGIN TRANSACTION +DECLARE @ReturnCode INT +SELECT @ReturnCode = 0 + +IF NOT EXISTS (SELECT name FROM msdb.dbo.syscategories WHERE name=N'REPL-Snapshot' AND category_class=1) +BEGIN +EXEC @ReturnCode = msdb.dbo.sp_add_category @class=N'JOB', @type=N'LOCAL', @name=N'REPL-Snapshot' +IF (@@ERROR <> 0 OR @ReturnCode <> 0) GOTO QuitWithRollback + +END + +/* Add Job */ +DECLARE @jobId BINARY(16) +EXEC @ReturnCode = msdb.dbo.sp_add_job @job_name=N'D00480 - ActivePos_read Snapshot', + @enabled=1, + @notify_level_eventlog=0, + @notify_level_email=0, + @notify_level_netsend=0, + @notify_level_page=0, + @delete_level=0, + @description=N'No description available.', + @category_name=N'REPL-Snapshot', + @start_step_id=1, + @owner_login_name=N'sa', @job_id = @jobId OUTPUT +IF (@@ERROR <> 0 OR @ReturnCode <> 0) GOTO QuitWithRollback + +/* Add Step */ +/* build command*/ +declare @cmd varchar(max) +, @distributor nvarchar(100) +SET @distributor = cast(serverproperty('ServerName') as nvarchar(100)) + +EXEC @ReturnCode = msdb.dbo.sp_add_jobstep @job_id=@jobId, @step_name=N'Snapshot Agent startup message.', + @step_id=1, + @cmdexec_success_code=0, + @on_success_action=3, + @on_success_step_id=0, + @on_fail_action=3, + @on_fail_step_id=0, + @retry_attempts=0, + @retry_interval=0, + @os_run_priority=0, @subsystem=N'TSQL', + @command=N'DECLARE @agentIDAPH int + +select @agentIDAPH = mssag.id from master.dbo.sysservers syssrv +join MSsnapshot_agents mssag on mssag.publisher_id = syssrv.srvid +where mssag.name = ''D00480 - ActivePos_read Snapshot'' + +exec sp_MSadd_snapshot_history @perfmon_increment = 0, @agent_id = @agentIDAPH, @runstatus = 1, +@comments = N''Starting agent.'' +', + @output_file_name=NULL, + @flags=0, + @database_user_name=NULL, + @server=@distributor, + @additional_parameters=NULL, + @proxy_id=NULL, + @proxy_name=NULL +IF (@@ERROR <> 0 OR @ReturnCode <> 0) GOTO QuitWithRollback +/* Add Step */ +SET @cmd = '-Publisher [' + @distributor+'] -PublisherDB [ActivePos_read] -Distributor ['+@distributor+'] -Publication [ActivePosTran] -DistributorSecurityMode 1' +EXEC @ReturnCode = msdb.dbo.sp_add_jobstep @job_id=@jobId, @step_name=N'Run agent.', + @step_id=2, + @cmdexec_success_code=0, + @on_success_action=1, + @on_success_step_id=0, + @on_fail_action=3, + @on_fail_step_id=0, + @retry_attempts=2, + @retry_interval=60, + @os_run_priority=0, @subsystem=N'Snapshot', + @command=@cmd, + @database_name=N'distribution', + @output_file_name=NULL, + @flags=0, + @database_user_name=NULL, + @server=@distributor, + @additional_parameters=NULL, + @proxy_id=NULL, + @proxy_name=N'[Repl][aphsqlrepl][ActivePos_read]' +IF (@@ERROR <> 0 OR @ReturnCode <> 0) GOTO QuitWithRollback +/* Add Step */ +EXEC @ReturnCode = msdb.dbo.sp_add_jobstep @job_id=@jobId, @step_name=N'Detect nonlogged agent shutdown.', + @step_id=3, + @cmdexec_success_code=0, + @on_success_action=2, + @on_success_step_id=0, + @on_fail_action=2, + @on_fail_step_id=0, + @retry_attempts=0, + @retry_interval=0, + @os_run_priority=0, @subsystem=N'TSQL', + @command=N'DECLARE @agentIDAPH int + +select @agentIDAPH = mssag.id from master.dbo.sysservers syssrv +join MSsnapshot_agents mssag on mssag.publisher_id = syssrv.srvid +where mssag.name = ''D00480 - ActivePos_read Snapshot'' + +exec sp_MSdetect_nonlogged_shutdown @subsystem = ''Snapshot'', @agent_id = @agentIDAPH +', + @database_name=N'distribution', + @output_file_name=NULL, + @flags=0, + @database_user_name=NULL, + @server=@distributor, + @additional_parameters=NULL, + @proxy_id=NULL, + @proxy_name=NULL +IF (@@ERROR <> 0 OR @ReturnCode <> 0) GOTO QuitWithRollback +EXEC @ReturnCode = msdb.dbo.sp_update_job @job_id = @jobId, @start_step_id = 1 +IF (@@ERROR <> 0 OR @ReturnCode <> 0) GOTO QuitWithRollback + +/* Add Standard Schedule */ +EXEC @ReturnCode = msdb.dbo.sp_add_jobschedule @job_id=@jobId, @name=N'D00480 - Daily at 06h30', + @enabled=1, + @freq_type=4, + @freq_interval=1, + @freq_subday_type=1, + @freq_subday_interval=1, + @freq_relative_interval=1, + @freq_recurrence_factor=0, + @active_start_date=20200113, + @active_end_date=99991231, + @active_start_time=63000, + @active_end_time=235959 +IF (@@ERROR <> 0 OR @ReturnCode <> 0) GOTO QuitWithRollback + +/* Attach existing specific schedule for job */ +declare @enabled_schedule int, + @schedule_name nvarchar(50) +declare c_schedules cursor local forward_only static for +select enabled, name + from msdb.dbo.sysschedules + where name LIKE 'D00480%' + and name LIKE '%#SPEC#' + +open c_schedules + +FETCH NEXT FROM c_schedules into @enabled_schedule, @schedule_name +while @@fetch_status = 0 +begin + EXEC @ReturnCode = msdb.dbo.sp_attach_schedule @job_id = @jobId, @schedule_name=@schedule_name + IF(@enabled_schedule = 1) + begin + SET @schedule_name = SUBSTRING(@schedule_name,0,LEN(@schedule_name)-5) + IF EXISTS (select name from msdb.dbo.sysschedules where name = @schedule_name) + EXEC @ReturnCode = msdb.dbo.sp_update_schedule @name=@schedule_name, @enabled=0 + end + IF (@@ERROR <> 0 OR @ReturnCode <> 0) GOTO QuitWithRollback +FETCH NEXT FROM c_schedules into @enabled_schedule, @schedule_name +end + +close c_schedules + +deallocate c_schedules + +EXEC @ReturnCode = msdb.dbo.sp_add_jobserver @job_id = @jobId, @server_name = N'(local)' +IF (@@ERROR <> 0 OR @ReturnCode <> 0) GOTO QuitWithRollback +COMMIT TRANSACTION +GOTO EndSave +QuitWithRollback: + IF (@@TRANCOUNT > 0) ROLLBACK TRANSACTION +EndSave: + +GO diff --git a/TPDT-268 - ACP in task sequence/cp_triaOne_jobs/Pharmacy/D91030 - Backup ActivePos_Read.sql b/TPDT-268 - ACP in task sequence/cp_triaOne_jobs/Pharmacy/D91030 - Backup ActivePos_Read.sql new file mode 100644 index 0000000..c5c113c Binary files /dev/null and b/TPDT-268 - ACP in task sequence/cp_triaOne_jobs/Pharmacy/D91030 - Backup ActivePos_Read.sql differ diff --git a/TPDT-268 - ACP in task sequence/cp_triaOne_jobs/Pharmacy/DR00090 - Nettoyage tables temporaires.sql b/TPDT-268 - ACP in task sequence/cp_triaOne_jobs/Pharmacy/DR00090 - Nettoyage tables temporaires.sql new file mode 100644 index 0000000..398811e Binary files /dev/null and b/TPDT-268 - ACP in task sequence/cp_triaOne_jobs/Pharmacy/DR00090 - Nettoyage tables temporaires.sql differ diff --git a/TPDT-268 - ACP in task sequence/cp_triaOne_jobs/Pharmacy/DR00450 - Correction of inventory.sql b/TPDT-268 - ACP in task sequence/cp_triaOne_jobs/Pharmacy/DR00450 - Correction of inventory.sql new file mode 100644 index 0000000..b2b2dba Binary files /dev/null and b/TPDT-268 - ACP in task sequence/cp_triaOne_jobs/Pharmacy/DR00450 - Correction of inventory.sql differ diff --git a/TPDT-268 - ACP in task sequence/cp_triaOne_jobs/Pharmacy/DR00460 - Mediset Calculation.sql b/TPDT-268 - ACP in task sequence/cp_triaOne_jobs/Pharmacy/DR00460 - Mediset Calculation.sql new file mode 100644 index 0000000..c2a2fdd --- /dev/null +++ b/TPDT-268 - ACP in task sequence/cp_triaOne_jobs/Pharmacy/DR00460 - Mediset Calculation.sql @@ -0,0 +1,207 @@ + +/* Drop existing standard schedule for job */ +declare @schedule_id int +declare c_schedules cursor local forward_only static for + select ss.schedule_id + from msdb.dbo.sysjobschedules sjs +INNER JOIN msdb.dbo.sysschedules ss + ON sjs.schedule_id = ss.schedule_id + AND ss.name NOT LIKE '%#SPEC#' +INNER JOIN msdb.dbo.sysjobs sj + ON sjs.job_id = sj.job_id + WHERE sj.name = N'DR00460 - Mediset Calculation' + +open c_schedules + +FETCH NEXT FROM c_schedules into @schedule_id +while @@fetch_status = 0 +begin + IF ((select COUNT(*) from msdb.dbo.sysjobschedules where schedule_id=@schedule_id) = 1) + EXEC msdb.dbo.sp_delete_schedule @schedule_id=@schedule_id, @force_delete = 1 +FETCH NEXT FROM c_schedules into @schedule_id +end + +close c_schedules + +deallocate c_schedules + +IF EXISTS (SELECT job_id FROM msdb.dbo.sysjobs_view WHERE name = N'DR00460 - Mediset Calculation') +EXEC msdb.dbo.sp_delete_job @job_name = N'DR00460 - Mediset Calculation', @delete_unused_schedule=0 +GO + +/* Creation Job and Steps*/ +BEGIN TRANSACTION +DECLARE @ReturnCode INT +SELECT @ReturnCode = 0 + +IF NOT EXISTS (SELECT name FROM msdb.dbo.syscategories WHERE name=N'TPH-Business' AND category_class=1) +BEGIN +EXEC @ReturnCode = msdb.dbo.sp_add_category @class=N'JOB', @type=N'LOCAL', @name=N'TPH-Business' +IF (@@ERROR <> 0 OR @ReturnCode <> 0) GOTO QuitWithRollback + +END + +/* Add Job */ +DECLARE @jobId BINARY(16) +EXEC @ReturnCode = msdb.dbo.sp_add_job @job_name=N'DR00460 - Mediset Calculation', + @enabled=1, + @notify_level_eventlog=2, + @notify_level_email=0, + @notify_level_netsend=0, + @notify_level_page=0, + @delete_level=0, + @description=N'Calculation des Stocks pour les Articles Médiset (Père - Fils). +FLA 22.10.2018 : Standardisation du job +SPE 17.01.2020 : Modification du schedule (fin a minuit) +FLA 17.03.2022 : Change DBA mail +RTC 13.03.2023 : OCTPDBA-473 Update schedule from every 1 minutes to every 8 hours', + @category_name=N'TPH-Business', + @start_step_id=1, + @owner_login_name=N'sa', @job_id = @jobId OUTPUT +IF (@@ERROR <> 0 OR @ReturnCode <> 0) GOTO QuitWithRollback + +/* Add Step */ +EXEC @ReturnCode = msdb.dbo.sp_add_jobstep @job_id=@jobId, @step_name=N'Empty step', + @step_id=1, + @cmdexec_success_code=0, + @on_success_action=3, + @on_success_step_id=0, + @on_fail_action=3, + @on_fail_step_id=0, + @retry_attempts=0, + @retry_interval=0, + @os_run_priority=0, @subsystem=N'TSQL', + @command=N'/* Empty step */ + +', + @database_name=N'master', + @output_file_name=NULL, + @flags=0, + @database_user_name=NULL, + @server=NULL, + @additional_parameters=NULL, + @proxy_id=NULL, + @proxy_name=NULL +IF (@@ERROR <> 0 OR @ReturnCode <> 0) GOTO QuitWithRollback +/* Add Step */ +EXEC @ReturnCode = msdb.dbo.sp_add_jobstep @job_id=@jobId, @step_name=N'Execute aps_Stock_Transfer_3', + @step_id=2, + @cmdexec_success_code=0, + @on_success_action=3, + @on_success_step_id=0, + @on_fail_action=4, + @on_fail_step_id=4, + @retry_attempts=0, + @retry_interval=1, + @os_run_priority=0, @subsystem=N'TSQL', + @command=N'EXEC [dbo].[aps_Mediset_Calculation]', + @database_name=N'Arizona', + @output_file_name=NULL, + @flags=0, + @database_user_name=NULL, + @server=NULL, + @additional_parameters=NULL, + @proxy_id=NULL, + @proxy_name=NULL +IF (@@ERROR <> 0 OR @ReturnCode <> 0) GOTO QuitWithRollback +/* Add Step */ +EXEC @ReturnCode = msdb.dbo.sp_add_jobstep @job_id=@jobId, @step_name=N'Empty step for success', + @step_id=3, + @cmdexec_success_code=0, + @on_success_action=1, + @on_success_step_id=0, + @on_fail_action=4, + @on_fail_step_id=4, + @retry_attempts=0, + @retry_interval=0, + @os_run_priority=0, @subsystem=N'TSQL', + @command=N'/* Empty step */ +exec Get_Job_Error_Info @in_JobName = ''DR00460 - Mediset Calculation'', @in_Recipients = ''DBA_operator'' +EXEC [mon].[Maj_Jobs_Status] @in_JobID = $(ESCAPE_SQUOTE(JOBID))', + @database_name=N'HCITools', + @output_file_name=NULL, + @flags=0, + @database_user_name=NULL, + @server=NULL, + @additional_parameters=NULL, + @proxy_id=NULL, + @proxy_name=NULL +IF (@@ERROR <> 0 OR @ReturnCode <> 0) GOTO QuitWithRollback +/* Add Step */ +EXEC @ReturnCode = msdb.dbo.sp_add_jobstep @job_id=@jobId, @step_name=N'Send email KO', + @step_id=4, + @cmdexec_success_code=0, + @on_success_action=2, + @on_success_step_id=0, + @on_fail_action=2, + @on_fail_step_id=0, + @retry_attempts=0, + @retry_interval=0, + @os_run_priority=0, @subsystem=N'TSQL', + @command=N'exec Get_Job_Error_Info @in_JobName = ''DR00460 - Mediset Calculation'', @in_Recipients = ''DBA_operator'' +EXEC [mon].[Maj_Jobs_Status] @in_JobID = $(ESCAPE_SQUOTE(JOBID))', + @database_name=N'HCITools', + @output_file_name=NULL, + @flags=0, + @database_user_name=NULL, + @server=NULL, + @additional_parameters=NULL, + @proxy_id=NULL, + @proxy_name=NULL +IF (@@ERROR <> 0 OR @ReturnCode <> 0) GOTO QuitWithRollback +EXEC @ReturnCode = msdb.dbo.sp_update_job @job_id = @jobId, @start_step_id = 1 +IF (@@ERROR <> 0 OR @ReturnCode <> 0) GOTO QuitWithRollback + +/* Add Standard Schedule */ +EXEC @ReturnCode = msdb.dbo.sp_add_jobschedule @job_id=@jobId, @name=N'DR00460-DR', + @enabled=1, + @freq_type=4, + @freq_interval=1, + @freq_subday_type=8, + @freq_subday_interval=8, + @freq_relative_interval=0, + @freq_recurrence_factor=0, + @active_start_date=20090924, + @active_end_date=99991231, + @active_start_time=70000, + @active_end_time=235959 +IF (@@ERROR <> 0 OR @ReturnCode <> 0) GOTO QuitWithRollback + +/* Attach existing specific schedule for job */ +declare @enabled_schedule int, + @schedule_name nvarchar(50) +declare c_schedules cursor local forward_only static for +select enabled, name + from msdb.dbo.sysschedules + where name LIKE 'DR00460%' + and name LIKE '%#SPEC#' + +open c_schedules + +FETCH NEXT FROM c_schedules into @enabled_schedule, @schedule_name +while @@fetch_status = 0 +begin + EXEC @ReturnCode = msdb.dbo.sp_attach_schedule @job_id = @jobId, @schedule_name=@schedule_name + IF(@enabled_schedule = 1) + begin + SET @schedule_name = SUBSTRING(@schedule_name,0,LEN(@schedule_name)-5) + IF EXISTS (select name from msdb.dbo.sysschedules where name = @schedule_name) + EXEC @ReturnCode = msdb.dbo.sp_update_schedule @name=@schedule_name, @enabled=0 + end + IF (@@ERROR <> 0 OR @ReturnCode <> 0) GOTO QuitWithRollback +FETCH NEXT FROM c_schedules into @enabled_schedule, @schedule_name +end + +close c_schedules + +deallocate c_schedules + +EXEC @ReturnCode = msdb.dbo.sp_add_jobserver @job_id = @jobId, @server_name = N'(local)' +IF (@@ERROR <> 0 OR @ReturnCode <> 0) GOTO QuitWithRollback +COMMIT TRANSACTION +GOTO EndSave +QuitWithRollback: + IF (@@TRANCOUNT > 0) ROLLBACK TRANSACTION +EndSave: + +GO diff --git a/TPDT-268 - ACP in task sequence/cp_triaOne_jobs/Pharmacy/DR00470 - ActivePos_read Log reader.sql b/TPDT-268 - ACP in task sequence/cp_triaOne_jobs/Pharmacy/DR00470 - ActivePos_read Log reader.sql new file mode 100644 index 0000000..67f14b3 Binary files /dev/null and b/TPDT-268 - ACP in task sequence/cp_triaOne_jobs/Pharmacy/DR00470 - ActivePos_read Log reader.sql differ diff --git a/TPDT-268 - ACP in task sequence/cp_triaOne_jobs/Pharmacy/DR70020 - Launch APSSynchroLoad.sql b/TPDT-268 - ACP in task sequence/cp_triaOne_jobs/Pharmacy/DR70020 - Launch APSSynchroLoad.sql new file mode 100644 index 0000000..92eb5df Binary files /dev/null and b/TPDT-268 - ACP in task sequence/cp_triaOne_jobs/Pharmacy/DR70020 - Launch APSSynchroLoad.sql differ diff --git a/TPDT-268 - ACP in task sequence/cp_triaOne_jobs/Pharmacy/Distribution clean up distribution.sql b/TPDT-268 - ACP in task sequence/cp_triaOne_jobs/Pharmacy/Distribution clean up distribution.sql new file mode 100644 index 0000000..b988b14 --- /dev/null +++ b/TPDT-268 - ACP in task sequence/cp_triaOne_jobs/Pharmacy/Distribution clean up distribution.sql @@ -0,0 +1,91 @@ + +IF EXISTS (SELECT job_id FROM msdb.dbo.sysjobs_view WHERE name = 'Distribution clean up: distribution') +EXEC msdb.dbo.sp_delete_job @job_name=N'Distribution clean up: distribution', @delete_unused_schedule=1 +GO + +BEGIN TRANSACTION +DECLARE @ReturnCode INT +SELECT @ReturnCode = 0 +/****** Object: JobCategory [REPL-Distribution Cleanup] Script Date: 06/10/2015 16:17:33 ******/ +IF NOT EXISTS (SELECT name FROM msdb.dbo.syscategories WHERE name=N'REPL-Distribution Cleanup' AND category_class=1) +BEGIN +EXEC @ReturnCode = msdb.dbo.sp_add_category @class=N'JOB', @type=N'LOCAL', @name=N'REPL-Distribution Cleanup' +IF (@@ERROR <> 0 OR @ReturnCode <> 0) GOTO QuitWithRollback + +END + +DECLARE @jobId BINARY(16) +EXEC @ReturnCode = msdb.dbo.sp_add_job @job_name=N'Distribution clean up: distribution', + @enabled=1, + @notify_level_eventlog=0, + @notify_level_email=0, + @notify_level_netsend=0, + @notify_level_page=0, + @delete_level=0, + @description=N'Removes replicated transactions from the distribution database.', + @category_name=N'REPL-Distribution Cleanup', + @owner_login_name=N'sa', @job_id = @jobId OUTPUT +IF (@@ERROR <> 0 OR @ReturnCode <> 0) GOTO QuitWithRollback +/****** Object: Step [Run agent.] Script Date: 06/10/2015 16:17:34 ******/ +EXEC @ReturnCode = msdb.dbo.sp_add_jobstep @job_id=@jobId, @step_name=N'Run agent.', + @step_id=1, + @cmdexec_success_code=0, + @on_success_action=1, + @on_success_step_id=0, + @on_fail_action=2, + @on_fail_step_id=0, + @retry_attempts=0, + @retry_interval=0, + @os_run_priority=0, @subsystem=N'TSQL', + @command=N'EXEC dbo.sp_MSdistribution_cleanup @min_distretention = 0, @max_distretention = 72', + @database_name=N'distribution', + @flags=0 +IF (@@ERROR <> 0 OR @ReturnCode <> 0) GOTO QuitWithRollback +EXEC @ReturnCode = msdb.dbo.sp_update_job @job_id = @jobId, @start_step_id = 1 +IF (@@ERROR <> 0 OR @ReturnCode <> 0) GOTO QuitWithRollback +EXEC @ReturnCode = msdb.dbo.sp_add_jobschedule @job_id=@jobId, @name=N'Replication agent schedule.', + @enabled=1, + @freq_type=4, + @freq_interval=1, + @freq_subday_type=4, + @freq_subday_interval=10, + @freq_relative_interval=1, + @freq_recurrence_factor=0, + @active_start_date=20140929, + @active_end_date=99991231, + @active_start_time=500, + @active_end_time=459 +IF (@@ERROR <> 0 OR @ReturnCode <> 0) GOTO QuitWithRollback +EXEC @ReturnCode = msdb.dbo.sp_add_jobserver @job_id = @jobId, @server_name = N'(local)' +IF (@@ERROR <> 0 OR @ReturnCode <> 0) GOTO QuitWithRollback +COMMIT TRANSACTION +GOTO EndSave +QuitWithRollback: + IF (@@TRANCOUNT > 0) ROLLBACK TRANSACTION +EndSave: + +GO + +/* Create operator and add it to the job */ +IF NOT EXISTS (SELECT name FROM msdb.dbo.sysoperators WHERE name = N'DBA') +BEGIN + + EXEC msdb.dbo.sp_add_operator @name=N'DBA', + @enabled=1, + @weekday_pager_start_time=90000, + @weekday_pager_end_time=180000, + @saturday_pager_start_time=90000, + @saturday_pager_end_time=180000, + @sunday_pager_start_time=90000, + @sunday_pager_end_time=180000, + @pager_days=0, + @email_address=N'_hci_dba@hcisolutions.ch', + @category_name=N'[Uncategorized]' + + EXEC msdb.dbo.sp_update_job @job_name=N'Distribution clean up: distribution', + @notify_level_email=2, + @notify_level_netsend=2, + @notify_level_page=2, + @notify_email_operator_name=N'DBA' +END +GO diff --git a/TPDT-268 - ACP in task sequence/cp_triaOne_jobs/Pharmacy/Reinitialize subscriptions having data validation failures.sql b/TPDT-268 - ACP in task sequence/cp_triaOne_jobs/Pharmacy/Reinitialize subscriptions having data validation failures.sql new file mode 100644 index 0000000..bb49ab4 Binary files /dev/null and b/TPDT-268 - ACP in task sequence/cp_triaOne_jobs/Pharmacy/Reinitialize subscriptions having data validation failures.sql differ diff --git a/TPDT-268 - ACP in task sequence/cp_triaOne_jobs/Pharmacy/Replication monitoring refresher for distribution.sql b/TPDT-268 - ACP in task sequence/cp_triaOne_jobs/Pharmacy/Replication monitoring refresher for distribution.sql new file mode 100644 index 0000000..7a89ea8 --- /dev/null +++ b/TPDT-268 - ACP in task sequence/cp_triaOne_jobs/Pharmacy/Replication monitoring refresher for distribution.sql @@ -0,0 +1,68 @@ + +IF EXISTS (SELECT job_id FROM msdb.dbo.sysjobs_view WHERE name = 'Replication monitoring refresher for distribution.') +EXEC msdb.dbo.sp_delete_job @job_name=N'Replication monitoring refresher for distribution.', @delete_unused_schedule=1 +GO + +BEGIN TRANSACTION +DECLARE @ReturnCode INT +SELECT @ReturnCode = 0 +/****** Object: JobCategory [REPL-Alert Response] Script Date: 06/12/2015 10:07:01 ******/ +IF NOT EXISTS (SELECT name FROM msdb.dbo.syscategories WHERE name=N'REPL-Alert Response' AND category_class=1) +BEGIN +EXEC @ReturnCode = msdb.dbo.sp_add_category @class=N'JOB', @type=N'LOCAL', @name=N'REPL-Alert Response' +IF (@@ERROR <> 0 OR @ReturnCode <> 0) GOTO QuitWithRollback + +END + +DECLARE @jobId BINARY(16) +EXEC @ReturnCode = msdb.dbo.sp_add_job @job_name=N'Replication monitoring refresher for distribution.', + @enabled=0, + @notify_level_eventlog=0, + @notify_level_email=0, + @notify_level_netsend=0, + @notify_level_page=0, + @delete_level=0, + @description=N'Replication monitoring refresher for distribution.', + @category_name=N'REPL-Alert Response', + @owner_login_name=N'sa', @job_id = @jobId OUTPUT +IF (@@ERROR <> 0 OR @ReturnCode <> 0) GOTO QuitWithRollback +/****** Object: Step [Run agent.] Script Date: 06/12/2015 10:07:01 ******/ +EXEC @ReturnCode = msdb.dbo.sp_add_jobstep @job_id=@jobId, @step_name=N'Run agent.', + @step_id=1, + @cmdexec_success_code=0, + @on_success_action=1, + @on_success_step_id=0, + @on_fail_action=2, + @on_fail_step_id=0, + @retry_attempts=2147483647, + @retry_interval=1, + @os_run_priority=0, @subsystem=N'TSQL', + @command=N'exec dbo.sp_replmonitorrefreshjob ', + @database_name=N'distribution', + @flags=0 +IF (@@ERROR <> 0 OR @ReturnCode <> 0) GOTO QuitWithRollback +EXEC @ReturnCode = msdb.dbo.sp_update_job @job_id = @jobId, @start_step_id = 1 +IF (@@ERROR <> 0 OR @ReturnCode <> 0) GOTO QuitWithRollback +DECLARE @schedule_id int +EXEC @ReturnCode = msdb.dbo.sp_add_jobschedule @job_id=@jobId, @name=N'Replication agent schedule.', + @enabled=1, + @freq_type=64, + @freq_interval=0, + @freq_subday_type=0, + @freq_subday_interval=0, + @freq_relative_interval=0, + @freq_recurrence_factor=0, + @active_start_date=20150202, + @active_end_date=99991231, + @active_start_time=0, + @active_end_time=235959, @schedule_id = @schedule_id OUTPUT +select @schedule_id +IF (@@ERROR <> 0 OR @ReturnCode <> 0) GOTO QuitWithRollback +EXEC @ReturnCode = msdb.dbo.sp_add_jobserver @job_id = @jobId, @server_name = N'(local)' +IF (@@ERROR <> 0 OR @ReturnCode <> 0) GOTO QuitWithRollback +COMMIT TRANSACTION +GOTO EndSave +QuitWithRollback: + IF (@@TRANCOUNT > 0) ROLLBACK TRANSACTION +EndSave: +GO diff --git a/TPDT-268 - ACP in task sequence/cp_triaOne_jobs/Pharmacy/SUNSTORE/M00401 - Insertion des prix moyens ponderes.sql b/TPDT-268 - ACP in task sequence/cp_triaOne_jobs/Pharmacy/SUNSTORE/M00401 - Insertion des prix moyens ponderes.sql new file mode 100644 index 0000000..468d5de Binary files /dev/null and b/TPDT-268 - ACP in task sequence/cp_triaOne_jobs/Pharmacy/SUNSTORE/M00401 - Insertion des prix moyens ponderes.sql differ diff --git a/TPDT-268 - ACP in task sequence/cp_triaOne_jobs/Pharmacy/SUNSTORE/W00371 - Calculation LORE.sql b/TPDT-268 - ACP in task sequence/cp_triaOne_jobs/Pharmacy/SUNSTORE/W00371 - Calculation LORE.sql new file mode 100644 index 0000000..0c28a27 Binary files /dev/null and b/TPDT-268 - ACP in task sequence/cp_triaOne_jobs/Pharmacy/SUNSTORE/W00371 - Calculation LORE.sql differ diff --git a/TPDT-268 - ACP in task sequence/cp_triaOne_jobs/Pharmacy/SUNSTORE/W00481 - Calcul de la rotation LoRe ABC.sql b/TPDT-268 - ACP in task sequence/cp_triaOne_jobs/Pharmacy/SUNSTORE/W00481 - Calcul de la rotation LoRe ABC.sql new file mode 100644 index 0000000..e257174 Binary files /dev/null and b/TPDT-268 - ACP in task sequence/cp_triaOne_jobs/Pharmacy/SUNSTORE/W00481 - Calcul de la rotation LoRe ABC.sql differ diff --git a/TPDT-268 - ACP in task sequence/cp_triaOne_jobs/Pharmacy/SUNSTORE/_D00181 - Ticino - Update or insert records of text in substitution language.sql b/TPDT-268 - ACP in task sequence/cp_triaOne_jobs/Pharmacy/SUNSTORE/_D00181 - Ticino - Update or insert records of text in substitution language.sql new file mode 100644 index 0000000..5598eb2 Binary files /dev/null and b/TPDT-268 - ACP in task sequence/cp_triaOne_jobs/Pharmacy/SUNSTORE/_D00181 - Ticino - Update or insert records of text in substitution language.sql differ diff --git a/TPDT-268 - ACP in task sequence/cp_triaOne_jobs/Pharmacy/SUNSTORE/_D00191 - Desactivate Item_context_status for ITCOSTA_code = 9.sql b/TPDT-268 - ACP in task sequence/cp_triaOne_jobs/Pharmacy/SUNSTORE/_D00191 - Desactivate Item_context_status for ITCOSTA_code = 9.sql new file mode 100644 index 0000000..c796a58 Binary files /dev/null and b/TPDT-268 - ACP in task sequence/cp_triaOne_jobs/Pharmacy/SUNSTORE/_D00191 - Desactivate Item_context_status for ITCOSTA_code = 9.sql differ diff --git a/TPDT-268 - ACP in task sequence/cp_triaOne_jobs/Pharmacy/SUNSTORE/_D00201 - APS_Sync_After Compteurs Documents.sql b/TPDT-268 - ACP in task sequence/cp_triaOne_jobs/Pharmacy/SUNSTORE/_D00201 - APS_Sync_After Compteurs Documents.sql new file mode 100644 index 0000000..73ce7d9 Binary files /dev/null and b/TPDT-268 - ACP in task sequence/cp_triaOne_jobs/Pharmacy/SUNSTORE/_D00201 - APS_Sync_After Compteurs Documents.sql differ diff --git a/TPDT-268 - ACP in task sequence/cp_triaOne_jobs/Pharmacy/SUNSTORE/_D00211 - APS_Create ADK type 5 for Customers.sql b/TPDT-268 - ACP in task sequence/cp_triaOne_jobs/Pharmacy/SUNSTORE/_D00211 - APS_Create ADK type 5 for Customers.sql new file mode 100644 index 0000000..29c64d2 Binary files /dev/null and b/TPDT-268 - ACP in task sequence/cp_triaOne_jobs/Pharmacy/SUNSTORE/_D00211 - APS_Create ADK type 5 for Customers.sql differ diff --git a/TPDT-268 - ACP in task sequence/cp_triaOne_jobs/Pharmacy/SUNSTORE/_D00361 - Check of CLR.sql b/TPDT-268 - ACP in task sequence/cp_triaOne_jobs/Pharmacy/SUNSTORE/_D00361 - Check of CLR.sql new file mode 100644 index 0000000..63a4e02 Binary files /dev/null and b/TPDT-268 - ACP in task sequence/cp_triaOne_jobs/Pharmacy/SUNSTORE/_D00361 - Check of CLR.sql differ diff --git a/TPDT-268 - ACP in task sequence/cp_triaOne_jobs/Pharmacy/SUNSTORE/_D00411 - LORE, mise à jour des articles.sql b/TPDT-268 - ACP in task sequence/cp_triaOne_jobs/Pharmacy/SUNSTORE/_D00411 - LORE, mise à jour des articles.sql new file mode 100644 index 0000000..eba7892 Binary files /dev/null and b/TPDT-268 - ACP in task sequence/cp_triaOne_jobs/Pharmacy/SUNSTORE/_D00411 - LORE, mise à jour des articles.sql differ diff --git a/TPDT-268 - ACP in task sequence/cp_triaOne_jobs/Pharmacy/SUNSTORE/__D00011 - Before working hours.sql b/TPDT-268 - ACP in task sequence/cp_triaOne_jobs/Pharmacy/SUNSTORE/__D00011 - Before working hours.sql new file mode 100644 index 0000000..db36d5e Binary files /dev/null and b/TPDT-268 - ACP in task sequence/cp_triaOne_jobs/Pharmacy/SUNSTORE/__D00011 - Before working hours.sql differ diff --git a/TPDT-268 - ACP in task sequence/cp_triaOne_jobs/Pharmacy/SUNSTORE/__D00021 - After working hours.sql b/TPDT-268 - ACP in task sequence/cp_triaOne_jobs/Pharmacy/SUNSTORE/__D00021 - After working hours.sql new file mode 100644 index 0000000..321e977 Binary files /dev/null and b/TPDT-268 - ACP in task sequence/cp_triaOne_jobs/Pharmacy/SUNSTORE/__D00021 - After working hours.sql differ diff --git a/TPDT-268 - ACP in task sequence/cp_triaOne_jobs/Pharmacy/YR00520 - Create missing standard costs.sql b/TPDT-268 - ACP in task sequence/cp_triaOne_jobs/Pharmacy/YR00520 - Create missing standard costs.sql new file mode 100644 index 0000000..69ad5ab Binary files /dev/null and b/TPDT-268 - ACP in task sequence/cp_triaOne_jobs/Pharmacy/YR00520 - Create missing standard costs.sql differ diff --git a/TPDT-268 - ACP in task sequence/cp_triaOne_jobs/Pharmacy/_95010 - Set closing time at midnight for today only.sql b/TPDT-268 - ACP in task sequence/cp_triaOne_jobs/Pharmacy/_95010 - Set closing time at midnight for today only.sql new file mode 100644 index 0000000..5ee72f1 Binary files /dev/null and b/TPDT-268 - ACP in task sequence/cp_triaOne_jobs/Pharmacy/_95010 - Set closing time at midnight for today only.sql differ diff --git a/TPDT-268 - ACP in task sequence/cp_triaOne_jobs/Pharmacy/_D00050 - Address update.sql b/TPDT-268 - ACP in task sequence/cp_triaOne_jobs/Pharmacy/_D00050 - Address update.sql new file mode 100644 index 0000000..399a3d9 Binary files /dev/null and b/TPDT-268 - ACP in task sequence/cp_triaOne_jobs/Pharmacy/_D00050 - Address update.sql differ diff --git a/TPDT-268 - ACP in task sequence/cp_triaOne_jobs/Pharmacy/_D00060 - APS_DH_locking.sql b/TPDT-268 - ACP in task sequence/cp_triaOne_jobs/Pharmacy/_D00060 - APS_DH_locking.sql new file mode 100644 index 0000000..854fbc8 Binary files /dev/null and b/TPDT-268 - ACP in task sequence/cp_triaOne_jobs/Pharmacy/_D00060 - APS_DH_locking.sql differ diff --git a/TPDT-268 - ACP in task sequence/cp_triaOne_jobs/Pharmacy/_D00080 - Load denormalized tables for Item search.sql b/TPDT-268 - ACP in task sequence/cp_triaOne_jobs/Pharmacy/_D00080 - Load denormalized tables for Item search.sql new file mode 100644 index 0000000..d11cff0 Binary files /dev/null and b/TPDT-268 - ACP in task sequence/cp_triaOne_jobs/Pharmacy/_D00080 - Load denormalized tables for Item search.sql differ diff --git a/TPDT-268 - ACP in task sequence/cp_triaOne_jobs/Pharmacy/_D00260 - Cloture des renouvelables.sql b/TPDT-268 - ACP in task sequence/cp_triaOne_jobs/Pharmacy/_D00260 - Cloture des renouvelables.sql new file mode 100644 index 0000000..683743a Binary files /dev/null and b/TPDT-268 - ACP in task sequence/cp_triaOne_jobs/Pharmacy/_D00260 - Cloture des renouvelables.sql differ diff --git a/TPDT-268 - ACP in task sequence/cp_triaOne_jobs/Pharmacy/_D00340 - LkdSrv - Prefac.sql b/TPDT-268 - ACP in task sequence/cp_triaOne_jobs/Pharmacy/_D00340 - LkdSrv - Prefac.sql new file mode 100644 index 0000000..1ea7ea7 --- /dev/null +++ b/TPDT-268 - ACP in task sequence/cp_triaOne_jobs/Pharmacy/_D00340 - LkdSrv - Prefac.sql @@ -0,0 +1,285 @@ +/* Drop existing standard schedule for job */ +declare @schedule_id int +declare c_schedules cursor local forward_only static for + select ss.schedule_id + from msdb.dbo.sysjobschedules sjs +INNER JOIN msdb.dbo.sysschedules ss + ON sjs.schedule_id = ss.schedule_id + AND ss.name NOT LIKE '%#SPEC#' +INNER JOIN msdb.dbo.sysjobs sj + ON sjs.job_id = sj.job_id + WHERE sj.name = N'_D00340 - LkdSrv - Prefac' + +open c_schedules + +FETCH NEXT FROM c_schedules into @schedule_id +while @@fetch_status = 0 +begin + IF ((select COUNT(*) from msdb.dbo.sysjobschedules where schedule_id=@schedule_id) = 1) + EXEC msdb.dbo.sp_delete_schedule @schedule_id=@schedule_id, @force_delete = 1 +FETCH NEXT FROM c_schedules into @schedule_id +end + +close c_schedules + +deallocate c_schedules + +IF EXISTS (SELECT job_id FROM msdb.dbo.sysjobs_view WHERE name = N'_D00340 - LkdSrv - Prefac') +EXEC msdb.dbo.sp_delete_job @job_name = N'_D00340 - LkdSrv - Prefac', @delete_unused_schedule=0 +GO + +/* Creation Job and Steps*/ +BEGIN TRANSACTION +DECLARE @ReturnCode INT +SELECT @ReturnCode = 0 + +IF NOT EXISTS (SELECT name FROM msdb.dbo.syscategories WHERE name=N'TPH-Business' AND category_class=1) +BEGIN +EXEC @ReturnCode = msdb.dbo.sp_add_category @class=N'JOB', @type=N'LOCAL', @name=N'TPH-Business' +IF (@@ERROR <> 0 OR @ReturnCode <> 0) GOTO QuitWithRollback + +END + +/* Add Job */ +DECLARE @jobId BINARY(16) +EXEC @ReturnCode = msdb.dbo.sp_add_job @job_name=N'_D00340 - LkdSrv - Prefac', + @enabled=1, + @notify_level_eventlog=2, + @notify_level_email=0, + @notify_level_netsend=0, + @notify_level_page=0, + @delete_level=0, + @description=N'27.10.2017 - FLA - Job standardisé +26.03.2018 - FLA - Ajout du step aps_PH_Automatic_Billing_Launcher +25.08.2023 - SPE - Retrait du step 4 aps_sp_olpFACT_Extraction +28.09.2023 - FLA - ajout du step 4 aps_sp_olpFACT_Extraction', + @category_name=N'TPH-Business', + @start_step_id=1, + @owner_login_name=N'sa', @job_id = @jobId OUTPUT +IF (@@ERROR <> 0 OR @ReturnCode <> 0) GOTO QuitWithRollback + +/* Add Step */ +EXEC @ReturnCode = msdb.dbo.sp_add_jobstep @job_id=@jobId, @step_name=N'Empty step', + @step_id=1, + @cmdexec_success_code=0, + @on_success_action=3, + @on_success_step_id=0, + @on_fail_action=3, + @on_fail_step_id=0, + @retry_attempts=0, + @retry_interval=0, + @os_run_priority=0, @subsystem=N'TSQL', + @command=N'/* Empty step */ + ', + @database_name=N'master', + @output_file_name=NULL, + @flags=0, + @database_user_name=NULL, + @server=NULL, + @additional_parameters=NULL, + @proxy_id=NULL, + @proxy_name=NULL +IF (@@ERROR <> 0 OR @ReturnCode <> 0) GOTO QuitWithRollback +/* Add Step */ +EXEC @ReturnCode = msdb.dbo.sp_add_jobstep @job_id=@jobId, @step_name=N'aps_sp_olpFACT_GAL_Automatic_Billing', + @step_id=2, + @cmdexec_success_code=0, + @on_success_action=3, + @on_success_step_id=0, + @on_fail_action=4, + @on_fail_step_id=8, + @retry_attempts=0, + @retry_interval=0, + @os_run_priority=0, @subsystem=N'TSQL', + @command=N'EXEC aps_sp_olpFACT_GAL_Automatic_Billing + 1 + , NULL + , ''HCI_Facturation'' + , ''HCI_Facturation'' + , ''HCI_Facturation'' + , ''HCI_Facturation'' + , NULL +;', + @database_name=N'ArizonaCUST', + @output_file_name=NULL, + @flags=0, + @database_user_name=NULL, + @server=NULL, + @additional_parameters=NULL, + @proxy_id=NULL, + @proxy_name=NULL +IF (@@ERROR <> 0 OR @ReturnCode <> 0) GOTO QuitWithRollback +/* Add Step */ +EXEC @ReturnCode = msdb.dbo.sp_add_jobstep @job_id=@jobId, @step_name=N'aps_PH_Automatic_Billing_Launcher', + @step_id=3, + @cmdexec_success_code=0, + @on_success_action=3, + @on_success_step_id=0, + @on_fail_action=4, + @on_fail_step_id=8, + @retry_attempts=0, + @retry_interval=0, + @os_run_priority=0, @subsystem=N'TSQL', + @command=N'exec aps_PH_Automatic_Billing_Launcher @in_debug = NULL', + @database_name=N'Arizona', + @output_file_name=NULL, + @flags=0, + @database_user_name=NULL, + @server=NULL, + @additional_parameters=NULL, + @proxy_id=NULL, + @proxy_name=NULL +IF (@@ERROR <> 0 OR @ReturnCode <> 0) GOTO QuitWithRollback +/* Add Step */ +EXEC @ReturnCode = msdb.dbo.sp_add_jobstep @job_id=@jobId, @step_name=N'aps_sp_OLPFACT_Extraction', + @step_id=4, + @cmdexec_success_code=0, + @on_success_action=3, + @on_success_step_id=0, + @on_fail_action=4, + @on_fail_step_id=8, + @retry_attempts=0, + @retry_interval=0, + @os_run_priority=0, @subsystem=N'TSQL', + @command=N' +exec aps_sp_OLPFACT_Extraction + +@JobType = 1 ; + +', + @database_name=N'ArizonaCUST', + @output_file_name=NULL, + @flags=0, + @database_user_name=NULL, + @server=NULL, + @additional_parameters=NULL, + @proxy_id=NULL, + @proxy_name=NULL +IF (@@ERROR <> 0 OR @ReturnCode <> 0) GOTO QuitWithRollback +/* Add Step */ +EXEC @ReturnCode = msdb.dbo.sp_add_jobstep @job_id=@jobId, @step_name=N'Calcul_KPI_FAKTURO', + @step_id=5, + @cmdexec_success_code=0, + @on_success_action=3, + @on_success_step_id=0, + @on_fail_action=4, + @on_fail_step_id=8, + @retry_attempts=0, + @retry_interval=0, + @os_run_priority=0, @subsystem=N'TSQL', + @command=N'exec aps_sp_calcul_KPI_FAKTURO + @JobType = 1', + @database_name=N'ArizonaCUST', + @output_file_name=NULL, + @flags=0, + @database_user_name=NULL, + @server=NULL, + @additional_parameters=NULL, + @proxy_id=NULL, + @proxy_name=NULL +IF (@@ERROR <> 0 OR @ReturnCode <> 0) GOTO QuitWithRollback +/* Add Step */ +EXEC @ReturnCode = msdb.dbo.sp_add_jobstep @job_id=@jobId, @step_name=N'Envoi rappel TriaFIN', + @step_id=6, + @cmdexec_success_code=0, + @on_success_action=3, + @on_success_step_id=0, + @on_fail_action=4, + @on_fail_step_id=7, + @retry_attempts=0, + @retry_interval=0, + @os_run_priority=0, @subsystem=N'TSQL', + @command=N'exec aps_PH_Batch_Reminder_Sender', + @database_name=N'Arizona', + @output_file_name=NULL, + @flags=0, + @database_user_name=NULL, + @server=NULL, + @additional_parameters=NULL, + @proxy_id=NULL, + @proxy_name=NULL +IF (@@ERROR <> 0 OR @ReturnCode <> 0) GOTO QuitWithRollback +/* Add Step */ +EXEC @ReturnCode = msdb.dbo.sp_add_jobstep @job_id=@jobId, @step_name=N'Empty step for success', + @step_id=7, + @cmdexec_success_code=0, + @on_success_action=1, + @on_success_step_id=0, + @on_fail_action=4, + @on_fail_step_id=8, + @retry_attempts=0, + @retry_interval=0, + @os_run_priority=0, @subsystem=N'TSQL', + @command=N'/* Empty step */ +exec Get_Job_Error_Info @in_JobName = ''_D00340 - LkdSrv - Prefac'', @in_Recipients = ''HCI_Facturation''', + @database_name=N'HCITools', + @output_file_name=NULL, + @flags=0, + @database_user_name=NULL, + @server=NULL, + @additional_parameters=NULL, + @proxy_id=NULL, + @proxy_name=NULL +IF (@@ERROR <> 0 OR @ReturnCode <> 0) GOTO QuitWithRollback +/* Add Step */ +EXEC @ReturnCode = msdb.dbo.sp_add_jobstep @job_id=@jobId, @step_name=N'Send email KO', + @step_id=8, + @cmdexec_success_code=0, + @on_success_action=2, + @on_success_step_id=0, + @on_fail_action=2, + @on_fail_step_id=0, + @retry_attempts=0, + @retry_interval=0, + @os_run_priority=0, @subsystem=N'TSQL', + @command=N'exec Get_Job_Error_Info @in_JobName = ''_D00340 - LkdSrv - Prefac'', @in_Recipients = ''HCI_Facturation''', + @database_name=N'HCITools', + @output_file_name=NULL, + @flags=0, + @database_user_name=NULL, + @server=NULL, + @additional_parameters=NULL, + @proxy_id=NULL, + @proxy_name=NULL +IF (@@ERROR <> 0 OR @ReturnCode <> 0) GOTO QuitWithRollback +EXEC @ReturnCode = msdb.dbo.sp_update_job @job_id = @jobId, @start_step_id = 1 +IF (@@ERROR <> 0 OR @ReturnCode <> 0) GOTO QuitWithRollback + +/* Attach existing specific schedule for job */ +declare @enabled_schedule int, + @schedule_name nvarchar(50) +declare c_schedules cursor local forward_only static for +select enabled, name + from msdb.dbo.sysschedules + where name LIKE '_D00340%' + and name LIKE '%#SPEC#' + +open c_schedules + +FETCH NEXT FROM c_schedules into @enabled_schedule, @schedule_name +while @@fetch_status = 0 +begin + EXEC @ReturnCode = msdb.dbo.sp_attach_schedule @job_id = @jobId, @schedule_name=@schedule_name + IF(@enabled_schedule = 1) + begin + SET @schedule_name = SUBSTRING(@schedule_name,0,LEN(@schedule_name)-5) + IF EXISTS (select name from msdb.dbo.sysschedules where name = @schedule_name) + EXEC @ReturnCode = msdb.dbo.sp_update_schedule @name=@schedule_name, @enabled=0 + end + IF (@@ERROR <> 0 OR @ReturnCode <> 0) GOTO QuitWithRollback +FETCH NEXT FROM c_schedules into @enabled_schedule, @schedule_name +end + +close c_schedules + +deallocate c_schedules + +EXEC @ReturnCode = msdb.dbo.sp_add_jobserver @job_id = @jobId, @server_name = N'(local)' +IF (@@ERROR <> 0 OR @ReturnCode <> 0) GOTO QuitWithRollback +COMMIT TRANSACTION +GOTO EndSave +QuitWithRollback: + IF (@@TRANCOUNT > 0) ROLLBACK TRANSACTION +EndSave: + +GO diff --git a/TPDT-268 - ACP in task sequence/cp_triaOne_jobs/Pharmacy/_D00380 - Delete old Monitor_rows.sql b/TPDT-268 - ACP in task sequence/cp_triaOne_jobs/Pharmacy/_D00380 - Delete old Monitor_rows.sql new file mode 100644 index 0000000..96dc47e Binary files /dev/null and b/TPDT-268 - ACP in task sequence/cp_triaOne_jobs/Pharmacy/_D00380 - Delete old Monitor_rows.sql differ diff --git a/TPDT-268 - ACP in task sequence/cp_triaOne_jobs/Pharmacy/_D60020 - Load_Validation_Data.sql b/TPDT-268 - ACP in task sequence/cp_triaOne_jobs/Pharmacy/_D60020 - Load_Validation_Data.sql new file mode 100644 index 0000000..1b97c93 Binary files /dev/null and b/TPDT-268 - ACP in task sequence/cp_triaOne_jobs/Pharmacy/_D60020 - Load_Validation_Data.sql differ diff --git a/TPDT-268 - ACP in task sequence/cp_triaOne_jobs/Pharmacy/__D70010 - After APSSynchroLoad.sql b/TPDT-268 - ACP in task sequence/cp_triaOne_jobs/Pharmacy/__D70010 - After APSSynchroLoad.sql new file mode 100644 index 0000000..de5899f Binary files /dev/null and b/TPDT-268 - ACP in task sequence/cp_triaOne_jobs/Pharmacy/__D70010 - After APSSynchroLoad.sql differ diff --git a/TPDT-268 - ACP in task sequence/dba_alerts/Alertes critiques.sql b/TPDT-268 - ACP in task sequence/dba_alerts/Alertes critiques.sql new file mode 100644 index 0000000..091a5dc --- /dev/null +++ b/TPDT-268 - ACP in task sequence/dba_alerts/Alertes critiques.sql @@ -0,0 +1,224 @@ +/*============================================================================= + + Explication du traitement realise par le script + ------------------------------------------- + 1. Creation de la catégorie SQL Server Agent Alerts + 2. Creation de l'opérateur DBA_operator + 3. Creation de l'alerte Severité 19 Fatal Error in Resource + 4. Creation de l'alerte Severité 20 Fatal Error in Current Process + 5. Creation de l'alerte Severité 21 Fatal Error in Database Process + 6. Creation de l'alerte Severité 22 Fatal Error Table Integrity Suspect + 7. Creation de l'alerte Severité 23 Fatal Error Database Integrity Suspect + 8. Creation de l'alerte Severité 24 Fatal Hardware Error + 9. Creation de l'alerte Severité 25 Fatal Error + 10. Création de l'alerte de l'erreur 825 Read-Retry Required + + Creation : 06.06.2018 / FLA + + Modifications : 17.03.2022 - FLA : Change DBA mail + +=============================================================================*/ + + + +USE [msdb]; + +/* Add categorie for SQL Server Agent Alerts */ +DECLARE @CategoryName sysname, + @OperatorName sysname, + @AlertName sysname + +SET @CategoryName = N'SQL Server Agent Alerts'; +SET @OperatorName = N'DBA_operator' + +IF NOT EXISTS (SELECT * + FROM msdb.dbo.syscategories + WHERE category_class = 2 /*2=Alert*/ + AND category_type = 3 + AND name = @CategoryName) +BEGIN + EXEC dbo.sp_add_category @class = N'ALERT', @type = N'NONE', @name = @CategoryName; +END + +/* Add operator DBA_operator for SQL Server Agent Alerts */ +IF EXISTS (SELECT name FROM msdb.dbo.sysoperators WHERE name = N'DBA_operator') +EXEC msdb.dbo.sp_delete_operator @name=N'DBA_operator' + +EXEC msdb.dbo.sp_add_operator @name=N'DBA_operator', + @enabled=1, + @weekday_pager_start_time=90000, + @weekday_pager_end_time=180000, + @saturday_pager_start_time=90000, + @saturday_pager_end_time=180000, + @sunday_pager_start_time=90000, + @sunday_pager_end_time=180000, + @pager_days=0, + @email_address=N'Gal_SE_DBA@galenica.com', + @category_name=N'[Uncategorized]' + +SET @AlertName = 'DBA - Sev 19 Error: Fatal Error in Resource' + +IF NOT EXISTS (SELECT name FROM msdb.dbo.sysalerts WHERE name = @AlertName) + EXEC msdb.dbo.sp_add_alert @name = @AlertName, + @message_id=0, + @severity=19, + @enabled=1, + @delay_between_responses=900, + @include_event_description_in=1, + @category_name = @CategoryName + +IF NOT EXISTS(SELECT name + FROM msdb.dbo.sysalerts AS sa + INNER JOIN msdb.dbo.sysnotifications AS sn + ON sa.id = sn.alert_id + WHERE sa.name = @AlertName) +EXEC msdb.dbo.sp_add_notification @alert_name = @AlertName, @operator_name=@OperatorName, @notification_method = 1; + + +SET @AlertName = 'DBA - Sev 20 Error: Fatal Error in Current Process' + +IF EXISTS (SELECT name FROM msdb.dbo.sysalerts WHERE name = @AlertName) +EXEC msdb.dbo.sp_delete_alert @name=@AlertName + +IF NOT EXISTS (SELECT name FROM msdb.dbo.sysalerts WHERE name = @AlertName) + EXEC msdb.dbo.sp_add_alert @name = @AlertName, + @message_id=0, + @severity=20, + @enabled=1, + @delay_between_responses=900, + @include_event_description_in=1, + @category_name = @CategoryName + +IF NOT EXISTS(SELECT name + FROM msdb.dbo.sysalerts AS sa + INNER JOIN msdb.dbo.sysnotifications AS sn + ON sa.id = sn.alert_id + WHERE sa.name = @AlertName) +EXEC msdb.dbo.sp_add_notification @alert_name = @AlertName, @operator_name=@OperatorName, @notification_method = 1; + +SET @AlertName = 'DBA - Sev 21 Error: Fatal Error in Database Process' + +IF EXISTS (SELECT name FROM msdb.dbo.sysalerts WHERE name = @AlertName) +EXEC msdb.dbo.sp_delete_alert @name=@AlertName + +IF NOT EXISTS (SELECT name FROM msdb.dbo.sysalerts WHERE name = @AlertName) + EXEC msdb.dbo.sp_add_alert @name = @AlertName, + @message_id=0, + @severity=21, + @enabled=1, + @delay_between_responses=900, + @include_event_description_in=1, + @category_name = @CategoryName + +IF NOT EXISTS(SELECT name + FROM msdb.dbo.sysalerts AS sa + INNER JOIN msdb.dbo.sysnotifications AS sn + ON sa.id = sn.alert_id + WHERE sa.name = @AlertName) +EXEC msdb.dbo.sp_add_notification @alert_name = @AlertName, @operator_name=@OperatorName, @notification_method = 1; + +SET @AlertName = 'DBA - Sev 22 Error: Fatal Error Table Integrity Suspect' + +IF EXISTS (SELECT name FROM msdb.dbo.sysalerts WHERE name = @AlertName) +EXEC msdb.dbo.sp_delete_alert @name=@AlertName + +IF NOT EXISTS (SELECT name FROM msdb.dbo.sysalerts WHERE name = @AlertName) + EXEC msdb.dbo.sp_add_alert @name = @AlertName, + @message_id=0, + @severity=22, + @enabled=1, + @delay_between_responses=900, + @include_event_description_in=1, + @category_name = @CategoryName + +IF NOT EXISTS(SELECT name + FROM msdb.dbo.sysalerts AS sa + INNER JOIN msdb.dbo.sysnotifications AS sn + ON sa.id = sn.alert_id + WHERE sa.name = @AlertName) +EXEC msdb.dbo.sp_add_notification @alert_name = @AlertName, @operator_name=@OperatorName, @notification_method = 1; + +SET @AlertName = 'DBA - Sev 23 Error: Fatal Error Database Integrity Suspect' + +IF EXISTS (SELECT name FROM msdb.dbo.sysalerts WHERE name = @AlertName) +EXEC msdb.dbo.sp_delete_alert @name=@AlertName + +IF NOT EXISTS (SELECT name FROM msdb.dbo.sysalerts WHERE name = @AlertName) + EXEC msdb.dbo.sp_add_alert @name = @AlertName, + @message_id=0, + @severity=23, + @enabled=1, + @delay_between_responses=900, + @include_event_description_in=1, + @category_name = @CategoryName + +IF NOT EXISTS(SELECT name + FROM msdb.dbo.sysalerts AS sa + INNER JOIN msdb.dbo.sysnotifications AS sn + ON sa.id = sn.alert_id + WHERE sa.name = @AlertName) +EXEC msdb.dbo.sp_add_notification @alert_name = @AlertName, @operator_name=@OperatorName, @notification_method = 1; + +SET @AlertName = 'DBA - Sev 24 Error: Fatal Hardware Error' + +IF EXISTS (SELECT name FROM msdb.dbo.sysalerts WHERE name = @AlertName) +EXEC msdb.dbo.sp_delete_alert @name=@AlertName + +IF NOT EXISTS (SELECT name FROM msdb.dbo.sysalerts WHERE name = @AlertName) + EXEC msdb.dbo.sp_add_alert @name = @AlertName, + @message_id=0, + @severity=24, + @enabled=1, + @delay_between_responses=900, + @include_event_description_in=1, + @category_name = @CategoryName + +IF NOT EXISTS(SELECT name + FROM msdb.dbo.sysalerts AS sa + INNER JOIN msdb.dbo.sysnotifications AS sn + ON sa.id = sn.alert_id + WHERE sa.name = @AlertName) +EXEC msdb.dbo.sp_add_notification @alert_name = @AlertName, @operator_name=@OperatorName, @notification_method = 1; + +SET @AlertName = 'DBA - Sev 25 Error: Fatal Error' + +IF EXISTS (SELECT name FROM msdb.dbo.sysalerts WHERE name = @AlertName) +EXEC msdb.dbo.sp_delete_alert @name=@AlertName + +IF NOT EXISTS (SELECT name FROM msdb.dbo.sysalerts WHERE name = @AlertName) + EXEC msdb.dbo.sp_add_alert @name = @AlertName, + @message_id=0, + @severity=25, + @enabled=1, + @delay_between_responses=900, + @include_event_description_in=1, + @category_name = @CategoryName + +IF NOT EXISTS(SELECT name + FROM msdb.dbo.sysalerts AS sa + INNER JOIN msdb.dbo.sysnotifications AS sn + ON sa.id = sn.alert_id + WHERE sa.name = @AlertName) +EXEC msdb.dbo.sp_add_notification @alert_name = @AlertName, @operator_name=@OperatorName, @notification_method = 1; + + +SET @AlertName = 'DBA - Error 825: Read-Retry Required' + +IF EXISTS (SELECT name FROM msdb.dbo.sysalerts WHERE name = @AlertName) +EXEC msdb.dbo.sp_delete_alert @name=@AlertName + +IF NOT EXISTS (SELECT name FROM msdb.dbo.sysalerts WHERE name = @AlertName) + EXEC msdb.dbo.sp_add_alert @name = @AlertName, + @message_id=825, + @severity=0, + @enabled=1, + @delay_between_responses=900, + @include_event_description_in=1, + @category_name = @CategoryName + +IF NOT EXISTS(SELECT name + FROM msdb.dbo.sysalerts AS sa + INNER JOIN msdb.dbo.sysnotifications AS sn + ON sa.id = sn.alert_id + WHERE sa.name = @AlertName) +EXEC msdb.dbo.sp_add_notification @alert_name = @AlertName, @operator_name=@OperatorName, @notification_method = 1; \ No newline at end of file diff --git a/TPDT-268 - ACP in task sequence/dba_alerts/DBA - Audit Login.sql b/TPDT-268 - ACP in task sequence/dba_alerts/DBA - Audit Login.sql new file mode 100644 index 0000000..0ac0a35 --- /dev/null +++ b/TPDT-268 - ACP in task sequence/dba_alerts/DBA - Audit Login.sql @@ -0,0 +1,24 @@ +USE [msdb] +GO + +DECLARE @namespace NVARCHAR(255) + = N'\\.\root\Microsoft\SqlServer\ServerEvents\' + COALESCE + ( + CONVERT(NVARCHAR(32), SERVERPROPERTY('InstanceName')), + N'MSSQLSERVER' + ); + +IF NOT EXISTS(SELECT 1 FROM msdb.dbo.sysalerts WHERE [name] = N'DBA - Audit Login') +BEGIN + EXEC msdb.dbo.sp_add_alert @name=N'DBA - Audit Login', + @message_id=0, + @severity=0, + @enabled=1, + @delay_between_responses=0, + @include_event_description_in=0, + @category_name=N'[Uncategorized]', + @wmi_namespace= @namespace, + @wmi_query=N'SELECT * FROM AUDIT_LOGIN_FAILED', + @job_name=N'_92020 - Audit Login' +END +GO \ No newline at end of file diff --git a/TPDT-268 - ACP in task sequence/dba_alerts/DBA - Blocked Process.sql b/TPDT-268 - ACP in task sequence/dba_alerts/DBA - Blocked Process.sql new file mode 100644 index 0000000..18f7dec --- /dev/null +++ b/TPDT-268 - ACP in task sequence/dba_alerts/DBA - Blocked Process.sql @@ -0,0 +1,358 @@ + +/* Update blocked process threshold */ +exec master.dbo.sp_configure 'show advanced option', 1; +RECONFIGURE WITH OVERRIDE +EXEC sp_configure 'blocked process threshold', 10 ---- CHANGE HERE !! +exec master.dbo.sp_configure 'show advanced option', 0; +RECONFIGURE WITH OVERRIDE +GO + +/* Add table to store alert report*/ +USE [HCITools] +GO + +IF NOT EXISTS ( SELECT * + FROM sys.objects + WHERE object_id = OBJECT_ID(N'[dbo].[BlockingSessionInfo]') + AND type in ( N'U' )) +BEGIN + + CREATE TABLE [dbo].[BlockingSessionInfo] ( + [SessionInfoId] [int] IDENTITY(1, 1) NOT NULL, + [AlertTime] [datetime2](0) NOT NULL, + [BlockingDetails] [xml] NULL, + [MailNotification] [BIT] NOT NULL + DEFAULT 0, + CONSTRAINT [PK_BlockingSessionInfo] + PRIMARY KEY CLUSTERED ([SessionInfoId] ASC)) ON [PRIMARY] + +END +GO + +USE [msdb] +GO + +/* Deploy job for alert response */ + +/* Drop existing standard schedule for job */ +declare @schedule_id int +declare c_schedules cursor local forward_only static for + select ss.schedule_id + from msdb.dbo.sysjobschedules sjs +INNER JOIN msdb.dbo.sysschedules ss + ON sjs.schedule_id = ss.schedule_id + AND ss.name NOT LIKE '%#SPEC#' +INNER JOIN msdb.dbo.sysjobs sj + ON sjs.job_id = sj.job_id + WHERE sj.name = N'_92050 - Response - Blocked Process Event' + +open c_schedules + +FETCH NEXT FROM c_schedules into @schedule_id +while @@fetch_status = 0 +begin + IF ((select COUNT(*) from msdb.dbo.sysjobschedules where schedule_id=@schedule_id) = 1) + EXEC msdb.dbo.sp_delete_schedule @schedule_id=@schedule_id, @force_delete = 1 +FETCH NEXT FROM c_schedules into @schedule_id +end + +close c_schedules + +deallocate c_schedules + +IF EXISTS (SELECT job_id FROM msdb.dbo.sysjobs_view WHERE name = N'_92050 - Response - Blocked Process Event') +EXEC msdb.dbo.sp_delete_job @job_name = N'_92050 - Response - Blocked Process Event', @delete_unused_schedule=0 +GO + +/* Creation Job and Steps*/ +BEGIN TRANSACTION +DECLARE @ReturnCode INT +SELECT @ReturnCode = 0 + +IF NOT EXISTS (SELECT name FROM msdb.dbo.syscategories WHERE name=N'DBA-Monitoring' AND category_class=1) +BEGIN +EXEC @ReturnCode = msdb.dbo.sp_add_category @class=N'JOB', @type=N'LOCAL', @name=N'DBA-Monitoring' +IF (@@ERROR <> 0 OR @ReturnCode <> 0) GOTO QuitWithRollback + +END + +/* Add Job */ +DECLARE @jobId BINARY(16) +EXEC @ReturnCode = msdb.dbo.sp_add_job @job_name=N'_92050 - Response - Blocked Process Event', + @enabled=1, + @notify_level_eventlog=0, + @notify_level_email=0, + @notify_level_netsend=0, + @notify_level_page=0, + @delete_level=0, + @description=N'16.11.2018 : RTC Store Blocking session report details and send notification to DBA only every 2 minutes and during opening hours.', + @category_name=N'DBA-Monitoring', + @start_step_id=1, + @owner_login_name=N'sa', @job_id = @jobId OUTPUT +IF (@@ERROR <> 0 OR @ReturnCode <> 0) GOTO QuitWithRollback + +/* Add Step */ +EXEC @ReturnCode = msdb.dbo.sp_add_jobstep @job_id=@jobId, @step_name=N'Empty step', + @step_id=1, + @cmdexec_success_code=0, + @on_success_action=3, + @on_success_step_id=0, + @on_fail_action=3, + @on_fail_step_id=0, + @retry_attempts=0, + @retry_interval=0, + @os_run_priority=0, @subsystem=N'TSQL', + @command=N'/* Empty step */', + @database_name=N'master', + @output_file_name=NULL, + @flags=0, + @database_user_name=NULL, + @server=NULL, + @additional_parameters=NULL, + @proxy_id=NULL, + @proxy_name=NULL +IF (@@ERROR <> 0 OR @ReturnCode <> 0) GOTO QuitWithRollback +/* Add Step */ +EXEC @ReturnCode = msdb.dbo.sp_add_jobstep @job_id=@jobId, @step_name=N'Insert Blocking info', + @step_id=2, + @cmdexec_success_code=0, + @on_success_action=3, + @on_success_step_id=0, + @on_fail_action=4, + @on_fail_step_id=5, + @retry_attempts=0, + @retry_interval=0, + @os_run_priority=0, @subsystem=N'TSQL', + @command=N'INSERT INTO dbo.BlockingSessionInfo ( + +AlertTime, + +BlockingDetails + +) + +VALUES ( + +GETDATE(), + +''$(ESCAPE_NONE(WMI(TextData)))'' + +)', + @database_name=N'HCITools', + @output_file_name=NULL, + @flags=0, + @database_user_name=NULL, + @server=NULL, + @additional_parameters=NULL, + @proxy_id=NULL, + @proxy_name=NULL +IF (@@ERROR <> 0 OR @ReturnCode <> 0) GOTO QuitWithRollback +/* Add Step */ +EXEC @ReturnCode = msdb.dbo.sp_add_jobstep @job_id=@jobId, @step_name=N'Send blocking session report if needed', + @step_id=3, + @cmdexec_success_code=0, + @on_success_action=3, + @on_success_step_id=0, + @on_fail_action=4, + @on_fail_step_id=5, + @retry_attempts=0, + @retry_interval=0, + @os_run_priority=0, @subsystem=N'TSQL', + @command=N'DECLARE @reportXml XML; +DECLARE @XmlToString NVARCHAR(MAX); +DECLARE @path NVARCHAR(4000); + +SET @reportXml = CONVERT(XML, N''$(ESCAPE_SQUOTE(WMI(TextData)))'', 1); + +SET @XmlToString = CONVERT(NVARCHAR(MAX), @reportXml); + +/* Elapse time since last mail sent in seconds*/ +DECLARE @elapseTime AS INT; +SELECT @elapseTime = 0; +SELECT TOP 1 + @elapseTime = DATEDIFF(SECOND, AlertTime, GETDATE()) +FROM HCITools.dbo.BlockingSessionInfo +WHERE MailNotification = 1 +ORDER BY AlertTime DESC; + +IF EXISTS (SELECT 1 FROM sys.databases WHERE name = ''Arizona'') +BEGIN + IF (Arizona.dbo.aps_fn_Is_working_hour(GETDATE(), NULL, NULL) = 1) + AND + ( + @elapseTime >= 120 + OR NOT EXISTS + ( + SELECT 1 + FROM HCITools.dbo.BlockingSessionInfo + WHERE MailNotification = 1 + ) + ) + BEGIN + EXEC [Arizona].[dbo].[aps_Send_Mail_with_template] @in_param_varchar_2 = ''DBA_operator'', + -- ,@in_param_varchar_3 =@XmlToString -- ''A session blocked has occured in SQL Server. Attached you will find the lock graph.'' + @in_param_message = @XmlToString, + @in_job_type = 3; + + UPDATE TOP (1) + HCITools.dbo.BlockingSessionInfo + SET MailNotification = 1 + WHERE SessionInfoId IN + ( + SELECT TOP 1 + SessionInfoId + FROM HCITools.dbo.BlockingSessionInfo + ORDER BY AlertTime DESC + ); + END; +END; +; + +', + @database_name=N'master', + @output_file_name=NULL, + @flags=0, + @database_user_name=NULL, + @server=NULL, + @additional_parameters=NULL, + @proxy_id=NULL, + @proxy_name=NULL +IF (@@ERROR <> 0 OR @ReturnCode <> 0) GOTO QuitWithRollback +/* Add Step */ +EXEC @ReturnCode = msdb.dbo.sp_add_jobstep @job_id=@jobId, @step_name=N'Empty step for success', + @step_id=4, + @cmdexec_success_code=0, + @on_success_action=1, + @on_success_step_id=0, + @on_fail_action=2, + @on_fail_step_id=0, + @retry_attempts=0, + @retry_interval=0, + @os_run_priority=0, @subsystem=N'TSQL', + @command=N'/* Empty step */', + @database_name=N'master', + @output_file_name=NULL, + @flags=0, + @database_user_name=NULL, + @server=NULL, + @additional_parameters=NULL, + @proxy_id=NULL, + @proxy_name=NULL +IF (@@ERROR <> 0 OR @ReturnCode <> 0) GOTO QuitWithRollback +/* Add Step */ +EXEC @ReturnCode = msdb.dbo.sp_add_jobstep @job_id=@jobId, @step_name=N'Send email KO', + @step_id=5, + @cmdexec_success_code=0, + @on_success_action=2, + @on_success_step_id=0, + @on_fail_action=2, + @on_fail_step_id=0, + @retry_attempts=0, + @retry_interval=0, + @os_run_priority=0, @subsystem=N'TSQL', + @command=N'exec Get_Job_Error_Info @in_JobName = ''_92050 - Response - Blocked Process Event'', @in_Recipients = ''DBA_operator''', + @database_name=N'HCITools', + @output_file_name=NULL, + @flags=0, + @database_user_name=NULL, + @server=NULL, + @additional_parameters=NULL, + @proxy_id=NULL, + @proxy_name=NULL +IF (@@ERROR <> 0 OR @ReturnCode <> 0) GOTO QuitWithRollback +EXEC @ReturnCode = msdb.dbo.sp_update_job @job_id = @jobId, @start_step_id = 1 +IF (@@ERROR <> 0 OR @ReturnCode <> 0) GOTO QuitWithRollback + +/* Attach existing specific schedule for job */ +declare @enabled_schedule int, + @schedule_name nvarchar(50) +declare c_schedules cursor local forward_only static for +select enabled, name + from msdb.dbo.sysschedules + where name LIKE '_92050%' + and name LIKE '%#SPEC#' + +open c_schedules + +FETCH NEXT FROM c_schedules into @enabled_schedule, @schedule_name +while @@fetch_status = 0 +begin + EXEC @ReturnCode = msdb.dbo.sp_attach_schedule @job_id = @jobId, @schedule_name=@schedule_name + IF(@enabled_schedule = 1) + begin + SET @schedule_name = SUBSTRING(@schedule_name,0,LEN(@schedule_name)-5) + IF EXISTS (select name from msdb.dbo.sysschedules where name = @schedule_name) + EXEC @ReturnCode = msdb.dbo.sp_update_schedule @name=@schedule_name, @enabled=0 + end + IF (@@ERROR <> 0 OR @ReturnCode <> 0) GOTO QuitWithRollback +FETCH NEXT FROM c_schedules into @enabled_schedule, @schedule_name +end + +close c_schedules + +deallocate c_schedules + +EXEC @ReturnCode = msdb.dbo.sp_add_jobserver @job_id = @jobId, @server_name = N'(local)' +IF (@@ERROR <> 0 OR @ReturnCode <> 0) GOTO QuitWithRollback +COMMIT TRANSACTION +GOTO EndSave +QuitWithRollback: + IF (@@TRANCOUNT > 0) ROLLBACK TRANSACTION +EndSave: + +GO + +/* Add categorie for SQL Server Agent Alerts */ +DECLARE @CategoryName sysname, + @AlertName sysname + +SET @CategoryName = N'SQL Server Agent Alerts'; + +IF NOT EXISTS (SELECT * + FROM msdb.dbo.syscategories + WHERE category_class = 2 /*2=Alert*/ + AND category_type = 3 + AND name = @CategoryName) +BEGIN + PRINT 'Add Category SQL Server Agent Alerts' + EXEC dbo.sp_add_category @class = N'ALERT', @type = N'NONE', @name = @CategoryName; +END + +/****** Alert [DBA - WMI:Respond to Blocking session] ******/ +SET @AlertName = 'DBA - WMI:Respond to Blocking session' +IF EXISTS (SELECT name FROM msdb.dbo.sysalerts WHERE name = @AlertName) +EXEC msdb.dbo.sp_delete_alert @name= @AlertName +GO + +DECLARE @CategoryName sysname, + @AlertName sysname + +SET @CategoryName = N'SQL Server Agent Alerts'; +SET @AlertName = 'DBA - WMI:Respond to Blocking session' +DECLARE @namespace NVARCHAR(200); +IF (SERVERPROPERTY('InstanceName') IS NOT NULL) +BEGIN + SELECT @namespace = N'\\.\root\Microsoft\SqlServer\ServerEvents\' + + CONVERT(NVARCHAR(128), SERVERPROPERTY('InstanceName')); +END; +ELSE +BEGIN + DECLARE @InstanceName SYSNAME + SET @InstanceName = CONVERT(VARCHAR(128),ISNULL(SERVERPROPERTY ('InstanceName'),'MSSQLSERVER')) + + SELECT @namespace = N'\\.\root\Microsoft\SqlServer\ServerEvents\' + @InstanceName; +END; + + EXEC msdb.dbo.sp_add_alert @name = @AlertName, + @message_id=0, + @severity=0, + @enabled=1, + @delay_between_responses=10, + @include_event_description_in=5, + @category_name=@CategoryName, + @wmi_namespace=@namespace, + @wmi_query=N'SELECT * FROM BLOCKED_PROCESS_REPORT', + @job_name=N'_92050 - Response - Blocked Process Event' +GO + + diff --git a/TPDT-268 - ACP in task sequence/dba_alerts/DBA - Broker - Too many messages in queue.sql b/TPDT-268 - ACP in task sequence/dba_alerts/DBA - Broker - Too many messages in queue.sql new file mode 100644 index 0000000..4ecee53 --- /dev/null +++ b/TPDT-268 - ACP in task sequence/dba_alerts/DBA - Broker - Too many messages in queue.sql @@ -0,0 +1,48 @@ +USE [msdb] +GO + +-- delete operator +IF EXISTS (SELECT name FROM msdb.dbo.sysoperators WHERE name = N'DBA operator') +EXEC msdb.dbo.sp_delete_operator @name=N'DBA operator' +GO + +USE [msdb] +GO + +-- Create operator +EXEC msdb.dbo.sp_add_operator @name=N'DBA operator', + @enabled=1, + @weekday_pager_start_time=90000, + @weekday_pager_end_time=180000, + @saturday_pager_start_time=90000, + @saturday_pager_end_time=180000, + @sunday_pager_start_time=90000, + @sunday_pager_end_time=180000, + @pager_days=0, + @email_address=N'Gal_SE_DBA@galenica.com', + @category_name=N'[Uncategorized]' +GO + + +USE [msdb] +GO + +-- delete Alerte +IF EXISTS (SELECT name FROM msdb.dbo.sysalerts WHERE name = N'DBA - Broker - Too many messages in queue') +EXEC msdb.dbo.sp_delete_alert @name=N'DBA - Broker - Too many messages in queue' +GO + +USE [msdb] +GO + +-- create alert +EXEC msdb.dbo.sp_add_alert @name=N'DBA - Broker - Too many messages in queue', + @message_id=0, + @severity=0, + @enabled=1, + @delay_between_responses=900, + @include_event_description_in=1, + @category_name=N'[Uncategorized]', + @performance_condition=N'MSSQL$APSSQL:Broker Statistics|Enqueued Messages Total||>|50', + @job_id=N'00000000-0000-0000-0000-000000000000' +GO \ No newline at end of file diff --git a/TPDT-268 - ACP in task sequence/dba_alerts/Replications.sql b/TPDT-268 - ACP in task sequence/dba_alerts/Replications.sql new file mode 100644 index 0000000..aa266de --- /dev/null +++ b/TPDT-268 - ACP in task sequence/dba_alerts/Replications.sql @@ -0,0 +1,437 @@ +USE [msdb]; +GO + +IF NOT EXISTS (SELECT 1 FROM master.cfg.InstanceContext WHERE Business IN ('TPPHAR','TPCENT')) +BEGIN + + IF EXISTS (SELECT 1 FROM sys.databases WHERE name = 'distribution') + BEGIN + + DECLARE @OperatorName sysname, + @AlertName sysname; + + SET @OperatorName = N'DBA_operator'; + + IF NOT EXISTS ( SELECT name + FROM msdb.dbo.sysoperators + WHERE name = @OperatorName) + EXEC msdb.dbo.sp_add_operator @name = @OperatorName, + @enabled = 1, + @weekday_pager_start_time = 90000, + @weekday_pager_end_time = 180000, + @saturday_pager_start_time = 90000, + @saturday_pager_end_time = 180000, + @sunday_pager_start_time = 90000, + @sunday_pager_end_time = 180000, + @pager_days = 0, + @email_address = N'Gal_SE_DBA@galenica.com', + @category_name = N'[Uncategorized]'; + + SET @AlertName = 'Replication Warning: Transactional replication latency (Threshold: latency)'; + + IF EXISTS ( SELECT name + FROM msdb.dbo.sysalerts + WHERE ( name = @AlertName + AND enabled = 0) + OR ( name = @AlertName + AND has_notification = 0)) + EXEC msdb.dbo.sp_delete_alert @name = @AlertName; + + IF NOT EXISTS (SELECT name FROM msdb.dbo.sysalerts WHERE name = @AlertName) + EXEC msdb.dbo.sp_add_alert @name = @AlertName, + @message_id = 14161, + @severity = 0, + @enabled = 1, + @delay_between_responses = 3600, + @include_event_description_in = 5, + @category_name = N'Replication', + @job_id = N'00000000-0000-0000-0000-000000000000'; + + IF NOT EXISTS ( SELECT name + FROM msdb.dbo.sysalerts AS sa + INNER JOIN msdb.dbo.sysnotifications AS sn + ON sa.id = sn.alert_id + WHERE sa.name = @AlertName) + EXEC msdb.dbo.sp_add_notification @alert_name = @AlertName, + @operator_name = @OperatorName, + @notification_method = 1; + + SET @AlertName = 'Replication Warning: Subscription expiration (Threshold: expiration)'; + + IF EXISTS ( SELECT name + FROM msdb.dbo.sysalerts + WHERE ( name = @AlertName + AND enabled = 0) + OR ( name = @AlertName + AND has_notification = 0)) + EXEC msdb.dbo.sp_delete_alert @name = @AlertName; + + IF NOT EXISTS (SELECT name FROM msdb.dbo.sysalerts WHERE name = @AlertName) + EXEC msdb.dbo.sp_add_alert @name = @AlertName, + @message_id = 14160, + @severity = 0, + @enabled = 1, + @delay_between_responses = 3600, + @include_event_description_in = 5, + @category_name = N'Replication', + @job_id = N'00000000-0000-0000-0000-000000000000'; + + IF NOT EXISTS ( SELECT name + FROM msdb.dbo.sysalerts AS sa + INNER JOIN msdb.dbo.sysnotifications AS sn + ON sa.id = sn.alert_id + WHERE sa.name = @AlertName) + EXEC msdb.dbo.sp_add_notification @alert_name = @AlertName, + @operator_name = @OperatorName, + @notification_method = 1; + + SET @AlertName = 'Replication Warning: Slow merge over LAN connection (Threshold: mergefastrunspeed)'; + + IF EXISTS ( SELECT name + FROM msdb.dbo.sysalerts + WHERE ( name = @AlertName + AND enabled = 0) + OR ( name = @AlertName + AND has_notification = 0)) + EXEC msdb.dbo.sp_delete_alert @name = @AlertName; + + IF NOT EXISTS (SELECT name FROM msdb.dbo.sysalerts WHERE name = @AlertName) + EXEC msdb.dbo.sp_add_alert @name = @AlertName, + @message_id = 14164, + @severity = 0, + @enabled = 1, + @delay_between_responses = 3600, + @include_event_description_in = 5, + @category_name = N'Replication', + @job_id = N'00000000-0000-0000-0000-000000000000'; + + IF NOT EXISTS ( SELECT name + FROM msdb.dbo.sysalerts AS sa + INNER JOIN msdb.dbo.sysnotifications AS sn + ON sa.id = sn.alert_id + WHERE sa.name = @AlertName) + EXEC msdb.dbo.sp_add_notification @alert_name = @AlertName, + @operator_name = @OperatorName, + @notification_method = 1; + + SET @AlertName = 'Replication Warning: Slow merge over dialup connection (Threshold: mergeslowrunspeed)'; + + IF EXISTS ( SELECT name + FROM msdb.dbo.sysalerts + WHERE ( name = @AlertName + AND enabled = 0) + OR ( name = @AlertName + AND has_notification = 0)) + EXEC msdb.dbo.sp_delete_alert @name = @AlertName; + + IF NOT EXISTS (SELECT name FROM msdb.dbo.sysalerts WHERE name = @AlertName) + EXEC msdb.dbo.sp_add_alert @name = @AlertName, + @message_id = 14165, + @severity = 0, + @enabled = 1, + @delay_between_responses = 3600, + @include_event_description_in = 5, + @category_name = N'Replication', + @job_id = N'00000000-0000-0000-0000-000000000000'; + + IF NOT EXISTS ( SELECT name + FROM msdb.dbo.sysalerts AS sa + INNER JOIN msdb.dbo.sysnotifications AS sn + ON sa.id = sn.alert_id + WHERE sa.name = @AlertName) + EXEC msdb.dbo.sp_add_notification @alert_name = @AlertName, + @operator_name = @OperatorName, + @notification_method = 1; + + SET @AlertName = 'Replication Warning: Long merge over LAN connection (Threshold: mergefastrunduration)'; + + IF EXISTS ( SELECT name + FROM msdb.dbo.sysalerts + WHERE ( name = @AlertName + AND enabled = 0) + OR ( name = @AlertName + AND has_notification = 0)) + EXEC msdb.dbo.sp_delete_alert @name = @AlertName; + + IF NOT EXISTS (SELECT name FROM msdb.dbo.sysalerts WHERE name = @AlertName) + EXEC msdb.dbo.sp_add_alert @name = @AlertName, + @message_id = 14162, + @severity = 0, + @enabled = 1, + @delay_between_responses = 3600, + @include_event_description_in = 5, + @category_name = N'Replication', + @job_id = N'00000000-0000-0000-0000-000000000000'; + + IF NOT EXISTS ( SELECT name + FROM msdb.dbo.sysalerts AS sa + INNER JOIN msdb.dbo.sysnotifications AS sn + ON sa.id = sn.alert_id + WHERE sa.name = @AlertName) + EXEC msdb.dbo.sp_add_notification @alert_name = @AlertName, + @operator_name = @OperatorName, + @notification_method = 1; + + SET @AlertName = 'Replication Warning: Long merge over dialup connection (Threshold: mergeslowrunduration)'; + + IF EXISTS ( SELECT name + FROM msdb.dbo.sysalerts + WHERE ( name = @AlertName + AND enabled = 0) + OR ( name = @AlertName + AND has_notification = 0)) + EXEC msdb.dbo.sp_delete_alert @name = @AlertName; + + IF NOT EXISTS (SELECT name FROM msdb.dbo.sysalerts WHERE name = @AlertName) + EXEC msdb.dbo.sp_add_alert @name = @AlertName, + @message_id = 14163, + @severity = 0, + @enabled = 1, + @delay_between_responses = 3600, + @include_event_description_in = 5, + @category_name = N'Replication', + @job_id = N'00000000-0000-0000-0000-000000000000'; + + IF NOT EXISTS ( SELECT name + FROM msdb.dbo.sysalerts AS sa + INNER JOIN msdb.dbo.sysnotifications AS sn + ON sa.id = sn.alert_id + WHERE sa.name = @AlertName) + EXEC msdb.dbo.sp_add_notification @alert_name = @AlertName, + @operator_name = @OperatorName, + @notification_method = 1; + + SET @AlertName = 'Replication: agent custom shutdown'; + + IF EXISTS ( SELECT name + FROM msdb.dbo.sysalerts + WHERE ( name = @AlertName + AND enabled = 0) + OR ( name = @AlertName + AND has_notification = 0)) + EXEC msdb.dbo.sp_delete_alert @name = @AlertName; + + IF NOT EXISTS (SELECT name FROM msdb.dbo.sysalerts WHERE name = @AlertName) + EXEC msdb.dbo.sp_add_alert @name = @AlertName, + @message_id = 20578, + @severity = 0, + @enabled = 1, + @delay_between_responses = 3600, + @include_event_description_in = 5, + @category_name = N'Replication', + @job_id = N'00000000-0000-0000-0000-000000000000'; + + IF NOT EXISTS ( SELECT name + FROM msdb.dbo.sysalerts AS sa + INNER JOIN msdb.dbo.sysnotifications AS sn + ON sa.id = sn.alert_id + WHERE sa.name = @AlertName) + EXEC msdb.dbo.sp_add_notification @alert_name = @AlertName, + @operator_name = @OperatorName, + @notification_method = 1; + + SET @AlertName = 'Replication: agent failure'; + + IF EXISTS ( SELECT name + FROM msdb.dbo.sysalerts + WHERE ( name = @AlertName + AND enabled = 0) + OR ( name = @AlertName + AND has_notification = 0)) + EXEC msdb.dbo.sp_delete_alert @name = @AlertName; + + IF NOT EXISTS (SELECT name FROM msdb.dbo.sysalerts WHERE name = @AlertName) + EXEC msdb.dbo.sp_add_alert @name = @AlertName, + @message_id = 14151, + @severity = 0, + @enabled = 1, + @delay_between_responses = 3600, + @include_event_description_in = 5, + @category_name = N'Replication', + @job_id = N'00000000-0000-0000-0000-000000000000'; + + IF NOT EXISTS ( SELECT name + FROM msdb.dbo.sysalerts AS sa + INNER JOIN msdb.dbo.sysnotifications AS sn + ON sa.id = sn.alert_id + WHERE sa.name = @AlertName) + EXEC msdb.dbo.sp_add_notification @alert_name = @AlertName, + @operator_name = @OperatorName, + @notification_method = 1; + + SET @AlertName = 'Replication: agent retry'; + + IF EXISTS ( SELECT name + FROM msdb.dbo.sysalerts + WHERE ( name = @AlertName + AND enabled = 0) + OR ( name = @AlertName + AND has_notification = 0)) + EXEC msdb.dbo.sp_delete_alert @name = @AlertName; + + IF NOT EXISTS (SELECT name FROM msdb.dbo.sysalerts WHERE name = @AlertName) + EXEC msdb.dbo.sp_add_alert @name = @AlertName, + @message_id = 14152, + @severity = 0, + @enabled = 1, + @delay_between_responses = 3600, + @include_event_description_in = 5, + @category_name = N'Replication', + @job_id = N'00000000-0000-0000-0000-000000000000'; + + IF NOT EXISTS ( SELECT name + FROM msdb.dbo.sysalerts AS sa + INNER JOIN msdb.dbo.sysnotifications AS sn + ON sa.id = sn.alert_id + WHERE sa.name = @AlertName) + EXEC msdb.dbo.sp_add_notification @alert_name = @AlertName, + @operator_name = @OperatorName, + @notification_method = 1; + + SET @AlertName = 'Replication: agent success'; + + IF EXISTS ( SELECT name + FROM msdb.dbo.sysalerts + WHERE ( name = @AlertName + AND enabled = 0) + OR ( name = @AlertName + AND has_notification = 0)) + EXEC msdb.dbo.sp_delete_alert @name = @AlertName; + + IF NOT EXISTS (SELECT name FROM msdb.dbo.sysalerts WHERE name = @AlertName) + EXEC msdb.dbo.sp_add_alert @name = @AlertName, + @message_id = 14150, + @severity = 0, + @enabled = 1, + @delay_between_responses = 3600, + @include_event_description_in = 5, + @category_name = N'Replication', + @job_id = N'00000000-0000-0000-0000-000000000000'; + + IF NOT EXISTS ( SELECT name + FROM msdb.dbo.sysalerts AS sa + INNER JOIN msdb.dbo.sysnotifications AS sn + ON sa.id = sn.alert_id + WHERE sa.name = @AlertName) + EXEC msdb.dbo.sp_add_notification @alert_name = @AlertName, + @operator_name = @OperatorName, + @notification_method = 1; + + SET @AlertName = 'Replication: expired subscription dropped'; + + IF EXISTS ( SELECT name + FROM msdb.dbo.sysalerts + WHERE ( name = @AlertName + AND enabled = 0) + OR ( name = @AlertName + AND has_notification = 0)) + EXEC msdb.dbo.sp_delete_alert @name = @AlertName; + + IF NOT EXISTS (SELECT name FROM msdb.dbo.sysalerts WHERE name = @AlertName) + EXEC msdb.dbo.sp_add_alert @name = @AlertName, + @message_id = 14157, + @severity = 0, + @enabled = 1, + @delay_between_responses = 3600, + @include_event_description_in = 5, + @category_name = N'Replication', + @job_id = N'00000000-0000-0000-0000-000000000000'; + + IF NOT EXISTS ( SELECT name + FROM msdb.dbo.sysalerts AS sa + INNER JOIN msdb.dbo.sysnotifications AS sn + ON sa.id = sn.alert_id + WHERE sa.name = @AlertName) + EXEC msdb.dbo.sp_add_notification @alert_name = @AlertName, + @operator_name = @OperatorName, + @notification_method = 1; + + SET @AlertName = 'Replication: Subscriber has failed data validation'; + + IF EXISTS ( SELECT name + FROM msdb.dbo.sysalerts + WHERE ( name = @AlertName + AND enabled = 0) + OR ( name = @AlertName + AND has_notification = 0)) + EXEC msdb.dbo.sp_delete_alert @name = @AlertName; + + IF NOT EXISTS (SELECT name FROM msdb.dbo.sysalerts WHERE name = @AlertName) + EXEC msdb.dbo.sp_add_alert @name = @AlertName, + @message_id = 20574, + @severity = 0, + @enabled = 1, + @delay_between_responses = 3600, + @include_event_description_in = 5, + @category_name = N'Replication', + @job_id = N'00000000-0000-0000-0000-000000000000'; + + IF NOT EXISTS ( SELECT name + FROM msdb.dbo.sysalerts AS sa + INNER JOIN msdb.dbo.sysnotifications AS sn + ON sa.id = sn.alert_id + WHERE sa.name = @AlertName) + EXEC msdb.dbo.sp_add_notification @alert_name = @AlertName, + @operator_name = @OperatorName, + @notification_method = 1; + + SET @AlertName = 'Replication: Subscriber has passed data validation'; + + IF EXISTS ( SELECT name + FROM msdb.dbo.sysalerts + WHERE ( name = @AlertName + AND enabled = 0) + OR ( name = @AlertName + AND has_notification = 0)) + EXEC msdb.dbo.sp_delete_alert @name = @AlertName; + + IF NOT EXISTS (SELECT name FROM msdb.dbo.sysalerts WHERE name = @AlertName) + EXEC msdb.dbo.sp_add_alert @name = @AlertName, + @message_id = 20575, + @severity = 0, + @enabled = 1, + @delay_between_responses = 3600, + @include_event_description_in = 5, + @category_name = N'Replication', + @job_id = N'00000000-0000-0000-0000-000000000000'; + + IF NOT EXISTS ( SELECT name + FROM msdb.dbo.sysalerts AS sa + INNER JOIN msdb.dbo.sysnotifications AS sn + ON sa.id = sn.alert_id + WHERE sa.name = @AlertName) + EXEC msdb.dbo.sp_add_notification @alert_name = @AlertName, + @operator_name = @OperatorName, + @notification_method = 1; + + SET @AlertName = 'Replication: Subscription reinitialized after validation failure'; + + IF EXISTS ( SELECT name + FROM msdb.dbo.sysalerts + WHERE ( name = @AlertName + AND enabled = 0) + OR ( name = @AlertName + AND has_notification = 0)) + EXEC msdb.dbo.sp_delete_alert @name = @AlertName; + + IF NOT EXISTS (SELECT name FROM msdb.dbo.sysalerts WHERE name = @AlertName) + EXEC msdb.dbo.sp_add_alert @name = @AlertName, + @message_id = 20572, + @severity = 0, + @enabled = 1, + @delay_between_responses = 3600, + @include_event_description_in = 5, + @category_name = N'Replication', + @job_id = N'00000000-0000-0000-0000-000000000000'; + + IF NOT EXISTS ( SELECT name + FROM msdb.dbo.sysalerts AS sa + INNER JOIN msdb.dbo.sysnotifications AS sn + ON sa.id = sn.alert_id + WHERE sa.name = @AlertName) + EXEC msdb.dbo.sp_add_notification @alert_name = @AlertName, + @operator_name = @OperatorName, + @notification_method = 1; + END; +END; +GO diff --git a/TPDT-268 - ACP in task sequence/dba_jobs/Centrale/D92220 - Check Critical Jobs.sql b/TPDT-268 - ACP in task sequence/dba_jobs/Centrale/D92220 - Check Critical Jobs.sql new file mode 100644 index 0000000..7240c81 Binary files /dev/null and b/TPDT-268 - ACP in task sequence/dba_jobs/Centrale/D92220 - Check Critical Jobs.sql differ diff --git a/TPDT-268 - ACP in task sequence/dba_jobs/Centrale/D92230 - Backup Labels List.sql b/TPDT-268 - ACP in task sequence/dba_jobs/Centrale/D92230 - Backup Labels List.sql new file mode 100644 index 0000000..fc83dfa Binary files /dev/null and b/TPDT-268 - ACP in task sequence/dba_jobs/Centrale/D92230 - Backup Labels List.sql differ diff --git a/TPDT-268 - ACP in task sequence/dba_jobs/Centrale/D92270 - Monitor amr PharmIndex.sql b/TPDT-268 - ACP in task sequence/dba_jobs/Centrale/D92270 - Monitor amr PharmIndex.sql new file mode 100644 index 0000000..de16d49 Binary files /dev/null and b/TPDT-268 - ACP in task sequence/dba_jobs/Centrale/D92270 - Monitor amr PharmIndex.sql differ diff --git a/TPDT-268 - ACP in task sequence/dba_jobs/Centrale/D93100 - Purge Synchro Label.sql b/TPDT-268 - ACP in task sequence/dba_jobs/Centrale/D93100 - Purge Synchro Label.sql new file mode 100644 index 0000000..9cfbf3a Binary files /dev/null and b/TPDT-268 - ACP in task sequence/dba_jobs/Centrale/D93100 - Purge Synchro Label.sql differ diff --git a/TPDT-268 - ACP in task sequence/dba_jobs/Centrale/D93150 - Purge All Stats Index.sql b/TPDT-268 - ACP in task sequence/dba_jobs/Centrale/D93150 - Purge All Stats Index.sql new file mode 100644 index 0000000..bcb40b0 Binary files /dev/null and b/TPDT-268 - ACP in task sequence/dba_jobs/Centrale/D93150 - Purge All Stats Index.sql differ diff --git a/TPDT-268 - ACP in task sequence/dba_jobs/Centrale/D93160 - Purge All Stats SP.sql b/TPDT-268 - ACP in task sequence/dba_jobs/Centrale/D93160 - Purge All Stats SP.sql new file mode 100644 index 0000000..1c2ce1e --- /dev/null +++ b/TPDT-268 - ACP in task sequence/dba_jobs/Centrale/D93160 - Purge All Stats SP.sql @@ -0,0 +1,200 @@ +/* Drop existing standard schedule for job */ +declare @schedule_id int +declare c_schedules cursor local forward_only static for + select ss.schedule_id + from msdb.dbo.sysjobschedules sjs +INNER JOIN msdb.dbo.sysschedules ss + ON sjs.schedule_id = ss.schedule_id + AND ss.name NOT LIKE '%#SPEC#' +INNER JOIN msdb.dbo.sysjobs sj + ON sjs.job_id = sj.job_id + WHERE sj.name = N'D93160 - Purge All Stats SP' + +open c_schedules + +FETCH NEXT FROM c_schedules into @schedule_id +while @@fetch_status = 0 +begin + IF ((select COUNT(*) from msdb.dbo.sysjobschedules where schedule_id=@schedule_id) = 1) + EXEC msdb.dbo.sp_delete_schedule @schedule_id=@schedule_id, @force_delete = 1 +FETCH NEXT FROM c_schedules into @schedule_id +end + +close c_schedules + +deallocate c_schedules + +IF EXISTS (SELECT job_id FROM msdb.dbo.sysjobs_view WHERE name = N'D93160 - Purge All Stats SP') +EXEC msdb.dbo.sp_delete_job @job_name = N'D93160 - Purge All Stats SP', @delete_unused_schedule=0 +GO + +/* Creation Job and Steps*/ +BEGIN TRANSACTION +DECLARE @ReturnCode INT +SELECT @ReturnCode = 0 + +IF NOT EXISTS (SELECT name FROM msdb.dbo.syscategories WHERE name=N'DBA-Maintenance' AND category_class=1) +BEGIN +EXEC @ReturnCode = msdb.dbo.sp_add_category @class=N'JOB', @type=N'LOCAL', @name=N'DBA-Maintenance' +IF (@@ERROR <> 0 OR @ReturnCode <> 0) GOTO QuitWithRollback + +END + +/* Add Job */ +DECLARE @jobId BINARY(16) +EXEC @ReturnCode = msdb.dbo.sp_add_job @job_name=N'D93160 - Purge All Stats SP', + @enabled=1, + @notify_level_eventlog=0, + @notify_level_email=0, + @notify_level_netsend=0, + @notify_level_page=0, + @delete_level=0, + @description=N'Cleaning SP statistics data older than 12 months. +23.09.2020 - FLA - Created +17.03.2022 - FLA : Change DBA mail', + @category_name=N'DBA-Maintenance', + @start_step_id=1, + @owner_login_name=N'sa', @job_id = @jobId OUTPUT +IF (@@ERROR <> 0 OR @ReturnCode <> 0) GOTO QuitWithRollback + +/* Add Step */ +EXEC @ReturnCode = msdb.dbo.sp_add_jobstep @job_id=@jobId, @step_name=N'Empty step', + @step_id=1, + @cmdexec_success_code=0, + @on_success_action=3, + @on_success_step_id=0, + @on_fail_action=3, + @on_fail_step_id=0, + @retry_attempts=0, + @retry_interval=0, + @os_run_priority=0, @subsystem=N'TSQL', + @command=N'/* Empty step */', + @database_name=N'master', + @output_file_name=NULL, + @flags=0, + @database_user_name=NULL, + @server=NULL, + @additional_parameters=NULL, + @proxy_id=NULL, + @proxy_name=NULL +IF (@@ERROR <> 0 OR @ReturnCode <> 0) GOTO QuitWithRollback +/* Add Step */ +EXEC @ReturnCode = msdb.dbo.sp_add_jobstep @job_id=@jobId, @step_name=N'Delete SP statistics older than 12 months', + @step_id=2, + @cmdexec_success_code=0, + @on_success_action=3, + @on_success_step_id=0, + @on_fail_action=4, + @on_fail_step_id=4, + @retry_attempts=0, + @retry_interval=0, + @os_run_priority=0, @subsystem=N'TSQL', + @command=N'EXEC [dbo].[mon_Purge_All_Stats_SP]', + @database_name=N'HCITools', + @output_file_name=NULL, + @flags=0, + @database_user_name=NULL, + @server=NULL, + @additional_parameters=NULL, + @proxy_id=NULL, + @proxy_name=NULL +IF (@@ERROR <> 0 OR @ReturnCode <> 0) GOTO QuitWithRollback +/* Add Step */ +EXEC @ReturnCode = msdb.dbo.sp_add_jobstep @job_id=@jobId, @step_name=N'Empty step for success', + @step_id=3, + @cmdexec_success_code=0, + @on_success_action=1, + @on_success_step_id=0, + @on_fail_action=4, + @on_fail_step_id=4, + @retry_attempts=0, + @retry_interval=0, + @os_run_priority=0, @subsystem=N'TSQL', + @command=N'/* Empty step */ +exec Get_Job_Error_Info @in_JobName = ''D93160 - Purge All Stats SP'', @in_Recipients = ''DBA_operator''', + @database_name=N'HCITools', + @output_file_name=NULL, + @flags=0, + @database_user_name=NULL, + @server=NULL, + @additional_parameters=NULL, + @proxy_id=NULL, + @proxy_name=NULL +IF (@@ERROR <> 0 OR @ReturnCode <> 0) GOTO QuitWithRollback +/* Add Step */ +EXEC @ReturnCode = msdb.dbo.sp_add_jobstep @job_id=@jobId, @step_name=N'Send email KO', + @step_id=4, + @cmdexec_success_code=0, + @on_success_action=2, + @on_success_step_id=0, + @on_fail_action=2, + @on_fail_step_id=0, + @retry_attempts=0, + @retry_interval=0, + @os_run_priority=0, @subsystem=N'TSQL', + @command=N'exec Get_Job_Error_Info @in_JobName = ''D93160 - Purge All Stats SP'', @in_Recipients = ''DBA_operator''', + @database_name=N'HCITools', + @output_file_name=NULL, + @flags=0, + @database_user_name=NULL, + @server=NULL, + @additional_parameters=NULL, + @proxy_id=NULL, + @proxy_name=NULL +IF (@@ERROR <> 0 OR @ReturnCode <> 0) GOTO QuitWithRollback +EXEC @ReturnCode = msdb.dbo.sp_update_job @job_id = @jobId, @start_step_id = 1 +IF (@@ERROR <> 0 OR @ReturnCode <> 0) GOTO QuitWithRollback + +/* Add Standard Schedule */ +EXEC @ReturnCode = msdb.dbo.sp_add_jobschedule @job_id=@jobId, @name=N'D93160-D', + @enabled=1, + @freq_type=4, + @freq_interval=1, + @freq_subday_type=1, + @freq_subday_interval=0, + @freq_relative_interval=0, + @freq_recurrence_factor=0, + @active_start_date=20161129, + @active_end_date=99991231, + @active_start_time=233000, + @active_end_time=235959 +IF (@@ERROR <> 0 OR @ReturnCode <> 0) GOTO QuitWithRollback + +/* Attach existing specific schedule for job */ +declare @enabled_schedule int, + @schedule_name nvarchar(50) +declare c_schedules cursor local forward_only static for +select enabled, name + from msdb.dbo.sysschedules + where name LIKE 'D93160%' + and name LIKE '%#SPEC#' + +open c_schedules + +FETCH NEXT FROM c_schedules into @enabled_schedule, @schedule_name +while @@fetch_status = 0 +begin + EXEC @ReturnCode = msdb.dbo.sp_attach_schedule @job_id = @jobId, @schedule_name=@schedule_name + IF(@enabled_schedule = 1) + begin + SET @schedule_name = SUBSTRING(@schedule_name,0,LEN(@schedule_name)-5) + IF EXISTS (select name from msdb.dbo.sysschedules where name = @schedule_name) + EXEC @ReturnCode = msdb.dbo.sp_update_schedule @name=@schedule_name, @enabled=0 + end + IF (@@ERROR <> 0 OR @ReturnCode <> 0) GOTO QuitWithRollback +FETCH NEXT FROM c_schedules into @enabled_schedule, @schedule_name +end + +close c_schedules + +deallocate c_schedules + +EXEC @ReturnCode = msdb.dbo.sp_add_jobserver @job_id = @jobId, @server_name = N'(local)' +IF (@@ERROR <> 0 OR @ReturnCode <> 0) GOTO QuitWithRollback +COMMIT TRANSACTION +GOTO EndSave +QuitWithRollback: + IF (@@TRANCOUNT > 0) ROLLBACK TRANSACTION +EndSave: + +GO diff --git a/TPDT-268 - ACP in task sequence/dba_jobs/Centrale/DR90010 - Central Track PH Insurance DML Alerts.sql b/TPDT-268 - ACP in task sequence/dba_jobs/Centrale/DR90010 - Central Track PH Insurance DML Alerts.sql new file mode 100644 index 0000000..c0aaf8f Binary files /dev/null and b/TPDT-268 - ACP in task sequence/dba_jobs/Centrale/DR90010 - Central Track PH Insurance DML Alerts.sql differ diff --git a/TPDT-268 - ACP in task sequence/dba_jobs/Centrale/_D92090 - Aggregate Stats Index.sql b/TPDT-268 - ACP in task sequence/dba_jobs/Centrale/_D92090 - Aggregate Stats Index.sql new file mode 100644 index 0000000..fba3f83 Binary files /dev/null and b/TPDT-268 - ACP in task sequence/dba_jobs/Centrale/_D92090 - Aggregate Stats Index.sql differ diff --git a/TPDT-268 - ACP in task sequence/dba_jobs/Centrale/_D92270 - Aggregate Stats SP.sql b/TPDT-268 - ACP in task sequence/dba_jobs/Centrale/_D92270 - Aggregate Stats SP.sql new file mode 100644 index 0000000..55b7730 --- /dev/null +++ b/TPDT-268 - ACP in task sequence/dba_jobs/Centrale/_D92270 - Aggregate Stats SP.sql @@ -0,0 +1,174 @@ +/*============================================================================= + + Agrégation des statistiques de procédures stockées + + ----------------------------------------------- + Ce script créer un job afin d'agréger les statistiques de procédures stockées dans la table Aggregate_Stats_SP + + Contexte d'utilisation + ---------------------- + + + Création : 23.09.2020 / FLA + + Modifications : 17.03.2022 - FLA : Change DBA mail + +=============================================================================*/ + +/* Drop existing standard schedule for job */ +declare @schedule_id int +declare c_schedules cursor local forward_only static for + select ss.schedule_id + from msdb.dbo.sysjobschedules sjs +INNER JOIN msdb.dbo.sysschedules ss + ON sjs.schedule_id = ss.schedule_id + AND ss.name NOT LIKE '%#SPEC#' +INNER JOIN msdb.dbo.sysjobs sj + ON sjs.job_id = sj.job_id + WHERE sj.name = N'_D92270 - Aggregate Stats SP' + +open c_schedules + +FETCH NEXT FROM c_schedules into @schedule_id +while @@fetch_status = 0 +begin + IF ((select COUNT(*) from msdb.dbo.sysjobschedules where schedule_id=@schedule_id) = 1) + EXEC msdb.dbo.sp_delete_schedule @schedule_id=@schedule_id, @force_delete = 1 +FETCH NEXT FROM c_schedules into @schedule_id +end + +close c_schedules + +deallocate c_schedules + +IF EXISTS (SELECT job_id FROM msdb.dbo.sysjobs_view WHERE name = N'_D92270 - Aggregate Stats SP') +EXEC msdb.dbo.sp_delete_job @job_name = N'_D92270 - Aggregate Stats SP', @delete_unused_schedule=0 +GO + +/* Creation Job and Steps*/ +BEGIN TRANSACTION +DECLARE @ReturnCode INT +SELECT @ReturnCode = 0 + +IF NOT EXISTS (SELECT name FROM msdb.dbo.syscategories WHERE name=N'DBA-Monitoring' AND category_class=1) +BEGIN +EXEC @ReturnCode = msdb.dbo.sp_add_category @class=N'JOB', @type=N'LOCAL', @name=N'DBA-Monitoring' +IF (@@ERROR <> 0 OR @ReturnCode <> 0) GOTO QuitWithRollback + +END + +/* Add Job */ +DECLARE @jobId BINARY(16) +EXEC @ReturnCode = msdb.dbo.sp_add_job @job_name=N'_D92270 - Aggregate Stats SP', + @enabled=1, + @notify_level_eventlog=0, + @notify_level_email=0, + @notify_level_netsend=0, + @notify_level_page=0, + @delete_level=0, + @description=N'Aggregate Stats SP in table Aggregate_Stats_SP + +23.09.2020 - FLA - Created', + @category_name=N'DBA-Monitoring', + @start_step_id=1, + @owner_login_name=N'sa', @job_id = @jobId OUTPUT +IF (@@ERROR <> 0 OR @ReturnCode <> 0) GOTO QuitWithRollback + +/* Add Step */ +EXEC @ReturnCode = msdb.dbo.sp_add_jobstep @job_id=@jobId, @step_name=N'Empty step', + @step_id=1, + @cmdexec_success_code=0, + @on_success_action=3, + @on_success_step_id=0, + @on_fail_action=3, + @on_fail_step_id=0, + @retry_attempts=0, + @retry_interval=0, + @os_run_priority=0, @subsystem=N'TSQL', + @command=N'/* Empty step */', + @database_name=N'master', + @output_file_name=NULL, + @flags=0, + @database_user_name=NULL, + @server=NULL, + @additional_parameters=NULL, + @proxy_id=NULL, + @proxy_name=NULL +IF (@@ERROR <> 0 OR @ReturnCode <> 0) GOTO QuitWithRollback +/* Add Step */ +EXEC @ReturnCode = msdb.dbo.sp_add_jobstep @job_id=@jobId, @step_name=N'Aggregate Stats SP', + @step_id=2, + @cmdexec_success_code=0, + @on_success_action=3, + @on_success_step_id=0, + @on_fail_action=4, + @on_fail_step_id=4, + @retry_attempts=0, + @retry_interval=1, + @os_run_priority=0, @subsystem=N'TSQL', + @command=N'exec [dbo].[mon_Aggregate_Stats_SP]', + @database_name=N'HCITools', + @output_file_name=NULL, + @flags=0, + @database_user_name=NULL, + @server=NULL, + @additional_parameters=NULL, + @proxy_id=NULL, + @proxy_name=NULL +IF (@@ERROR <> 0 OR @ReturnCode <> 0) GOTO QuitWithRollback +/* Add Step */ +EXEC @ReturnCode = msdb.dbo.sp_add_jobstep @job_id=@jobId, @step_name=N'Empty step for success', + @step_id=3, + @cmdexec_success_code=0, + @on_success_action=1, + @on_success_step_id=0, + @on_fail_action=4, + @on_fail_step_id=4, + @retry_attempts=0, + @retry_interval=0, + @os_run_priority=0, @subsystem=N'TSQL', + @command=N'/* Empty step */ +exec Get_Job_Error_Info @in_JobName = ''_D92270 - Aggregate Stats SP'', @in_Recipients = ''DBA_operator''', + @database_name=N'HCITools', + @output_file_name=NULL, + @flags=0, + @database_user_name=NULL, + @server=NULL, + @additional_parameters=NULL, + @proxy_id=NULL, + @proxy_name=NULL +IF (@@ERROR <> 0 OR @ReturnCode <> 0) GOTO QuitWithRollback +/* Add Step */ +EXEC @ReturnCode = msdb.dbo.sp_add_jobstep @job_id=@jobId, @step_name=N'Send email KO', + @step_id=4, + @cmdexec_success_code=0, + @on_success_action=2, + @on_success_step_id=0, + @on_fail_action=2, + @on_fail_step_id=0, + @retry_attempts=0, + @retry_interval=0, + @os_run_priority=0, @subsystem=N'TSQL', + @command=N'exec Get_Job_Error_Info @in_JobName = ''_D92270 - Aggregate Stats SP'', @in_Recipients = ''DBA_operator''', + @database_name=N'HCITools', + @output_file_name=NULL, + @flags=0, + @database_user_name=NULL, + @server=NULL, + @additional_parameters=NULL, + @proxy_id=NULL, + @proxy_name=NULL +IF (@@ERROR <> 0 OR @ReturnCode <> 0) GOTO QuitWithRollback +EXEC @ReturnCode = msdb.dbo.sp_update_job @job_id = @jobId, @start_step_id = 1 +IF (@@ERROR <> 0 OR @ReturnCode <> 0) GOTO QuitWithRollback + + +EXEC @ReturnCode = msdb.dbo.sp_add_jobserver @job_id = @jobId, @server_name = N'(local)' +IF (@@ERROR <> 0 OR @ReturnCode <> 0) GOTO QuitWithRollback +COMMIT TRANSACTION +GOTO EndSave +QuitWithRollback: + IF (@@TRANCOUNT > 0) ROLLBACK TRANSACTION +EndSave: + +GO diff --git a/TPDT-268 - ACP in task sequence/dba_jobs/Centrale/_MIX90290 - SYNC - Monitor AMR - Central.sql b/TPDT-268 - ACP in task sequence/dba_jobs/Centrale/_MIX90290 - SYNC - Monitor AMR - Central.sql new file mode 100644 index 0000000..94e9897 Binary files /dev/null and b/TPDT-268 - ACP in task sequence/dba_jobs/Centrale/_MIX90290 - SYNC - Monitor AMR - Central.sql differ diff --git a/TPDT-268 - ACP in task sequence/dba_jobs/D91040 - Backup of simple databases after MSI update.sql b/TPDT-268 - ACP in task sequence/dba_jobs/D91040 - Backup of simple databases after MSI update.sql new file mode 100644 index 0000000..d9bcf8e --- /dev/null +++ b/TPDT-268 - ACP in task sequence/dba_jobs/D91040 - Backup of simple databases after MSI update.sql @@ -0,0 +1,198 @@ +/* Drop existing standard schedule for job */ +declare @schedule_id int +declare c_schedules cursor local forward_only static for + select ss.schedule_id + from msdb.dbo.sysjobschedules sjs +INNER JOIN msdb.dbo.sysschedules ss + ON sjs.schedule_id = ss.schedule_id + AND ss.name NOT LIKE '%#SPEC#' +INNER JOIN msdb.dbo.sysjobs sj + ON sjs.job_id = sj.job_id + WHERE sj.name = N'D91040 - Backup of simple databases after MSI update' + +open c_schedules + +FETCH NEXT FROM c_schedules into @schedule_id +while @@fetch_status = 0 +begin + IF ((select COUNT(*) from msdb.dbo.sysjobschedules where schedule_id=@schedule_id) = 1) + EXEC msdb.dbo.sp_delete_schedule @schedule_id=@schedule_id, @force_delete = 1 +FETCH NEXT FROM c_schedules into @schedule_id +end + +close c_schedules + +deallocate c_schedules + +IF EXISTS (SELECT job_id FROM msdb.dbo.sysjobs_view WHERE name = N'D91040 - Backup of simple databases after MSI update') +EXEC msdb.dbo.sp_delete_job @job_name = N'D91040 - Backup of simple databases after MSI update', @delete_unused_schedule=0 +GO + +/* Creation Job and Steps*/ +BEGIN TRANSACTION +DECLARE @ReturnCode INT +SELECT @ReturnCode = 0 + +IF NOT EXISTS (SELECT name FROM msdb.dbo.syscategories WHERE name=N'DBA Database Maintenance' AND category_class=1) +BEGIN +EXEC @ReturnCode = msdb.dbo.sp_add_category @class=N'JOB', @type=N'LOCAL', @name=N'DBA Database Maintenance' +IF (@@ERROR <> 0 OR @ReturnCode <> 0) GOTO QuitWithRollback + +END + +/* Add Job */ +DECLARE @jobId BINARY(16) +EXEC @ReturnCode = msdb.dbo.sp_add_job @job_name=N'D91040 - Backup of simple databases after MSI update', + @enabled=1, + @notify_level_eventlog=0, + @notify_level_email=0, + @notify_level_netsend=0, + @notify_level_page=0, + @delete_level=0, + @description=N'09-01.2023 RTC: OCTPDBA-454 Backup TriaPharm database having SIMPLE recovery mode after MSI update', + @category_name=N'DBA Database Maintenance', + @start_step_id=1, + @owner_login_name=N'sa', @job_id = @jobId OUTPUT +IF (@@ERROR <> 0 OR @ReturnCode <> 0) GOTO QuitWithRollback + +/* Add Step */ +EXEC @ReturnCode = msdb.dbo.sp_add_jobstep @job_id=@jobId, @step_name=N'Empty step', + @step_id=1, + @cmdexec_success_code=0, + @on_success_action=3, + @on_success_step_id=0, + @on_fail_action=3, + @on_fail_step_id=0, + @retry_attempts=0, + @retry_interval=0, + @os_run_priority=0, @subsystem=N'TSQL', + @command=N'/* Empty step */', + @database_name=N'master', + @output_file_name=NULL, + @flags=0, + @database_user_name=NULL, + @server=NULL, + @additional_parameters=NULL, + @proxy_id=NULL, + @proxy_name=NULL +IF (@@ERROR <> 0 OR @ReturnCode <> 0) GOTO QuitWithRollback +/* Add Step */ +EXEC @ReturnCode = msdb.dbo.sp_add_jobstep @job_id=@jobId, @step_name=N'Backup databases', + @step_id=2, + @cmdexec_success_code=0, + @on_success_action=3, + @on_success_step_id=0, + @on_fail_action=4, + @on_fail_step_id=4, + @retry_attempts=0, + @retry_interval=0, + @os_run_priority=0, @subsystem=N'TSQL', + @command=N'exec hcitools.dbo.[Backup_Simple_Databases]', + @database_name=N'HCITools', + @output_file_name=NULL, + @flags=0, + @database_user_name=NULL, + @server=NULL, + @additional_parameters=NULL, + @proxy_id=NULL, + @proxy_name=NULL +IF (@@ERROR <> 0 OR @ReturnCode <> 0) GOTO QuitWithRollback +/* Add Step */ +EXEC @ReturnCode = msdb.dbo.sp_add_jobstep @job_id=@jobId, @step_name=N'Empty step for success', + @step_id=3, + @cmdexec_success_code=0, + @on_success_action=1, + @on_success_step_id=0, + @on_fail_action=4, + @on_fail_step_id=4, + @retry_attempts=0, + @retry_interval=0, + @os_run_priority=0, @subsystem=N'TSQL', + @command=N'/* Empty step */ +', + @database_name=N'master', + @output_file_name=NULL, + @flags=0, + @database_user_name=NULL, + @server=NULL, + @additional_parameters=NULL, + @proxy_id=NULL, + @proxy_name=NULL +IF (@@ERROR <> 0 OR @ReturnCode <> 0) GOTO QuitWithRollback +/* Add Step */ +EXEC @ReturnCode = msdb.dbo.sp_add_jobstep @job_id=@jobId, @step_name=N'Send email KO', + @step_id=4, + @cmdexec_success_code=0, + @on_success_action=2, + @on_success_step_id=0, + @on_fail_action=2, + @on_fail_step_id=0, + @retry_attempts=0, + @retry_interval=0, + @os_run_priority=0, @subsystem=N'TSQL', + @command=N'exec Get_Job_Error_Info @in_JobName = ''D91040 - Backup of simple databases after MSI update'', @in_Recipients = ''DBA_operator''', + @database_name=N'HCITools', + @output_file_name=NULL, + @flags=0, + @database_user_name=NULL, + @server=NULL, + @additional_parameters=NULL, + @proxy_id=NULL, + @proxy_name=NULL +IF (@@ERROR <> 0 OR @ReturnCode <> 0) GOTO QuitWithRollback +EXEC @ReturnCode = msdb.dbo.sp_update_job @job_id = @jobId, @start_step_id = 1 +IF (@@ERROR <> 0 OR @ReturnCode <> 0) GOTO QuitWithRollback + +/* Add Standard Schedule */ +EXEC @ReturnCode = msdb.dbo.sp_add_jobschedule @job_id=@jobId, @name=N'D91040-D', + @enabled=1, + @freq_type=4, + @freq_interval=1, + @freq_subday_type=1, + @freq_subday_interval=0, + @freq_relative_interval=0, + @freq_recurrence_factor=0, + @active_start_date=20230109, + @active_end_date=99991231, + @active_start_time=60000, + @active_end_time=235959 +IF (@@ERROR <> 0 OR @ReturnCode <> 0) GOTO QuitWithRollback + +/* Attach existing specific schedule for job */ +declare @enabled_schedule int, + @schedule_name nvarchar(50) +declare c_schedules cursor local forward_only static for +select enabled, name + from msdb.dbo.sysschedules + where name LIKE 'D91040%' + and name LIKE '%#SPEC#' + +open c_schedules + +FETCH NEXT FROM c_schedules into @enabled_schedule, @schedule_name +while @@fetch_status = 0 +begin + EXEC @ReturnCode = msdb.dbo.sp_attach_schedule @job_id = @jobId, @schedule_name=@schedule_name + IF(@enabled_schedule = 1) + begin + SET @schedule_name = SUBSTRING(@schedule_name,0,LEN(@schedule_name)-5) + IF EXISTS (select name from msdb.dbo.sysschedules where name = @schedule_name) + EXEC @ReturnCode = msdb.dbo.sp_update_schedule @name=@schedule_name, @enabled=0 + end + IF (@@ERROR <> 0 OR @ReturnCode <> 0) GOTO QuitWithRollback +FETCH NEXT FROM c_schedules into @enabled_schedule, @schedule_name +end + +close c_schedules + +deallocate c_schedules + +EXEC @ReturnCode = msdb.dbo.sp_add_jobserver @job_id = @jobId, @server_name = N'(local)' +IF (@@ERROR <> 0 OR @ReturnCode <> 0) GOTO QuitWithRollback +COMMIT TRANSACTION +GOTO EndSave +QuitWithRollback: + IF (@@TRANCOUNT > 0) ROLLBACK TRANSACTION +EndSave: + +GO diff --git a/TPDT-268 - ACP in task sequence/dba_jobs/D92070 - Transfert Stats Index.sql b/TPDT-268 - ACP in task sequence/dba_jobs/D92070 - Transfert Stats Index.sql new file mode 100644 index 0000000..0a79a21 Binary files /dev/null and b/TPDT-268 - ACP in task sequence/dba_jobs/D92070 - Transfert Stats Index.sql differ diff --git a/TPDT-268 - ACP in task sequence/dba_jobs/D92080 - Collect Stats Index.sql b/TPDT-268 - ACP in task sequence/dba_jobs/D92080 - Collect Stats Index.sql new file mode 100644 index 0000000..aa30c55 --- /dev/null +++ b/TPDT-268 - ACP in task sequence/dba_jobs/D92080 - Collect Stats Index.sql @@ -0,0 +1,243 @@ +/*============================================================================= + + Collecte des statistiques d'index + + ----------------------------------------------- + Ce script créer un job appelant la procédure stockée [mon_Collect_Stats_Index] + + Contexte d'utilisation + ---------------------- + Ce job doit être créé après avoir créé la procédure stockée [mon_Collect_Stats_Index] + + Création : 14.07.2015 / FLA + + Modifications : 22.07.2016 / FLA standardize job name and schedule + 09.09.2016 / FLA : Ajout de Get_Job_Error_Info dans empty step et Send Mail KO + 04.10.2017 / FLA : Ajout de la gestion des environnements + 16.11.2020 / SPE - TFS62199 - Collect Stats SP and Index performances + 17.03.2022 / FLA : Change DBA mail +=============================================================================*/ + +/* Drop existing standard schedule for job */ +declare @schedule_id int +declare c_schedules cursor local forward_only static for + select ss.schedule_id + from msdb.dbo.sysjobschedules sjs +INNER JOIN msdb.dbo.sysschedules ss + ON sjs.schedule_id = ss.schedule_id + AND ss.name NOT LIKE '%#SPEC#' +INNER JOIN msdb.dbo.sysjobs sj + ON sjs.job_id = sj.job_id + WHERE sj.name = N'D92080 - Collect Stats Index' + +open c_schedules + +FETCH NEXT FROM c_schedules into @schedule_id +while @@fetch_status = 0 +begin + IF ((select COUNT(*) from msdb.dbo.sysjobschedules where schedule_id=@schedule_id) = 1) + EXEC msdb.dbo.sp_delete_schedule @schedule_id=@schedule_id, @force_delete = 1 +FETCH NEXT FROM c_schedules into @schedule_id +end + +close c_schedules + +deallocate c_schedules + +IF EXISTS (SELECT job_id FROM msdb.dbo.sysjobs_view WHERE name = N'D92080 - Collect Stats Index') +EXEC msdb.dbo.sp_delete_job @job_name = N'D92080 - Collect Stats Index', @delete_unused_schedule=0 +GO + +/* Creation Job and Steps*/ +BEGIN TRANSACTION +DECLARE @ReturnCode INT +SELECT @ReturnCode = 0 + +IF NOT EXISTS (SELECT name FROM msdb.dbo.syscategories WHERE name=N'DBA-Monitoring' AND category_class=1) +BEGIN +EXEC @ReturnCode = msdb.dbo.sp_add_category @class=N'JOB', @type=N'LOCAL', @name=N'DBA-Monitoring' +IF (@@ERROR <> 0 OR @ReturnCode <> 0) GOTO QuitWithRollback + +END + +/* Add Job */ +DECLARE @jobId BINARY(16) +EXEC @ReturnCode = msdb.dbo.sp_add_job @job_name=N'D92080 - Collect Stats Index', + @enabled=1, + @notify_level_eventlog=0, + @notify_level_email=0, + @notify_level_netsend=0, + @notify_level_page=0, + @delete_level=0, + @description=N'Collect Stats Index from DMV sys.dm_db_index_usage_stats + +14.07.2015 - FLA - Created +16.11.2020 - SPE - Modify schedules and add random time', + @category_name=N'DBA-Monitoring', + @start_step_id=1, + @owner_login_name=N'sa', @job_id = @jobId OUTPUT +IF (@@ERROR <> 0 OR @ReturnCode <> 0) GOTO QuitWithRollback + +/* Add Step */ +EXEC @ReturnCode = msdb.dbo.sp_add_jobstep @job_id=@jobId, @step_name=N'Empty step', + @step_id=1, + @cmdexec_success_code=0, + @on_success_action=3, + @on_success_step_id=0, + @on_fail_action=3, + @on_fail_step_id=0, + @retry_attempts=0, + @retry_interval=0, + @os_run_priority=0, @subsystem=N'TSQL', + @command=N'/* Empty step */', + @database_name=N'master', + @output_file_name=NULL, + @flags=0, + @database_user_name=NULL, + @server=NULL, + @additional_parameters=NULL, + @proxy_id=NULL, + @proxy_name=NULL +IF (@@ERROR <> 0 OR @ReturnCode <> 0) GOTO QuitWithRollback +/* Add Step */ +EXEC @ReturnCode = msdb.dbo.sp_add_jobstep @job_id=@jobId, @step_name=N'Wait for a random delay of 0..15 minutes', + @step_id=2, + @cmdexec_success_code=0, + @on_success_action=3, + @on_success_step_id=0, + @on_fail_action=3, + @on_fail_step_id=0, + @retry_attempts=0, + @retry_interval=0, + @os_run_priority=0, @subsystem=N'TSQL', + @command=N'EXEC [dbo].[aps_Wait_Random_Time] @in_Minutes = 15 +', + @database_name=N'HCITools', + @output_file_name=NULL, + @flags=0, + @database_user_name=NULL, + @server=NULL, + @additional_parameters=NULL, + @proxy_id=NULL, + @proxy_name=NULL +IF (@@ERROR <> 0 OR @ReturnCode <> 0) GOTO QuitWithRollback +/* Add Step */ +EXEC @ReturnCode = msdb.dbo.sp_add_jobstep @job_id=@jobId, @step_name=N'Collect Stats Index', + @step_id=3, + @cmdexec_success_code=0, + @on_success_action=3, + @on_success_step_id=0, + @on_fail_action=4, + @on_fail_step_id=5, + @retry_attempts=0, + @retry_interval=1, + @os_run_priority=0, @subsystem=N'TSQL', + @command=N'exec [dbo].[mon_Collect_Stats_Index]', + @database_name=N'HCITools', + @output_file_name=NULL, + @flags=0, + @database_user_name=NULL, + @server=NULL, + @additional_parameters=NULL, + @proxy_id=NULL, + @proxy_name=NULL +IF (@@ERROR <> 0 OR @ReturnCode <> 0) GOTO QuitWithRollback +/* Add Step */ +EXEC @ReturnCode = msdb.dbo.sp_add_jobstep @job_id=@jobId, @step_name=N'Empty step for success', + @step_id=4, + @cmdexec_success_code=0, + @on_success_action=1, + @on_success_step_id=0, + @on_fail_action=4, + @on_fail_step_id=5, + @retry_attempts=0, + @retry_interval=0, + @os_run_priority=0, @subsystem=N'TSQL', + @command=N'/* Empty step */ +exec Get_Job_Error_Info @in_JobName = ''D92080 - Collect Stats Index'', @in_Recipients = ''DBA_operator''', + @database_name=N'HCITools', + @output_file_name=NULL, + @flags=0, + @database_user_name=NULL, + @server=NULL, + @additional_parameters=NULL, + @proxy_id=NULL, + @proxy_name=NULL +IF (@@ERROR <> 0 OR @ReturnCode <> 0) GOTO QuitWithRollback +/* Add Step */ +EXEC @ReturnCode = msdb.dbo.sp_add_jobstep @job_id=@jobId, @step_name=N'Send email KO', + @step_id=5, + @cmdexec_success_code=0, + @on_success_action=2, + @on_success_step_id=0, + @on_fail_action=2, + @on_fail_step_id=0, + @retry_attempts=0, + @retry_interval=0, + @os_run_priority=0, @subsystem=N'TSQL', + @command=N'exec Get_Job_Error_Info @in_JobName = ''D92080 - Collect Stats Index'', @in_Recipients = ''DBA_operator''', + @database_name=N'HCITools', + @output_file_name=NULL, + @flags=0, + @database_user_name=NULL, + @server=NULL, + @additional_parameters=NULL, + @proxy_id=NULL, + @proxy_name=NULL +IF (@@ERROR <> 0 OR @ReturnCode <> 0) GOTO QuitWithRollback +EXEC @ReturnCode = msdb.dbo.sp_update_job @job_id = @jobId, @start_step_id = 1 +IF (@@ERROR <> 0 OR @ReturnCode <> 0) GOTO QuitWithRollback + +/* Add Standard Schedule */ +EXEC @ReturnCode = msdb.dbo.sp_add_jobschedule @job_id=@jobId, @name=N'D92080-D', + @enabled=1, + @freq_type=4, + @freq_interval=1, + @freq_subday_type=1, + @freq_subday_interval=0, + @freq_relative_interval=0, + @freq_recurrence_factor=0, + @active_start_date=20160722, + @active_end_date=99991231, + @active_start_time=233000, + @active_end_time=235959 +IF (@@ERROR <> 0 OR @ReturnCode <> 0) GOTO QuitWithRollback + +/* Attach existing specific schedule for job */ +declare @enabled_schedule int, + @schedule_name nvarchar(50) +declare c_schedules cursor local forward_only static for +select enabled, name + from msdb.dbo.sysschedules + where name LIKE 'D92080%' + and name LIKE '%#SPEC#' + +open c_schedules + +FETCH NEXT FROM c_schedules into @enabled_schedule, @schedule_name +while @@fetch_status = 0 +begin + EXEC @ReturnCode = msdb.dbo.sp_attach_schedule @job_id = @jobId, @schedule_name=@schedule_name + IF(@enabled_schedule = 1) + begin + SET @schedule_name = SUBSTRING(@schedule_name,0,LEN(@schedule_name)-5) + IF EXISTS (select name from msdb.dbo.sysschedules where name = @schedule_name) + EXEC @ReturnCode = msdb.dbo.sp_update_schedule @name=@schedule_name, @enabled=0 + end + IF (@@ERROR <> 0 OR @ReturnCode <> 0) GOTO QuitWithRollback +FETCH NEXT FROM c_schedules into @enabled_schedule, @schedule_name +end + +close c_schedules + +deallocate c_schedules + +EXEC @ReturnCode = msdb.dbo.sp_add_jobserver @job_id = @jobId, @server_name = N'(local)' +IF (@@ERROR <> 0 OR @ReturnCode <> 0) GOTO QuitWithRollback +COMMIT TRANSACTION +GOTO EndSave +QuitWithRollback: + IF (@@TRANCOUNT > 0) ROLLBACK TRANSACTION +EndSave: + +GO diff --git a/TPDT-268 - ACP in task sequence/dba_jobs/D92100 - DBA Check.sql b/TPDT-268 - ACP in task sequence/dba_jobs/D92100 - DBA Check.sql new file mode 100644 index 0000000..60bd889 Binary files /dev/null and b/TPDT-268 - ACP in task sequence/dba_jobs/D92100 - DBA Check.sql differ diff --git a/TPDT-268 - ACP in task sequence/dba_jobs/D92250 - Collect Stats SP.sql b/TPDT-268 - ACP in task sequence/dba_jobs/D92250 - Collect Stats SP.sql new file mode 100644 index 0000000..3c8b0a7 --- /dev/null +++ b/TPDT-268 - ACP in task sequence/dba_jobs/D92250 - Collect Stats SP.sql @@ -0,0 +1,240 @@ +/*============================================================================= + + Collecte des statistiques de procédures stockées + + ----------------------------------------------- + Ce script créer un job appelant la procédure stockée [mon_Collect_Stats_SP] + + Contexte d'utilisation + ---------------------- + Ce job doit être créé après avoir créé la procédure stockée [mon_Collect_Stats_SP] + + Création : 23.09.2020 / FLA + + Modifications : 16.11.2020 / SPE - TFS62199 - Collect Stats SP and Index performances + 17.03.2022 / FLA : Change DBA mail +=============================================================================*/ + +/* Drop existing standard schedule for job */ +declare @schedule_id int +declare c_schedules cursor local forward_only static for + select ss.schedule_id + from msdb.dbo.sysjobschedules sjs +INNER JOIN msdb.dbo.sysschedules ss + ON sjs.schedule_id = ss.schedule_id + AND ss.name NOT LIKE '%#SPEC#' +INNER JOIN msdb.dbo.sysjobs sj + ON sjs.job_id = sj.job_id + WHERE sj.name = N'D92250 - Collect Stats SP' + +open c_schedules + +FETCH NEXT FROM c_schedules into @schedule_id +while @@fetch_status = 0 +begin + IF ((select COUNT(*) from msdb.dbo.sysjobschedules where schedule_id=@schedule_id) = 1) + EXEC msdb.dbo.sp_delete_schedule @schedule_id=@schedule_id, @force_delete = 1 +FETCH NEXT FROM c_schedules into @schedule_id +end + +close c_schedules + +deallocate c_schedules + +IF EXISTS (SELECT job_id FROM msdb.dbo.sysjobs_view WHERE name = N'D92250 - Collect Stats SP') +EXEC msdb.dbo.sp_delete_job @job_name = N'D92250 - Collect Stats SP', @delete_unused_schedule=0 +GO + +/* Creation Job and Steps*/ +BEGIN TRANSACTION +DECLARE @ReturnCode INT +SELECT @ReturnCode = 0 + +IF NOT EXISTS (SELECT name FROM msdb.dbo.syscategories WHERE name=N'DBA-Monitoring' AND category_class=1) +BEGIN +EXEC @ReturnCode = msdb.dbo.sp_add_category @class=N'JOB', @type=N'LOCAL', @name=N'DBA-Monitoring' +IF (@@ERROR <> 0 OR @ReturnCode <> 0) GOTO QuitWithRollback + +END + +/* Add Job */ +DECLARE @jobId BINARY(16) +EXEC @ReturnCode = msdb.dbo.sp_add_job @job_name=N'D92250 - Collect Stats SP', + @enabled=1, + @notify_level_eventlog=0, + @notify_level_email=0, + @notify_level_netsend=0, + @notify_level_page=0, + @delete_level=0, + @description=N'Collect Stats Index from DMV sys.dm_exec_procedure_stats + +23.09.2020 - FLA - Created +16.11.2020 - SPE - Modify schedules and add random time', + @category_name=N'DBA-Monitoring', + @start_step_id=1, + @owner_login_name=N'sa', @job_id = @jobId OUTPUT +IF (@@ERROR <> 0 OR @ReturnCode <> 0) GOTO QuitWithRollback + +/* Add Step */ +EXEC @ReturnCode = msdb.dbo.sp_add_jobstep @job_id=@jobId, @step_name=N'Empty step', + @step_id=1, + @cmdexec_success_code=0, + @on_success_action=3, + @on_success_step_id=0, + @on_fail_action=3, + @on_fail_step_id=0, + @retry_attempts=0, + @retry_interval=0, + @os_run_priority=0, @subsystem=N'TSQL', + @command=N'/* Empty step */', + @database_name=N'master', + @output_file_name=NULL, + @flags=0, + @database_user_name=NULL, + @server=NULL, + @additional_parameters=NULL, + @proxy_id=NULL, + @proxy_name=NULL +IF (@@ERROR <> 0 OR @ReturnCode <> 0) GOTO QuitWithRollback +/* Add Step */ +EXEC @ReturnCode = msdb.dbo.sp_add_jobstep @job_id=@jobId, @step_name=N'Wait for a random delay of 0..15 minutes', + @step_id=2, + @cmdexec_success_code=0, + @on_success_action=3, + @on_success_step_id=0, + @on_fail_action=3, + @on_fail_step_id=0, + @retry_attempts=0, + @retry_interval=0, + @os_run_priority=0, @subsystem=N'TSQL', + @command=N'EXEC [dbo].[aps_Wait_Random_Time] @in_Minutes = 15 +', + @database_name=N'HCITools', + @output_file_name=NULL, + @flags=0, + @database_user_name=NULL, + @server=NULL, + @additional_parameters=NULL, + @proxy_id=NULL, + @proxy_name=NULL +IF (@@ERROR <> 0 OR @ReturnCode <> 0) GOTO QuitWithRollback +/* Add Step */ +EXEC @ReturnCode = msdb.dbo.sp_add_jobstep @job_id=@jobId, @step_name=N'Collect Stats SP', + @step_id=3, + @cmdexec_success_code=0, + @on_success_action=3, + @on_success_step_id=0, + @on_fail_action=4, + @on_fail_step_id=5, + @retry_attempts=0, + @retry_interval=1, + @os_run_priority=0, @subsystem=N'TSQL', + @command=N'exec [dbo].[mon_Collect_Stats_SP]', + @database_name=N'HCITools', + @output_file_name=NULL, + @flags=0, + @database_user_name=NULL, + @server=NULL, + @additional_parameters=NULL, + @proxy_id=NULL, + @proxy_name=NULL +IF (@@ERROR <> 0 OR @ReturnCode <> 0) GOTO QuitWithRollback +/* Add Step */ +EXEC @ReturnCode = msdb.dbo.sp_add_jobstep @job_id=@jobId, @step_name=N'Empty step for success', + @step_id=4, + @cmdexec_success_code=0, + @on_success_action=1, + @on_success_step_id=0, + @on_fail_action=4, + @on_fail_step_id=5, + @retry_attempts=0, + @retry_interval=0, + @os_run_priority=0, @subsystem=N'TSQL', + @command=N'/* Empty step */ +exec Get_Job_Error_Info @in_JobName = ''D92250 - Collect Stats SP'', @in_Recipients = ''DBA_operator''', + @database_name=N'HCITools', + @output_file_name=NULL, + @flags=0, + @database_user_name=NULL, + @server=NULL, + @additional_parameters=NULL, + @proxy_id=NULL, + @proxy_name=NULL +IF (@@ERROR <> 0 OR @ReturnCode <> 0) GOTO QuitWithRollback +/* Add Step */ +EXEC @ReturnCode = msdb.dbo.sp_add_jobstep @job_id=@jobId, @step_name=N'Send email KO', + @step_id=5, + @cmdexec_success_code=0, + @on_success_action=2, + @on_success_step_id=0, + @on_fail_action=2, + @on_fail_step_id=0, + @retry_attempts=0, + @retry_interval=0, + @os_run_priority=0, @subsystem=N'TSQL', + @command=N'exec Get_Job_Error_Info @in_JobName = ''D92250 - Collect Stats SP'', @in_Recipients = ''DBA_operator''', + @database_name=N'HCITools', + @output_file_name=NULL, + @flags=0, + @database_user_name=NULL, + @server=NULL, + @additional_parameters=NULL, + @proxy_id=NULL, + @proxy_name=NULL +IF (@@ERROR <> 0 OR @ReturnCode <> 0) GOTO QuitWithRollback +EXEC @ReturnCode = msdb.dbo.sp_update_job @job_id = @jobId, @start_step_id = 1 +IF (@@ERROR <> 0 OR @ReturnCode <> 0) GOTO QuitWithRollback + +/* Add Standard Schedule */ +EXEC @ReturnCode = msdb.dbo.sp_add_jobschedule @job_id=@jobId, @name=N'D92250-D', + @enabled=1, + @freq_type=4, + @freq_interval=1, + @freq_subday_type=1, + @freq_subday_interval=0, + @freq_relative_interval=0, + @freq_recurrence_factor=0, + @active_start_date=20160722, + @active_end_date=99991231, + @active_start_time=230000, + @active_end_time=235959 +IF (@@ERROR <> 0 OR @ReturnCode <> 0) GOTO QuitWithRollback + +/* Attach existing specific schedule for job */ +declare @enabled_schedule int, + @schedule_name nvarchar(50) +declare c_schedules cursor local forward_only static for +select enabled, name + from msdb.dbo.sysschedules + where name LIKE 'D92250%' + and name LIKE '%#SPEC#' + +open c_schedules + +FETCH NEXT FROM c_schedules into @enabled_schedule, @schedule_name +while @@fetch_status = 0 +begin + EXEC @ReturnCode = msdb.dbo.sp_attach_schedule @job_id = @jobId, @schedule_name=@schedule_name + IF(@enabled_schedule = 1) + begin + SET @schedule_name = SUBSTRING(@schedule_name,0,LEN(@schedule_name)-5) + IF EXISTS (select name from msdb.dbo.sysschedules where name = @schedule_name) + EXEC @ReturnCode = msdb.dbo.sp_update_schedule @name=@schedule_name, @enabled=0 + end + IF (@@ERROR <> 0 OR @ReturnCode <> 0) GOTO QuitWithRollback +FETCH NEXT FROM c_schedules into @enabled_schedule, @schedule_name +end + +close c_schedules + +deallocate c_schedules + +EXEC @ReturnCode = msdb.dbo.sp_add_jobserver @job_id = @jobId, @server_name = N'(local)' +IF (@@ERROR <> 0 OR @ReturnCode <> 0) GOTO QuitWithRollback +COMMIT TRANSACTION +GOTO EndSave +QuitWithRollback: + IF (@@TRANCOUNT > 0) ROLLBACK TRANSACTION +EndSave: + +GO diff --git a/TPDT-268 - ACP in task sequence/dba_jobs/D92260 - Transfert Stats SP.sql b/TPDT-268 - ACP in task sequence/dba_jobs/D92260 - Transfert Stats SP.sql new file mode 100644 index 0000000..2d5c4e6 --- /dev/null +++ b/TPDT-268 - ACP in task sequence/dba_jobs/D92260 - Transfert Stats SP.sql @@ -0,0 +1,261 @@ +/*============================================================================= + + Transfert des statistiques de procédure stockées + + ----------------------------------------------- + Ce script créer un job appelant la procédure stockée [mon_Transfert_Stats_SP] puis [mon_Purge_Stats_SP] + + Contexte d'utilisation + ---------------------- + Ce job doit être créé après avoir créé la procédure stockée [mon_Transfert_Stats_SP] et [mon_Purge_Stats_SP] + + Création : 23.09.2020 / FLA + + Modifications : 16.11.2020 / SPE - TFS62199 - Collect Stats SP and Index performances + 17.03.2022 / FLA : Change DBA mail + +=============================================================================*/ + +/* Drop existing standard schedule for job */ +declare @schedule_id int +declare c_schedules cursor local forward_only static for + select ss.schedule_id + from msdb.dbo.sysjobschedules sjs +INNER JOIN msdb.dbo.sysschedules ss + ON sjs.schedule_id = ss.schedule_id + AND ss.name NOT LIKE '%#SPEC#' +INNER JOIN msdb.dbo.sysjobs sj + ON sjs.job_id = sj.job_id + WHERE sj.name = N'D92260 - Transfert Stats SP' + +open c_schedules + +FETCH NEXT FROM c_schedules into @schedule_id +while @@fetch_status = 0 +begin + IF ((select COUNT(*) from msdb.dbo.sysjobschedules where schedule_id=@schedule_id) = 1) + EXEC msdb.dbo.sp_delete_schedule @schedule_id=@schedule_id, @force_delete = 1 +FETCH NEXT FROM c_schedules into @schedule_id +end + +close c_schedules + +deallocate c_schedules + +IF EXISTS (SELECT job_id FROM msdb.dbo.sysjobs_view WHERE name = N'D92260 - Transfert Stats SP') +EXEC msdb.dbo.sp_delete_job @job_name = N'D92260 - Transfert Stats SP', @delete_unused_schedule=0 +GO + +/* Creation Job and Steps*/ +BEGIN TRANSACTION +DECLARE @ReturnCode INT +SELECT @ReturnCode = 0 + +IF NOT EXISTS (SELECT name FROM msdb.dbo.syscategories WHERE name=N'DBA-Monitoring' AND category_class=1) +BEGIN +EXEC @ReturnCode = msdb.dbo.sp_add_category @class=N'JOB', @type=N'LOCAL', @name=N'DBA-Monitoring' +IF (@@ERROR <> 0 OR @ReturnCode <> 0) GOTO QuitWithRollback + +END + +/* Add Job */ +DECLARE @jobId BINARY(16) +EXEC @ReturnCode = msdb.dbo.sp_add_job @job_name=N'D92260 - Transfert Stats SP', + @enabled=1, + @notify_level_eventlog=0, + @notify_level_email=0, + @notify_level_netsend=0, + @notify_level_page=0, + @delete_level=0, + @description=N'Transfert les stats de SP sur la centrale + +23.09.2020 - FLA - Created +16.11.2020 - SPE - Modify schedules', + @category_name=N'DBA-Monitoring', + @start_step_id=1, + @owner_login_name=N'sa', @job_id = @jobId OUTPUT +IF (@@ERROR <> 0 OR @ReturnCode <> 0) GOTO QuitWithRollback + +/* Add Step */ +EXEC @ReturnCode = msdb.dbo.sp_add_jobstep @job_id=@jobId, @step_name=N'Empty step', + @step_id=1, + @cmdexec_success_code=0, + @on_success_action=3, + @on_success_step_id=0, + @on_fail_action=3, + @on_fail_step_id=0, + @retry_attempts=0, + @retry_interval=0, + @os_run_priority=0, @subsystem=N'TSQL', + @command=N'/* Empty step */', + @database_name=N'master', + @output_file_name=NULL, + @flags=0, + @database_user_name=NULL, + @server=NULL, + @additional_parameters=NULL, + @proxy_id=NULL, + @proxy_name=NULL +IF (@@ERROR <> 0 OR @ReturnCode <> 0) GOTO QuitWithRollback +/* Add Step */ +EXEC @ReturnCode = msdb.dbo.sp_add_jobstep @job_id=@jobId, @step_name=N'Wait for a random delay of 0..15 minutes', + @step_id=2, + @cmdexec_success_code=0, + @on_success_action=3, + @on_success_step_id=0, + @on_fail_action=3, + @on_fail_step_id=0, + @retry_attempts=0, + @retry_interval=0, + @os_run_priority=0, @subsystem=N'TSQL', + @command=N'EXEC [dbo].[Wait_Random_Time] @in_Minutes = 15', + @database_name=N'HCITools', + @output_file_name=NULL, + @flags=0, + @database_user_name=NULL, + @server=NULL, + @additional_parameters=NULL, + @proxy_id=NULL, + @proxy_name=NULL +IF (@@ERROR <> 0 OR @ReturnCode <> 0) GOTO QuitWithRollback +/* Add Step */ +EXEC @ReturnCode = msdb.dbo.sp_add_jobstep @job_id=@jobId, @step_name=N'Transfert Stats SP', + @step_id=3, + @cmdexec_success_code=0, + @on_success_action=3, + @on_success_step_id=0, + @on_fail_action=4, + @on_fail_step_id=6, + @retry_attempts=0, + @retry_interval=0, + @os_run_priority=0, @subsystem=N'TSQL', + @command=N'exec [dbo].[mon_Transfert_Stats_SP]', + @database_name=N'HCITools', + @output_file_name=NULL, + @flags=0, + @database_user_name=NULL, + @server=NULL, + @additional_parameters=NULL, + @proxy_id=NULL, + @proxy_name=NULL +IF (@@ERROR <> 0 OR @ReturnCode <> 0) GOTO QuitWithRollback +/* Add Step */ +EXEC @ReturnCode = msdb.dbo.sp_add_jobstep @job_id=@jobId, @step_name=N'Purge Stats SP locally', + @step_id=4, + @cmdexec_success_code=0, + @on_success_action=3, + @on_success_step_id=0, + @on_fail_action=4, + @on_fail_step_id=6, + @retry_attempts=0, + @retry_interval=0, + @os_run_priority=0, @subsystem=N'TSQL', + @command=N'EXEC [dbo].[mon_Purge_Stats_SP]', + @database_name=N'HCITools', + @output_file_name=NULL, + @flags=0, + @database_user_name=NULL, + @server=NULL, + @additional_parameters=NULL, + @proxy_id=NULL, + @proxy_name=NULL +IF (@@ERROR <> 0 OR @ReturnCode <> 0) GOTO QuitWithRollback +/* Add Step */ +EXEC @ReturnCode = msdb.dbo.sp_add_jobstep @job_id=@jobId, @step_name=N'Empty step for success', + @step_id=5, + @cmdexec_success_code=0, + @on_success_action=1, + @on_success_step_id=0, + @on_fail_action=4, + @on_fail_step_id=6, + @retry_attempts=0, + @retry_interval=0, + @os_run_priority=0, @subsystem=N'TSQL', + @command=N'/* Empty step */ +exec Get_Job_Error_Info @in_JobName = ''D92260 - Transfert Stats SP'', @in_Recipients = ''DBA_operator''', + @database_name=N'HCITools', + @output_file_name=NULL, + @flags=0, + @database_user_name=NULL, + @server=NULL, + @additional_parameters=NULL, + @proxy_id=NULL, + @proxy_name=NULL +IF (@@ERROR <> 0 OR @ReturnCode <> 0) GOTO QuitWithRollback +/* Add Step */ +EXEC @ReturnCode = msdb.dbo.sp_add_jobstep @job_id=@jobId, @step_name=N'Send email KO', + @step_id=6, + @cmdexec_success_code=0, + @on_success_action=2, + @on_success_step_id=0, + @on_fail_action=2, + @on_fail_step_id=0, + @retry_attempts=0, + @retry_interval=0, + @os_run_priority=0, @subsystem=N'TSQL', + @command=N'exec Get_Job_Error_Info @in_JobName = ''D92260 - Transfert Stats SP'', @in_Recipients = ''DBA_operator''', + @database_name=N'HCITools', + @output_file_name=NULL, + @flags=0, + @database_user_name=NULL, + @server=NULL, + @additional_parameters=NULL, + @proxy_id=NULL, + @proxy_name=NULL +IF (@@ERROR <> 0 OR @ReturnCode <> 0) GOTO QuitWithRollback +EXEC @ReturnCode = msdb.dbo.sp_update_job @job_id = @jobId, @start_step_id = 1 +IF (@@ERROR <> 0 OR @ReturnCode <> 0) GOTO QuitWithRollback + +/* Add Standard Schedule */ +EXEC @ReturnCode = msdb.dbo.sp_add_jobschedule @job_id=@jobId, @name=N'D92260-D', + @enabled=1, + @freq_type=4, + @freq_interval=1, + @freq_subday_type=1, + @freq_subday_interval=0, + @freq_relative_interval=0, + @freq_recurrence_factor=0, + @active_start_date=20160509, + @active_end_date=99991231, + @active_start_time=000000, + @active_end_time=235959 +IF (@@ERROR <> 0 OR @ReturnCode <> 0) GOTO QuitWithRollback + +/* Attach existing specific schedule for job */ +declare @enabled_schedule int, + @schedule_name nvarchar(50) +declare c_schedules cursor local forward_only static for +select enabled, name + from msdb.dbo.sysschedules + where name LIKE 'D92260%' + and name LIKE '%#SPEC#' + +open c_schedules + +FETCH NEXT FROM c_schedules into @enabled_schedule, @schedule_name +while @@fetch_status = 0 +begin + EXEC @ReturnCode = msdb.dbo.sp_attach_schedule @job_id = @jobId, @schedule_name=@schedule_name + IF(@enabled_schedule = 1) + begin + SET @schedule_name = SUBSTRING(@schedule_name,0,LEN(@schedule_name)-5) + IF EXISTS (select name from msdb.dbo.sysschedules where name = @schedule_name) + EXEC @ReturnCode = msdb.dbo.sp_update_schedule @name=@schedule_name, @enabled=0 + end + IF (@@ERROR <> 0 OR @ReturnCode <> 0) GOTO QuitWithRollback +FETCH NEXT FROM c_schedules into @enabled_schedule, @schedule_name +end + +close c_schedules + +deallocate c_schedules + +EXEC @ReturnCode = msdb.dbo.sp_add_jobserver @job_id = @jobId, @server_name = N'(local)' +IF (@@ERROR <> 0 OR @ReturnCode <> 0) GOTO QuitWithRollback +COMMIT TRANSACTION +GOTO EndSave +QuitWithRollback: + IF (@@TRANCOUNT > 0) ROLLBACK TRANSACTION +EndSave: + +GO diff --git a/TPDT-268 - ACP in task sequence/dba_jobs/D93020 - Daily clean-up.sql b/TPDT-268 - ACP in task sequence/dba_jobs/D93020 - Daily clean-up.sql new file mode 100644 index 0000000..7351e3f --- /dev/null +++ b/TPDT-268 - ACP in task sequence/dba_jobs/D93020 - Daily clean-up.sql @@ -0,0 +1,201 @@ +/* Drop existing standard schedule for job */ +declare @schedule_id int +declare c_schedules cursor local forward_only static for + select ss.schedule_id + from msdb.dbo.sysjobschedules sjs +INNER JOIN msdb.dbo.sysschedules ss + ON sjs.schedule_id = ss.schedule_id + AND ss.name NOT LIKE '%#SPEC#' +INNER JOIN msdb.dbo.sysjobs sj + ON sjs.job_id = sj.job_id + WHERE sj.name = N'D93020 - Daily clean-up' + +open c_schedules + +FETCH NEXT FROM c_schedules into @schedule_id +while @@fetch_status = 0 +begin + IF ((select COUNT(*) from msdb.dbo.sysjobschedules where schedule_id=@schedule_id) = 1) + EXEC msdb.dbo.sp_delete_schedule @schedule_id=@schedule_id, @force_delete = 1 +FETCH NEXT FROM c_schedules into @schedule_id +end + +close c_schedules + +deallocate c_schedules + +IF EXISTS (SELECT job_id FROM msdb.dbo.sysjobs_view WHERE name = N'D93020 - Daily clean-up') +EXEC msdb.dbo.sp_delete_job @job_name = N'D93020 - Daily clean-up', @delete_unused_schedule=0 +GO + +/* Creation Job and Steps*/ +BEGIN TRANSACTION +DECLARE @ReturnCode INT +SELECT @ReturnCode = 0 + +IF NOT EXISTS (SELECT name FROM msdb.dbo.syscategories WHERE name=N'DBA Database Maintenance' AND category_class=1) +BEGIN +EXEC @ReturnCode = msdb.dbo.sp_add_category @class=N'JOB', @type=N'LOCAL', @name=N'DBA Database Maintenance' +IF (@@ERROR <> 0 OR @ReturnCode <> 0) GOTO QuitWithRollback + +END + +/* Add Job */ +DECLARE @jobId BINARY(16) +EXEC @ReturnCode = msdb.dbo.sp_add_job @job_name=N'D93020 - Daily clean-up', + @enabled=1, + @notify_level_eventlog=0, + @notify_level_email=0, + @notify_level_netsend=0, + @notify_level_page=0, + @delete_level=0, + @description=N'22.02.2013 - PDE - Created +03.07.2015 - LPO #TFS28342# Script unique pour AMAVITA, SUNSTORE, AAI +10.02.2021 - SPE #TFS63542# - Adapt purge DR jobs daily treatment +17.03.2022 - FLA : Change DBA mail', + @category_name=N'DBA Database Maintenance', + @start_step_id=1, + @owner_login_name=N'sa', @job_id = @jobId OUTPUT +IF (@@ERROR <> 0 OR @ReturnCode <> 0) GOTO QuitWithRollback + +/* Add Step */ +EXEC @ReturnCode = msdb.dbo.sp_add_jobstep @job_id=@jobId, @step_name=N'Empty step', + @step_id=1, + @cmdexec_success_code=0, + @on_success_action=3, + @on_success_step_id=0, + @on_fail_action=3, + @on_fail_step_id=0, + @retry_attempts=0, + @retry_interval=0, + @os_run_priority=0, @subsystem=N'TSQL', + @command=N'/* Empty step */', + @database_name=N'master', + @output_file_name=NULL, + @flags=0, + @database_user_name=NULL, + @server=NULL, + @additional_parameters=NULL, + @proxy_id=NULL, + @proxy_name=NULL +IF (@@ERROR <> 0 OR @ReturnCode <> 0) GOTO QuitWithRollback +/* Add Step */ +EXEC @ReturnCode = msdb.dbo.sp_add_jobstep @job_id=@jobId, @step_name=N'Daily Clean-up', + @step_id=2, + @cmdexec_success_code=0, + @on_success_action=3, + @on_success_step_id=0, + @on_fail_action=4, + @on_fail_step_id=4, + @retry_attempts=0, + @retry_interval=0, + @os_run_priority=0, @subsystem=N'TSQL', + @command=N'EXEC [dbo].[CleanUp_History]', + @database_name=N'HCITools', + @output_file_name=NULL, + @flags=0, + @database_user_name=NULL, + @server=NULL, + @additional_parameters=NULL, + @proxy_id=NULL, + @proxy_name=NULL +IF (@@ERROR <> 0 OR @ReturnCode <> 0) GOTO QuitWithRollback +/* Add Step */ +EXEC @ReturnCode = msdb.dbo.sp_add_jobstep @job_id=@jobId, @step_name=N'Empty step for success', + @step_id=3, + @cmdexec_success_code=0, + @on_success_action=1, + @on_success_step_id=0, + @on_fail_action=4, + @on_fail_step_id=4, + @retry_attempts=0, + @retry_interval=0, + @os_run_priority=0, @subsystem=N'TSQL', + @command=N'/* Empty step */ +exec Get_Job_Error_Info @in_JobName = ''D93020 - Daily clean-up'', @in_Recipients = ''DBA_operator''', + @database_name=N'HCITools', + @output_file_name=NULL, + @flags=0, + @database_user_name=NULL, + @server=NULL, + @additional_parameters=NULL, + @proxy_id=NULL, + @proxy_name=NULL +IF (@@ERROR <> 0 OR @ReturnCode <> 0) GOTO QuitWithRollback +/* Add Step */ +EXEC @ReturnCode = msdb.dbo.sp_add_jobstep @job_id=@jobId, @step_name=N'Send email KO', + @step_id=4, + @cmdexec_success_code=0, + @on_success_action=2, + @on_success_step_id=0, + @on_fail_action=2, + @on_fail_step_id=0, + @retry_attempts=0, + @retry_interval=0, + @os_run_priority=0, @subsystem=N'TSQL', + @command=N'exec Get_Job_Error_Info @in_JobName = ''D93020 - Daily clean-up'', @in_Recipients = ''DBA_operator''', + @database_name=N'HCITools', + @output_file_name=NULL, + @flags=0, + @database_user_name=NULL, + @server=NULL, + @additional_parameters=NULL, + @proxy_id=NULL, + @proxy_name=NULL +IF (@@ERROR <> 0 OR @ReturnCode <> 0) GOTO QuitWithRollback +EXEC @ReturnCode = msdb.dbo.sp_update_job @job_id = @jobId, @start_step_id = 1 +IF (@@ERROR <> 0 OR @ReturnCode <> 0) GOTO QuitWithRollback + +/* Add Standard Schedule */ +EXEC @ReturnCode = msdb.dbo.sp_add_jobschedule @job_id=@jobId, @name=N'D93020-D', + @enabled=1, + @freq_type=4, + @freq_interval=1, + @freq_subday_type=1, + @freq_subday_interval=0, + @freq_relative_interval=0, + @freq_recurrence_factor=0, + @active_start_date=20160208, + @active_end_date=99991231, + @active_start_time=61500, + @active_end_time=235959 +IF (@@ERROR <> 0 OR @ReturnCode <> 0) GOTO QuitWithRollback + +/* Attach existing specific schedule for job */ +declare @enabled_schedule int, + @schedule_name nvarchar(50) +declare c_schedules cursor local forward_only static for +select enabled, name + from msdb.dbo.sysschedules + where name LIKE 'D93020%' + and name LIKE '%#SPEC#' + +open c_schedules + +FETCH NEXT FROM c_schedules into @enabled_schedule, @schedule_name +while @@fetch_status = 0 +begin + EXEC @ReturnCode = msdb.dbo.sp_attach_schedule @job_id = @jobId, @schedule_name=@schedule_name + IF(@enabled_schedule = 1) + begin + SET @schedule_name = SUBSTRING(@schedule_name,0,LEN(@schedule_name)-5) + IF EXISTS (select name from msdb.dbo.sysschedules where name = @schedule_name) + EXEC @ReturnCode = msdb.dbo.sp_update_schedule @name=@schedule_name, @enabled=0 + end + IF (@@ERROR <> 0 OR @ReturnCode <> 0) GOTO QuitWithRollback +FETCH NEXT FROM c_schedules into @enabled_schedule, @schedule_name +end + +close c_schedules + +deallocate c_schedules + +EXEC @ReturnCode = msdb.dbo.sp_add_jobserver @job_id = @jobId, @server_name = N'(local)' +IF (@@ERROR <> 0 OR @ReturnCode <> 0) GOTO QuitWithRollback +COMMIT TRANSACTION +GOTO EndSave +QuitWithRollback: + IF (@@TRANCOUNT > 0) ROLLBACK TRANSACTION +EndSave: + +GO diff --git a/TPDT-268 - ACP in task sequence/dba_jobs/DR92030 - Check open transactions.sql b/TPDT-268 - ACP in task sequence/dba_jobs/DR92030 - Check open transactions.sql new file mode 100644 index 0000000..9645e15 --- /dev/null +++ b/TPDT-268 - ACP in task sequence/dba_jobs/DR92030 - Check open transactions.sql @@ -0,0 +1,201 @@ +/* Drop existing standard schedule for job */ +declare @schedule_id int +declare c_schedules cursor local forward_only static for + select ss.schedule_id + from msdb.dbo.sysjobschedules sjs +INNER JOIN msdb.dbo.sysschedules ss + ON sjs.schedule_id = ss.schedule_id + AND ss.name NOT LIKE '%#SPEC#' +INNER JOIN msdb.dbo.sysjobs sj + ON sjs.job_id = sj.job_id + WHERE sj.name = N'DR92030 - Check open transactions' + +open c_schedules + +FETCH NEXT FROM c_schedules into @schedule_id +while @@fetch_status = 0 +begin + IF ((select COUNT(*) from msdb.dbo.sysjobschedules where schedule_id=@schedule_id) = 1) + EXEC msdb.dbo.sp_delete_schedule @schedule_id=@schedule_id, @force_delete = 1 +FETCH NEXT FROM c_schedules into @schedule_id +end + +close c_schedules + +deallocate c_schedules + +IF EXISTS (SELECT job_id FROM msdb.dbo.sysjobs_view WHERE name = N'DR92030 - Check open transactions') +EXEC msdb.dbo.sp_delete_job @job_name = N'DR92030 - Check open transactions', @delete_unused_schedule=0 +GO + +/* Creation Job and Steps*/ +BEGIN TRANSACTION +DECLARE @ReturnCode INT +SELECT @ReturnCode = 0 + +IF NOT EXISTS (SELECT name FROM msdb.dbo.syscategories WHERE name=N'[Uncategorized (Local)]' AND category_class=1) +BEGIN +EXEC @ReturnCode = msdb.dbo.sp_add_category @class=N'JOB', @type=N'LOCAL', @name=N'[Uncategorized (Local)]' +IF (@@ERROR <> 0 OR @ReturnCode <> 0) GOTO QuitWithRollback + +END + +/* Add Job */ +DECLARE @jobId BINARY(16) +EXEC @ReturnCode = msdb.dbo.sp_add_job @job_name=N'DR92030 - Check open transactions', + @enabled=1, + @notify_level_eventlog=0, + @notify_level_email=0, + @notify_level_netsend=0, + @notify_level_page=0, + @delete_level=0, + @description=N'12.08.2011 - PDE - Created +06.12.2012 - PDE - Added check of opened transactions +11.12.2018 - RTC - Remove blocking session. +17.03.2022 - FLA : Change DBA mail', + @category_name=N'[Uncategorized (Local)]', + @start_step_id=1, + @owner_login_name=N'sa', @job_id = @jobId OUTPUT +IF (@@ERROR <> 0 OR @ReturnCode <> 0) GOTO QuitWithRollback + +/* Add Step */ +EXEC @ReturnCode = msdb.dbo.sp_add_jobstep @job_id=@jobId, @step_name=N'Empty step', + @step_id=1, + @cmdexec_success_code=0, + @on_success_action=3, + @on_success_step_id=0, + @on_fail_action=3, + @on_fail_step_id=0, + @retry_attempts=0, + @retry_interval=0, + @os_run_priority=0, @subsystem=N'TSQL', + @command=N'/* Empty step */', + @database_name=N'master', + @output_file_name=NULL, + @flags=0, + @database_user_name=NULL, + @server=NULL, + @additional_parameters=NULL, + @proxy_id=NULL, + @proxy_name=NULL +IF (@@ERROR <> 0 OR @ReturnCode <> 0) GOTO QuitWithRollback +/* Add Step */ +EXEC @ReturnCode = msdb.dbo.sp_add_jobstep @job_id=@jobId, @step_name=N'Send warning in case of opened transactions', + @step_id=2, + @cmdexec_success_code=0, + @on_success_action=3, + @on_success_step_id=0, + @on_fail_action=4, + @on_fail_step_id=4, + @retry_attempts=0, + @retry_interval=0, + @os_run_priority=0, @subsystem=N'TSQL', + @command=N'EXEC [dbo].[mon_Check_Open_Tran]', + @database_name=N'HCITools', + @output_file_name=NULL, + @flags=0, + @database_user_name=NULL, + @server=NULL, + @additional_parameters=NULL, + @proxy_id=NULL, + @proxy_name=NULL +IF (@@ERROR <> 0 OR @ReturnCode <> 0) GOTO QuitWithRollback +/* Add Step */ +EXEC @ReturnCode = msdb.dbo.sp_add_jobstep @job_id=@jobId, @step_name=N'Empty step for success', + @step_id=3, + @cmdexec_success_code=0, + @on_success_action=1, + @on_success_step_id=0, + @on_fail_action=4, + @on_fail_step_id=4, + @retry_attempts=0, + @retry_interval=0, + @os_run_priority=0, @subsystem=N'TSQL', + @command=N'/* Empty step */ +exec Get_Job_Error_Info @in_JobName = ''DR92030 - Check open transactions'', @in_Recipients = ''DBA_operator''', + @database_name=N'HCITools', + @output_file_name=NULL, + @flags=0, + @database_user_name=NULL, + @server=NULL, + @additional_parameters=NULL, + @proxy_id=NULL, + @proxy_name=NULL +IF (@@ERROR <> 0 OR @ReturnCode <> 0) GOTO QuitWithRollback +/* Add Step */ +EXEC @ReturnCode = msdb.dbo.sp_add_jobstep @job_id=@jobId, @step_name=N'Send email KO', + @step_id=4, + @cmdexec_success_code=0, + @on_success_action=2, + @on_success_step_id=0, + @on_fail_action=2, + @on_fail_step_id=0, + @retry_attempts=0, + @retry_interval=0, + @os_run_priority=0, @subsystem=N'TSQL', + @command=N'exec Get_Job_Error_Info @in_JobName = ''DR92030 - Check open transactions'', @in_Recipients = ''DBA_operator''', + @database_name=N'HCITools', + @output_file_name=NULL, + @flags=0, + @database_user_name=NULL, + @server=NULL, + @additional_parameters=NULL, + @proxy_id=NULL, + @proxy_name=NULL +IF (@@ERROR <> 0 OR @ReturnCode <> 0) GOTO QuitWithRollback +EXEC @ReturnCode = msdb.dbo.sp_update_job @job_id = @jobId, @start_step_id = 1 +IF (@@ERROR <> 0 OR @ReturnCode <> 0) GOTO QuitWithRollback + +/* Add Standard Schedule */ +EXEC @ReturnCode = msdb.dbo.sp_add_jobschedule @job_id=@jobId, @name=N'DR92030-DR', + @enabled=1, + @freq_type=4, + @freq_interval=1, + @freq_subday_type=4, + @freq_subday_interval=2, + @freq_relative_interval=0, + @freq_recurrence_factor=0, + @active_start_date=20110811, + @active_end_date=99991231, + @active_start_time=80000, + @active_end_time=230000 +IF (@@ERROR <> 0 OR @ReturnCode <> 0) GOTO QuitWithRollback + +/* Attach existing specific schedule for job */ +declare @enabled_schedule int, + @schedule_name nvarchar(50) +declare c_schedules cursor local forward_only static for +select enabled, name + from msdb.dbo.sysschedules + where name LIKE 'DR92030%' + and name LIKE '%#SPEC#' + +open c_schedules + +FETCH NEXT FROM c_schedules into @enabled_schedule, @schedule_name +while @@fetch_status = 0 +begin + EXEC @ReturnCode = msdb.dbo.sp_attach_schedule @job_id = @jobId, @schedule_name=@schedule_name + IF(@enabled_schedule = 1) + begin + SET @schedule_name = SUBSTRING(@schedule_name,0,LEN(@schedule_name)-5) + IF EXISTS (select name from msdb.dbo.sysschedules where name = @schedule_name) + EXEC @ReturnCode = msdb.dbo.sp_update_schedule @name=@schedule_name, @enabled=0 + end + IF (@@ERROR <> 0 OR @ReturnCode <> 0) GOTO QuitWithRollback +FETCH NEXT FROM c_schedules into @enabled_schedule, @schedule_name +end + +close c_schedules + +deallocate c_schedules + +EXEC @ReturnCode = msdb.dbo.sp_add_jobserver @job_id = @jobId, @server_name = N'(local)' +IF (@@ERROR <> 0 OR @ReturnCode <> 0) GOTO QuitWithRollback +COMMIT TRANSACTION +GOTO EndSave +QuitWithRollback: + IF (@@TRANCOUNT > 0) ROLLBACK TRANSACTION +EndSave: + +GO diff --git a/TPDT-268 - ACP in task sequence/dba_jobs/DR92120 - Check Stack Dump.sql b/TPDT-268 - ACP in task sequence/dba_jobs/DR92120 - Check Stack Dump.sql new file mode 100644 index 0000000..6a40674 Binary files /dev/null and b/TPDT-268 - ACP in task sequence/dba_jobs/DR92120 - Check Stack Dump.sql differ diff --git a/TPDT-268 - ACP in task sequence/dba_jobs/DR92160 - Replication Check.sql b/TPDT-268 - ACP in task sequence/dba_jobs/DR92160 - Replication Check.sql new file mode 100644 index 0000000..0d1cde5 --- /dev/null +++ b/TPDT-268 - ACP in task sequence/dba_jobs/DR92160 - Replication Check.sql @@ -0,0 +1,207 @@ +/* Drop existing standard schedule for job */ +declare @schedule_id int +declare c_schedules cursor local forward_only static for + select ss.schedule_id + from msdb.dbo.sysjobschedules sjs +INNER JOIN msdb.dbo.sysschedules ss + ON sjs.schedule_id = ss.schedule_id + AND ss.name NOT LIKE '%#SPEC#' +INNER JOIN msdb.dbo.sysjobs sj + ON sjs.job_id = sj.job_id + WHERE sj.name = N'DR92160 - Replication Check' + +open c_schedules + +FETCH NEXT FROM c_schedules into @schedule_id +while @@fetch_status = 0 +begin + IF ((select COUNT(*) from msdb.dbo.sysjobschedules where schedule_id=@schedule_id) = 1) + EXEC msdb.dbo.sp_delete_schedule @schedule_id=@schedule_id, @force_delete = 1 +FETCH NEXT FROM c_schedules into @schedule_id +end + +close c_schedules + +deallocate c_schedules + +IF EXISTS (SELECT job_id FROM msdb.dbo.sysjobs_view WHERE name = N'DR92160 - Replication Check') +EXEC msdb.dbo.sp_delete_job @job_name = N'DR92160 - Replication Check', @delete_unused_schedule=0 +GO + +/* Creation Job and Steps*/ +BEGIN TRANSACTION +DECLARE @ReturnCode INT +SELECT @ReturnCode = 0 + +IF NOT EXISTS (SELECT name FROM msdb.dbo.syscategories WHERE name=N'DBA-Monitoring' AND category_class=1) +BEGIN +EXEC @ReturnCode = msdb.dbo.sp_add_category @class=N'JOB', @type=N'LOCAL', @name=N'DBA-Monitoring' +IF (@@ERROR <> 0 OR @ReturnCode <> 0) GOTO QuitWithRollback + +END + +/* Add Job */ +DECLARE @jobId BINARY(16) +EXEC @ReturnCode = msdb.dbo.sp_add_job @job_name=N'DR92160 - Replication Check', + @enabled=1, + @notify_level_eventlog=0, + @notify_level_email=0, + @notify_level_netsend=0, + @notify_level_page=0, + @delete_level=0, + @description=N'Vérifie un ensemble de points critiques de la réplication + +18.07.2017 - FLA - Ajout du step de test de l''etat des souscriptions et de l''état des agents +09.02.2018 - FLA - Ajout du step de control des jobs à double +24.04.2018 - RTC - Ajout du test des commandes non distribuées et mise à jour du schedule +05.07.2019 - SPE - Modification schedule 7h00 -> 6h00 +20.04.2020 - SPE - Modifications pour ajout monitoring Nagios +17.03.2022 - FLA : Change DBA mail', + @category_name=N'DBA-Monitoring', + @start_step_id=1, + @owner_login_name=N'sa', @job_id = @jobId OUTPUT +IF (@@ERROR <> 0 OR @ReturnCode <> 0) GOTO QuitWithRollback + +/* Add Step */ +EXEC @ReturnCode = msdb.dbo.sp_add_jobstep @job_id=@jobId, @step_name=N'Empty step', + @step_id=1, + @cmdexec_success_code=0, + @on_success_action=3, + @on_success_step_id=0, + @on_fail_action=3, + @on_fail_step_id=0, + @retry_attempts=0, + @retry_interval=0, + @os_run_priority=0, @subsystem=N'TSQL', + @command=N'/* Empty step */', + @database_name=N'master', + @output_file_name=NULL, + @flags=0, + @database_user_name=NULL, + @server=NULL, + @additional_parameters=NULL, + @proxy_id=NULL, + @proxy_name=NULL +IF (@@ERROR <> 0 OR @ReturnCode <> 0) GOTO QuitWithRollback +/* Add Step */ +EXEC @ReturnCode = msdb.dbo.sp_add_jobstep @job_id=@jobId, @step_name=N'Check all steps', + @step_id=2, + @cmdexec_success_code=0, + @on_success_action=3, + @on_success_step_id=0, + @on_fail_action=4, + @on_fail_step_id=4, + @retry_attempts=0, + @retry_interval=0, + @os_run_priority=0, @subsystem=N'TSQL', + @command=N'EXEC [dbo].[Replication_Check] @in_CheckType = 0, @in_Email = 1', + @database_name=N'HCITools', + @output_file_name=NULL, + @flags=0, + @database_user_name=NULL, + @server=NULL, + @additional_parameters=NULL, + @proxy_id=NULL, + @proxy_name=NULL +IF (@@ERROR <> 0 OR @ReturnCode <> 0) GOTO QuitWithRollback +/* Add Step */ +EXEC @ReturnCode = msdb.dbo.sp_add_jobstep @job_id=@jobId, @step_name=N'Empty step for success', + @step_id=3, + @cmdexec_success_code=0, + @on_success_action=1, + @on_success_step_id=0, + @on_fail_action=4, + @on_fail_step_id=4, + @retry_attempts=0, + @retry_interval=0, + @os_run_priority=0, @subsystem=N'TSQL', + @command=N'/* Empty step */ +', + @database_name=N'HCITools', + @output_file_name=NULL, + @flags=0, + @database_user_name=NULL, + @server=NULL, + @additional_parameters=NULL, + @proxy_id=NULL, + @proxy_name=NULL +IF (@@ERROR <> 0 OR @ReturnCode <> 0) GOTO QuitWithRollback +/* Add Step */ +EXEC @ReturnCode = msdb.dbo.sp_add_jobstep @job_id=@jobId, @step_name=N'Send email KO', + @step_id=4, + @cmdexec_success_code=0, + @on_success_action=2, + @on_success_step_id=0, + @on_fail_action=2, + @on_fail_step_id=0, + @retry_attempts=0, + @retry_interval=0, + @os_run_priority=0, @subsystem=N'TSQL', + @command=N'exec Get_Job_Error_Info @in_JobName = ''DR92160 - Replication Check'', @in_Recipients = ''DBA_operator'' + +', + @database_name=N'HCITools', + @output_file_name=NULL, + @flags=0, + @database_user_name=NULL, + @server=NULL, + @additional_parameters=NULL, + @proxy_id=NULL, + @proxy_name=NULL +IF (@@ERROR <> 0 OR @ReturnCode <> 0) GOTO QuitWithRollback +EXEC @ReturnCode = msdb.dbo.sp_update_job @job_id = @jobId, @start_step_id = 1 +IF (@@ERROR <> 0 OR @ReturnCode <> 0) GOTO QuitWithRollback + +/* Add Standard Schedule */ +EXEC @ReturnCode = msdb.dbo.sp_add_jobschedule @job_id=@jobId, @name=N'DR92160-DR', + @enabled=1, + @freq_type=4, + @freq_interval=1, + @freq_subday_type=4, + @freq_subday_interval=30, + @freq_relative_interval=0, + @freq_recurrence_factor=0, + @active_start_date=20160921, + @active_end_date=99991231, + @active_start_time=60000, + @active_end_time=180000 +IF (@@ERROR <> 0 OR @ReturnCode <> 0) GOTO QuitWithRollback + +/* Attach existing specific schedule for job */ +declare @enabled_schedule int, + @schedule_name nvarchar(50) +declare c_schedules cursor local forward_only static for +select enabled, name + from msdb.dbo.sysschedules + where name LIKE 'DR92160%' + and name LIKE '%#SPEC#' + +open c_schedules + +FETCH NEXT FROM c_schedules into @enabled_schedule, @schedule_name +while @@fetch_status = 0 +begin + EXEC @ReturnCode = msdb.dbo.sp_attach_schedule @job_id = @jobId, @schedule_name=@schedule_name + IF(@enabled_schedule = 1) + begin + SET @schedule_name = SUBSTRING(@schedule_name,0,LEN(@schedule_name)-5) + IF EXISTS (select name from msdb.dbo.sysschedules where name = @schedule_name) + EXEC @ReturnCode = msdb.dbo.sp_update_schedule @name=@schedule_name, @enabled=0 + end + IF (@@ERROR <> 0 OR @ReturnCode <> 0) GOTO QuitWithRollback +FETCH NEXT FROM c_schedules into @enabled_schedule, @schedule_name +end + +close c_schedules + +deallocate c_schedules + +EXEC @ReturnCode = msdb.dbo.sp_add_jobserver @job_id = @jobId, @server_name = N'(local)' +IF (@@ERROR <> 0 OR @ReturnCode <> 0) GOTO QuitWithRollback +COMMIT TRANSACTION +GOTO EndSave +QuitWithRollback: + IF (@@TRANCOUNT > 0) ROLLBACK TRANSACTION +EndSave: + +GO diff --git a/TPDT-268 - ACP in task sequence/dba_jobs/DR92210 - Audit Login Control.sql b/TPDT-268 - ACP in task sequence/dba_jobs/DR92210 - Audit Login Control.sql new file mode 100644 index 0000000..99606b2 Binary files /dev/null and b/TPDT-268 - ACP in task sequence/dba_jobs/DR92210 - Audit Login Control.sql differ diff --git a/TPDT-268 - ACP in task sequence/dba_jobs/DR92240 - Long Running Jobs.sql b/TPDT-268 - ACP in task sequence/dba_jobs/DR92240 - Long Running Jobs.sql new file mode 100644 index 0000000..b9921d0 --- /dev/null +++ b/TPDT-268 - ACP in task sequence/dba_jobs/DR92240 - Long Running Jobs.sql @@ -0,0 +1,209 @@ +/****************************************************************/ +/********** SUPPRESSION TEMPORAIRE DES ANCIENS JOBS ************/ +/****************************************************************/ +USE [msdb] +GO + +IF EXISTS (SELECT job_id FROM msdb.dbo.sysjobs_view WHERE name = N'DR92050 - Long Running Jobs') +EXEC msdb.dbo.sp_delete_job @job_name=N'DR92050 - Long Running Jobs', @delete_unused_schedule=1 +GO + + +/* Drop existing standard schedule for job */ +declare @schedule_id int +declare c_schedules cursor local forward_only static for + select ss.schedule_id + from msdb.dbo.sysjobschedules sjs +INNER JOIN msdb.dbo.sysschedules ss + ON sjs.schedule_id = ss.schedule_id + AND ss.name NOT LIKE '%#SPEC#' +INNER JOIN msdb.dbo.sysjobs sj + ON sjs.job_id = sj.job_id + WHERE sj.name = N'DR92240 - Long Running Jobs' + +open c_schedules + +FETCH NEXT FROM c_schedules into @schedule_id +while @@fetch_status = 0 +begin + IF ((select COUNT(*) from msdb.dbo.sysjobschedules where schedule_id=@schedule_id) = 1) + EXEC msdb.dbo.sp_delete_schedule @schedule_id=@schedule_id, @force_delete = 1 +FETCH NEXT FROM c_schedules into @schedule_id +end + +close c_schedules + +deallocate c_schedules + +IF EXISTS (SELECT job_id FROM msdb.dbo.sysjobs_view WHERE name = N'DR92240 - Long Running Jobs') +EXEC msdb.dbo.sp_delete_job @job_name = N'DR92240 - Long Running Jobs', @delete_unused_schedule=0 +GO + +/* Creation Job and Steps*/ +BEGIN TRANSACTION +DECLARE @ReturnCode INT +SELECT @ReturnCode = 0 + +IF NOT EXISTS (SELECT name FROM msdb.dbo.syscategories WHERE name=N'DBA-Monitoring' AND category_class=1) +BEGIN +EXEC @ReturnCode = msdb.dbo.sp_add_category @class=N'JOB', @type=N'LOCAL', @name=N'DBA-Monitoring' +IF (@@ERROR <> 0 OR @ReturnCode <> 0) GOTO QuitWithRollback + +END + +/* Add Job */ +DECLARE @jobId BINARY(16) +EXEC @ReturnCode = msdb.dbo.sp_add_job @job_name=N'DR92240 - Long Running Jobs', + @enabled=1, + @notify_level_eventlog=0, + @notify_level_email=0, + @notify_level_netsend=0, + @notify_level_page=0, + @delete_level=0, + @description=N'25.06.2015/LPE: Check long running SQL Agent Jobs +03.08.2015 - LPO #TFS28342# Script unique pour AMAVITA, SUNSTORE, AAI', + @category_name=N'DBA-Monitoring', + @start_step_id=1, + @owner_login_name=N'sa', @job_id = @jobId OUTPUT +IF (@@ERROR <> 0 OR @ReturnCode <> 0) GOTO QuitWithRollback + +/* Add Step */ +EXEC @ReturnCode = msdb.dbo.sp_add_jobstep @job_id=@jobId, @step_name=N'Empty step', + @step_id=1, + @cmdexec_success_code=0, + @on_success_action=3, + @on_success_step_id=0, + @on_fail_action=3, + @on_fail_step_id=0, + @retry_attempts=0, + @retry_interval=0, + @os_run_priority=0, @subsystem=N'TSQL', + @command=N'/* Empty step */', + @database_name=N'master', + @output_file_name=NULL, + @flags=0, + @database_user_name=NULL, + @server=NULL, + @additional_parameters=NULL, + @proxy_id=NULL, + @proxy_name=NULL +IF (@@ERROR <> 0 OR @ReturnCode <> 0) GOTO QuitWithRollback +/* Add Step */ +EXEC @ReturnCode = msdb.dbo.sp_add_jobstep @job_id=@jobId, @step_name=N'Check long running jobs', + @step_id=2, + @cmdexec_success_code=0, + @on_success_action=3, + @on_success_step_id=0, + @on_fail_action=4, + @on_fail_step_id=4, + @retry_attempts=0, + @retry_interval=0, + @os_run_priority=0, @subsystem=N'TSQL', + @command=N'EXEC [dbo].[mon_Check_Long_Running_Jobs]', + @database_name=N'HCITools', + @output_file_name=NULL, + @flags=0, + @database_user_name=NULL, + @server=NULL, + @additional_parameters=NULL, + @proxy_id=NULL, + @proxy_name=NULL +IF (@@ERROR <> 0 OR @ReturnCode <> 0) GOTO QuitWithRollback +/* Add Step */ +EXEC @ReturnCode = msdb.dbo.sp_add_jobstep @job_id=@jobId, @step_name=N'Empty step for success', + @step_id=3, + @cmdexec_success_code=0, + @on_success_action=1, + @on_success_step_id=0, + @on_fail_action=4, + @on_fail_step_id=4, + @retry_attempts=0, + @retry_interval=0, + @os_run_priority=0, @subsystem=N'TSQL', + @command=N'/* Empty step */', + @database_name=N'master', + @output_file_name=NULL, + @flags=0, + @database_user_name=NULL, + @server=NULL, + @additional_parameters=NULL, + @proxy_id=NULL, + @proxy_name=NULL +IF (@@ERROR <> 0 OR @ReturnCode <> 0) GOTO QuitWithRollback +/* Add Step */ +EXEC @ReturnCode = msdb.dbo.sp_add_jobstep @job_id=@jobId, @step_name=N'Send email KO', + @step_id=4, + @cmdexec_success_code=0, + @on_success_action=2, + @on_success_step_id=0, + @on_fail_action=2, + @on_fail_step_id=0, + @retry_attempts=0, + @retry_interval=0, + @os_run_priority=0, @subsystem=N'TSQL', + @command=N'/* empty*/', + @database_name=N'master', + @output_file_name=NULL, + @flags=0, + @database_user_name=NULL, + @server=NULL, + @additional_parameters=NULL, + @proxy_id=NULL, + @proxy_name=NULL +IF (@@ERROR <> 0 OR @ReturnCode <> 0) GOTO QuitWithRollback +EXEC @ReturnCode = msdb.dbo.sp_update_job @job_id = @jobId, @start_step_id = 1 +IF (@@ERROR <> 0 OR @ReturnCode <> 0) GOTO QuitWithRollback + +/* Add Standard Schedule */ +EXEC @ReturnCode = msdb.dbo.sp_add_jobschedule @job_id=@jobId, @name=N'DR92240-DR', + @enabled=1, + @freq_type=8, + @freq_interval=62, + @freq_subday_type=4, + @freq_subday_interval=5, + @freq_relative_interval=0, + @freq_recurrence_factor=1, + @active_start_date=20150625, + @active_end_date=99991231, + @active_start_time=70000, + @active_end_time=193000 +IF (@@ERROR <> 0 OR @ReturnCode <> 0) GOTO QuitWithRollback + +/* Attach existing specific schedule for job */ +declare @enabled_schedule int, + @schedule_name nvarchar(50) +declare c_schedules cursor local forward_only static for +select enabled, name + from msdb.dbo.sysschedules + where name LIKE 'DR92240%' + and name LIKE '%#SPEC#' + +open c_schedules + +FETCH NEXT FROM c_schedules into @enabled_schedule, @schedule_name +while @@fetch_status = 0 +begin + EXEC @ReturnCode = msdb.dbo.sp_attach_schedule @job_id = @jobId, @schedule_name=@schedule_name + IF(@enabled_schedule = 1) + begin + SET @schedule_name = SUBSTRING(@schedule_name,0,LEN(@schedule_name)-5) + IF EXISTS (select name from msdb.dbo.sysschedules where name = @schedule_name) + EXEC @ReturnCode = msdb.dbo.sp_update_schedule @name=@schedule_name, @enabled=0 + end + IF (@@ERROR <> 0 OR @ReturnCode <> 0) GOTO QuitWithRollback +FETCH NEXT FROM c_schedules into @enabled_schedule, @schedule_name +end + +close c_schedules + +deallocate c_schedules + +EXEC @ReturnCode = msdb.dbo.sp_add_jobserver @job_id = @jobId, @server_name = N'(local)' +IF (@@ERROR <> 0 OR @ReturnCode <> 0) GOTO QuitWithRollback +COMMIT TRANSACTION +GOTO EndSave +QuitWithRollback: + IF (@@TRANCOUNT > 0) ROLLBACK TRANSACTION +EndSave: + +GO diff --git a/TPDT-268 - ACP in task sequence/dba_jobs/Pharmacy/D93120 - Purge Replication Backup.sql b/TPDT-268 - ACP in task sequence/dba_jobs/Pharmacy/D93120 - Purge Replication Backup.sql new file mode 100644 index 0000000..1c4c46b Binary files /dev/null and b/TPDT-268 - ACP in task sequence/dba_jobs/Pharmacy/D93120 - Purge Replication Backup.sql differ diff --git a/TPDT-268 - ACP in task sequence/dba_jobs/Pharmacy/DR92110 - Check Broker Queues.sql b/TPDT-268 - ACP in task sequence/dba_jobs/Pharmacy/DR92110 - Check Broker Queues.sql new file mode 100644 index 0000000..33b8d48 --- /dev/null +++ b/TPDT-268 - ACP in task sequence/dba_jobs/Pharmacy/DR92110 - Check Broker Queues.sql @@ -0,0 +1,201 @@ +/* Drop existing standard schedule for job */ +declare @schedule_id int +declare c_schedules cursor local forward_only static for + select ss.schedule_id + from msdb.dbo.sysjobschedules sjs +INNER JOIN msdb.dbo.sysschedules ss + ON sjs.schedule_id = ss.schedule_id + AND ss.name NOT LIKE '%#SPEC#' +INNER JOIN msdb.dbo.sysjobs sj + ON sjs.job_id = sj.job_id + WHERE sj.name = N'DR92110 - Check Broker Queues' + +open c_schedules + +FETCH NEXT FROM c_schedules into @schedule_id +while @@fetch_status = 0 +begin + IF ((select COUNT(*) from msdb.dbo.sysjobschedules where schedule_id=@schedule_id) = 1) + EXEC msdb.dbo.sp_delete_schedule @schedule_id=@schedule_id, @force_delete = 1 +FETCH NEXT FROM c_schedules into @schedule_id +end + +close c_schedules + +deallocate c_schedules + +IF EXISTS (SELECT job_id FROM msdb.dbo.sysjobs_view WHERE name = N'DR92110 - Check Broker Queues') +EXEC msdb.dbo.sp_delete_job @job_name = N'DR92110 - Check Broker Queues', @delete_unused_schedule=0 +GO + +/* Creation Job and Steps*/ +BEGIN TRANSACTION +DECLARE @ReturnCode INT +SELECT @ReturnCode = 0 + +IF NOT EXISTS (SELECT name FROM msdb.dbo.syscategories WHERE name=N'DBA-Monitoring' AND category_class=1) +BEGIN +EXEC @ReturnCode = msdb.dbo.sp_add_category @class=N'JOB', @type=N'LOCAL', @name=N'DBA-Monitoring' +IF (@@ERROR <> 0 OR @ReturnCode <> 0) GOTO QuitWithRollback + +END + +/* Add Job */ +DECLARE @jobId BINARY(16) +EXEC @ReturnCode = msdb.dbo.sp_add_job @job_name=N'DR92110 - Check Broker Queues', + @enabled=1, + @notify_level_eventlog=0, + @notify_level_email=0, + @notify_level_netsend=0, + @notify_level_page=0, + @delete_level=0, + @description=N'Vérification si les queues ne sont pas disabled (poison messages) + +07.06.2016 - FLA - Création +17.03.2022 - FLA : Change DBA mail', + @category_name=N'DBA-Monitoring', + @start_step_id=1, + @owner_login_name=N'sa', @job_id = @jobId OUTPUT +IF (@@ERROR <> 0 OR @ReturnCode <> 0) GOTO QuitWithRollback + +/* Add Step */ +EXEC @ReturnCode = msdb.dbo.sp_add_jobstep @job_id=@jobId, @step_name=N'Empty step', + @step_id=1, + @cmdexec_success_code=0, + @on_success_action=3, + @on_success_step_id=0, + @on_fail_action=3, + @on_fail_step_id=0, + @retry_attempts=0, + @retry_interval=0, + @os_run_priority=0, @subsystem=N'TSQL', + @command=N'/* Empty step */', + @database_name=N'master', + @output_file_name=NULL, + @flags=0, + @database_user_name=NULL, + @server=NULL, + @additional_parameters=NULL, + @proxy_id=NULL, + @proxy_name=NULL +IF (@@ERROR <> 0 OR @ReturnCode <> 0) GOTO QuitWithRollback +/* Add Step */ +EXEC @ReturnCode = msdb.dbo.sp_add_jobstep @job_id=@jobId, @step_name=N'Check all Broker queues', + @step_id=2, + @cmdexec_success_code=0, + @on_success_action=3, + @on_success_step_id=0, + @on_fail_action=4, + @on_fail_step_id=4, + @retry_attempts=0, + @retry_interval=0, + @os_run_priority=0, @subsystem=N'TSQL', + @command=N'EXEC [dbo].[mon_Check_Broker_queues]', + @database_name=N'HCITools', + @output_file_name=NULL, + @flags=0, + @database_user_name=NULL, + @server=NULL, + @additional_parameters=NULL, + @proxy_id=NULL, + @proxy_name=NULL +IF (@@ERROR <> 0 OR @ReturnCode <> 0) GOTO QuitWithRollback +/* Add Step */ +EXEC @ReturnCode = msdb.dbo.sp_add_jobstep @job_id=@jobId, @step_name=N'Empty step for success', + @step_id=3, + @cmdexec_success_code=0, + @on_success_action=1, + @on_success_step_id=0, + @on_fail_action=4, + @on_fail_step_id=4, + @retry_attempts=0, + @retry_interval=0, + @os_run_priority=0, @subsystem=N'TSQL', + @command=N'/* Empty step */ +exec Get_Job_Error_Info @in_JobName = ''DR92110 - Check Broker Queues'', @in_Recipients = ''DBA_operator''', + @database_name=N'HCITools', + @output_file_name=NULL, + @flags=0, + @database_user_name=NULL, + @server=NULL, + @additional_parameters=NULL, + @proxy_id=NULL, + @proxy_name=NULL +IF (@@ERROR <> 0 OR @ReturnCode <> 0) GOTO QuitWithRollback +/* Add Step */ +EXEC @ReturnCode = msdb.dbo.sp_add_jobstep @job_id=@jobId, @step_name=N'Send email KO', + @step_id=4, + @cmdexec_success_code=0, + @on_success_action=2, + @on_success_step_id=0, + @on_fail_action=2, + @on_fail_step_id=0, + @retry_attempts=0, + @retry_interval=0, + @os_run_priority=0, @subsystem=N'TSQL', + @command=N'exec Get_Job_Error_Info @in_JobName = ''DR92110 - Check Broker Queues'', @in_Recipients = ''DBA_operator''', + @database_name=N'HCITools', + @output_file_name=NULL, + @flags=0, + @database_user_name=NULL, + @server=NULL, + @additional_parameters=NULL, + @proxy_id=NULL, + @proxy_name=NULL +IF (@@ERROR <> 0 OR @ReturnCode <> 0) GOTO QuitWithRollback +EXEC @ReturnCode = msdb.dbo.sp_update_job @job_id = @jobId, @start_step_id = 1 +IF (@@ERROR <> 0 OR @ReturnCode <> 0) GOTO QuitWithRollback + +/* Add Standard Schedule */ +EXEC @ReturnCode = msdb.dbo.sp_add_jobschedule @job_id=@jobId, @name=N'DR92110-DR', + @enabled=1, + @freq_type=4, + @freq_interval=1, + @freq_subday_type=4, + @freq_subday_interval=15, + @freq_relative_interval=0, + @freq_recurrence_factor=0, + @active_start_date=20160607, + @active_end_date=99991231, + @active_start_time=0, + @active_end_time=235959 +IF (@@ERROR <> 0 OR @ReturnCode <> 0) GOTO QuitWithRollback + +/* Attach existing specific schedule for job */ +declare @enabled_schedule int, + @schedule_name nvarchar(50) +declare c_schedules cursor local forward_only static for +select enabled, name + from msdb.dbo.sysschedules + where name LIKE 'DR92110%' + and name LIKE '%#SPEC#' + +open c_schedules + +FETCH NEXT FROM c_schedules into @enabled_schedule, @schedule_name +while @@fetch_status = 0 +begin + EXEC @ReturnCode = msdb.dbo.sp_attach_schedule @job_id = @jobId, @schedule_name=@schedule_name + IF(@enabled_schedule = 1) + begin + SET @schedule_name = SUBSTRING(@schedule_name,0,LEN(@schedule_name)-5) + IF EXISTS (select name from msdb.dbo.sysschedules where name = @schedule_name) + EXEC @ReturnCode = msdb.dbo.sp_update_schedule @name=@schedule_name, @enabled=0 + end + IF (@@ERROR <> 0 OR @ReturnCode <> 0) GOTO QuitWithRollback +FETCH NEXT FROM c_schedules into @enabled_schedule, @schedule_name +end + +close c_schedules + +deallocate c_schedules + +EXEC @ReturnCode = msdb.dbo.sp_add_jobserver @job_id = @jobId, @server_name = N'(local)' +IF (@@ERROR <> 0 OR @ReturnCode <> 0) GOTO QuitWithRollback +COMMIT TRANSACTION +GOTO EndSave +QuitWithRollback: + IF (@@TRANCOUNT > 0) ROLLBACK TRANSACTION +EndSave: + +GO diff --git a/TPDT-268 - ACP in task sequence/dba_jobs/Pharmacy/DR92130 - Monitoring AMR.sql b/TPDT-268 - ACP in task sequence/dba_jobs/Pharmacy/DR92130 - Monitoring AMR.sql new file mode 100644 index 0000000..b5d176a Binary files /dev/null and b/TPDT-268 - ACP in task sequence/dba_jobs/Pharmacy/DR92130 - Monitoring AMR.sql differ diff --git a/TPDT-268 - ACP in task sequence/dba_jobs/Pharmacy/DR92180 - Check Performance Issue.sql b/TPDT-268 - ACP in task sequence/dba_jobs/Pharmacy/DR92180 - Check Performance Issue.sql new file mode 100644 index 0000000..99c7796 Binary files /dev/null and b/TPDT-268 - ACP in task sequence/dba_jobs/Pharmacy/DR92180 - Check Performance Issue.sql differ diff --git a/TPDT-268 - ACP in task sequence/dba_jobs/Pharmacy/DR92290 - Monitoring Change Tracking.sql b/TPDT-268 - ACP in task sequence/dba_jobs/Pharmacy/DR92290 - Monitoring Change Tracking.sql new file mode 100644 index 0000000..05dff92 Binary files /dev/null and b/TPDT-268 - ACP in task sequence/dba_jobs/Pharmacy/DR92290 - Monitoring Change Tracking.sql differ diff --git a/TPDT-268 - ACP in task sequence/dba_jobs/W93040 - Clean-up monitoring history.sql b/TPDT-268 - ACP in task sequence/dba_jobs/W93040 - Clean-up monitoring history.sql new file mode 100644 index 0000000..cd6cd74 Binary files /dev/null and b/TPDT-268 - ACP in task sequence/dba_jobs/W93040 - Clean-up monitoring history.sql differ diff --git a/TPDT-268 - ACP in task sequence/dba_jobs/W93060 - Clean-up history.sql b/TPDT-268 - ACP in task sequence/dba_jobs/W93060 - Clean-up history.sql new file mode 100644 index 0000000..dd9f2e7 --- /dev/null +++ b/TPDT-268 - ACP in task sequence/dba_jobs/W93060 - Clean-up history.sql @@ -0,0 +1,21 @@ +/****************************************************************/ +/********** SUPPRESSION TEMPORAIRE DES ANCIENS JOBS ************/ +/****************************************************************/ +USE [msdb] +GO + +IF EXISTS (SELECT job_id FROM msdb.dbo.sysjobs_view WHERE name = N'W90280 - Clean-up history') +EXEC msdb.dbo.sp_delete_job @job_name=N'W90280 - Clean-up history', @delete_unused_schedule=1 +GO + +IF EXISTS (SELECT job_id FROM msdb.dbo.sysjobs_view WHERE name = N'_W90280 - Clean-up history') +EXEC msdb.dbo.sp_delete_job @job_name=N'_W90280 - Clean-up history', @delete_unused_schedule=1 +GO + +IF EXISTS (SELECT job_id FROM msdb.dbo.sysjobs_view WHERE name = N'_W90260 - Clean-up history') +EXEC msdb.dbo.sp_delete_job @job_name=N'_W90260 - Clean-up history', @delete_unused_schedule=1 +GO + +IF EXISTS (SELECT job_id FROM msdb.dbo.sysjobs_view WHERE name = N'W93060 - Clean-up history') +EXEC msdb.dbo.sp_delete_job @job_name=N'W93060 - Clean-up history', @delete_unused_schedule=1 +GO \ No newline at end of file diff --git a/TPDT-268 - ACP in task sequence/dba_jobs/W93140 - Backup objects security.sql b/TPDT-268 - ACP in task sequence/dba_jobs/W93140 - Backup objects security.sql new file mode 100644 index 0000000..d5772cb Binary files /dev/null and b/TPDT-268 - ACP in task sequence/dba_jobs/W93140 - Backup objects security.sql differ diff --git a/TPDT-268 - ACP in task sequence/dba_jobs/_92020 - Audit Login.sql b/TPDT-268 - ACP in task sequence/dba_jobs/_92020 - Audit Login.sql new file mode 100644 index 0000000..893d466 --- /dev/null +++ b/TPDT-268 - ACP in task sequence/dba_jobs/_92020 - Audit Login.sql @@ -0,0 +1,196 @@ +/* Drop existing standard schedule for job */ +declare @schedule_id int +declare c_schedules cursor local forward_only static for + select ss.schedule_id + from msdb.dbo.sysjobschedules sjs +INNER JOIN msdb.dbo.sysschedules ss + ON sjs.schedule_id = ss.schedule_id + AND ss.name NOT LIKE '%#SPEC#' +INNER JOIN msdb.dbo.sysjobs sj + ON sjs.job_id = sj.job_id + WHERE sj.name = N'_92020 - Audit Login' + +open c_schedules + +FETCH NEXT FROM c_schedules into @schedule_id +while @@fetch_status = 0 +begin + IF ((select COUNT(*) from msdb.dbo.sysjobschedules where schedule_id=@schedule_id) = 1) + EXEC msdb.dbo.sp_delete_schedule @schedule_id=@schedule_id, @force_delete = 1 +FETCH NEXT FROM c_schedules into @schedule_id +end + +close c_schedules + +deallocate c_schedules + +IF EXISTS (SELECT job_id FROM msdb.dbo.sysjobs_view WHERE name = N'_92020 - Audit Login') +EXEC msdb.dbo.sp_delete_job @job_name = N'_92020 - Audit Login', @delete_unused_schedule=0 +GO + +/* Creation Job and Steps*/ +BEGIN TRANSACTION +DECLARE @ReturnCode INT +SELECT @ReturnCode = 0 + +IF NOT EXISTS (SELECT name FROM msdb.dbo.syscategories WHERE name=N'[Uncategorized (Local)]' AND category_class=1) +BEGIN +EXEC @ReturnCode = msdb.dbo.sp_add_category @class=N'JOB', @type=N'LOCAL', @name=N'[Uncategorized (Local)]' +IF (@@ERROR <> 0 OR @ReturnCode <> 0) GOTO QuitWithRollback + +END + +/* Add Job */ +DECLARE @jobId BINARY(16) +EXEC @ReturnCode = msdb.dbo.sp_add_job @job_name=N'_92020 - Audit Login', + @enabled=1, + @notify_level_eventlog=0, + @notify_level_email=0, + @notify_level_netsend=0, + @notify_level_page=0, + @delete_level=0, + @description=N'SPE - 27.02.2019 - Job creation + 17.03.2022 - FLA : Change DBA mail', + @category_name=N'[Uncategorized (Local)]', + @start_step_id=1, + @owner_login_name=N'sa', @job_id = @jobId OUTPUT +IF (@@ERROR <> 0 OR @ReturnCode <> 0) GOTO QuitWithRollback + +/* Add Step */ +EXEC @ReturnCode = msdb.dbo.sp_add_jobstep @job_id=@jobId, @step_name=N'Empty step', + @step_id=1, + @cmdexec_success_code=0, + @on_success_action=3, + @on_success_step_id=0, + @on_fail_action=3, + @on_fail_step_id=0, + @retry_attempts=0, + @retry_interval=0, + @os_run_priority=0, @subsystem=N'TSQL', + @command=N'/* Empty step */ +', + @database_name=N'master', + @output_file_name=NULL, + @flags=0, + @database_user_name=NULL, + @server=NULL, + @additional_parameters=NULL, + @proxy_id=NULL, + @proxy_name=NULL +IF (@@ERROR <> 0 OR @ReturnCode <> 0) GOTO QuitWithRollback +/* Add Step */ +EXEC @ReturnCode = msdb.dbo.sp_add_jobstep @job_id=@jobId, @step_name=N'Add audit event into table', + @step_id=2, + @cmdexec_success_code=0, + @on_success_action=3, + @on_success_step_id=0, + @on_fail_action=4, + @on_fail_step_id=4, + @retry_attempts=0, + @retry_interval=0, + @os_run_priority=0, @subsystem=N'TSQL', + @command=N'EXECUTE [dba].[sp_audit_login] + @in_ApplicationName = N''$(ESCAPE_SQUOTE(WMI(ApplicationName)))'' + ,@in_client_process_id = N''$(ESCAPE_SQUOTE(WMI(ClientProcessID)))'' + ,@in_host_name = N''$(ESCAPE_SQUOTE(WMI(HostName)))'' + ,@in_login_name = N''$(ESCAPE_SQUOTE(WMI(LoginName)))'' + ,@in_NT_domain_name = N''$(ESCAPE_SQUOTE(WMI(NTDomainName)))'' + ,@in_NT_user_name = N''$(ESCAPE_SQUOTE(WMI(NTUserName)))'' + ,@in_session_login_name = N''$(ESCAPE_SQUOTE(WMI(SessionLoginName)))'' + ,@in_spid = N''$(ESCAPE_SQUOTE(WMI(SPID)))'' + ,@in_event_time = N''$(ESCAPE_SQUOTE(WMI(StartTime)))'' + ,@in_audit_login_text = N''$(ESCAPE_SQUOTE(WMI(State)))'' + ,@in_text_data = N''$(ESCAPE_SQUOTE(WMI(TextData)))''', + @database_name=N'HCITools', + @output_file_name=NULL, + @flags=0, + @database_user_name=NULL, + @server=NULL, + @additional_parameters=NULL, + @proxy_id=NULL, + @proxy_name=NULL +IF (@@ERROR <> 0 OR @ReturnCode <> 0) GOTO QuitWithRollback +/* Add Step */ +EXEC @ReturnCode = msdb.dbo.sp_add_jobstep @job_id=@jobId, @step_name=N'Empty step for success', + @step_id=3, + @cmdexec_success_code=0, + @on_success_action=1, + @on_success_step_id=0, + @on_fail_action=4, + @on_fail_step_id=4, + @retry_attempts=0, + @retry_interval=0, + @os_run_priority=0, @subsystem=N'TSQL', + @command=N'/* Empty step */ +exec Get_Job_Error_Info @in_JobName = ''_92020 - Audit Login'', @in_Recipients = ''DBA_operator''', + @database_name=N'HCITools', + @output_file_name=NULL, + @flags=0, + @database_user_name=NULL, + @server=NULL, + @additional_parameters=NULL, + @proxy_id=NULL, + @proxy_name=NULL +IF (@@ERROR <> 0 OR @ReturnCode <> 0) GOTO QuitWithRollback +/* Add Step */ +EXEC @ReturnCode = msdb.dbo.sp_add_jobstep @job_id=@jobId, @step_name=N'Send email KO', + @step_id=4, + @cmdexec_success_code=0, + @on_success_action=2, + @on_success_step_id=0, + @on_fail_action=2, + @on_fail_step_id=0, + @retry_attempts=0, + @retry_interval=0, + @os_run_priority=0, @subsystem=N'TSQL', + @command=N'exec Get_Job_Error_Info @in_JobName = ''_92020 - Audit Login'', @in_Recipients = ''DBA_operator''', + @database_name=N'HCITools', + @output_file_name=NULL, + @flags=0, + @database_user_name=NULL, + @server=NULL, + @additional_parameters=NULL, + @proxy_id=NULL, + @proxy_name=NULL +IF (@@ERROR <> 0 OR @ReturnCode <> 0) GOTO QuitWithRollback +EXEC @ReturnCode = msdb.dbo.sp_update_job @job_id = @jobId, @start_step_id = 1 +IF (@@ERROR <> 0 OR @ReturnCode <> 0) GOTO QuitWithRollback + +/* Attach existing specific schedule for job */ +declare @enabled_schedule int, + @schedule_name nvarchar(50) +declare c_schedules cursor local forward_only static for +select enabled, name + from msdb.dbo.sysschedules + where name LIKE '_92020%' + and name LIKE '%#SPEC#' + +open c_schedules + +FETCH NEXT FROM c_schedules into @enabled_schedule, @schedule_name +while @@fetch_status = 0 +begin + EXEC @ReturnCode = msdb.dbo.sp_attach_schedule @job_id = @jobId, @schedule_name=@schedule_name + IF(@enabled_schedule = 1) + begin + SET @schedule_name = SUBSTRING(@schedule_name,0,LEN(@schedule_name)-5) + IF EXISTS (select name from msdb.dbo.sysschedules where name = @schedule_name) + EXEC @ReturnCode = msdb.dbo.sp_update_schedule @name=@schedule_name, @enabled=0 + end + IF (@@ERROR <> 0 OR @ReturnCode <> 0) GOTO QuitWithRollback +FETCH NEXT FROM c_schedules into @enabled_schedule, @schedule_name +end + +close c_schedules + +deallocate c_schedules + +EXEC @ReturnCode = msdb.dbo.sp_add_jobserver @job_id = @jobId, @server_name = N'(local)' +IF (@@ERROR <> 0 OR @ReturnCode <> 0) GOTO QuitWithRollback +COMMIT TRANSACTION +GOTO EndSave +QuitWithRollback: + IF (@@TRANCOUNT > 0) ROLLBACK TRANSACTION +EndSave: + +GO diff --git a/TPDT-268 - ACP in task sequence/dba_packages/1800-DeployIndexAndStatisticsMaintenance.sql b/TPDT-268 - ACP in task sequence/dba_packages/1800-DeployIndexAndStatisticsMaintenance.sql new file mode 100644 index 0000000..36ef65b --- /dev/null +++ b/TPDT-268 - ACP in task sequence/dba_packages/1800-DeployIndexAndStatisticsMaintenance.sql @@ -0,0 +1,859 @@ +/*============================================================================= + + Explication du traitement realise par la SP + ------------------------------------------- + 1. Creation de la table [HCITools].[dbo].[CommandLog] + 2. Creation de la procédure stockée [HCITools].[dbo].[CommandExecute] + 3. Creation de la procédure stockée [HCITools].[dbo].[IndexOptimize] + 4. Creation de la catégorie de job de l'agent SQL "DBA-Maintenance" + 5. Creation du job de l'agent SQL "D93020 - Index and Statistics Optimize" + 6. Creation du job de l'agent SQL "W93070 - CommandLog Cleanup" + 7. Creation du job de l'agent SQL "W93080 – Output Files Cleanup" + 8. Creation du job de l'agent SQL "W93090 - Index and Statistics Optimize Fullscan" + + Creation : 23.03.2015 / LPE + Dossier : Déploiement de la solution de maintenance des index et des statistiques SQL + http://sharepoint/retailpharma/dba/Reference%20documents/1800%20-%20Maintenance%20des%20index%20et%20des%20statistiques%20SQL.docx + + Modifications : + 13.10.15 / FLA : Changement du répertoire de log de D: vers G: + 13.10.15 / FLA : Appelle de la SP aps_Send_Mail_with_template à partir de HCITools + 14.10.15 / FLA : Modification du SortInTempDB à No dans "D90800 - Index and Statistics Optimize" + 09.03.16 / LPE : Ajout de @StatisticsSample='100' dans "D90800 - Index and Statistics Optimize" + 09.03.16 / LPE : Exclude databases "apstest", "arizonatest", "arizonacashtest" + 27.05.16 / LPE : Set parameter @Execute='Y' when calling job [W90800] + 30.06.16 / FLA : Adding dynamic path + 05.07.16 / LPE : Modify execution time of SQL job "D90800 - Index and Statistics Optimize" + 21.07.16 / FLA : Standardize the name of job and schedule + 09.09.16 / FLA : Ajout de Get_Job_Error_Info dans empty step et Send Mail KO + 22.03.17 / FLA : Changement du schedule du job D93020 - Index and Statistics Optimize + 06.09.17 / RTC : Split Document_line and others for du job D93020 - Index and Statistics Optimize. + 09.03.18 / RTC : Update Ola hallengren solution with 16th octobre 2016 for sql 2016 compatibility. + 22.03.18 / RTC : Move sp IndexOptimize in a HCITools sp. + 15.08.19 / SPE : #TFS54630# - Update Ola hallengren solution with 14th june 2019 version and change SQL maintenance jobs. + 06.11.19 / SPE : #TFS54630# - Disable job DR93010 - Index and Statistics Optimize + 17.11.20 / SPE : #TFS62147# - Modify index optimize and DBCC check db weekly to optimize global performances + 17.03.22 / FLA : Change DBA mail + 27.04.23 / TSC : OCTPDBA-588 remove usage of sqlCmd in job "W93070 - CommandLog Cleanup" + 01.09.23 / SPE : OCTPDBA-718: Remove txt file output in jobs to be compliant with SQL Managed Instances +=============================================================================*/ + + +/****************************************************************/ +/********** SUPPRESSION TEMPORAIRE DES ANCIENS JOBS ************/ +/****************************************************************/ +USE [msdb] +GO +IF EXISTS (SELECT job_id FROM msdb.dbo.sysjobs_view WHERE name = N'D90800 - Index and Statistics Optimize') +EXEC msdb.dbo.sp_delete_job @job_name=N'D90800 - Index and Statistics Optimize', @delete_unused_schedule=1 +GO + +IF EXISTS (SELECT job_id FROM msdb.dbo.sysjobs_view WHERE name = N'W90600 - CommandLog Cleanup') +EXEC msdb.dbo.sp_delete_job @job_name=N'W90600 - CommandLog Cleanup', @delete_unused_schedule=1 +GO + +IF EXISTS (SELECT job_id FROM msdb.dbo.sysjobs_view WHERE name = N'W90700 – Output Files Cleanup') +EXEC msdb.dbo.sp_delete_job @job_name=N'W90700 – Output Files Cleanup', @delete_unused_schedule=1 +GO + +IF EXISTS (SELECT job_id FROM msdb.dbo.sysjobs_view WHERE name = N'W90800 - Index and Statistics Optimize Fullscan') +EXEC msdb.dbo.sp_delete_job @job_name=N'W90800 - Index and Statistics Optimize Fullscan', @delete_unused_schedule=1 +GO + +IF EXISTS (SELECT job_id FROM msdb.dbo.sysjobs_view WHERE name = N'D93020 - Index and Statistics Optimize') +EXEC msdb.dbo.sp_delete_job @job_name=N'D93020 - Index and Statistics Optimize', @delete_unused_schedule=1 +GO + +IF EXISTS (SELECT job_id FROM msdb.dbo.sysjobs_view WHERE name = N'DR93010 - Index and Statistics Optimize') +EXEC msdb.dbo.sp_delete_job @job_name=N'DR93010 - Index and Statistics Optimize', @delete_unused_schedule=1 +GO + +/*****************************************************************/ +/********* 1. CREATE TABLE [HCITools].[dbo].[CommandLog] *********/ +/*****************************************************************/ +USE [HCITools] +GO + +IF NOT EXISTS (SELECT * FROM sys.objects WHERE object_id = OBJECT_ID(N'[HCITools].[dbo].[CommandLog]') AND type in (N'U')) +CREATE TABLE [HCITools].[dbo].[CommandLog]( +[ID] int IDENTITY(1,1) NOT NULL CONSTRAINT [PK_CommandLog] PRIMARY KEY CLUSTERED, +[DatabaseName] sysname NULL, +[SchemaName] sysname NULL, +[ObjectName] sysname NULL, +[ObjectType] char(2) NULL, +[IndexName] sysname NULL, +[IndexType] tinyint NULL, +[StatisticsName] sysname NULL, +[PartitionNumber] int NULL, +[ExtendedInfo] xml NULL, +[Command] nvarchar(max) NOT NULL, +[CommandType] nvarchar(60) NOT NULL, +[StartTime] datetime NOT NULL, +[EndTime] datetime NULL, +[ErrorNumber] int NULL, +[ErrorMessage] nvarchar(max) NULL +) +GO + + +/********************************************************************************/ +/********* 2. CREATE STORED PROCEDURE [HCITools].[dbo].[CommandExecute] *********/ +/********************************************************************************/ +USE [HCITools] +GO + +IF EXISTS (SELECT * FROM sys.objects WHERE object_id = OBJECT_ID(N'[HCITools].[dbo].[CommandExecute]') AND type in (N'P', N'PC')) + DROP PROCEDURE [dbo].[CommandExecute] +GO + + + +CREATE PROCEDURE [dbo].[CommandExecute] + +@DatabaseContext nvarchar(max), +@Command nvarchar(max), +@CommandType nvarchar(max), +@Mode int, +@Comment nvarchar(max) = NULL, +@DatabaseName nvarchar(max) = NULL, +@SchemaName nvarchar(max) = NULL, +@ObjectName nvarchar(max) = NULL, +@ObjectType nvarchar(max) = NULL, +@IndexName nvarchar(max) = NULL, +@IndexType int = NULL, +@StatisticsName nvarchar(max) = NULL, +@PartitionNumber int = NULL, +@ExtendedInfo xml = NULL, +@LockMessageSeverity int = 16, +@LogToTable nvarchar(max), +@Execute nvarchar(max) + +AS + +BEGIN + + ---------------------------------------------------------------------------------------------------- + --// Source: https://ola.hallengren.com //-- + --// License: https://ola.hallengren.com/license.html //-- + --// GitHub: https://github.com/olahallengren/sql-server-maintenance-solution //-- + --// Version: 2020-11-15 18:44:03 //-- + ---------------------------------------------------------------------------------------------------- + + SET NOCOUNT ON + + DECLARE @StartMessage nvarchar(max) + DECLARE @EndMessage nvarchar(max) + DECLARE @ErrorMessage nvarchar(max) + DECLARE @ErrorMessageOriginal nvarchar(max) + DECLARE @Severity int + + DECLARE @Errors TABLE (ID int IDENTITY PRIMARY KEY, + [Message] nvarchar(max) NOT NULL, + Severity int NOT NULL, + [State] int) + + DECLARE @CurrentMessage nvarchar(max) + DECLARE @CurrentSeverity int + DECLARE @CurrentState int + + DECLARE @sp_executesql nvarchar(max) = QUOTENAME(@DatabaseContext) + '.sys.sp_executesql' + + DECLARE @StartTime datetime2 + DECLARE @EndTime datetime2 + + DECLARE @ID int + + DECLARE @Error int = 0 + DECLARE @ReturnCode int = 0 + + DECLARE @EmptyLine nvarchar(max) = CHAR(9) + + ---------------------------------------------------------------------------------------------------- + --// Check core requirements //-- + ---------------------------------------------------------------------------------------------------- + + IF NOT (SELECT [compatibility_level] FROM sys.databases WHERE database_id = DB_ID()) >= 90 + BEGIN + INSERT INTO @Errors ([Message], Severity, [State]) + SELECT 'The database ' + QUOTENAME(DB_NAME(DB_ID())) + ' has to be in compatibility level 90 or higher.', 16, 1 + END + + IF NOT (SELECT uses_ansi_nulls FROM sys.sql_modules WHERE [object_id] = @@PROCID) = 1 + BEGIN + INSERT INTO @Errors ([Message], Severity, [State]) + SELECT 'ANSI_NULLS has to be set to ON for the stored procedure.', 16, 1 + END + + IF NOT (SELECT uses_quoted_identifier FROM sys.sql_modules WHERE [object_id] = @@PROCID) = 1 + BEGIN + INSERT INTO @Errors ([Message], Severity, [State]) + SELECT 'QUOTED_IDENTIFIER has to be set to ON for the stored procedure.', 16, 1 + END + + IF @LogToTable = 'Y' AND NOT EXISTS (SELECT * FROM sys.objects objects INNER JOIN sys.schemas schemas ON objects.[schema_id] = schemas.[schema_id] WHERE objects.[type] = 'U' AND schemas.[name] = 'dbo' AND objects.[name] = 'CommandLog') + BEGIN + INSERT INTO @Errors ([Message], Severity, [State]) + SELECT 'The table CommandLog is missing. Download https://ola.hallengren.com/scripts/CommandLog.sql.', 16, 1 + END + + ---------------------------------------------------------------------------------------------------- + --// Check input parameters //-- + ---------------------------------------------------------------------------------------------------- + + IF @DatabaseContext IS NULL OR NOT EXISTS (SELECT * FROM sys.databases WHERE name = @DatabaseContext) + BEGIN + INSERT INTO @Errors ([Message], Severity, [State]) + SELECT 'The value for the parameter @DatabaseContext is not supported.', 16, 1 + END + + IF @Command IS NULL OR @Command = '' + BEGIN + INSERT INTO @Errors ([Message], Severity, [State]) + SELECT 'The value for the parameter @Command is not supported.', 16, 1 + END + + IF @CommandType IS NULL OR @CommandType = '' OR LEN(@CommandType) > 60 + BEGIN + INSERT INTO @Errors ([Message], Severity, [State]) + SELECT 'The value for the parameter @CommandType is not supported.', 16, 1 + END + + IF @Mode NOT IN(1,2) OR @Mode IS NULL + BEGIN + INSERT INTO @Errors ([Message], Severity, [State]) + SELECT 'The value for the parameter @Mode is not supported.', 16, 1 + END + + IF @LockMessageSeverity NOT IN(10,16) OR @LockMessageSeverity IS NULL + BEGIN + INSERT INTO @Errors ([Message], Severity, [State]) + SELECT 'The value for the parameter @LockMessageSeverity is not supported.', 16, 1 + END + + IF @LogToTable NOT IN('Y','N') OR @LogToTable IS NULL + BEGIN + INSERT INTO @Errors ([Message], Severity, [State]) + SELECT 'The value for the parameter @LogToTable is not supported.', 16, 1 + END + + IF @Execute NOT IN('Y','N') OR @Execute IS NULL + BEGIN + INSERT INTO @Errors ([Message], Severity, [State]) + SELECT 'The value for the parameter @Execute is not supported.', 16, 1 + END + + ---------------------------------------------------------------------------------------------------- + --// Raise errors //-- + ---------------------------------------------------------------------------------------------------- + + DECLARE ErrorCursor CURSOR FAST_FORWARD FOR SELECT [Message], Severity, [State] FROM @Errors ORDER BY [ID] ASC + + OPEN ErrorCursor + + FETCH ErrorCursor INTO @CurrentMessage, @CurrentSeverity, @CurrentState + + WHILE @@FETCH_STATUS = 0 + BEGIN + RAISERROR('%s', @CurrentSeverity, @CurrentState, @CurrentMessage) WITH NOWAIT + RAISERROR(@EmptyLine, 10, 1) WITH NOWAIT + + FETCH NEXT FROM ErrorCursor INTO @CurrentMessage, @CurrentSeverity, @CurrentState + END + + CLOSE ErrorCursor + + DEALLOCATE ErrorCursor + + IF EXISTS (SELECT * FROM @Errors WHERE Severity >= 16) + BEGIN + SET @ReturnCode = 50000 + GOTO ReturnCode + END + + ---------------------------------------------------------------------------------------------------- + --// Log initial information //-- + ---------------------------------------------------------------------------------------------------- + + SET @StartTime = SYSDATETIME() + + SET @StartMessage = 'Date and time: ' + CONVERT(nvarchar,@StartTime,120) + RAISERROR('%s',10,1,@StartMessage) WITH NOWAIT + + SET @StartMessage = 'Database context: ' + QUOTENAME(@DatabaseContext) + RAISERROR('%s',10,1,@StartMessage) WITH NOWAIT + + SET @StartMessage = 'Command: ' + @Command + RAISERROR('%s',10,1,@StartMessage) WITH NOWAIT + + IF @Comment IS NOT NULL + BEGIN + SET @StartMessage = 'Comment: ' + @Comment + RAISERROR('%s',10,1,@StartMessage) WITH NOWAIT + END + + IF @LogToTable = 'Y' + BEGIN + INSERT INTO dbo.CommandLog (DatabaseName, SchemaName, ObjectName, ObjectType, IndexName, IndexType, StatisticsName, PartitionNumber, ExtendedInfo, CommandType, Command, StartTime) + VALUES (@DatabaseName, @SchemaName, @ObjectName, @ObjectType, @IndexName, @IndexType, @StatisticsName, @PartitionNumber, @ExtendedInfo, @CommandType, @Command, @StartTime) + END + + SET @ID = SCOPE_IDENTITY() + + ---------------------------------------------------------------------------------------------------- + --// Execute command //-- + ---------------------------------------------------------------------------------------------------- + + IF @Mode = 1 AND @Execute = 'Y' + BEGIN + EXECUTE @sp_executesql @stmt = @Command + SET @Error = @@ERROR + SET @ReturnCode = @Error + END + + IF @Mode = 2 AND @Execute = 'Y' + BEGIN + BEGIN TRY + EXECUTE @sp_executesql @stmt = @Command + END TRY + BEGIN CATCH + SET @Error = ERROR_NUMBER() + SET @ErrorMessageOriginal = ERROR_MESSAGE() + + SET @ErrorMessage = 'Msg ' + CAST(ERROR_NUMBER() AS nvarchar) + ', ' + ISNULL(ERROR_MESSAGE(),'') + SET @Severity = CASE WHEN ERROR_NUMBER() IN(1205,1222) THEN @LockMessageSeverity ELSE 16 END + RAISERROR('%s',@Severity,1,@ErrorMessage) WITH NOWAIT + + IF NOT (ERROR_NUMBER() IN(1205,1222) AND @LockMessageSeverity = 10) + BEGIN + SET @ReturnCode = ERROR_NUMBER() + END + END CATCH + END + + ---------------------------------------------------------------------------------------------------- + --// Log completing information //-- + ---------------------------------------------------------------------------------------------------- + + SET @EndTime = SYSDATETIME() + + SET @EndMessage = 'Outcome: ' + CASE WHEN @Execute = 'N' THEN 'Not Executed' WHEN @Error = 0 THEN 'Succeeded' ELSE 'Failed' END + RAISERROR('%s',10,1,@EndMessage) WITH NOWAIT + + SET @EndMessage = 'Duration: ' + CASE WHEN (DATEDIFF(SECOND,@StartTime,@EndTime) / (24 * 3600)) > 0 THEN CAST((DATEDIFF(SECOND,@StartTime,@EndTime) / (24 * 3600)) AS nvarchar) + '.' ELSE '' END + CONVERT(nvarchar,DATEADD(SECOND,DATEDIFF(SECOND,@StartTime,@EndTime),'1900-01-01'),108) + RAISERROR('%s',10,1,@EndMessage) WITH NOWAIT + + SET @EndMessage = 'Date and time: ' + CONVERT(nvarchar,@EndTime,120) + RAISERROR('%s',10,1,@EndMessage) WITH NOWAIT + + RAISERROR(@EmptyLine,10,1) WITH NOWAIT + + IF @LogToTable = 'Y' + BEGIN + UPDATE dbo.CommandLog + SET EndTime = @EndTime, + ErrorNumber = CASE WHEN @Execute = 'N' THEN NULL ELSE @Error END, + ErrorMessage = @ErrorMessageOriginal + WHERE ID = @ID + END + + ReturnCode: + IF @ReturnCode <> 0 + BEGIN + RETURN @ReturnCode + END + + ---------------------------------------------------------------------------------------------------- + +END +GO + + +/********************************************************************************/ +/********* 4. CREATE SQL AGENT JOB CATEGORY "DBA-Maintenance" *********/ +/********************************************************************************/ +USE [msdb] +GO + +IF NOT EXISTS (SELECT name FROM msdb.dbo.syscategories WHERE name=N'DBA-Maintenance' AND category_class=1) +BEGIN + + EXEC msdb.dbo.sp_add_category @class=N'JOB', @type=N'LOCAL', @name=N'DBA-Maintenance' + +END + + + + + + + + +/********************************************************************************/ +/********* 5. CREATE SQL AGENT JOB "W93070 - CommandLog Cleanup" ***************/ +/********************************************************************************/ + +USE [msdb] +; + +DECLARE @job_description NVARCHAR(1024) + +SET @job_description = 'Création du job le ' + CONVERT(VARCHAR(10),GETDATE(),104) + ' (Source SharePoint : "1800 - Maintenance des index et des statistiques SQL.docx") + +27.04.2023 TSC OCTPDBA-588 Adapt step "CommandLog Cleanup" to not use a sqlCmd +' +/* Drop existing standard schedule for job */ +declare @schedule_id int +declare c_schedules cursor local forward_only static for + select ss.schedule_id + from msdb.dbo.sysjobschedules sjs +INNER JOIN msdb.dbo.sysschedules ss + ON sjs.schedule_id = ss.schedule_id + AND ss.name NOT LIKE '%#SPEC#' +INNER JOIN msdb.dbo.sysjobs sj + ON sjs.job_id = sj.job_id + WHERE sj.name = N'W93070 - CommandLog Cleanup' + +open c_schedules + +FETCH NEXT FROM c_schedules into @schedule_id +while @@fetch_status = 0 +begin + IF ((select COUNT(*) from msdb.dbo.sysjobschedules where schedule_id=@schedule_id) = 1) + EXEC msdb.dbo.sp_delete_schedule @schedule_id=@schedule_id, @force_delete = 1 +FETCH NEXT FROM c_schedules into @schedule_id +end + +close c_schedules + +deallocate c_schedules + +IF EXISTS (SELECT job_id FROM msdb.dbo.sysjobs_view WHERE name = N'W93070 - CommandLog Cleanup') +EXEC msdb.dbo.sp_delete_job @job_name = N'W93070 - CommandLog Cleanup', @delete_unused_schedule=0 + + +/* Creation Job and Steps*/ +BEGIN TRANSACTION +DECLARE @ReturnCode INT +SELECT @ReturnCode = 0 + +IF NOT EXISTS (SELECT name FROM msdb.dbo.syscategories WHERE name=N'DBA-Maintenance' AND category_class=1) +BEGIN +EXEC @ReturnCode = msdb.dbo.sp_add_category @class=N'JOB', @type=N'LOCAL', @name=N'DBA-Maintenance' +IF (@@ERROR <> 0 OR @ReturnCode <> 0) GOTO QuitWithRollback + +END + +/* Add Job */ +DECLARE @jobId BINARY(16) +EXEC @ReturnCode = msdb.dbo.sp_add_job @job_name=N'W93070 - CommandLog Cleanup', + @enabled=1, + @notify_level_eventlog=2, + @notify_level_email=0, + @notify_level_netsend=0, + @notify_level_page=0, + @delete_level=0, + @description=@job_description, + @category_name=N'DBA-Maintenance', + @start_step_id=1, + @owner_login_name=N'sa', @job_id = @jobId OUTPUT +IF (@@ERROR <> 0 OR @ReturnCode <> 0) GOTO QuitWithRollback + +/* Add Step */ +EXEC @ReturnCode = msdb.dbo.sp_add_jobstep @job_id=@jobId, @step_name=N'Empty step', + @step_id=1, + @cmdexec_success_code=0, + @on_success_action=3, + @on_success_step_id=0, + @on_fail_action=3, + @on_fail_step_id=0, + @retry_attempts=0, + @retry_interval=0, + @os_run_priority=0, @subsystem=N'TSQL', + @command=N'/* Empty step */', + @database_name=N'master', + @output_file_name=NULL, + @flags=0, + @database_user_name=NULL, + @server=NULL, + @additional_parameters=NULL, + @proxy_id=NULL, + @proxy_name=NULL +IF (@@ERROR <> 0 OR @ReturnCode <> 0) GOTO QuitWithRollback +/* Add Step */ +EXEC @ReturnCode = msdb.dbo.sp_add_jobstep @job_id=@jobId, @step_name=N'CommandLog Cleanup', + @step_id=2, + @cmdexec_success_code=0, + @on_success_action=3, + @on_success_step_id=0, + @on_fail_action=4, + @on_fail_step_id=4, + @retry_attempts=0, + @retry_interval=0, + @os_run_priority=0, @subsystem=N'TSQL', + @command=N'DELETE FROM [dbo].[CommandLog] WHERE StartTime < DATEADD(dd,-30,GETDATE())', + @database_name=N'HCITools', + @output_file_name=NULL, + @flags=0, + @database_user_name=NULL, + @server=NULL, + @additional_parameters=NULL, + @proxy_id=NULL, + @proxy_name=NULL +IF (@@ERROR <> 0 OR @ReturnCode <> 0) GOTO QuitWithRollback +/* Add Step */ +EXEC @ReturnCode = msdb.dbo.sp_add_jobstep @job_id=@jobId, @step_name=N'Empty step for success', + @step_id=3, + @cmdexec_success_code=0, + @on_success_action=1, + @on_success_step_id=0, + @on_fail_action=4, + @on_fail_step_id=4, + @retry_attempts=0, + @retry_interval=0, + @os_run_priority=0, @subsystem=N'TSQL', + @command=N'/* Empty step */ +exec Get_Job_Error_Info @in_JobName = ''W93070 - CommandLog Cleanup'', @in_Recipients = ''DBA_operator''', + @database_name=N'HCITools', + @output_file_name=NULL, + @flags=0, + @database_user_name=NULL, + @server=NULL, + @additional_parameters=NULL, + @proxy_id=NULL, + @proxy_name=NULL +IF (@@ERROR <> 0 OR @ReturnCode <> 0) GOTO QuitWithRollback +/* Add Step */ +EXEC @ReturnCode = msdb.dbo.sp_add_jobstep @job_id=@jobId, @step_name=N'Send email KO', + @step_id=4, + @cmdexec_success_code=0, + @on_success_action=2, + @on_success_step_id=0, + @on_fail_action=2, + @on_fail_step_id=0, + @retry_attempts=0, + @retry_interval=0, + @os_run_priority=0, @subsystem=N'TSQL', + @command=N'exec Get_Job_Error_Info @in_JobName = ''W93070 - CommandLog Cleanup'', @in_Recipients = ''DBA_operator''', + @database_name=N'HCITools', + @output_file_name=NULL, + @flags=0, + @database_user_name=NULL, + @server=NULL, + @additional_parameters=NULL, + @proxy_id=NULL, + @proxy_name=NULL +IF (@@ERROR <> 0 OR @ReturnCode <> 0) GOTO QuitWithRollback +EXEC @ReturnCode = msdb.dbo.sp_update_job @job_id = @jobId, @start_step_id = 1 +IF (@@ERROR <> 0 OR @ReturnCode <> 0) GOTO QuitWithRollback + +/* Add Standard Schedule */ +EXEC @ReturnCode = msdb.dbo.sp_add_jobschedule @job_id=@jobId, @name=N'W93070-W', + @enabled=1, + @freq_type=8, + @freq_interval=1, + @freq_subday_type=1, + @freq_subday_interval=0, + @freq_relative_interval=0, + @freq_recurrence_factor=1, + @active_start_date=20150305, + @active_end_date=99991231, + @active_start_time=0, + @active_end_time=235959 +IF (@@ERROR <> 0 OR @ReturnCode <> 0) GOTO QuitWithRollback + +/* Attach existing specific schedule for job */ +declare @enabled_schedule int, + @schedule_name nvarchar(50) +declare c_schedules cursor local forward_only static for +select enabled, name + from msdb.dbo.sysschedules + where name LIKE 'W93070%' + and name LIKE '%#SPEC#' + +open c_schedules + +FETCH NEXT FROM c_schedules into @enabled_schedule, @schedule_name +while @@fetch_status = 0 +begin + EXEC @ReturnCode = msdb.dbo.sp_attach_schedule @job_id = @jobId, @schedule_name=@schedule_name + IF(@enabled_schedule = 1) + begin + SET @schedule_name = SUBSTRING(@schedule_name,0,LEN(@schedule_name)-5) + IF EXISTS (select name from msdb.dbo.sysschedules where name = @schedule_name) + EXEC @ReturnCode = msdb.dbo.sp_update_schedule @name=@schedule_name, @enabled=0 + end + IF (@@ERROR <> 0 OR @ReturnCode <> 0) GOTO QuitWithRollback +FETCH NEXT FROM c_schedules into @enabled_schedule, @schedule_name +end + +close c_schedules + +deallocate c_schedules + +EXEC @ReturnCode = msdb.dbo.sp_add_jobserver @job_id = @jobId, @server_name = N'(local)' +IF (@@ERROR <> 0 OR @ReturnCode <> 0) GOTO QuitWithRollback +COMMIT TRANSACTION +GOTO EndSave +QuitWithRollback: + IF (@@TRANCOUNT > 0) ROLLBACK TRANSACTION +EndSave: + +GO + + +/********************************************************************************/ +/********* 6. DROP SQL AGENT JOB "W93080 – Output Files Cleanup" *********/ +/********************************************************************************/ +USE [msdb] +; + +IF EXISTS (SELECT job_id FROM msdb.dbo.sysjobs_view WHERE name = N'W93080 - Output Files Cleanup') +EXEC msdb.dbo.sp_delete_job @job_name = N'W93080 - Output Files Cleanup', @delete_unused_schedule=1 + + +/*********************************************************************************************/ +/********* 7. CREATE SQL AGENT JOB "W93090 - Index and Statistics Optimize Fullscan" *********/ +/*********************************************************************************************/ +USE [msdb] +; + +DECLARE @job_description NVARCHAR(1024) + +SET @job_description = 'Création du job le ' + CONVERT(VARCHAR(10),GETDATE(),104) + ' (Source SharePoint : "1800 - Maintenance des index et des statistiques SQL.docx")' + +/* Drop existing standard schedule for job */ +declare @schedule_id int +declare c_schedules cursor local forward_only static for + select ss.schedule_id + from msdb.dbo.sysjobschedules sjs +INNER JOIN msdb.dbo.sysschedules ss + ON sjs.schedule_id = ss.schedule_id + AND ss.name NOT LIKE '%#SPEC#' +INNER JOIN msdb.dbo.sysjobs sj + ON sjs.job_id = sj.job_id + WHERE sj.name = N'W93090 - Index and Statistics Optimize Fullscan' + +open c_schedules + +FETCH NEXT FROM c_schedules into @schedule_id +while @@fetch_status = 0 +begin + IF ((select COUNT(*) from msdb.dbo.sysjobschedules where schedule_id=@schedule_id) = 1) + EXEC msdb.dbo.sp_delete_schedule @schedule_id=@schedule_id, @force_delete = 1 +FETCH NEXT FROM c_schedules into @schedule_id +end + +close c_schedules + +deallocate c_schedules + +IF EXISTS (SELECT job_id FROM msdb.dbo.sysjobs_view WHERE name = N'W93090 - Index and Statistics Optimize Fullscan') +EXEC msdb.dbo.sp_delete_job @job_name = N'W93090 - Index and Statistics Optimize Fullscan', @delete_unused_schedule=0 + + +/* Creation Job and Steps*/ +BEGIN TRANSACTION +DECLARE @ReturnCode INT +SELECT @ReturnCode = 0 + +IF NOT EXISTS (SELECT name FROM msdb.dbo.syscategories WHERE name=N'DBA-Maintenance' AND category_class=1) +BEGIN +EXEC @ReturnCode = msdb.dbo.sp_add_category @class=N'JOB', @type=N'LOCAL', @name=N'DBA-Maintenance' +IF (@@ERROR <> 0 OR @ReturnCode <> 0) GOTO QuitWithRollback + +END + +/* Add Job */ +DECLARE @jobId BINARY(16) +EXEC @ReturnCode = msdb.dbo.sp_add_job @job_name=N'W93090 - Index and Statistics Optimize Fullscan', + @enabled=1, + @notify_level_eventlog=2, + @notify_level_email=0, + @notify_level_netsend=0, + @notify_level_page=0, + @delete_level=0, + @description=@job_description, + @category_name=N'DBA-Maintenance', + @start_step_id=1, + @owner_login_name=N'sa', @job_id = @jobId OUTPUT +IF (@@ERROR <> 0 OR @ReturnCode <> 0) GOTO QuitWithRollback + +/* Add Step */ +EXEC @ReturnCode = msdb.dbo.sp_add_jobstep @job_id=@jobId, @step_name=N'Empty step', + @step_id=1, + @cmdexec_success_code=0, + @on_success_action=3, + @on_success_step_id=0, + @on_fail_action=3, + @on_fail_step_id=0, + @retry_attempts=0, + @retry_interval=0, + @os_run_priority=0, @subsystem=N'TSQL', + @command=N'/* Empty step */', + @database_name=N'master', + @output_file_name=NULL, + @flags=0, + @database_user_name=NULL, + @server=NULL, + @additional_parameters=NULL, + @proxy_id=NULL, + @proxy_name=NULL +IF (@@ERROR <> 0 OR @ReturnCode <> 0) GOTO QuitWithRollback +/* Add Step */ +EXEC @ReturnCode = msdb.dbo.sp_add_jobstep @job_id=@jobId, @step_name=N'Wait for a random delay of 0..1150 minutes', + @step_id=2, + @cmdexec_success_code=0, + @on_success_action=3, + @on_success_step_id=0, + @on_fail_action=4, + @on_fail_step_id=5, + @retry_attempts=0, + @retry_interval=0, + @os_run_priority=0, @subsystem=N'TSQL', + @command=N'EXEC [dbo].[Wait_Random_Time_Sunday] @in_Minutes = 1150', + @database_name=N'HCITools', + @output_file_name=NULL, + @flags=0, + @database_user_name=NULL, + @server=NULL, + @additional_parameters=NULL, + @proxy_id=NULL, + @proxy_name=NULL +IF (@@ERROR <> 0 OR @ReturnCode <> 0) GOTO QuitWithRollback +/* Add Step */ +EXEC @ReturnCode = msdb.dbo.sp_add_jobstep @job_id=@jobId, @step_name=N'IndexOptimize - ALL_DATABASES', + @step_id=3, + @cmdexec_success_code=0, + @on_success_action=3, + @on_success_step_id=0, + @on_fail_action=4, + @on_fail_step_id=5, + @retry_attempts=0, + @retry_interval=0, + @os_run_priority=0, @subsystem=N'TSQL', + @command=N'EXECUTE [dbo].[IndexOptimize] +@Databases = ''ALL_DATABASES,-tempdb,-symbiose,-ArizonaDW,-%test%,-%dbi%,-%snapshot%,-%capucine%'', +@FragmentationMedium=''INDEX_REORGANIZE,INDEX_REBUILD_ONLINE,INDEX_REBUILD_OFFLINE'', +@FragmentationHigh=''INDEX_REBUILD_ONLINE,INDEX_REBUILD_OFFLINE'', +@FragmentationLevel1=5, +@FragmentationLevel2=30, +@MinNumberOfPages=1000, +@SortInTempdb=''N'', +@LOBCompaction=''Y'', +@UpdateStatistics=''ALL'', +@OnlyModifiedStatistics=''N'', +@StatisticsSample=''100'', +@PartitionLevel=''Y'', +@MSShippedObjects=''Y'', +@Indexes=''ALL_INDEXES'', +@LogToTable=''Y'', +@Execute=''Y'';', + @database_name=N'HCITools', + @output_file_name=NULL, + @flags=0, + @database_user_name=NULL, + @server=NULL, + @additional_parameters=NULL, + @proxy_id=NULL, + @proxy_name=NULL +IF (@@ERROR <> 0 OR @ReturnCode <> 0) GOTO QuitWithRollback +/* Add Step */ +EXEC @ReturnCode = msdb.dbo.sp_add_jobstep @job_id=@jobId, @step_name=N'Empty step for success', + @step_id=4, + @cmdexec_success_code=0, + @on_success_action=1, + @on_success_step_id=0, + @on_fail_action=4, + @on_fail_step_id=5, + @retry_attempts=0, + @retry_interval=0, + @os_run_priority=0, @subsystem=N'TSQL', + @command=N'/* Empty step */ +exec Get_Job_Error_Info @in_JobName = ''W93090 - Index and Statistics Optimize Fullscan'', @in_Recipients = ''DBA_operator''', + @database_name=N'HCITools', + @output_file_name=NULL, + @flags=0, + @database_user_name=NULL, + @server=NULL, + @additional_parameters=NULL, + @proxy_id=NULL, + @proxy_name=NULL +IF (@@ERROR <> 0 OR @ReturnCode <> 0) GOTO QuitWithRollback +/* Add Step */ +EXEC @ReturnCode = msdb.dbo.sp_add_jobstep @job_id=@jobId, @step_name=N'Send email KO', + @step_id=5, + @cmdexec_success_code=0, + @on_success_action=2, + @on_success_step_id=0, + @on_fail_action=2, + @on_fail_step_id=0, + @retry_attempts=0, + @retry_interval=0, + @os_run_priority=0, @subsystem=N'TSQL', + @command=N'exec Get_Job_Error_Info @in_JobName = ''W93090 - Index and Statistics Optimize Fullscan'', @in_Recipients = ''DBA_operator''', + @database_name=N'HCITools', + @output_file_name=NULL, + @flags=0, + @database_user_name=NULL, + @server=NULL, + @additional_parameters=NULL, + @proxy_id=NULL, + @proxy_name=NULL +IF (@@ERROR <> 0 OR @ReturnCode <> 0) GOTO QuitWithRollback +EXEC @ReturnCode = msdb.dbo.sp_update_job @job_id = @jobId, @start_step_id = 1 +IF (@@ERROR <> 0 OR @ReturnCode <> 0) GOTO QuitWithRollback + +/* Add Standard Schedule */ +EXEC @ReturnCode = msdb.dbo.sp_add_jobschedule @job_id=@jobId, @name=N'W93090-W', + @enabled=1, + @freq_type=8, + @freq_interval=1, + @freq_subday_type=1, + @freq_subday_interval=0, + @freq_relative_interval=0, + @freq_recurrence_factor=1, + @active_start_date=20150305, + @active_end_date=99991231, + @active_start_time=42000, + @active_end_time=235959 +IF (@@ERROR <> 0 OR @ReturnCode <> 0) GOTO QuitWithRollback + +/* Attach existing specific schedule for job */ +declare @enabled_schedule int, + @schedule_name nvarchar(50) +declare c_schedules cursor local forward_only static for +select enabled, name + from msdb.dbo.sysschedules + where name LIKE 'W93090%' + and name LIKE '%#SPEC#' + +open c_schedules + +FETCH NEXT FROM c_schedules into @enabled_schedule, @schedule_name +while @@fetch_status = 0 +begin + EXEC @ReturnCode = msdb.dbo.sp_attach_schedule @job_id = @jobId, @schedule_name=@schedule_name + IF(@enabled_schedule = 1) + begin + SET @schedule_name = SUBSTRING(@schedule_name,0,LEN(@schedule_name)-5) + IF EXISTS (select name from msdb.dbo.sysschedules where name = @schedule_name) + EXEC @ReturnCode = msdb.dbo.sp_update_schedule @name=@schedule_name, @enabled=0 + end + IF (@@ERROR <> 0 OR @ReturnCode <> 0) GOTO QuitWithRollback +FETCH NEXT FROM c_schedules into @enabled_schedule, @schedule_name +end + +close c_schedules + +deallocate c_schedules + +EXEC @ReturnCode = msdb.dbo.sp_add_jobserver @job_id = @jobId, @server_name = N'(local)' +IF (@@ERROR <> 0 OR @ReturnCode <> 0) GOTO QuitWithRollback +COMMIT TRANSACTION +GOTO EndSave +QuitWithRollback: + IF (@@TRANCOUNT > 0) ROLLBACK TRANSACTION +EndSave: + +GO + diff --git a/TPDT-268 - ACP in task sequence/dba_packages/DeployDBATraceFlags.sql b/TPDT-268 - ACP in task sequence/dba_packages/DeployDBATraceFlags.sql new file mode 100644 index 0000000..79bc5d6 --- /dev/null +++ b/TPDT-268 - ACP in task sequence/dba_packages/DeployDBATraceFlags.sql @@ -0,0 +1,417 @@ +USE [HCITools] +GO + +IF NOT EXISTS (SELECT * FROM master.sys.schemas WHERE name = N'dba') +BEGIN + EXEC('CREATE SCHEMA [dba] AUTHORIZATION [dbo]') +END +GO + +/* Creation de la table DBA_trace_flags */ +IF NOT EXISTS (SELECT * FROM sys.objects WHERE object_id = OBJECT_ID(N'[dba].[DBA_trace_flags]') AND type in (N'U')) +BEGIN + + CREATE TABLE [dba].[DBA_trace_flags]( + [DBA_trace_flags_ID] [int] NOT NULL, + [DTF_name] [varchar](MAX) NOT NULL, + [DTF_lowerstVersion] [smallint] NOT NULL, + [DTF_highestVersion] [smallint] NULL, + [DTF_active] [bit] NOT NULL + CONSTRAINT [PK_DBA_trace_flags] PRIMARY KEY CLUSTERED + ( + [DBA_trace_flags_ID] ASC + )WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY] + ) ON [PRIMARY] + +END +GO + + + +/* DEBUT CONFIGURATIONS DES TRACEFLAGS ------------------------------------------------------------------------------*/ + +/* +10 = SQL 2008 +11 = SQL 2012 +12 = SQL 2014 +13 = SQL 2016 +14 = SQL 2017 +15 = SQL 2019 + +In SQL Managed instance, only these trace flags are compatible: 460, 2301, 2389, 2390, 2453, 2467, 7471, 8207, 9389, 10316, and 11024 */ +IF (SERVERPROPERTY('EngineEdition') <> 8) +BEGIN + +/* TraceFlag 1117 Grow All Files in a FileGroup Equally */ +IF NOT EXISTS(SELECT 1 FROM [dba].[DBA_trace_flags] WHERE DBA_trace_flags_ID =1117) +BEGIN + INSERT INTO [dba].[DBA_trace_flags](DBA_trace_flags_ID,DTF_name,DTF_lowerstVersion,DTF_highestVersion,DTF_active) + VALUES(1117,'Grow All Files in a FileGroup Equally',10,12,1) +END + +/* TraceFlag 3226 Suppress all successful backups in SQL server error log */ +IF NOT EXISTS(SELECT 1 FROM [dba].[DBA_trace_flags] WHERE DBA_trace_flags_ID =3226) +BEGIN + INSERT INTO [dba].[DBA_trace_flags](DBA_trace_flags_ID,DTF_name,DTF_lowerstVersion,DTF_highestVersion,DTF_active) + VALUES(3226,'Suppress all successful backups in SQL server error log',10,NULL,1) +END + +/* TraceFlag 9481 Set the Query Optimizer cardinality estimation model to 70 (LEGACY) */ +IF NOT EXISTS(SELECT 1 FROM [dba].[DBA_trace_flags] WHERE DBA_trace_flags_ID =9481) +BEGIN + INSERT INTO [dba].[DBA_trace_flags](DBA_trace_flags_ID,DTF_name,DTF_lowerstVersion,DTF_highestVersion,DTF_active) + VALUES(9481,'Set the Query Optimizer cardinality estimation model to 70 (LEGACY)',12,12,1) +END + +END + +/* FIN CONFIGURATIONS DES TRACEFLAGS --------------------------------------------------------------------------------*/ + + + + +/* CREATION DE LA PROCEDURE STOCKEE */ + +IF EXISTS (SELECT * FROM sys.objects WHERE object_id = OBJECT_ID(N'[dba].[DBA_Set_All_TraceFlags]') AND type in (N'P', N'PC')) +DROP PROCEDURE [dba].[DBA_Set_All_TraceFlags] +GO + +SET ANSI_NULLS ON +GO + +SET QUOTED_IDENTIFIER ON +GO + +CREATE PROCEDURE [dba].[DBA_Set_All_TraceFlags] +AS +/*============================================================================= + + Explication du traitement realise par la SP + ------------------------------------------- + La SP va rechercher la configuration des traceflags par rapport a la version actuelle du moteur SQL et configure le necessaire. + + Contexte d'utilisation + ---------------------- + Appelé depuis le job _94010 - Set Traceflags + + Parametres + ---------- + + Creation : 16.03.21 / SPE + + Modifications : + +=============================================================================*/ + +SET NOCOUNT ON; + +/*------------------- Declaration des variables --------------------*/ + +DECLARE @currentSQLVersion SMALLINT, + @lowestSQLVersion SMALLINT, + @highestSQLVersion SMALLINT, + @traceFlagNumber INT, + @sqlstmt VARCHAR(MAX) + + +/*------------ Affectation des parametres aux variables ------------*/ + +SET @currentSQLVersion = SUBSTRING(CAST(SERVERPROPERTY('ProductVersion') AS NVARCHAR(128)), 1, CHARINDEX('.', CAST(SERVERPROPERTY('ProductVersion') AS NVARCHAR(128))) - 1 ) + + +/*-------------------------- Traitement ---------------------------*/ + +BEGIN TRY + + DECLARE c_traceflags CURSOR LOCAL FORWARD_ONLY STATIC FOR + SELECT DBA_trace_flags_ID,DTF_lowerstVersion,DTF_highestVersion + FROM [dba].[DBA_trace_flags] + WHERE DTF_active = 1 + ; + OPEN c_traceflags + ; + FETCH NEXT FROM c_traceflags + INTO @traceFlagNumber,@lowestSQLVersion,@highestSQLVersion + ; + WHILE @@fetch_status = 0 + BEGIN + + IF ((SERVERPROPERTY('EngineEdition') = 8) and (@traceFlagNumber IN (460,2301,2389,2390,2453,2467,7471,8207,9389,10316,11024 ))) OR (SERVERPROPERTY('EngineEdition') <> 8) + BEGIN + + IF @currentSQLVersion >= @lowestSQLVersion + BEGIN + IF @currentSQLVersion <= isnull(@highestSQLVersion,9999) + BEGIN + SET @sqlstmt = 'DBCC TRACEON (' + convert(VARCHAR,@traceFlagNumber) + ', -1) WITH NO_INFOMSGS;' + EXEC (@sqlstmt) + END + END + + END + + FETCH NEXT FROM c_traceflags + INTO @traceFlagNumber,@lowestSQLVersion,@highestSQLVersion + ; + END + ; + CLOSE c_traceflags + ; + DEALLOCATE c_traceflags + + + +/*---------------------- Traitement des erreurs ----------------------*/ +END TRY +BEGIN CATCH + + /* Traitement des erreurs (avec RaiseError) */ + EXEC dbo.get_Error_Info @in_RaiseError = 1 + +END CATCH +GO + + + + +/* CREATION DU JOB SQL */ + +USE [msdb] +GO + +/****************************************************************/ +/********** SUPPRESSION TEMPORAIRE DES ANCIENS JOBS ************/ +/****************************************************************/ + +IF EXISTS (SELECT job_id FROM msdb.dbo.sysjobs_view WHERE name = N'_90210 - Set Traceflag 1117') +EXEC msdb.dbo.sp_delete_job @job_name=N'_90210 - Set Traceflag 1117', @delete_unused_schedule=1 +GO + +IF EXISTS (SELECT job_id FROM msdb.dbo.sysjobs_view WHERE name = N'_94010 - Set Traceflag 1117') +EXEC msdb.dbo.sp_delete_job @job_name=N'_94010 - Set Traceflag 1117', @delete_unused_schedule=1 +GO + +IF EXISTS (SELECT job_id FROM msdb.dbo.sysjobs_view WHERE name = N'_94010 - Set Traceflag 1117 and 3226') +EXEC msdb.dbo.sp_delete_job @job_name=N'_94010 - Set Traceflag 1117 and 3226', @delete_unused_schedule=1 +GO + +/* Creation des categories manquantes si besoin*/ +IF NOT EXISTS (SELECT name FROM msdb.dbo.syscategories WHERE name=N'DBA-Configuration' AND category_class=1) +BEGIN + EXEC msdb.dbo.sp_add_category @class=N'JOB', @type=N'LOCAL', @name=N'DBA-Configuration' +END + +/*============================================================================= + + Job utilise avec la table DBA_trace_flags pour les configurations sur les traceflags selon la version SQL + + Création : 16.03.2021 / SPE + + Modifications : + +=============================================================================*/ +/* Drop existing standard schedule for job */ +declare @schedule_id int +declare c_schedules cursor local forward_only static for + select ss.schedule_id + from msdb.dbo.sysjobschedules sjs +INNER JOIN msdb.dbo.sysschedules ss + ON sjs.schedule_id = ss.schedule_id + AND ss.name NOT LIKE '%#SPEC#' +INNER JOIN msdb.dbo.sysjobs sj + ON sjs.job_id = sj.job_id + WHERE sj.name = N'_94010 - Set Traceflags' + +open c_schedules + +FETCH NEXT FROM c_schedules into @schedule_id +while @@fetch_status = 0 +begin + IF ((select COUNT(*) from msdb.dbo.sysjobschedules where schedule_id=@schedule_id) = 1) + EXEC msdb.dbo.sp_delete_schedule @schedule_id=@schedule_id, @force_delete = 1 +FETCH NEXT FROM c_schedules into @schedule_id +end + +close c_schedules + +deallocate c_schedules + +IF EXISTS (SELECT job_id FROM msdb.dbo.sysjobs_view WHERE name = N'_94010 - Set Traceflags') +EXEC msdb.dbo.sp_delete_job @job_name = N'_94010 - Set Traceflags', @delete_unused_schedule=0 +GO + +/* Creation Job and Steps*/ +BEGIN TRANSACTION +DECLARE @ReturnCode INT +SELECT @ReturnCode = 0 + +IF NOT EXISTS (SELECT name FROM msdb.dbo.syscategories WHERE name=N'DBA-Configuration' AND category_class=1) +BEGIN +EXEC @ReturnCode = msdb.dbo.sp_add_category @class=N'JOB', @type=N'LOCAL', @name=N'DBA-Configuration' +IF (@@ERROR <> 0 OR @ReturnCode <> 0) GOTO QuitWithRollback + +END + +/* Add Job */ +DECLARE @jobId BINARY(16) +EXEC @ReturnCode = msdb.dbo.sp_add_job @job_name=N'_94010 - Set Traceflags', + @enabled=1, + @notify_level_eventlog=0, + @notify_level_email=0, + @notify_level_netsend=0, + @notify_level_page=0, + @delete_level=0, + @description=N'Use table DBA_trace_flags to set all SQL traceflags', + @category_name=N'DBA-Configuration', + @start_step_id=1, + @owner_login_name=N'sa', @job_id = @jobId OUTPUT +IF (@@ERROR <> 0 OR @ReturnCode <> 0) GOTO QuitWithRollback + +/* Add Step */ +EXEC @ReturnCode = msdb.dbo.sp_add_jobstep @job_id=@jobId, @step_name=N'Empty step', + @step_id=1, + @cmdexec_success_code=0, + @on_success_action=3, + @on_success_step_id=0, + @on_fail_action=3, + @on_fail_step_id=0, + @retry_attempts=0, + @retry_interval=0, + @os_run_priority=0, @subsystem=N'TSQL', + @command=N'/* Empty step */', + @database_name=N'master', + @output_file_name=NULL, + @flags=0, + @database_user_name=NULL, + @server=NULL, + @additional_parameters=NULL, + @proxy_id=NULL, + @proxy_name=NULL +IF (@@ERROR <> 0 OR @ReturnCode <> 0) GOTO QuitWithRollback +/* Add Step */ +EXEC @ReturnCode = msdb.dbo.sp_add_jobstep @job_id=@jobId, @step_name=N'Set ALL Traceflags', + @step_id=2, + @cmdexec_success_code=0, + @on_success_action=3, + @on_success_step_id=0, + @on_fail_action=4, + @on_fail_step_id=4, + @retry_attempts=0, + @retry_interval=1, + @os_run_priority=0, @subsystem=N'TSQL', + @command=N'EXEC [dba].[DBA_Set_All_TraceFlags]', + @database_name=N'HCITools', + @output_file_name=NULL, + @flags=0, + @database_user_name=NULL, + @server=NULL, + @additional_parameters=NULL, + @proxy_id=NULL, + @proxy_name=NULL +IF (@@ERROR <> 0 OR @ReturnCode <> 0) GOTO QuitWithRollback +/* Add Step */ +EXEC @ReturnCode = msdb.dbo.sp_add_jobstep @job_id=@jobId, @step_name=N'Empty step for success', + @step_id=3, + @cmdexec_success_code=0, + @on_success_action=1, + @on_success_step_id=0, + @on_fail_action=4, + @on_fail_step_id=4, + @retry_attempts=0, + @retry_interval=0, + @os_run_priority=0, @subsystem=N'TSQL', + @command=N'/* Empty step */ +exec Get_Job_Error_Info @in_JobName = ''_94010 - Set Traceflags'', @in_Recipients = ''DBA_operator''', + @database_name=N'HCITools', + @output_file_name=NULL, + @flags=0, + @database_user_name=NULL, + @server=NULL, + @additional_parameters=NULL, + @proxy_id=NULL, + @proxy_name=NULL +IF (@@ERROR <> 0 OR @ReturnCode <> 0) GOTO QuitWithRollback +/* Add Step */ +EXEC @ReturnCode = msdb.dbo.sp_add_jobstep @job_id=@jobId, @step_name=N'Send email KO', + @step_id=4, + @cmdexec_success_code=0, + @on_success_action=2, + @on_success_step_id=0, + @on_fail_action=2, + @on_fail_step_id=0, + @retry_attempts=0, + @retry_interval=0, + @os_run_priority=0, @subsystem=N'TSQL', + @command=N'exec Get_Job_Error_Info @in_JobName = ''_94010 - Set Traceflags'', @in_Recipients = ''DBA_operator''', + @database_name=N'HCITools', + @output_file_name=NULL, + @flags=0, + @database_user_name=NULL, + @server=NULL, + @additional_parameters=NULL, + @proxy_id=NULL, + @proxy_name=NULL +IF (@@ERROR <> 0 OR @ReturnCode <> 0) GOTO QuitWithRollback +EXEC @ReturnCode = msdb.dbo.sp_update_job @job_id = @jobId, @start_step_id = 1 +IF (@@ERROR <> 0 OR @ReturnCode <> 0) GOTO QuitWithRollback + +/* Add Standard Schedule */ +EXEC @ReturnCode = msdb.dbo.sp_add_jobschedule @job_id=@jobId, @name=N'_94010', + @enabled=1, + @freq_type=64, + @freq_interval=0, + @freq_subday_type=0, + @freq_subday_interval=0, + @freq_relative_interval=0, + @freq_recurrence_factor=0, + @active_start_date=20150714, + @active_end_date=99991231, + @active_start_time=0, + @active_end_time=235959 +IF (@@ERROR <> 0 OR @ReturnCode <> 0) GOTO QuitWithRollback + +/* Attach existing specific schedule for job */ +declare @enabled_schedule int, + @schedule_name nvarchar(50) +declare c_schedules cursor local forward_only static for +select enabled, name + from msdb.dbo.sysschedules + where name LIKE '_94010%' + and name LIKE '%#SPEC#' + +open c_schedules + +FETCH NEXT FROM c_schedules into @enabled_schedule, @schedule_name +while @@fetch_status = 0 +begin + EXEC @ReturnCode = msdb.dbo.sp_attach_schedule @job_id = @jobId, @schedule_name=@schedule_name + IF(@enabled_schedule = 1) + begin + SET @schedule_name = SUBSTRING(@schedule_name,0,LEN(@schedule_name)-5) + IF EXISTS (select name from msdb.dbo.sysschedules where name = @schedule_name) + EXEC @ReturnCode = msdb.dbo.sp_update_schedule @name=@schedule_name, @enabled=0 + end + IF (@@ERROR <> 0 OR @ReturnCode <> 0) GOTO QuitWithRollback +FETCH NEXT FROM c_schedules into @enabled_schedule, @schedule_name +end + +close c_schedules + +deallocate c_schedules + +EXEC @ReturnCode = msdb.dbo.sp_add_jobserver @job_id = @jobId, @server_name = N'(local)' +IF (@@ERROR <> 0 OR @ReturnCode <> 0) GOTO QuitWithRollback +COMMIT TRANSACTION +GOTO EndSave +QuitWithRollback: + IF (@@TRANCOUNT > 0) ROLLBACK TRANSACTION +EndSave: + +GO + + + +/* EXECUTION DU JOB POUR ACTIVER LES TRACEFLAGS */ + +EXEC dbo.sp_start_job @job_name = N'_94010 - Set Traceflags' +GO diff --git a/TPDT-268 - ACP in task sequence/dba_packages/DeployDatabaseIntegrityCheck.sql b/TPDT-268 - ACP in task sequence/dba_packages/DeployDatabaseIntegrityCheck.sql new file mode 100644 index 0000000..5ecdf28 --- /dev/null +++ b/TPDT-268 - ACP in task sequence/dba_packages/DeployDatabaseIntegrityCheck.sql @@ -0,0 +1,280 @@ +/*============================================================================= + + Prérequis + --------- + + + Explication du traitement realise par la SP + ------------------------------------------- + 1. Creation de la procédure stockée [HCITools].[dbo].[DatabaseIntegrityCheck] + 2. Creation de la catégorie de job de l'agent SQL "DBA-Maintenance" + 3. Creation du job de l'agent SQL "W93050 - Check integrity of several databases" + + Creation : 15.02.2016 / LPE + Dossier : Déploiement de la solution de vérification de l'intégrité des bases de données SQL + + Modifications : 22.03.2016 / FLA : Changement du nom du job et ajout de schedule + 12.05.2016 / FLA : Ajout du paramètre @LogToTable pour loguer dans la table CommandLog + 21.07.2016 / FLA : ajout du path dynamique, standardisation du nom du job et du schedule + 09.09.2016 / FLA : Ajout de Get_Job_Error_Info dans empty step et Send Mail KO + 09.03.2018 / RTC : Update Ola hallengren solution with 16th octobre 2016 for sql 2016 compatibility. + 22.03.2018 / RTC : Move sp DatabaseIntegrityCheck in a HCITools sp. + 15.08.2019 / SPE : #TFS54630# - Update Ola hallengren solution with 14th june 2019 version and change SQL maintenance jobs. + 06.11.2019 / SPE : #TFS54630# - Remove Daily - Check integrity of several. + 17.11.2020 / SPE : #TFS62147# - Modify index optimize and DBCC check db weekly to optimize global performances + 17.03.2022 / FLA : Change DBA mail + 01.09.2023 / SPE : OCTPDBA-718: Remove txt file output in jobs to be compliant with SQL Managed Instances +=============================================================================*/ + +/********************************************************************************/ +/********* 2. CREATE SQL AGENT JOB CATEGORY "DBA-Maintenance" *********/ +/********************************************************************************/ +USE [msdb] +GO + +IF NOT EXISTS (SELECT name FROM msdb.dbo.syscategories WHERE name=N'DBA-Maintenance' AND category_class=1) +BEGIN + + EXEC msdb.dbo.sp_add_category @class=N'JOB', @type=N'LOCAL', @name=N'DBA-Maintenance' + +END + + + + +/********************************************************************************************/ +/********* 3. CREATE SQL AGENT JOB "W93050 - Check integrity of several databases" *********/ +/********************************************************************************************/ + +USE [msdb] +; + +/* Drop existing standard schedule for job */ +declare @schedule_id int +declare c_schedules cursor local forward_only static for + select ss.schedule_id + from msdb.dbo.sysjobschedules sjs +INNER JOIN msdb.dbo.sysschedules ss + ON sjs.schedule_id = ss.schedule_id + AND ss.name NOT LIKE '%#SPEC#' +INNER JOIN msdb.dbo.sysjobs sj + ON sjs.job_id = sj.job_id + WHERE sj.name = N'W93050 - Check integrity of several databases' + +open c_schedules + +FETCH NEXT FROM c_schedules into @schedule_id +while @@fetch_status = 0 +begin + IF ((select COUNT(*) from msdb.dbo.sysjobschedules where schedule_id=@schedule_id) = 1) + EXEC msdb.dbo.sp_delete_schedule @schedule_id=@schedule_id, @force_delete = 1 +FETCH NEXT FROM c_schedules into @schedule_id +end + +close c_schedules + +deallocate c_schedules + +IF EXISTS (SELECT job_id FROM msdb.dbo.sysjobs_view WHERE name = N'W93050 - Check integrity of several databases') +EXEC msdb.dbo.sp_delete_job @job_name = N'W93050 - Check integrity of several databases', @delete_unused_schedule=0 + + +/* Creation Job and Steps*/ +BEGIN TRANSACTION +DECLARE @ReturnCode INT +SELECT @ReturnCode = 0 + +IF NOT EXISTS (SELECT name FROM msdb.dbo.syscategories WHERE name=N'DBA-Maintenance' AND category_class=1) +BEGIN +EXEC @ReturnCode = msdb.dbo.sp_add_category @class=N'JOB', @type=N'LOCAL', @name=N'DBA-Maintenance' +IF (@@ERROR <> 0 OR @ReturnCode <> 0) GOTO QuitWithRollback + +END + +/* Add Job */ +DECLARE @jobId BINARY(16) +EXEC @ReturnCode = msdb.dbo.sp_add_job @job_name=N'W93050 - Check integrity of several databases', + @enabled=1, + @notify_level_eventlog=2, + @notify_level_email=0, + @notify_level_netsend=0, + @notify_level_page=0, + @delete_level=0, + @description=N'04.08.2011 - PDE - Created +15.02.2016 - LPE - Refonte du job en utilisant la solution de Ola Hallengren (https://ola.hallengren.com/sql-server-integrity-check.html) +22.03.2016 - FLA - Sortie du bouquet weekly maitenance et ajout de schedule +15.08.2019 - SPE - Modification du job pour demarrer aleatoirement le dimanche si la pharmacie n est pas ouverte +17.11.2020 - SPE : TFS62147 - Modify index optimize and DBCC check db weekly to optimize global performances', + @category_name=N'DBA-Maintenance', + @start_step_id=1, + @owner_login_name=N'sa', @job_id = @jobId OUTPUT +IF (@@ERROR <> 0 OR @ReturnCode <> 0) GOTO QuitWithRollback + +/* Add Step */ +EXEC @ReturnCode = msdb.dbo.sp_add_jobstep @job_id=@jobId, @step_name=N'Empty step', + @step_id=1, + @cmdexec_success_code=0, + @on_success_action=3, + @on_success_step_id=0, + @on_fail_action=3, + @on_fail_step_id=0, + @retry_attempts=0, + @retry_interval=0, + @os_run_priority=0, @subsystem=N'TSQL', + @command=N'/* Empty step */', + @database_name=N'master', + @output_file_name=NULL, + @flags=0, + @database_user_name=NULL, + @server=NULL, + @additional_parameters=NULL, + @proxy_id=NULL, + @proxy_name=NULL +IF (@@ERROR <> 0 OR @ReturnCode <> 0) GOTO QuitWithRollback +/* Add Step */ +EXEC @ReturnCode = msdb.dbo.sp_add_jobstep @job_id=@jobId, @step_name=N'Wait for a random delay of 0..1150 minutes', + @step_id=2, + @cmdexec_success_code=0, + @on_success_action=3, + @on_success_step_id=0, + @on_fail_action=4, + @on_fail_step_id=5, + @retry_attempts=0, + @retry_interval=0, + @os_run_priority=0, @subsystem=N'TSQL', + @command=N'EXEC [dbo].[Wait_Random_Time_Sunday] @in_Minutes = 1150', + @database_name=N'HCITools', + @output_file_name=NULL, + @flags=0, + @database_user_name=NULL, + @server=NULL, + @additional_parameters=NULL, + @proxy_id=NULL, + @proxy_name=NULL +IF (@@ERROR <> 0 OR @ReturnCode <> 0) GOTO QuitWithRollback +/* Add Step */ +EXEC @ReturnCode = msdb.dbo.sp_add_jobstep @job_id=@jobId, @step_name=N'DatabaseIntegrityCheck - ALL_DATABASES', + @step_id=3, + @cmdexec_success_code=0, + @on_success_action=3, + @on_success_step_id=0, + @on_fail_action=4, + @on_fail_step_id=5, + @retry_attempts=0, + @retry_interval=0, + @os_run_priority=0, @subsystem=N'TSQL', + @command=N'EXECUTE [dbo].[DatabaseIntegrityCheck] +@Databases = ''ALL_DATABASES,-tempdb,-symbiose,-ArizonaDW,-%test%,-%dbi%,-%snapshot%,-%capucine%'', +@LogToTable=''Y'', +@PhysicalOnly=''N'', +@timelimit=14400;', + @database_name=N'HCITools', + @output_file_name=NULL, + @flags=0, + @database_user_name=NULL, + @server=NULL, + @additional_parameters=NULL, + @proxy_id=NULL, + @proxy_name=NULL +IF (@@ERROR <> 0 OR @ReturnCode <> 0) GOTO QuitWithRollback +/* Add Step */ +EXEC @ReturnCode = msdb.dbo.sp_add_jobstep @job_id=@jobId, @step_name=N'Empty step for success', + @step_id=4, + @cmdexec_success_code=0, + @on_success_action=1, + @on_success_step_id=0, + @on_fail_action=4, + @on_fail_step_id=5, + @retry_attempts=0, + @retry_interval=0, + @os_run_priority=0, @subsystem=N'TSQL', + @command=N'/* Empty step */ +exec Get_Job_Error_Info @in_JobName = ''W93050 - Check integrity of several databases'', @in_Recipients = ''DBA_operator''', + @database_name=N'HCITools', + @output_file_name=NULL, + @flags=0, + @database_user_name=NULL, + @server=NULL, + @additional_parameters=NULL, + @proxy_id=NULL, + @proxy_name=NULL +IF (@@ERROR <> 0 OR @ReturnCode <> 0) GOTO QuitWithRollback +/* Add Step */ +EXEC @ReturnCode = msdb.dbo.sp_add_jobstep @job_id=@jobId, @step_name=N'Send email KO', + @step_id=5, + @cmdexec_success_code=0, + @on_success_action=2, + @on_success_step_id=0, + @on_fail_action=2, + @on_fail_step_id=0, + @retry_attempts=0, + @retry_interval=0, + @os_run_priority=0, @subsystem=N'TSQL', + @command=N'exec Get_Job_Error_Info @in_JobName = ''W93050 - Check integrity of several databases'', @in_Recipients = ''DBA_operator''', + @database_name=N'HCITools', + @output_file_name=NULL, + @flags=0, + @database_user_name=NULL, + @server=NULL, + @additional_parameters=NULL, + @proxy_id=NULL, + @proxy_name=NULL +IF (@@ERROR <> 0 OR @ReturnCode <> 0) GOTO QuitWithRollback +EXEC @ReturnCode = msdb.dbo.sp_update_job @job_id = @jobId, @start_step_id = 1 +IF (@@ERROR <> 0 OR @ReturnCode <> 0) GOTO QuitWithRollback + +/* Add Standard Schedule */ +EXEC @ReturnCode = msdb.dbo.sp_add_jobschedule @job_id=@jobId, @name=N'W93050-W', + @enabled=1, + @freq_type=8, + @freq_interval=1, + @freq_subday_type=1, + @freq_subday_interval=0, + @freq_relative_interval=0, + @freq_recurrence_factor=1, + @active_start_date=20160322, + @active_end_date=99991231, + @active_start_time=42000, + @active_end_time=235959 +IF (@@ERROR <> 0 OR @ReturnCode <> 0) GOTO QuitWithRollback + +/* Attach existing specific schedule for job */ +declare @enabled_schedule int, + @schedule_name nvarchar(50) +declare c_schedules cursor local forward_only static for +select enabled, name + from msdb.dbo.sysschedules + where name LIKE 'W93050%' + and name LIKE '%#SPEC#' + +open c_schedules + +FETCH NEXT FROM c_schedules into @enabled_schedule, @schedule_name +while @@fetch_status = 0 +begin + EXEC @ReturnCode = msdb.dbo.sp_attach_schedule @job_id = @jobId, @schedule_name=@schedule_name + IF(@enabled_schedule = 1) + begin + SET @schedule_name = SUBSTRING(@schedule_name,0,LEN(@schedule_name)-5) + IF EXISTS (select name from msdb.dbo.sysschedules where name = @schedule_name) + EXEC @ReturnCode = msdb.dbo.sp_update_schedule @name=@schedule_name, @enabled=0 + end + IF (@@ERROR <> 0 OR @ReturnCode <> 0) GOTO QuitWithRollback +FETCH NEXT FROM c_schedules into @enabled_schedule, @schedule_name +end + +close c_schedules + +deallocate c_schedules + +EXEC @ReturnCode = msdb.dbo.sp_add_jobserver @job_id = @jobId, @server_name = N'(local)' +IF (@@ERROR <> 0 OR @ReturnCode <> 0) GOTO QuitWithRollback +COMMIT TRANSACTION +GOTO EndSave +QuitWithRollback: + IF (@@TRANCOUNT > 0) ROLLBACK TRANSACTION +EndSave: + +GO + + diff --git a/TPDT-268 - ACP in task sequence/dba_packages/DeployEnvironnementIdentification.sql b/TPDT-268 - ACP in task sequence/dba_packages/DeployEnvironnementIdentification.sql new file mode 100644 index 0000000..6f1e1d6 --- /dev/null +++ b/TPDT-268 - ACP in task sequence/dba_packages/DeployEnvironnementIdentification.sql @@ -0,0 +1,448 @@ +/*================================================================= + + Explanation on the script behaviour. + ----------------------------------------------- + 1. Creates the configuration schema cfg + 2. Creates table cfg.InstanceContext + 3. Creates the trigger for date auto update + 4. Add constraints for enumerations + 5. Creates table cfg.Identity + 7. Create trigger for date auto update + 8. Create trigger to garanty one record in identity table + 9. Add constraints for enumerations + 10. Add some samples script for data initialization of context table + 11. Add script to initialize identity table o every pharmacy. + + + Creation : 22.02.2017 / RTC + + Modifications : 29.03.2017 / RTC Few chanages after feedback meeting. + : 12.05.2017 / RTC Update extended properties + : 31.05.2017 / RTC Grant select authorization on the tables + : 04.09.2017 / RTC Add new Context Type for Acceptance. + : 01.11.2018 / SPE Add identification for RUEGG + +======================================================================*/ +USE [master] +GO +/*****************************************************************/ +/********* 1. CREATE SCHEMA [cfg] ********************************/ +/*****************************************************************/ +DECLARE @cmd varchar(1000) +IF NOT EXISTS (SELECT * FROM sys.schemas WHERE name = N'cfg') + BEGIN + SET @cmd='CREATE SCHEMA [cfg] AUTHORIZATION dbo'; + EXEC (@cmd); + PRINT 'SCHEMA [cfg] created!' +END; + +/*****************************************************************/ +/********* 2. CREATE TABLE [master].[cfg].[InstanceContext] *********/ +/*****************************************************************/ + +IF NOT EXISTS (SELECT * FROM sys.objects WHERE object_id = OBJECT_ID(N'[master].[cfg].[InstanceContext]') AND type in (N'U')) +BEGIN + + CREATE TABLE [master].[cfg].[InstanceContext] + ( + InstanceContextGuid uniqueidentifier NOT NULL, + [Type] CHAR(4), + [Business] VARCHAR(6), + [Behavior] NVARCHAR(128), + [Remark] VARCHAR(256), + [UpdateDate] DATETIME NOT NULL DEFAULT getdate(), + CONSTRAINT [PK_Context] PRIMARY KEY NONCLUSTERED + ( + [InstanceContextGuid] ASC + )WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY] + ) + PRINT 'Table cfg.Context created !' +END +GO + +/* Create trigger to update the date */ +IF EXISTS (SELECT * FROM sys.triggers WHERE object_id = OBJECT_ID(N'[cfg].[tU_InstanceContext]')) + DROP TRIGGER [cfg].[tU_InstanceContext] +GO + +CREATE TRIGGER [cfg].[tU_InstanceContext] on master.[cfg].[InstanceContext] FOR UPDATE +As +BEGIN + UPDATE t + SET t.UpdateDate = getdate() + FROM master.[cfg].[InstanceContext] t + inner join inserted I + ON t.InstanceContextGuid = I.InstanceContextGuid +End +GO + +PRINT 'Trigger [tU_InstanceContext] created!' +GO + +/* Add check constraint for HCIC_type*/ +IF EXISTS (SELECT * FROM sys.check_constraints WHERE object_id = OBJECT_ID(N'[cfg].[CK_Type]') AND parent_object_id = OBJECT_ID(N'[cfg].[InstanceContext]')) +BEGIN + PRINT 'Drop constraint CK_Type on table [InstanceContext] ' + ALTER TABLE [cfg].[InstanceContext] DROP CONSTRAINT [CK_Type] +END +GO + +PRINT 'Create constraint [CK_Type] on table [InstanceContext]' +ALTER TABLE [cfg].[InstanceContext] WITH CHECK ADD CONSTRAINT [CK_Type] CHECK ([Type] in ('DEVE', 'DEMO', 'FORM', 'VALI', 'ACCE', 'REFE', 'PREP','PROD', 'CLOS')) +GO + +PRINT 'Activate contraint [CK_Type] on table [InstanceContext]' +ALTER TABLE [cfg].[InstanceContext] CHECK CONSTRAINT [CK_Type] +GO + +/* Add check constraint for business*/ +IF EXISTS (SELECT * FROM sys.check_constraints WHERE object_id = OBJECT_ID(N'[cfg].[CK_Business]') AND parent_object_id = OBJECT_ID(N'[cfg].[InstanceContext]')) +BEGIN + PRINT 'Drop constraint CK_Business on table [InstanceContext] ' + ALTER TABLE [cfg].[InstanceContext] DROP CONSTRAINT [CK_Business] +END +GO + +PRINT 'Create constraint [CK_Business] on table [InstanceContext]' +ALTER TABLE [cfg].[InstanceContext] WITH CHECK ADD CONSTRAINT [CK_Business] +CHECK ([Business] in ('TPCENT', 'TPPHAR', 'TPDWH', 'TPREP','TSCAN', 'PINDEX', 'TPPRI', 'TFACT')) +GO + +PRINT 'Activate contraint [CK_Business] on table [InstanceContext]' +ALTER TABLE [cfg].[InstanceContext] CHECK CONSTRAINT [CK_Business] +GO + +/* Add check constraint behaviour*/ +IF EXISTS (SELECT * FROM sys.check_constraints WHERE object_id = OBJECT_ID(N'[cfg].[CK_Behavior]') AND parent_object_id = OBJECT_ID(N'[cfg].[InstanceContext]')) +BEGIN + PRINT 'Drop constraint CK_Behavior on table [InstanceContext] ' + ALTER TABLE [cfg].[InstanceContext] DROP CONSTRAINT [CK_Behavior] +END +GO + +PRINT 'Create constraint [CK_Behavior] on table [InstanceContext] ' +ALTER TABLE [cfg].[InstanceContext] WITH CHECK ADD CONSTRAINT [CK_Behavior] +CHECK ([Behavior] in ('Enable', 'Disable', 'Maintain', 'Read', 'Other')) +GO + +PRINT 'Activate constraint [CK_Behavior] on table [InstanceContext]' +ALTER TABLE [cfg].[InstanceContext] CHECK CONSTRAINT [CK_Behavior] +GO + +/* Add unique index [UIXInstanceContext] on [InstanceConstext] */ +IF EXISTS (SELECT 1 FROM sys.indexes WHERE object_id = OBJECT_ID(N'[cfg].[InstanceContext]') AND name = N'UIXInstanceContext') +BEGIN + PRINT 'Suppression de l''index unique [UIXInstanceContext] sur la table [InstanceContext]' + DROP INDEX [UIXInstanceContext] ON [cfg].[InstanceContext] WITH ( ONLINE = OFF ) +END +GO + +PRINT 'Creation du nouvel index unique [UIXInstanceContext] sur la table [InstanceContext]' +CREATE UNIQUE NONCLUSTERED INDEX [UIXInstanceContext] ON [cfg].[InstanceContext] +( + [Type] ASC, + [Business] 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 = ON, FILLFACTOR = 90) ON [PRIMARY] +GO + + +/*****************************************************************/ +/********* 3. CREATE TABLE [master].[cfg].[Identity] *********/ +/*****************************************************************/ +IF NOT EXISTS (SELECT * FROM sys.objects WHERE object_id = OBJECT_ID(N'[master].[cfg].[Identity]') AND type in (N'U')) +BEGIN + CREATE TABLE [master].[cfg].[Identity] + ( + [Format] CHAR(4), + [DnsAlias] SYSNAME, + [Remark] VARCHAR(256), + [UpdateDate] DATETIME NOT NULL DEFAULT getdate(), + [Customer] VARCHAR(4) + ) + PRINT 'Table Identity created!' +END +GO + +/* Add Customer if not exist */ +IF NOT EXISTS (SELECT 1 FROM INFORMATION_SCHEMA.COLUMNS WHERE TABLE_NAME = 'Identity' AND COLUMN_NAME = 'Customer') +BEGIN + ALTER TABLE [cfg].[Identity] ADD [Customer] VARCHAR(4) NULL +END +GO + +/* Add check constraint HCII_customer*/ +IF EXISTS (SELECT * FROM sys.check_constraints WHERE object_id = OBJECT_ID(N'[cfg].[CK_Customer]') AND parent_object_id = OBJECT_ID(N'[cfg].[Identity]')) +BEGIN + PRINT 'Drop constraint CK_Customer on table [Identity] ' + ALTER TABLE [cfg].[Identity] DROP CONSTRAINT [CK_Customer] +END +GO + +/* Modify Customer type */ +IF EXISTS (SELECT 1 FROM INFORMATION_SCHEMA.COLUMNS WHERE TABLE_NAME = 'Identity' AND COLUMN_NAME = 'Customer' and DATA_TYPE='char') +BEGIN + ALTER TABLE [cfg].[Identity] ALTER COLUMN [Customer] VARCHAR(4) NULL +END +GO + +/* Create trigger on insert to avoid having more than one record*/ +IF EXISTS (SELECT * FROM sys.triggers WHERE object_id = OBJECT_ID(N'[cfg].[tI_Identity]')) + DROP TRIGGER [cfg].[tI_Identity] +GO + +PRINT 'Create Trigger [tI_Identity]' +GO + +CREATE TRIGGER [cfg].[tI_Identity] on master.[cfg].[Identity] INSTEAD OF INSERT +As +BEGIN + IF EXISTS (SELECT * FROM MASTER.[cfg].[Identity]) + BEGIN + ROLLBACK TRANSACTION + RAISERROR ('Table can only contain one record, please update the existing record!',10,1) + END + ELSE + INSERT INTO master.[cfg].[Identity] + SELECT [Format], [DnsAlias], [Remark], [UpdateDate], [Customer] + FROM inserted +End +GO + +/* Create trigger to update the date */ +IF EXISTS (SELECT * FROM sys.triggers WHERE object_id = OBJECT_ID(N'[cfg].[tU_Identity]')) +DROP TRIGGER [cfg].[tU_Identity] +GO + +CREATE TRIGGER [cfg].[tU_Identity] on master.[cfg].[Identity] FOR UPDATE +AS +BEGIN + UPDATE t + SET t.UpdateDate = getdate() + FROM master.[cfg].[Identity] t + inner join inserted I + On t.DnsAlias = I.DnsAlias +END +GO +PRINT 'Trigger [tu_Identity] created!' + +/* Add check constraint HCII_format*/ +IF EXISTS (SELECT * FROM sys.check_constraints WHERE object_id = OBJECT_ID(N'[cfg].[CK_Format]') AND parent_object_id = OBJECT_ID(N'[cfg].[Identity]')) +BEGIN + PRINT 'Drop constraint CK_Format on table [Identity] ' + ALTER TABLE [cfg].[Identity] DROP CONSTRAINT [CK_Format] +END +GO + +PRINT 'Create constraint [CK_Format] on table [Identity] ' +ALTER TABLE [cfg].[Identity] WITH CHECK ADD CONSTRAINT [CK_Format] CHECK ([Format] in ('CVI', 'SUN', 'AMA', 'GCM', 'HCI')) +GO + +PRINT 'Activate constraint [CK_Format] on table [Identity]' +ALTER TABLE [cfg].[Identity] CHECK CONSTRAINT [CK_Format] +GO + +PRINT 'Create constraint [CK_Customer] on table [Identity] ' +ALTER TABLE [cfg].[Identity] WITH CHECK ADD CONSTRAINT [CK_Customer] CHECK ([Customer] in ('SUN', 'AMA','CVI','HCI')) +GO + +PRINT 'Activate constraint [CK_Customer] on table [Identity]' +ALTER TABLE [cfg].[Identity] CHECK CONSTRAINT [CK_Customer] +GO + +/* Add extented properties */ +IF EXISTS (SELECT name FROM fn_listextendedproperty (N'MS_Description','SCHEMA',N'cfg','TABLE',N'IDentity','COLUMN',N'Format') ) +EXEC sys.sp_dropextendedproperty @name=N'MS_Description' , @level0type=N'SCHEMA',@level0name=N'cfg', @level1type=N'TABLE',@level1name=N'Identity' +, @level2type=N'COLUMN',@level2name=N'Format' + +GO + +EXEC sys.sp_addextendedproperty @name=N'MS_Description', @value=N'Specifies the subsidiary or group of the pharmacy : CVI, SUN, AMA, GCM or HCI' +, @level0type=N'SCHEMA',@level0name=N'cfg', @level1type=N'TABLE',@level1name=N'Identity', @level2type=N'COLUMN',@level2name=N'Format' +GO + +IF EXISTS (SELECT name FROM fn_listextendedproperty (N'MS_Description','SCHEMA',N'cfg','TABLE',N'IDentity','COLUMN',N'DnsAlias')) +EXEC sys.sp_dropextendedproperty @name=N'MS_Description' , @level0type=N'SCHEMA',@level0name=N'cfg', @level1type=N'TABLE',@level1name=N'Identity' +, @level2type=N'COLUMN',@level2name=N'DnsAlias' + +GO +EXEC sys.sp_addextendedproperty @name=N'MS_Description', @value=N'Specifies the DNS alias of the machine hosting the instance.' +, @level0type=N'SCHEMA',@level0name=N'cfg', @level1type=N'TABLE',@level1name=N'Identity', @level2type=N'COLUMN',@level2name=N'DnsAlias' +GO + +IF EXISTS (SELECT name FROM fn_listextendedproperty (N'MS_Description','SCHEMA',N'cfg','TABLE',N'InstanceContext','COLUMN',N'Business')) +EXEC sys.sp_dropextendedproperty @name=N'MS_Description' , @level0type=N'SCHEMA',@level0name=N'cfg', @level1type=N'TABLE' +,@level1name=N'InstanceContext', @level2type=N'COLUMN',@level2name=N'Business' + +GO +EXEC sys.sp_addextendedproperty @name=N'MS_Description', @value=N'Specifies the type of the environnement : DEVE ,DEMO, FORM, VALI, ACCE, REFE ,PREP, PROD or CLOS.' +, @level0type=N'SCHEMA',@level0name=N'cfg', @level1type=N'TABLE',@level1name=N'InstanceContext', @level2type=N'COLUMN',@level2name=N'Business' +GO + +IF EXISTS (SELECT name FROM fn_listextendedproperty (N'MS_Description','SCHEMA',N'cfg','TABLE',N'InstanceContext','COLUMN',N'Type')) +EXEC sys.sp_dropextendedproperty @name=N'MS_Description' , @level0type=N'SCHEMA',@level0name=N'cfg', @level1type=N'TABLE' +,@level1name=N'InstanceContext', @level2type=N'COLUMN',@level2name=N'Type' + +GO +EXEC sys.sp_addextendedproperty @name=N'MS_Description', @value=N'Specifies the type of applications : TPCENT , TPPHAR, TPREP, TSCAN ,PINDEX, TPPRI or TFACT.' +, @level0type=N'SCHEMA',@level0name=N'cfg', @level1type=N'TABLE',@level1name=N'InstanceContext', @level2type=N'COLUMN',@level2name=N'Type' +GO + +IF EXISTS (SELECT name FROM fn_listextendedproperty (N'MS_Description','SCHEMA',N'cfg','TABLE',N'InstanceContext','COLUMN',N'Behavior')) +EXEC sys.sp_dropextendedproperty @name=N'MS_Description' , @level0type=N'SCHEMA',@level0name=N'cfg', @level1type=N'TABLE' +,@level1name=N'InstanceContext', @level2type=N'COLUMN',@level2name=N'Behavior' + +GO +EXEC sys.sp_addextendedproperty @name=N'MS_Description', @value=N'Specifies the behaviour Enable, Disable, Maintain, Read, Other' +, @level0type=N'SCHEMA',@level0name=N'cfg', @level1type=N'TABLE',@level1name=N'InstanceContext', @level2type=N'COLUMN',@level2name=N'Behavior' +GO + +/****************************************************************/ +/******* AUTHORISATIONS ON TABLES cfg *********/ +/****************************************************************/ +USE [master] +GO +GRANT SELECT ON [master].[cfg].[Identity] TO [public] AS [dbo] +GO +GRANT SELECT ON [master].[cfg].[InstanceContext] TO [public] AS [dbo] +GO + +/* Sample data insertion + +/* Validation pharmacy*/ +INSERT INTO [master].[cfg].[InstanceContext] + (InstanceContextGuid + ,[Type] + ,[Business] + ,[Behavior] + ,[Remark] + ,[UpdateDate]) + VALUES + (Newid() + ,'VALI' + ,'TPPHAR' + ,'Enable' + ,'Table initialization DBA' + ,Default) +/* Reference */ +INSERT INTO [master].[cfg].[InstanceContext] + (InstanceContextGuid + ,[Type] + ,[Business] + ,[Behavior] + ,[Remark] + ,[UpdateDate]) + VALUES + (Newid() + ,'VALI' + ,'TPREP' + ,'Enable' + ,'Table initialization DBA' + ,Default) + +/* Validation datawarehouse*/ +INSERT INTO [master].[cfg].[InstanceContext] + (InstanceContextGuid + ,[Type] + ,[Business] + ,[Behavior] + ,[Remark] + ,[UpdateDate]) + VALUES + (Newid() + ,'VALI' + ,'TPDWH' + ,'Enable' + ,'Table initialization DBA' + ,Default) + +/* Production AMA, sun, CVI */ +INSERT INTO [master].[cfg].[InstanceContext] + (InstanceContextGuid + ,[Type] + ,[Business] + ,[Behavior] + ,[Remark] + ,[UpdateDate]) + VALUES + (Newid() + ,'PROD' + ,'TPPHAR' + ,'Enable' + ,'Table initialization DBA' + ,Default) + + + /* Identity table init for all except ITOP set up env */ + DECLARE @Organizational_Unit as INT, + @ouCode AS char(3), + @alias as varchar(100), + @subCode as char(5), + @ouSubsidiary as int + +EXEC Arizona.dbo.sp_bmc_Bmc_Applic_Default + @in_job_type = 3, + @in_param_int_1 = null, + @in_param_int_2 = null, + @in_param_varchar_1 = 'cvCurrentOrganizationalUnit', + @out_default_value = @Organizational_Unit output, + @out_param_int_1 = null + +SELECT TOP 1 @ouCode = OU_code, @ouSubsidiary = ou_subsidiary + FROM Arizona.dbo.Organizational_Unit + WHERE Organizational_Unit_Id = @Organizational_Unit; + + SELECT TOP 1 @subCode = CASE + WHEN @ouSubsidiary in (1,111) THEN 'SUN' + WHEN @ouSubsidiary = 102 THEN 'AMA' + WHEN @ouSubsidiary = 124 THEN 'CVI'' + END + +SELECT TOP 1 @alias = SS_server_name + FROM Arizona.dbo.System_site + WHERE CHARINDEX(@ouCode,SS_server_name) > 0 + + select @ouSubsidiary [SubId], @subCode [SubCode], @alias [alias] + +INSERT INTO [master].[cfg].[Identity] + ([Format] + ,[DnsAlias] + ,[Remark] + ,[UpdateDate]) + VALUES + (@subCode + ,isnull(@alias, 'No DNS found') + ,'Record initialization DBA' + ,Default) + +/* Identity table init for ITOP set up env */ +INSERT INTO [master].[cfg].[Identity] + ([Format] + ,[DnsAlias] + ,[Remark] + ,[UpdateDate]) + VALUES + ('HCI' + ,'DNS to update' + ,'Initialization ITOP' + ,Default) + +/* New Rollout */ +INSERT INTO [master].[cfg].[InstanceContext] + (InstanceContextGuid + ,[Type] + ,[Business] + ,[Behavior] + ,[Remark] + ,[UpdateDate]) + VALUES + (Newid() + ,'PREP' + ,'TPPHAR' + ,'Enable' + ,'Initialization ITOP' + ,Default) + +*/ + + +GO \ No newline at end of file diff --git a/TPDT-268 - ACP in task sequence/dba_packages/DeployJobsMonitoring.sql b/TPDT-268 - ACP in task sequence/dba_packages/DeployJobsMonitoring.sql new file mode 100644 index 0000000..dc5d9c1 --- /dev/null +++ b/TPDT-268 - ACP in task sequence/dba_packages/DeployJobsMonitoring.sql @@ -0,0 +1,173 @@ +/*============================================================================= + + Création d'un package pour la gestion du monitoring des Jobs SQL + + -> Mise en place des indexes nécessaires sur MSDB + -> Deploy de la SP de monitoring des jobs: Get_Job_Error_Info + + Création : 24.01.2023 / SPE + + Modifications : + +=============================================================================*/ + +/* CREATION DES INDEXES */ + +USE [msdb]; +GO + +IF NOT EXISTS ( SELECT 1 + FROM sys.indexes + WHERE name = 'NCIX_sysjobhistory_COL_job_id') +BEGIN + CREATE NONCLUSTERED INDEX [NCIX_sysjobhistory_COL_job_id] + ON [dbo].[sysjobhistory] ([job_id] ASC, [run_status] ASC, [sql_message_id] ASC, [run_date] ASC, [run_time] ASC) + INCLUDE ([step_name], [message]) + WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, SORT_IN_TEMPDB = OFF, DROP_EXISTING = OFF, ONLINE = OFF, + ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) + ON [PRIMARY]; +END; +GO + +IF NOT EXISTS ( SELECT 1 + FROM sys.indexes + WHERE name = 'NCIX_sysjobactivity_COL_job_id') +BEGIN + CREATE NONCLUSTERED INDEX [NCIX_sysjobactivity_COL_job_id] + ON [dbo].[sysjobactivity] ([job_id] ASC, [start_execution_date] ASC) + INCLUDE (last_executed_step_id) + WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, SORT_IN_TEMPDB = OFF, DROP_EXISTING = OFF, ONLINE = OFF, + ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) + ON [PRIMARY]; +END; +GO + +/* DEPLOIEMENT DE LA SP Get_Job_Error_Info */ +USE [HCITools]; +GO + +IF EXISTS ( SELECT * + FROM sys.objects + WHERE object_id = OBJECT_ID(N'[dbo].[Get_Job_Error_Info]') + AND type IN ( N'P', N'PC' )) + DROP PROCEDURE [dbo].[Get_Job_Error_Info]; +GO + +SET ANSI_NULLS ON; +GO + +SET QUOTED_IDENTIFIER ON; +GO + + +CREATE PROCEDURE [dbo].[Get_Job_Error_Info] + @in_debug TINYINT = 0, + @in_JobName NVARCHAR(1000), + @in_Recipients VARCHAR(250) +AS +/*============================================================================= + + Explication du traitement realise par la SP + ------------------------------------------- + Cette SP sert a récupérer le message d'erreur d'un step de job et de l'envoyer par mail. + + Contexte d'utilisation + ---------------------- + Appelée depuis le step Empty Step et Send mail KO des jobs + + Parametres + ---------- + @in_debug : non utilisé + @in_JobName : nom du job + @in_Recipients : mail/profil du/des destinataire(s) + + Creation : 1.4.16 / RTC + + Modifications : 04.04.16 / FLA : normalisation de la SP, modification du paramètre d'entrée, modification de l'appel de l'envoi de mail + 06.10.16 / FLA : ajout de la gestion des erreurs de query timeout + 19.02.21 / SPE : Modification null message (Bug) + +=============================================================================*/ + +SET NOCOUNT ON; + +/*------------------- Declaration des variables --------------------*/ +DECLARE @message NVARCHAR(MAX); + +/*------------ Affectation des parametres aux variables ------------*/ +SET @message = N''; + +/*-------------------------- Traitement ---------------------------*/ +BEGIN TRY + + SELECT @message + = @message + N'STEP NAME: ' + jh.step_name + CHAR(13) + N'ERROR MESSAGE: ' + CHAR(13) + jh.message + CHAR(13) + + CHAR(13) + FROM msdb..sysjobhistory jh + INNER JOIN msdb..sysjobactivity ja + ON ja.job_id = jh.job_id + INNER JOIN msdb..sysjobs j + ON j.job_id = ja.job_id + WHERE j.name = @in_JobName + AND run_status = 0 --and ja.stop_execution_date is null-- + AND ja.session_id = ( SELECT TOP 1 session_id + FROM msdb.dbo.syssessions + ORDER BY agent_start_date DESC) + AND start_execution_date IS NOT NULL + --AND stop_execution_date is null + AND msdb.dbo.agent_datetime(run_date, run_time) >= start_execution_date; + + /* Gestion des Query Timeout Error */ + IF EXISTS ( SELECT 1 + FROM msdb..sysjobhistory jh + INNER JOIN msdb..sysjobactivity ja + ON ja.job_id = jh.job_id + INNER JOIN msdb..sysjobs j + ON j.job_id = ja.job_id + WHERE j.name = @in_JobName + AND run_status = 1 --and ja.stop_execution_date is null-- + AND ja.session_id = ( SELECT TOP 1 session_id + FROM msdb.dbo.syssessions + ORDER BY agent_start_date DESC) + AND start_execution_date IS NOT NULL + AND jh.sql_message_id = 7412 + AND msdb.dbo.agent_datetime(run_date, run_time) >= start_execution_date) + BEGIN + + SELECT @message + = @message + N'STEP NAME: ' + jh.step_name + CHAR(13) + N'ERROR MESSAGE: ' + CHAR(13) + jh.message + + CHAR(13) + CHAR(13) + FROM msdb..sysjobhistory jh + INNER JOIN msdb..sysjobactivity ja + ON ja.job_id = jh.job_id + INNER JOIN msdb..sysjobs j + ON j.job_id = ja.job_id + WHERE j.name = @in_JobName + AND run_status = 1 --and ja.stop_execution_date is null-- + AND ja.session_id = ( SELECT TOP 1 session_id + FROM msdb.dbo.syssessions + ORDER BY agent_start_date DESC) + AND start_execution_date IS NOT NULL + AND jh.sql_message_id = 7412 + AND msdb.dbo.agent_datetime(run_date, run_time) >= start_execution_date; + END; + + /*---------------------- Evoie du mail ------------*/ + IF (@message <> '') + EXEC aps_Send_Mail_with_template @in_param_varchar_2 = @in_Recipients, + @in_param_message = @message, + @in_job_type = 1; /* 0:sans template; 1/NULL:echec; 2:succes; 3:warning; 4:message*/ + +END TRY +BEGIN CATCH + + /* Traitement des erreurs (sans RaiseError) */ + EXEC dbo.get_Error_Info @in_RaiseError = 0; + +END CATCH; + +/*------------------ Retour au programme appelant -----------------*/ +RETURN (@@error); + + +GO diff --git a/TPDT-268 - ACP in task sequence/dba_packages/DeployJobsStatusMonitoring.sql b/TPDT-268 - ACP in task sequence/dba_packages/DeployJobsStatusMonitoring.sql new file mode 100644 index 0000000..c933bae --- /dev/null +++ b/TPDT-268 - ACP in task sequence/dba_packages/DeployJobsStatusMonitoring.sql @@ -0,0 +1,929 @@ +/*============================================================================= + + Création d'un package pour la gestion du monitoring des status des Jobs SQL + + -> Création des tables + -> Création des FK et index + -> Deploy de la SP d'initialisation du status des jobs : mon.Initialize_Jobs_Status + -> Deploy de la SP de mise à jour du status des jobs : mon.Maj_Jobs_Status + -> Deploy de la fonction du calcul de prochain schedule : GetNextScheduleForJob + + Création : 13.07.2023 / FLA + + Modifications : + 17.08.2023 / FLA : Changement de methode d'update, changement du calcul du prochain schedule, add SP to check status + 21.09.2023 / FLA : Improve performance for function GetNextScheduleForJob and for SP Maj_Jobs_Status + + +=============================================================================*/ + + + + +/***********************************************************************/ +/* STRUCTURE */ +/* */ +/***********************************************************************/ +USE HCITools; + +IF NOT EXISTS ( SELECT * + FROM sys.objects + WHERE object_id = OBJECT_ID(N'[mon].[Job_monitoring_config]') + AND type IN ( N'U' )) +BEGIN + + CREATE TABLE [mon].[Job_monitoring_config]( + [Job_monitoring_config_ID] [INT] IDENTITY(1,1) NOT NULL, + [JMC_name] [VARCHAR](255) NOT NULL, + [JMC_need_history] [BIT] NOT NULL, + [JMC_caller] [VARCHAR](255) NULL, + [JMC_ignore] [BIT] NOT NULL, + CONSTRAINT [PK_Job_monitoring_config] PRIMARY KEY CLUSTERED + ( + [Job_monitoring_config_ID] ASC + )WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY] + ) ON [PRIMARY] +END + +IF NOT EXISTS (SELECT * FROM sys.objects WHERE object_id = OBJECT_ID(N'[mon].[DF_JMC_need_history]') AND type = 'D') +BEGIN +ALTER TABLE [mon].[Job_monitoring_config] ADD CONSTRAINT DF_JMC_need_history DEFAULT (1) FOR [JMC_need_history] +END +GO + +IF NOT EXISTS (SELECT * FROM sys.objects WHERE object_id = OBJECT_ID(N'[mon].[DF_JMC_ignore]') AND type = 'D') +BEGIN +ALTER TABLE [mon].[Job_monitoring_config] ADD CONSTRAINT DF_JMC_ignore DEFAULT (0) FOR [JMC_ignore] +END +GO + + +IF NOT EXISTS (SELECT * FROM ::fn_listextendedproperty ('MS_Description', 'Schema', 'mon', 'Table', 'Job_monitoring_config', 'Column', 'JMC_need_history')) +BEGIN + EXEC sp_addextendedproperty 'MS_Description', '0: same row updated in table Job_monitoring_history, 1:one row for each execution of job', 'Schema', [mon], 'table', [Job_monitoring_config], 'column', [JMC_need_history] +END +GO + +IF NOT EXISTS (SELECT * FROM ::fn_listextendedproperty ('MS_Description', 'Schema', 'mon', 'Table', 'Job_monitoring_config', 'Column', 'JMC_caller')) +BEGIN + EXEC sp_addextendedproperty 'MS_Description', 'Name of job If job called by another one', 'Schema', [mon], 'table', [Job_monitoring_config], 'column', [JMC_caller] +END +GO + +IF NOT EXISTS (SELECT * FROM ::fn_listextendedproperty ('MS_Description', 'Schema', 'mon', 'Table', 'Job_monitoring_config', 'Column', 'JMC_ignore')) +BEGIN + EXEC sp_addextendedproperty 'MS_Description', '0: To monitor, 1:To don''t monitor', 'Schema', [mon], 'table', [Job_monitoring_config], 'column', [JMC_ignore] +END +GO + +IF NOT EXISTS ( SELECT 1 + FROM INFORMATION_SCHEMA.TABLE_CONSTRAINTS + WHERE CONSTRAINT_TYPE = 'PRIMARY KEY' + AND TABLE_NAME = N'Job_monitoring_config') +BEGIN + ALTER TABLE [mon].[Job_monitoring_config] + ADD CONSTRAINT [PK_Job_monitoring_config] + PRIMARY KEY CLUSTERED ([Job_monitoring_config_ID] ASC); +END; + + +IF NOT EXISTS ( SELECT 1 + FROM sys.indexes + WHERE object_id = OBJECT_ID(N'[mon].[Job_monitoring_config]') + AND name = N'NCIX_Job_monitoring_config_COL_JMC_name') +BEGIN + CREATE NONCLUSTERED INDEX [NCIX_Job_monitoring_config_COL_JMC_name] + ON [mon].[Job_monitoring_config] ([JMC_name] ASC) + INCLUDE (JMC_need_history, JMC_caller, JMC_ignore); +END; + +IF NOT EXISTS ( SELECT * + FROM sys.objects + WHERE object_id = OBJECT_ID(N'[mon].[Job_monitoring_history]') + AND type IN ( N'U' )) +BEGIN + CREATE TABLE [mon].[Job_monitoring_history]( + [Job_monitoring_history_ID] [INT] IDENTITY(1,1) NOT NULL, + [JMH_job_monitoring_config_ID] [INT] NOT NULL, + [JMH_next_schedule] [DATETIME] NULL, + [JMH_monitoring_status] [TINYINT] NOT NULL, + [JMH_job_status] [TINYINT] NULL, + [JMH_error_message] [NVARCHAR](4000) NULL, + [JMH_update_status] [DATETIME] NOT NULL, + [JMH_monitoring_date] [DATETIME] NULL, + CONSTRAINT [PK_Job_monitoring_history] PRIMARY KEY CLUSTERED + ( + [Job_monitoring_history_ID] ASC + )WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY] + ) ON [PRIMARY] +END + +IF NOT EXISTS (SELECT * FROM sys.objects WHERE object_id = OBJECT_ID(N'[mon].[DF_JMH_monitoring_status]') AND type = 'D') +BEGIN +ALTER TABLE [mon].[Job_monitoring_history] ADD CONSTRAINT DF_JMH_monitoring_status DEFAULT ((0)) FOR [JMH_monitoring_status] +END +GO + +IF NOT EXISTS (SELECT * FROM sys.objects WHERE object_id = OBJECT_ID(N'[mon].[DF_JMH_update_status]') AND type = 'D') +BEGIN +ALTER TABLE [mon].[Job_monitoring_history] ADD CONSTRAINT DF_JMH_update_status DEFAULT (GETDATE()) FOR [JMH_update_status] +END +GO + +IF NOT EXISTS (SELECT * FROM ::fn_listextendedproperty ('MS_Description', 'Schema', 'mon', 'Table', 'Job_monitoring_history', 'Column', 'JMH_monitoring_status')) +BEGIN + EXEC sp_addextendedproperty 'MS_Description', '0: No error, 1:Error not checked, 2:Error checked', 'Schema', [mon], 'table', [Job_monitoring_history], 'column', [JMH_monitoring_status] +END +GO + +IF NOT EXISTS (SELECT * FROM ::fn_listextendedproperty ('MS_Description', 'Schema', 'mon', 'Table', 'Job_monitoring_history', 'Column', 'JMH_job_status')) +BEGIN + EXEC sp_addextendedproperty 'MS_Description', '0 = Failed + 1 = Succeeded + 2 = No execution', 'Schema', [mon], 'table', [Job_monitoring_history], 'column', [JMH_job_status] +END +GO + + +IF NOT EXISTS ( SELECT 1 + FROM INFORMATION_SCHEMA.TABLE_CONSTRAINTS + WHERE CONSTRAINT_TYPE = 'PRIMARY KEY' + AND TABLE_NAME = N'Job_monitoring_history') +BEGIN + ALTER TABLE [mon].[Job_monitoring_history] + ADD CONSTRAINT [PK_Job_monitoring_history] + PRIMARY KEY CLUSTERED ([Job_monitoring_history_ID] ASC); +END; + +IF NOT EXISTS ( SELECT 1 + FROM sys.foreign_keys + WHERE object_id = OBJECT_ID(N'mon.FK_Job_monitoring_config_COL_Job_monitoring_config_ID') + AND parent_object_id = OBJECT_ID(N'[mon].[Job_monitoring_history]')) +BEGIN + ALTER TABLE [mon].[Job_monitoring_history] + ADD CONSTRAINT [FK_Job_monitoring_config_COL_Job_monitoring_config_ID] + FOREIGN KEY ([JMH_Job_monitoring_config_ID]) + REFERENCES [mon].[Job_monitoring_config] ([Job_monitoring_config_ID]) ON DELETE NO ACTION ON UPDATE NO ACTION; +END; +GO + +IF EXISTS (SELECT * FROM sys.objects WHERE object_id = OBJECT_ID(N'[mon].[Initialize_Jobs_Status]') AND type IN (N'P', N'PC')) +DROP PROCEDURE [mon].[Initialize_Jobs_Status] +GO + +CREATE PROCEDURE [mon].[Initialize_Jobs_Status] + @in_debug TINYINT = 0, + @in_JobName NVARCHAR(1000) = NULL +AS +/*============================================================================= + + Explication du traitement realise par la SP + ------------------------------------------- + Cette SP sert a initialiser le status des jobs + + Contexte d'utilisation + ---------------------- + Appelée à la main en passant le nom du job à initialiser si besoin sinon all jobs + + Parametres + ---------- + @in_debug : non utilisé + @in_JobName : nom du job (si null All jobs) + + Creation : 13.07.23 / FLA + + Modifications : + +=============================================================================*/ + +SET NOCOUNT ON; + +/*------------------- Declaration des variables --------------------*/ +DECLARE @JobName VARCHAR(255), + @LastStatus TINYINT, + @LastMessage NVARCHAR(4000), + @NextRun DATETIME, + @ID INT; + +/*------------ Affectation des parametres aux variables ------------*/ + +/*-------------------------- Traitement ---------------------------*/ +BEGIN TRY + + DECLARE c_Jobs CURSOR FAST_FORWARD READ_ONLY FOR + SELECT SJ.name, + SJH.LastStatus, + SJH.Lastmessage, + SJA.NextRun + FROM msdb.dbo.sysjobs SJ + OUTER APPLY ( SELECT TOP 1 NextRun = JA.next_scheduled_run_date + FROM msdb.dbo.sysjobactivity JA + WHERE JA.job_id = SJ.job_id + ORDER BY session_id DESC) AS SJA + OUTER APPLY ( SELECT TOP 1 LastStatus = MIN(run_status), + Lastmessage = CASE + WHEN JH.sql_severity > 0 THEN message + ELSE NULL END + FROM msdb.dbo.sysjobhistory JH + WHERE JH.job_id = SJ.job_id + AND JH.run_date = ( SELECT MAX(T.run_date) + FROM msdb.dbo.sysjobhistory T + WHERE T.job_id = JH.job_id) + AND JH.run_time >= ( SELECT MAX(T.run_time) + FROM msdb.dbo.sysjobhistory T + WHERE T.job_id = JH.job_id + AND JH.run_date = T.run_date + AND T.step_id = 0) + GROUP BY CASE + WHEN JH.sql_severity > 0 THEN message + ELSE NULL END + ORDER BY MIN(run_status)) AS SJH + WHERE SJ.enabled = 1 + AND (( SJ.name LIKE 'DR[0-9]%' + OR SJ.name LIKE 'D[0-9]%' + OR SJ.name LIKE 'M[0-9]%' + OR SJ.name LIKE 'W[0-9]%' + OR SJ.name LIKE '[_]%') AND @in_JobName IS NULL) + AND SJ.name NOT LIKE '%Log reader%' + OR (SJ.name = @in_JobName AND @in_JobName IS NOT NULL) + + ORDER BY SJ.name; + + + OPEN c_Jobs; + + FETCH NEXT FROM c_Jobs + INTO @JobName, + @LastStatus, + @LastMessage, + @NextRun; + + WHILE @@FETCH_STATUS = 0 + BEGIN + + IF NOT EXISTS ( SELECT 1 + FROM mon.Job_monitoring_config + WHERE JMC_name = @JobName) + BEGIN + + INSERT INTO mon.Job_monitoring_config (JMC_name, + JMC_need_history) + VALUES (@JobName, CASE + WHEN @JobName LIKE '[_][0-9]%' THEN 0 + WHEN @JobName LIKE 'DR[0-9]%' THEN 0 + ELSE 1 END); + SELECT @ID = SCOPE_IDENTITY(); + INSERT INTO mon.Job_monitoring_history (JMH_job_monitoring_config_ID, + JMH_next_schedule, + JMH_monitoring_status, + JMH_job_status, + JMH_error_message) + VALUES (@ID, @NextRun, CASE WHEN ISNULL(@LastStatus,1) = 1 THEN 0 ELSE 1 END, @LastStatus, @LastMessage); + + END; + FETCH NEXT FROM c_Jobs + INTO @JobName, + @LastStatus, + @LastMessage, + @NextRun; + + UPDATE JMC + SET JMC.JMC_Caller = SJ.name + FROM msdb.dbo.sysjobs SJ + INNER JOIN msdb.dbo.sysjobsteps SJS + ON SJ.job_id = SJS.job_id + INNER JOIN mon.Job_monitoring_config JMC + ON JMC.JMC_name = REPLACE(REPLACE(SUBSTRING(SJS.step_name, 11, 80), '[', ''), ']', '') + WHERE SJS.command LIKE '%aps_Launch_Job_SQL_Agent%' + OR SJS.command LIKE '%aps_CheckProd_Job%'; + + END; + + CLOSE c_Jobs; + DEALLOCATE c_Jobs; + +END TRY +BEGIN CATCH + + /* Traitement des erreurs (sans RaiseError) */ + EXEC dbo.get_Error_Info @in_RaiseError = 0; + +END CATCH; + +/*------------------ Retour au programme appelant -----------------*/ +RETURN (@@error); +GO + +IF EXISTS (SELECT * FROM sys.objects WHERE object_id = OBJECT_ID(N'[dbo].[GetNextScheduleForJob]') AND type in (N'FN', N'IF', N'TF', N'FS', N'FT')) +DROP FUNCTION [dbo].[GetNextScheduleForJob] +GO + +CREATE FUNCTION [dbo].[GetNextScheduleForJob] +( + @JobName SYSNAME, + @startDate DATETIME, + @endDate DATETIME +) + +RETURNS @t TABLE ( + scheduleID INT NOT NULL, + jobName SYSNAME NOT NULL, + jobDescription NVARCHAR(512) NOT NULL, + scheduleName SYSNAME NOT NULL, + categoryName SYSNAME NOT NULL, + startDate DATETIME NOT NULL, + jobEnabled INT NOT NULL, + scheduleEnabled INT NOT NULL) + +AS + +BEGIN + +-- Create a tally table. If you already have one of your own please use that instead. +DECLARE @tallyNumbers TABLE + ( + num SMALLINT PRIMARY KEY CLUSTERED + ) + +DECLARE @index SMALLINT + +SET @index = 1 + +WHILE @index <= 8640 + BEGIN + INSERT @tallyNumbers + ( + num + ) + VALUES ( + @index + ) + + SET @index = @index + 1 + END + +-- Create a staging table for jobschedules +DECLARE @jobSchedules TABLE + ( + rowID INT IDENTITY(1, 1) PRIMARY KEY CLUSTERED, + jobName SYSNAME NOT NULL, + jobDescription NVARCHAR(512) NOT NULL, + scheduleName SYSNAME NOT NULL, + scheduleID INT NOT NULL, + categoryName SYSNAME NOT NULL, + freq_type INT NOT NULL, + freq_interval INT NOT NULL, + freq_subday_type INT NOT NULL, + freq_subday_interval INT NOT NULL, + freq_relative_interval INT NOT NULL, + freq_recurrence_factor INT NOT NULL, + startDate DATETIME NOT NULL, + startTime DATETIME NOT NULL, + endDate DATETIME NOT NULL, + endTime DATETIME NOT NULL, + jobEnabled INT NOT NULL, + scheduleEnabled INT NOT NULL + ) + + +-- Populate the staging table for JobSchedules with SQL Server 2005 and SQL Server 2008 +INSERT @JobSchedules + ( + jobName, + jobDescription, + scheduleName, + scheduleID, + categoryName, + freq_type, + freq_interval, + freq_subday_type, + freq_subday_interval, + freq_relative_interval, + freq_recurrence_factor, + startDate, + startTime, + endDate, + endTime, + jobEnabled, + scheduleEnabled + ) +SELECT sj.name, + COALESCE(sj.description, ''), + ss.name, + ss.schedule_id, + sc.name, + ss.freq_type, + ss.freq_interval, + ss.freq_subday_type, + ss.freq_subday_interval, + ss.freq_relative_interval, + ss.freq_recurrence_factor, + COALESCE(STR(ss.active_start_date, 8), CONVERT(CHAR(8), GETDATE(), 112)) startDate, + STUFF(STUFF(REPLACE(STR(ss.active_start_time, 6), ' ', '0'), 3, 0, ':'), 6, 0, ':') startTime, + STR(ss.active_end_date, 8) endDate, + STUFF(STUFF(REPLACE(STR(ss.active_end_time, 6), ' ', '0'), 3, 0, ':'), 6, 0, ':') endTime, + sj.enabled, + ss.enabled +FROM msdb..sysschedules AS ss WITH (NOLOCK) +INNER JOIN msdb..sysjobschedules AS sjs WITH (NOLOCK) ON sjs.schedule_id = ss.schedule_id +INNER JOIN msdb..sysjobs AS sj WITH (NOLOCK) ON sj.job_id = sjs.job_id +INNER JOIN msdb..syscategories AS sc WITH (NOLOCK) ON sc.category_id = sj.category_id +WHERE ss.freq_type IN (1, 4, 8, 16, 32) + AND sj.name = @JobName + +-- Deal with first, second, third, fourth and last occurence +DECLARE @tempStart DATETIME, + @tempEnd DATETIME + +SELECT @tempStart = DATEADD(MONTH, DATEDIFF(MONTH, '19000101', @startDate), '19000101'), + @TempEnd = DATEADD(MONTH, DATEDIFF(MONTH, '18991231', @endDate), '18991231') + +DECLARE @dayInformation TABLE + ( + infoDate DATETIME PRIMARY KEY CLUSTERED, + weekdayName VARCHAR(9) NOT NULL, + statusCode INT NOT NULL, + lastDay TINYINT DEFAULT 0 + ) + +WHILE @tempStart <= @tempEnd + BEGIN + INSERT @dayInformation + ( + infoDate, + weekdayName, + statusCode + ) + SELECT @tempStart, + DATENAME(WEEKDAY, @tempStart), + CASE + WHEN DATEPART(DAY, @tempStart) BETWEEN 1 AND 7 THEN 1 + WHEN DATEPART(DAY, @tempStart) BETWEEN 8 AND 14 THEN 2 + WHEN DATEPART(DAY, @tempStart) BETWEEN 15 AND 21 THEN 4 + WHEN DATEPART(DAY, @tempStart) BETWEEN 22 AND 28 THEN 8 + ELSE 0 + END + + SET @tempStart = DATEADD(DAY, 1, @tempStart) + END + +UPDATE di +SET di.statusCode = di.statusCode + 16 +FROM @dayInformation AS di +INNER JOIN ( + SELECT DATEDIFF(MONTH, '19000101', infoDate) AS theMonth, + DATEPART(DAY, MAX(infoDate)) - 6 AS theDay + FROM @dayInformation + GROUP BY DATEDIFF(MONTH, '19000101', infoDate) + ) AS x ON x.theMonth = DATEDIFF(MONTH, '19000101', di.infoDate) +WHERE DATEPART(DAY, di.infoDate) >= x.theDay + +UPDATE di +SET di.lastDay = 16 +FROM @dayInformation AS di +INNER JOIN ( + SELECT DATEDIFF(MONTH, '19000101', infoDate) AS theMonth, + MAX(infoDate) AS theDay + FROM @dayInformation + GROUP BY DATEDIFF(MONTH, '19000101', infoDate) + ) AS x ON x.theMonth = DATEDIFF(MONTH, '19000101', di.infoDate) +WHERE di.infoDate = x.theDay + +UPDATE @dayInformation +SET lastDay = DATEPART(DAY, infoDate) +WHERE DATEPART(DAY, infoDate) BETWEEN 1 AND 4 + +-- Stage all individual schedule times +DECLARE @scheduleTimes TABLE + ( + rowID INT NOT NULL, + startDate DATETIME NOT NULL, + endDate DATETIME NOT NULL, + waitSeconds INT DEFAULT 0 + ) + +-- Insert one time only schedules +INSERT @scheduleTimes + ( + rowID, + startDate, + endDate + ) +SELECT rowID, + startDate+startTime, + startDate+startTime +FROM @jobSchedules +WHERE freq_type = 1 + AND startDate+startTime BETWEEN @StartDate AND @EndDate + +-- Insert daily schedules +INSERT @scheduleTimes + ( + rowID, + startDate, + endDate, + waitSeconds + ) +SELECT js.rowID, + di.infoDate+js.startTime, + di.infoDate+js.endTime, + CASE js.freq_subday_type + WHEN 1 THEN 0 + WHEN 2 THEN js.freq_subday_interval + WHEN 4 THEN 60 * js.freq_subday_interval + WHEN 8 THEN 3600 * js.freq_subday_interval + END +FROM @jobSchedules AS js +INNER JOIN @dayInformation AS di ON di.infoDate >= js.startDate + AND di.infoDate <= js.endDate +WHERE js.freq_type = 4 + AND DATEDIFF(DAY, js.startDate, di.infoDate) % js.freq_interval = 0 + + +-- Insert weekly schedules +INSERT @scheduleTimes + ( + rowID, + startDate, + endDate, + waitSeconds + ) +SELECT js.rowID, + di.infoDate+js.startTime, + di.infoDate+js.endTime, + CASE js.freq_subday_type + WHEN 1 THEN 0 + WHEN 2 THEN js.freq_subday_interval + WHEN 4 THEN 60 * js.freq_subday_interval + WHEN 8 THEN 3600 * js.freq_subday_interval + END +FROM @jobSchedules AS js +INNER JOIN @dayInformation AS di ON di.infoDate >= js.startDate + AND di.infoDate <= js.endDate +WHERE js.freq_type = 8 + AND 1 = CASE + WHEN js.freq_interval & 1 = 1 AND di.weekdayName = 'Sunday' THEN 1 + WHEN js.freq_interval & 2 = 2 AND di.weekdayName = 'Monday' THEN 1 + WHEN js.freq_interval & 4 = 4 AND di.weekdayName = 'Tuesday' THEN 1 + WHEN js.freq_interval & 8 = 8 AND di.weekdayName = 'Wednesday' THEN 1 + WHEN js.freq_interval & 16 = 16 AND di.weekdayName = 'Thursday' THEN 1 + WHEN js.freq_interval & 32 = 32 AND di.weekdayName = 'Friday' THEN 1 + WHEN js.freq_interval & 64 = 64 AND di.weekdayName = 'Saturday' THEN 1 + ELSE 0 + END + AND (DATEDIFF(DAY, js.startDate, di.infoDate) / 7) % js.freq_recurrence_factor = 0 + +-- Insert monthly schedules +INSERT @scheduleTimes + ( + rowID, + startDate, + endDate, + waitSeconds + ) +SELECT js.rowID, + di.infoDate+js.startTime, + di.infoDate+js.endTime, + CASE js.freq_subday_type + WHEN 1 THEN 0 + WHEN 2 THEN js.freq_subday_interval + WHEN 4 THEN 60 * js.freq_subday_interval + WHEN 8 THEN 3600 * js.freq_subday_interval + END +FROM @jobSchedules AS js +INNER JOIN @dayInformation AS di ON di.infoDate >= js.startDate + AND di.infoDate <= js.endDate +WHERE js.freq_type = 16 + AND DATEPART(DAY, di.infoDate) = js.freq_interval + AND DATEDIFF(MONTH, js.startDate, di.infoDate) % js.freq_recurrence_factor = 0 + +-- Insert monthly relative schedules +INSERT @scheduleTimes + ( + rowID, + startDate, + endDate, + waitSeconds + ) +SELECT js.rowID, + di.infoDate+js.startTime, + di.infoDate+js.endTime, + CASE js.freq_subday_type + WHEN 1 THEN 0 + WHEN 2 THEN js.freq_subday_interval + WHEN 4 THEN 60 * js.freq_subday_interval + WHEN 8 THEN 3600 * js.freq_subday_interval + END +FROM @jobSchedules AS js +INNER JOIN @dayInformation AS di ON di.infoDate >= js.startDate + AND di.infoDate <= js.endDate +WHERE js.freq_type = 32 + AND 1 = CASE + WHEN js.freq_interval = 1 AND di.weekdayName = 'Sunday' THEN 1 + WHEN js.freq_interval = 2 AND di.weekdayName = 'Monday' THEN 1 + WHEN js.freq_interval = 3 AND di.weekdayName = 'Tuesday' THEN 1 + WHEN js.freq_interval = 4 AND di.weekdayName = 'Wednesday' THEN 1 + WHEN js.freq_interval = 5 AND di.weekdayName = 'Thursday' THEN 1 + WHEN js.freq_interval = 6 AND di.weekdayName = 'Friday' THEN 1 + WHEN js.freq_interval = 7 AND di.weekdayName = 'Saturday' THEN 1 + WHEN js.freq_interval = 8 AND js.freq_relative_interval = di.lastDay THEN 1 + WHEN js.freq_interval = 9 AND di.weekdayName NOT IN ('Sunday', 'Saturday') THEN 1 + WHEN js.freq_interval = 10 AND di.weekdayName IN ('Sunday', 'Saturday') THEN 1 + ELSE 0 + END + AND di.statusCode & js.freq_relative_interval = js.freq_relative_interval + AND DATEDIFF(MONTH, js.startDate, di.infoDate) % js.freq_recurrence_factor = 0 + +-- Get the daily recurring schedule times +INSERT @scheduleTimes + ( + rowID, + startDate, + endDate, + waitSeconds + ) +SELECT st.rowID, + DATEADD(SECOND, tn.num * st.waitSeconds, st.startDate), + st.endDate, + st.waitSeconds +FROM @scheduleTimes AS st +CROSS JOIN @tallyNumbers AS tn +WHERE tn.num * st.waitSeconds <= DATEDIFF(SECOND, st.startDate, st.endDate) + AND st.waitSeconds > 0 + +-- Present the result +INSERT @t (scheduleID, + jobName, + jobDescription, + scheduleName, + categoryName, + startDate, + jobEnabled, + scheduleEnabled) +SELECT js.scheduleID, + js.jobName, + js.jobDescription, + js.scheduleName, + js.categoryName, + st.startDate, + js.jobEnabled, + js.scheduleEnabled +FROM @scheduleTimes AS st +INNER JOIN @jobSchedules AS js ON js.rowID = st.rowID +WHERE js.jobEnabled = 1 + AND js.scheduleEnabled = 1 + AND st.startDate >= @startDate + AND st.startDate <= @endDate +RETURN + +END +GO + + +IF EXISTS (SELECT * FROM sys.objects WHERE object_id = OBJECT_ID(N'[mon].[Maj_Jobs_Status]') AND type IN (N'P', N'PC')) +DROP PROCEDURE [mon].[Maj_Jobs_Status] +GO + +CREATE PROCEDURE [mon].[Maj_Jobs_Status] + @in_debug TINYINT = 0, + @in_JobName NVARCHAR(1000) = NULL, + @in_JobID UNIQUEIDENTIFIER = NULL +AS +/*============================================================================= + + Explication du traitement realise par la SP + ------------------------------------------- + Cette SP sert a mettre à jour le status des jobs + + Contexte d'utilisation + ---------------------- + Appelée depuis le step Empty Step et Send mail KO des jobs + + Parametres + ---------- + @in_debug : non utilisé + @in_JobName : nom du job (si null All jobs) + + Creation : 03.08.23 / FLA + + Modifications : + 22.08.23 : Get directly the job_id in job instead of put job name in parameter + 21.09.23 : Call the new version of function [GetNextScheduleForJob] + +=============================================================================*/ + + +SET NOCOUNT ON; + +/*------------------- Declaration des variables --------------------*/ +DECLARE @LastMessage NVARCHAR(4000) = NULL, + @JMC_ID INT = 0, + @JMH_ID INT = NULL, + @NeedHistory BIT = 1, + @NextRun DATETIME + +/*------------ Affectation des parametres aux variables ------------*/ + +/*-------------------------- Traitement ---------------------------*/ +BEGIN TRY + + IF @in_JobID IS NOT NULL + SELECT @in_JobName = name FROM msdb.dbo.sysjobs WHERE job_id = @in_JobID + + SELECT @LastMessage = jh.message + FROM msdb.dbo.sysjobhistory jh +INNER JOIN msdb.dbo.sysjobactivity ja + ON ja.job_id = jh.job_id +INNER JOIN msdb.dbo.sysjobs j + ON j.job_id = ja.job_id + WHERE j.name = @in_JobName + AND run_status = 0 --and ja.stop_execution_date is null-- + AND ja.session_id = (SELECT TOP 1 session_id + FROM msdb.dbo.syssessions + ORDER BY agent_start_date DESC) + AND start_execution_date IS NOT NULL + --AND stop_execution_date is null + AND msdb.dbo.agent_datetime(run_date, run_time) >= start_execution_date; + + /* Gestion des Query Timeout Error */ + IF EXISTS (SELECT 1 + FROM msdb..sysjobhistory jh + INNER JOIN msdb..sysjobactivity ja + ON ja.job_id = jh.job_id + INNER JOIN msdb..sysjobs j + ON j.job_id = ja.job_id + WHERE j.name = @in_JobName + AND run_status = 1 --and ja.stop_execution_date is null-- + AND ja.session_id = (SELECT TOP 1 session_id + FROM msdb.dbo.syssessions + ORDER BY agent_start_date DESC) + AND start_execution_date IS NOT NULL + AND jh.sql_message_id = 7412 + AND msdb.dbo.agent_datetime(run_date, run_time) >= start_execution_date) + BEGIN + + SELECT @LastMessage = jh.message + FROM msdb..sysjobhistory jh + INNER JOIN msdb..sysjobactivity ja + ON ja.job_id = jh.job_id + INNER JOIN msdb..sysjobs j + ON j.job_id = ja.job_id + WHERE j.name = @in_JobName + AND run_status = 1 --and ja.stop_execution_date is null-- + AND ja.session_id = (SELECT TOP 1 session_id + FROM msdb.dbo.syssessions + ORDER BY agent_start_date DESC) + AND start_execution_date IS NOT NULL + AND jh.sql_message_id = 7412 + AND msdb.dbo.agent_datetime(run_date, run_time) >= start_execution_date; + END; + + SELECT @JMC_ID = JMC.Job_monitoring_config_ID, + @NeedHistory = JMC.JMC_need_history, + @JMH_ID = JMH.Job_monitoring_history_ID + FROM [mon].[Job_monitoring_config] JMC +LEFT OUTER JOIN [mon].[Job_monitoring_history] JMH + ON JMC.Job_monitoring_config_ID = JMH.JMH_job_monitoring_config_ID + WHERE JMC_name = @in_JobName + AND JMC_ignore = 0 + + IF @JMC_ID <> 0 + BEGIN + + SELECT @NextRun = Job.startDate FROM + (SELECT TOP 1 startDate + FROM [dbo].[GetNextScheduleForJob](@in_JobName,GETDATE(), GETDATE() + 1) + ORDER BY startDate) AS Job + + IF @NeedHistory = 0 + BEGIN + UPDATE [mon].[Job_monitoring_history] SET [JMH_next_schedule] = @NextRun, + [JMH_monitoring_status] = CASE WHEN @LastMessage IS NOT NULL THEN 1 ELSE 0 END, + [JMH_job_status] = CASE WHEN @LastMessage IS NOT NULL THEN 0 ELSE 1 END, + [JMH_error_message] = @LastMessage, + [JMH_update_status] = GETDATE() + WHERE JMH_job_monitoring_config_ID = @JMH_ID + END + ELSE + BEGIN + INSERT INTO [mon].[Job_monitoring_history] ([JMH_job_monitoring_config_ID], + [JMH_next_schedule], + [JMH_monitoring_status], + [JMH_job_status], + [JMH_error_message], + [JMH_update_status]) + VALUES (@JMC_ID, + @NextRun, + CASE WHEN @LastMessage IS NOT NULL THEN 1 ELSE 0 END, + CASE WHEN @LastMessage IS NOT NULL THEN 0 ELSE 1 END, + @LastMessage, + DEFAULT + ) + END + END + +END TRY +BEGIN CATCH + + /* Traitement des erreurs (sans RaiseError) */ + EXEC dbo.get_Error_Info @in_RaiseError = 0; + +END CATCH; + +/*------------------ Retour au programme appelant -----------------*/ +RETURN (@@error); +GO + + +IF EXISTS (SELECT * FROM sys.objects WHERE object_id = OBJECT_ID(N'[mon].[Get_Jobs_Status]') AND type in (N'P', N'PC')) +DROP PROCEDURE [mon].[Get_Jobs_Status] +GO + +CREATE PROCEDURE [mon].[Get_Jobs_Status] + @in_debug TINYINT = 0, + @in_JobName NVARCHAR(1000) = NULL +AS +/*============================================================================= + + Explication du traitement realise par la SP + ------------------------------------------- + Cette SP sert à retourner le status des jobs + + Contexte d'utilisation + ---------------------- + Appelée depuis le MDV ou à la main + + Parametres + ---------- + @in_debug : non utilisé + @in_JobName : nom du job (si null All jobs) + + Creation : 17.08.23 / FLA + + Modifications : + +=============================================================================*/ + + +SET NOCOUNT ON; + +/*------------------- Declaration des variables --------------------*/ + + +/*------------ Affectation des parametres aux variables ------------*/ + +/*-------------------------- Traitement ---------------------------*/ +BEGIN TRY + + SELECT JMC.JMC_name AS JobName, + JMH.JMH_error_message AS Error, + CASE + WHEN ( JMH.JMH_job_status = 0 + AND JMH_monitoring_status = 1) THEN 'ERROR' + WHEN (CASE WHEN ISNULL(JMH.JMH_next_schedule,T1.JMH_next_schedule) < ISNULL(T1.JMH_next_schedule,JMH.JMH_next_schedule) THEN ISNULL(JMH.JMH_next_schedule,T1.JMH_next_schedule) ELSE ISNULL(T1.JMH_next_schedule,JMH.JMH_next_schedule) END < GETDATE()) THEN 'NOT EXECUTED' + ELSE '' END AS Status + FROM mon.Job_monitoring_config JMC + INNER JOIN mon.Job_monitoring_history JMH + ON JMC.Job_monitoring_config_ID = JMH.JMH_job_monitoring_config_ID + AND JMC.JMC_ignore = 0 + AND JMH.JMH_update_status = (SELECT MAX(JMH2.JMH_update_status) + FROM mon.Job_monitoring_history JMH2 + WHERE JMH2.JMH_job_monitoring_config_ID = JMC.Job_monitoring_config_ID) + OUTER APPLY (SELECT JMH3.JMH_next_schedule FROM mon.Job_monitoring_config JMC3 + INNER JOIN mon.Job_monitoring_history JMH3 + ON JMC3.Job_monitoring_config_ID = JMH3.JMH_job_monitoring_config_ID + AND JMH3.JMH_update_status = (SELECT MAX(JMH4.JMH_update_status) + FROM mon.Job_monitoring_history JMH4 + WHERE JMH4.JMH_job_monitoring_config_ID = JMC3.Job_monitoring_config_ID) + WHERE JMC3.JMC_name = JMC.JMC_caller) AS T1 + WHERE JMC.JMC_name = COALESCE(@in_JobName, JMC.JMC_name) + ORDER BY JMC.JMC_name + +END TRY +BEGIN CATCH + + /* Traitement des erreurs (sans RaiseError) */ + EXEC dbo.get_Error_Info @in_RaiseError = 0; + +END CATCH; + +/*------------------ Retour au programme appelant -----------------*/ +RETURN (@@error); +GO + + +/***********************************************************************/ +/* INITIALISATION */ +/* */ +/***********************************************************************/ + +EXEC [mon].[Initialize_Jobs_Status] + +SELECT * + FROM mon.Job_monitoring_config JMC + INNER JOIN mon.Job_monitoring_history JMH + ON JMC.Job_monitoring_config_ID = JMH.JMH_Job_monitoring_config_ID +ORDER BY JMC.JMC_name + + +EXEC [mon].[Get_Jobs_Status] diff --git a/TPDT-268 - ACP in task sequence/dba_packages/DeployMonitoringRestore.sql b/TPDT-268 - ACP in task sequence/dba_packages/DeployMonitoringRestore.sql new file mode 100644 index 0000000..ded3dbe --- /dev/null +++ b/TPDT-268 - ACP in task sequence/dba_packages/DeployMonitoringRestore.sql @@ -0,0 +1,248 @@ +/*============================================================================= + + Création d'une alerte sur les restaurations de base de données + + ----------------------------------------------- + Ce script créer une alerte sur les restaurations de bases de données et envoie un mail d'alerte le cas échéant + + Contexte d'utilisation + ---------------------- + Cette alerte doit être créée après l'installation d'une nouvelle instance SQL. + + Création : 09.02.2017 / FLA + 17.03.2022 / FLA : Change DBA mail +=============================================================================*/ + + + +/* Drop existing standard schedule for job */ +declare @schedule_id int +declare c_schedules cursor local forward_only static for + select ss.schedule_id + from msdb.dbo.sysjobschedules sjs +INNER JOIN msdb.dbo.sysschedules ss + ON sjs.schedule_id = ss.schedule_id + AND ss.name NOT LIKE '%#SPEC#' +INNER JOIN msdb.dbo.sysjobs sj + ON sjs.job_id = sj.job_id + WHERE sj.name = N'_92040 - Response - DATABASE Restore Event' + +open c_schedules + +FETCH NEXT FROM c_schedules into @schedule_id +while @@fetch_status = 0 +begin + IF ((select COUNT(*) from msdb.dbo.sysjobschedules where schedule_id=@schedule_id) = 1) + EXEC msdb.dbo.sp_delete_schedule @schedule_id=@schedule_id, @force_delete = 1 +FETCH NEXT FROM c_schedules into @schedule_id +end + +close c_schedules + +deallocate c_schedules + +IF EXISTS (SELECT job_id FROM msdb.dbo.sysjobs_view WHERE name = N'_92040 - Response - DATABASE Restore Event') +EXEC msdb.dbo.sp_delete_job @job_name = N'_92040 - Response - DATABASE Restore Event', @delete_unused_schedule=0 +GO + +/* Creation Job and Steps*/ +BEGIN TRANSACTION +DECLARE @ReturnCode INT +SELECT @ReturnCode = 0 + +IF NOT EXISTS (SELECT name FROM msdb.dbo.syscategories WHERE name=N'DBA-Monitoring' AND category_class=1) +BEGIN +EXEC @ReturnCode = msdb.dbo.sp_add_category @class=N'JOB', @type=N'LOCAL', @name=N'DBA-Monitoring' +IF (@@ERROR <> 0 OR @ReturnCode <> 0) GOTO QuitWithRollback + +END + +/* Add Job */ +DECLARE @jobId BINARY(16) +EXEC @ReturnCode = msdb.dbo.sp_add_job @job_name=N'_92040 - Response - DATABASE Restore Event', + @enabled=1, + @notify_level_eventlog=0, + @notify_level_email=0, + @notify_level_netsend=0, + @notify_level_page=0, + @delete_level=0, + @description=N'Sends notifications to DBA when DATABASE Restore event(s) occur(s)', + @category_name=N'DBA-Monitoring', + @start_step_id=1, + @owner_login_name=N'sa', @job_id = @jobId OUTPUT +IF (@@ERROR <> 0 OR @ReturnCode <> 0) GOTO QuitWithRollback + +/* Add Step */ +EXEC @ReturnCode = msdb.dbo.sp_add_jobstep @job_id=@jobId, @step_name=N'Empty step', + @step_id=1, + @cmdexec_success_code=0, + @on_success_action=3, + @on_success_step_id=0, + @on_fail_action=3, + @on_fail_step_id=0, + @retry_attempts=0, + @retry_interval=0, + @os_run_priority=0, @subsystem=N'TSQL', + @command=N'/* Empty step */', + @database_name=N'master', + @output_file_name=NULL, + @flags=0, + @database_user_name=NULL, + @server=NULL, + @additional_parameters=NULL, + @proxy_id=NULL, + @proxy_name=NULL +IF (@@ERROR <> 0 OR @ReturnCode <> 0) GOTO QuitWithRollback +/* Add Step */ +EXEC @ReturnCode = msdb.dbo.sp_add_jobstep @job_id=@jobId, @step_name=N'Send e-mail in response to WMI alert(s)', + @step_id=2, + @cmdexec_success_code=0, + @on_success_action=3, + @on_success_step_id=0, + @on_fail_action=4, + @on_fail_step_id=4, + @retry_attempts=0, + @retry_interval=1, + @os_run_priority=0, @subsystem=N'TSQL', + @command=N'declare @mysubject nvarchar(200) + set @mysubject = ''Database Restore event - ''''$(ESCAPE_SQUOTE(WMI(DatabaseName)))'''' on server '' + @@SERVERNAME + + exec aps_Send_Mail_with_template + @in_param_message = ''Application Name: $(ESCAPE_SQUOTE(WMI(ApplicationName))) +Host Name: $(ESCAPE_SQUOTE(WMI(HostName))) +Login Name: $(ESCAPE_SQUOTE(WMI(LoginName))) +SPID : $(ESCAPE_SQUOTE(WMI(SPID))) +Command : $(ESCAPE_SQUOTE(WMI(TextData)))'', + + @in_param_subject = @mysubject, + @in_param_varchar_2 = ''DBA_operator;'';', + @database_name=N'HCITools', + @output_file_name=NULL, + @flags=0, + @database_user_name=NULL, + @server=NULL, + @additional_parameters=NULL, + @proxy_id=NULL, + @proxy_name=NULL +IF (@@ERROR <> 0 OR @ReturnCode <> 0) GOTO QuitWithRollback +/* Add Step */ +EXEC @ReturnCode = msdb.dbo.sp_add_jobstep @job_id=@jobId, @step_name=N'Empty step for success', + @step_id=3, + @cmdexec_success_code=0, + @on_success_action=1, + @on_success_step_id=0, + @on_fail_action=4, + @on_fail_step_id=4, + @retry_attempts=0, + @retry_interval=0, + @os_run_priority=0, @subsystem=N'TSQL', + @command=N'/* Empty step */', + @database_name=N'master', + @output_file_name=NULL, + @flags=0, + @database_user_name=NULL, + @server=NULL, + @additional_parameters=NULL, + @proxy_id=NULL, + @proxy_name=NULL +IF (@@ERROR <> 0 OR @ReturnCode <> 0) GOTO QuitWithRollback +/* Add Step */ +EXEC @ReturnCode = msdb.dbo.sp_add_jobstep @job_id=@jobId, @step_name=N'Send email KO', + @step_id=4, + @cmdexec_success_code=0, + @on_success_action=2, + @on_success_step_id=0, + @on_fail_action=2, + @on_fail_step_id=0, + @retry_attempts=0, + @retry_interval=0, + @os_run_priority=0, @subsystem=N'TSQL', + @command=N'exec aps_Send_Mail_with_template + @in_param_varchar_2 = ''DBA_operator;'';', + @database_name=N'HCITools', + @output_file_name=NULL, + @flags=0, + @database_user_name=NULL, + @server=NULL, + @additional_parameters=NULL, + @proxy_id=NULL, + @proxy_name=NULL +IF (@@ERROR <> 0 OR @ReturnCode <> 0) GOTO QuitWithRollback +EXEC @ReturnCode = msdb.dbo.sp_update_job @job_id = @jobId, @start_step_id = 1 +IF (@@ERROR <> 0 OR @ReturnCode <> 0) GOTO QuitWithRollback + +/* Attach existing specific schedule for job */ +declare @enabled_schedule int, + @schedule_name nvarchar(50) +declare c_schedules cursor local forward_only static for +select enabled, name + from msdb.dbo.sysschedules + where name LIKE '_92040%' + and name LIKE '%#SPEC#' + +open c_schedules + +FETCH NEXT FROM c_schedules into @enabled_schedule, @schedule_name +while @@fetch_status = 0 +begin + EXEC @ReturnCode = msdb.dbo.sp_attach_schedule @job_id = @jobId, @schedule_name=@schedule_name + IF(@enabled_schedule = 1) + begin + SET @schedule_name = SUBSTRING(@schedule_name,0,LEN(@schedule_name)-5) + IF EXISTS (select name from msdb.dbo.sysschedules where name = @schedule_name) + EXEC @ReturnCode = msdb.dbo.sp_update_schedule @name=@schedule_name, @enabled=0 + end + IF (@@ERROR <> 0 OR @ReturnCode <> 0) GOTO QuitWithRollback +FETCH NEXT FROM c_schedules into @enabled_schedule, @schedule_name +end + +close c_schedules + +deallocate c_schedules + +EXEC @ReturnCode = msdb.dbo.sp_add_jobserver @job_id = @jobId, @server_name = N'(local)' +IF (@@ERROR <> 0 OR @ReturnCode <> 0) GOTO QuitWithRollback +COMMIT TRANSACTION +GOTO EndSave +QuitWithRollback: + IF (@@TRANCOUNT > 0) ROLLBACK TRANSACTION +EndSave: + +GO + + +USE [msdb] +GO + +IF EXISTS (SELECT name FROM msdb.dbo.sysalerts WHERE name = N'DBA - WMI: Restore Database Events') +EXEC msdb.dbo.sp_delete_alert @name=N'DBA - WMI: Restore Database Events' +GO + +IF NOT EXISTS (SELECT name FROM msdb.dbo.syscategories WHERE name=N'SQL Server Agent Alerts' AND category_class=2) +EXEC msdb.dbo.sp_add_category @class=N'ALERT', @type=N'NONE', @name=N'SQL Server Agent Alerts' +GO + +DECLARE @namespace NVARCHAR(200); +IF (SERVERPROPERTY('InstanceName') IS NOT NULL) +BEGIN + SELECT @namespace = N'\\.\root\Microsoft\SqlServer\ServerEvents\' + + CONVERT(NVARCHAR(128), SERVERPROPERTY('InstanceName')); +END; +ELSE +BEGIN + SELECT @namespace = N'\\.\root\Microsoft\SqlServer\ServerEvents\APSSQL'; +END; + + +/* Création de l'alerte sur les restaurations de bases de données */ +EXEC msdb.dbo.sp_add_alert @name=N'DBA - WMI: Restore Database Events', + @message_id=0, + @severity=0, + @enabled=1, + @delay_between_responses=0, + @include_event_description_in=1, + @category_name=N'SQL Server Agent Alerts', + @wmi_namespace=@namespace, + @wmi_query=N'select * FROM AUDIT_BACKUP_RESTORE_EVENT WHERE EventSubClass = 2 AND Success = 1 AND TextData like ''%RESTORE DATABASE%''', + @job_name=N'_92040 - Response - DATABASE Restore Event' +GO \ No newline at end of file diff --git a/TPDT-268 - ACP in task sequence/dba_packages/DeployPerfMonReplication.sql b/TPDT-268 - ACP in task sequence/dba_packages/DeployPerfMonReplication.sql new file mode 100644 index 0000000..e7d7e1d --- /dev/null +++ b/TPDT-268 - ACP in task sequence/dba_packages/DeployPerfMonReplication.sql @@ -0,0 +1,502 @@ +/*============================================================================= + + User guide + --------------------------------------------------- + + 01. Create Table [Replication_queue_history] + 02. Create Indexes [NCIX_?] + 03. Create stored procedure [Get_replication_counters] + 04. Create Job [DR92280 - Monitoring SQL Server Replication] + + Usage context + ------------------------------------------ + To collect performance status for all publication's subscriptions in the server + + + Parameters + ------------------------------------------ + + Creation : 27.10.21 / RTC + + Modification : 17.03.2022 - FLA : Change DBA mail + 22.04.2022 - FLA : Correct SP location in job + +=============================================================================*/ + + +/***************************************************************/ +/****** Create Table [Replication_queue_history] *******/ +/***************************************************************/ +USE [HCITools] +GO + +SET ANSI_NULLS ON +GO + +SET QUOTED_IDENTIFIER ON +GO + +IF NOT EXISTS (SELECT * FROM sys.objects WHERE object_id = OBJECT_ID(N'[mon].[Replication_queue_history]') AND type in (N'U')) +BEGIN + +CREATE TABLE mon.Replication_queue_history( + Replication_queue_history_Id INT IDENTITY(1,1) NOT NULL, + RQH_subscriber_db VARCHAR(50) NOT NULL, + RQH_records_in_queue NUMERIC(18, 0) NULL, + RQH_catch_up_time NUMERIC(18, 0) NULL, + RQH_log_date DATETIME NOT NULL + CONSTRAINT PK_EPR_Replication_queue_history PRIMARY KEY CLUSTERED +( + RQH_subscriber_db ASC, RQH_log_date DESC +)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY] +) ON [PRIMARY] +END +GO + +/***************************************************************/ +/****** Create Procedure [Get_replication_counters] *******/ +/***************************************************************/ + +IF EXISTS (SELECT * FROM sys.objects WHERE object_id = OBJECT_ID(N'[dbo].[mon_Get_Replication_Counters]') AND type in (N'P', N'PC')) + DROP PROCEDURE [dbo].[mon_Get_Replication_Counters] +GO + +CREATE PROCEDURE [dbo].[mon_Get_Replication_Counters] + @in_debug INT = NULL +AS + +/*============================================================================= + + Explication du traitement realise par la SP + ------------------------------------------- + To collect performance counters in SQL Server Replication + + Contexte d'utilisation + ---------------------- + Job : DR92280 - Monitoring SQL Server Replication + + Parametres + ---------- + @in_debug + + Creation : 27.10.2021 / RTC + + Modifications : + +=============================================================================*/ + +DECLARE @cmd NVARCHAR(max) +DECLARE @publisher SYSNAME, + @publisher_db SYSNAME, + @publication SYSNAME, + @pubtype INT +DECLARE @subscriber SYSNAME, + @subscriber_db SYSNAME, + @subtype INT +DECLARE @cmdcount INT, + @processtime INT +DECLARE @ParmDefinition NVARCHAR(500) +DECLARE @JobName SYSNAME +DECLARE @minutes INT, + @threshold INT, + @maxCommands INT, + @mail CHAR(1) = 'N' +SET @minutes = 60 --> Define how many minutes latency before you would like to be notified +SET @maxCommands = 80000 ---> change this to represent the max number of outstanding commands to be proceduresed before notification +SET @threshold = @minutes * 60 + +/* Drop all temp tables */ +IF OBJECT_ID(N'tempdb..#PublisherInfo') is not null + drop table #PublisherInfo + +if exists (SELECT * + FROM [TempDB].sys.objects o WITH (NOLOCK) + WHERE o.name = '##PublicationInfo' + AND o.type IN (N'U')) + Drop table ##PublicationInfo + + +if exists (SELECT * + FROM [TempDB].sys.objects o WITH (NOLOCK) + WHERE o.name = '##SubscriptionInfo' + AND o.type IN (N'U')) + Drop table ##SubscriptionInfo + +SELECT * +INTO #PublisherInfo + FROM + OPENROWSET('SQLOLEDB', + 'SERVER=(LOCAL);TRUSTED_CONNECTION=YES;', + 'SET FMTONLY OFF EXEC distribution.dbo.sp_replmonitorhelppublisher WITH RESULT SETS ((publisher sysname, Distribution_db sysname, status int, warning int, publication_count int, returnstamp bigint))') -- + +select * + from #PublisherInfo + +SELECT @publisher = publisher + FROM #PublisherInfo + +SET @cmd + = 'SELECT * INTO ##PublicationInfo FROM OPENROWSET(''SQLOLEDB'',''SERVER=(LOCAL);TRUSTED_CONNECTION=YES'' +,''SET FMTONLY OFF EXEC distribution.dbo.sp_replmonitorhelppublication @publisher= ''''' + @publisher + + ''''' with result sets ((publisher_db sysname, publication sysname, publication_id int, publication_type int, status int, warning int, worst_latency int, best_latency int, average_latency int, last_distsync datetime, + retention int, latencythreshold int, expirationthreshold int, agentnotrunningthreshold int, subscriptioncount int, runningdistagentcount int, snapshot_agentname sysname, logreader_agentname sysname, + qreader_agentname sysname, worst_runspeedPerf int, best_runspeedPerf int, average_runspeedPerf int, retention_period_unit int, publisher sysname))'')' + +--select @cmd + +EXEC sp_executesql @cmd + +select * + FROM ##PublicationInfo + + +SELECT @publisher_db = publisher_db, + @publication = publication, + @pubtype = publication_type + FROM ##PublicationInfo + +SET @cmd + = 'SELECT * INTO ##SubscriptionInfo FROM OPENROWSET(''SQLOLEDB'',''SERVER=(LOCAL);TRUSTED_CONNECTION=YES'' +,''SET FMTONLY OFF EXEC distribution.dbo.sp_replmonitorhelpsubscription @publisher=''''' + @publisher + + ''''',@publication_type=' + CONVERT(CHAR(1), @pubtype) + + ' with result sets ((status int, warning int, subscriber sysname, subscriber_db sysname, publisher_db sysname, +publication sysname, publication_type int, subtype int, latency int, latencythreshold int, agentnotrunning int, agentnotrunningthreshold int, timetoexpiration int, expirationthreshold int, + last_distsync datetime, distribution_agentname sysname, mergeagentname sysname, mergesubscriptionfriendlyname sysname, mergeagentlocation sysname, mergeconnectiontype int, mergePerformance int, + mergerunspeed float, mergerunduration int, monitorranking int, distributionagentjobid binary(16), mergeagentjobid binary(16), distributionagentid int, distributionagentprofileid int, + mergeagentid int, mergeagentprofileid int, logreaderagentname sysname, publisher sysname ))'')' + +--select @cmd + +EXEC sp_executesql @cmd + +select * + from ##SubscriptionInfo + + +ALTER TABLE ##SubscriptionInfo +ADD PendingCmdCount INT NULL, + EstimatedProcessTime INT NULL + +DECLARE cur_sub CURSOR READ_ONLY FOR +SELECT @publisher, + s.publisher_db, + s.publication, + s.subscriber, + s.subscriber_db, + s.subtype, + s.distribution_agentname + FROM ##SubscriptionInfo s + +OPEN cur_sub +FETCH NEXT FROM cur_sub + INTO @publisher, + @publisher_db, + @publication, + @subscriber, + @subscriber_db, + @subtype, + @JobName + +WHILE @@FETCH_STATUS = 0 +BEGIN + SET @cmd + = 'SELECT @cmdcount=pendingcmdcount, @processtime=estimatedprocesstime FROM OPENROWSET(''SQLOLEDB'',''SERVER=(LOCAL);TRUSTED_CONNECTION=YES'' + ,''SET FMTONLY OFF EXEC distribution.dbo.sp_replmonitorsubscriptionpendingcmds @publisher=''''' + + @publisher + ''''',@publisher_db=''''' + @publisher_db + ''''',@publication=''''' + @publication + + ''''',@subscriber=''''' + @subscriber + ''''',@subscriber_db=''''' + @subscriber_db + + ''''',@subscription_type=' + CONVERT(CHAR(1), @subtype) + + ' With result sets ((pendingcmdcount int, estimatedprocesstime int))'')' + SET @ParmDefinition = N'@cmdcount INT OUTPUT, + @processtime INT OUTPUT' + select @cmd + EXEC sp_executesql @cmd, + @ParmDefinition, + @cmdcount OUTPUT, + @processtime OUTPUT + + SELECT @cmdcount, + @processtime + + UPDATE ##SubscriptionInfo + SET PendingCmdCount = @cmdcount, + EstimatedProcessTime = @processtime + WHERE subscriber_db = @subscriber_db + + INSERT INTO HCITools.mon.Replication_queue_history + VALUES (@subscriber, @cmdcount, @processtime, GETDATE()) + + FETCH NEXT FROM cur_sub + INTO @publisher, + @publisher_db, + @publication, + @subscriber, + @subscriber_db, + @subtype, + @JobName +END + +CLOSE cur_sub +DEALLOCATE cur_sub + +GO + +/***************************************************************/ +/****** Create Procedure [Purge_repl_queue_hist] *******/ +/***************************************************************/ + +IF EXISTS (SELECT * FROM sys.objects WHERE object_id = OBJECT_ID(N'[dbo].[mon_purge_repl_queue_hist]') AND type in (N'P', N'PC')) + DROP PROCEDURE [dbo].[mon_Purge_repl_queue_hist] +GO + +CREATE PROCEDURE [dbo].[mon_Purge_repl_queue_hist] + @in_debug INT = NULL +AS + +/*============================================================================= + + Explication du traitement realise par la SP + ------------------------------------------- + To purge performance counters history in HCITools + + Contexte d'utilisation + ---------------------- + Job : DR92280 - Monitoring SQL Server Replication + + Parametres + ---------- + @in_debug + + Creation : 27.10.2021 / RTC + + Modifications : + +=============================================================================*/ +DECLARE @delDate datetime = getdate()-30 + DELETE FROM mon.Replication_queue_history + WHERE RQH_log_date < @deldate + +GO + +/***************************************************************/ +/** Create Job [DR92280 - Monitoring SQL Server Replication] **/ +/***************************************************************/ + + +/* Drop existing standard schedule for job */ +declare @schedule_id int +declare c_schedules cursor local forward_only static for + select ss.schedule_id + from msdb.dbo.sysjobschedules sjs +INNER JOIN msdb.dbo.sysschedules ss + ON sjs.schedule_id = ss.schedule_id + AND ss.name NOT LIKE '%#SPEC#' +INNER JOIN msdb.dbo.sysjobs sj + ON sjs.job_id = sj.job_id + WHERE sj.name = N'DR92280 - Monitoring SQL Server Replication' + +open c_schedules + +FETCH NEXT FROM c_schedules into @schedule_id +while @@fetch_status = 0 +begin + IF ((select COUNT(*) from msdb.dbo.sysjobschedules where schedule_id=@schedule_id) = 1) + EXEC msdb.dbo.sp_delete_schedule @schedule_id=@schedule_id, @force_delete = 1 +FETCH NEXT FROM c_schedules into @schedule_id +end + +close c_schedules + +deallocate c_schedules + +IF EXISTS (SELECT job_id FROM msdb.dbo.sysjobs_view WHERE name = N'DR92280 - Monitoring SQL Server Replication') +EXEC msdb.dbo.sp_delete_job @job_name = N'DR92280 - Monitoring SQL Server Replication', @delete_unused_schedule=0 +GO + +/* Creation Job and Steps*/ +BEGIN TRANSACTION +DECLARE @ReturnCode INT +SELECT @ReturnCode = 0 + +IF NOT EXISTS (SELECT name FROM msdb.dbo.syscategories WHERE name=N'[Uncategorized (Local)]' AND category_class=1) +BEGIN +EXEC @ReturnCode = msdb.dbo.sp_add_category @class=N'JOB', @type=N'LOCAL', @name=N'[Uncategorized (Local)]' +IF (@@ERROR <> 0 OR @ReturnCode <> 0) GOTO QuitWithRollback + +END + +/* Add Job */ +DECLARE @jobId BINARY(16) +EXEC @ReturnCode = msdb.dbo.sp_add_job @job_name=N'DR92280 - Monitoring SQL Server Replication', + @enabled=1, + @notify_level_eventlog=0, + @notify_level_email=0, + @notify_level_netsend=0, + @notify_level_page=0, + @delete_level=0, + @description=N'27.10.2021 /RTC : Collect Data for replication monitoring', + @category_name=N'[Uncategorized (Local)]', + @start_step_id=1, + @owner_login_name=N'sa', @job_id = @jobId OUTPUT +IF (@@ERROR <> 0 OR @ReturnCode <> 0) GOTO QuitWithRollback + +/* Add Step */ +EXEC @ReturnCode = msdb.dbo.sp_add_jobstep @job_id=@jobId, @step_name=N'Empty step', + @step_id=1, + @cmdexec_success_code=0, + @on_success_action=3, + @on_success_step_id=0, + @on_fail_action=3, + @on_fail_step_id=0, + @retry_attempts=0, + @retry_interval=0, + @os_run_priority=0, @subsystem=N'TSQL', + @command=N'/*Empty step */', + @database_name=N'master', + @output_file_name=NULL, + @flags=0, + @database_user_name=NULL, + @server=NULL, + @additional_parameters=NULL, + @proxy_id=NULL, + @proxy_name=NULL +IF (@@ERROR <> 0 OR @ReturnCode <> 0) GOTO QuitWithRollback +/* Add Step */ +EXEC @ReturnCode = msdb.dbo.sp_add_jobstep @job_id=@jobId, @step_name=N'Repl monitor collect data', + @step_id=2, + @cmdexec_success_code=0, + @on_success_action=3, + @on_success_step_id=0, + @on_fail_action=4, + @on_fail_step_id=5, + @retry_attempts=0, + @retry_interval=0, + @os_run_priority=0, @subsystem=N'TSQL', + @command=N'exec [dbo].[mon_Get_Replication_Counters]', + @database_name=N'HCITools', + @output_file_name=NULL, + @flags=0, + @database_user_name=NULL, + @server=NULL, + @additional_parameters=NULL, + @proxy_id=NULL, + @proxy_name=NULL +IF (@@ERROR <> 0 OR @ReturnCode <> 0) GOTO QuitWithRollback +/* Add Step */ +EXEC @ReturnCode = msdb.dbo.sp_add_jobstep @job_id=@jobId, @step_name=N'Purge queue history', + @step_id=3, + @cmdexec_success_code=0, + @on_success_action=3, + @on_success_step_id=0, + @on_fail_action=4, + @on_fail_step_id=5, + @retry_attempts=0, + @retry_interval=0, + @os_run_priority=0, @subsystem=N'TSQL', + @command=N'exec [dbo].[mon_Purge_repl_queue_hist]', + @database_name=N'HCITools', + @output_file_name=NULL, + @flags=0, + @database_user_name=NULL, + @server=NULL, + @additional_parameters=NULL, + @proxy_id=NULL, + @proxy_name=NULL +IF (@@ERROR <> 0 OR @ReturnCode <> 0) GOTO QuitWithRollback +/* Add Step */ +EXEC @ReturnCode = msdb.dbo.sp_add_jobstep @job_id=@jobId, @step_name=N'Empty step for success', + @step_id=4, + @cmdexec_success_code=0, + @on_success_action=1, + @on_success_step_id=0, + @on_fail_action=3, + @on_fail_step_id=0, + @retry_attempts=0, + @retry_interval=0, + @os_run_priority=0, @subsystem=N'TSQL', + @command=N'/* EMpty step for success */', + @database_name=N'master', + @output_file_name=NULL, + @flags=0, + @database_user_name=NULL, + @server=NULL, + @additional_parameters=NULL, + @proxy_id=NULL, + @proxy_name=NULL +IF (@@ERROR <> 0 OR @ReturnCode <> 0) GOTO QuitWithRollback +/* Add Step */ +EXEC @ReturnCode = msdb.dbo.sp_add_jobstep @job_id=@jobId, @step_name=N'Send mail KO', + @step_id=5, + @cmdexec_success_code=0, + @on_success_action=2, + @on_success_step_id=0, + @on_fail_action=2, + @on_fail_step_id=0, + @retry_attempts=0, + @retry_interval=0, + @os_run_priority=0, @subsystem=N'TSQL', + @command=N'exec Get_Job_Error_Info @in_JobName = ''DR92280 - Monitoring SQL Server Replication'', @in_Recipients = ''DBA_operator''', + @database_name=N'HCITools', + @output_file_name=NULL, + @flags=0, + @database_user_name=NULL, + @server=NULL, + @additional_parameters=NULL, + @proxy_id=NULL, + @proxy_name=NULL +IF (@@ERROR <> 0 OR @ReturnCode <> 0) GOTO QuitWithRollback +EXEC @ReturnCode = msdb.dbo.sp_update_job @job_id = @jobId, @start_step_id = 1 +IF (@@ERROR <> 0 OR @ReturnCode <> 0) GOTO QuitWithRollback + +/* Add Standard Schedule */ +EXEC @ReturnCode = msdb.dbo.sp_add_jobschedule @job_id=@jobId, @name=N'DR92280-DR', + @enabled=1, + @freq_type=4, + @freq_interval=1, + @freq_subday_type=4, + @freq_subday_interval=10, + @freq_relative_interval=0, + @freq_recurrence_factor=0, + @active_start_date=20210820, + @active_end_date=99991231, + @active_start_time=0, + @active_end_time=235959 +IF (@@ERROR <> 0 OR @ReturnCode <> 0) GOTO QuitWithRollback + +/* Attach existing specific schedule for job */ +declare @enabled_schedule int, + @schedule_name nvarchar(50) +declare c_schedules cursor local forward_only static for +select enabled, name + from msdb.dbo.sysschedules + where name LIKE 'DR92280%' + and name LIKE '%#SPEC#' + +open c_schedules + +FETCH NEXT FROM c_schedules into @enabled_schedule, @schedule_name +while @@fetch_status = 0 +begin + EXEC @ReturnCode = msdb.dbo.sp_attach_schedule @job_id = @jobId, @schedule_name=@schedule_name + IF(@enabled_schedule = 1) + begin + SET @schedule_name = SUBSTRING(@schedule_name,0,LEN(@schedule_name)-5) + IF EXISTS (select name from msdb.dbo.sysschedules where name = @schedule_name) + EXEC @ReturnCode = msdb.dbo.sp_update_schedule @name=@schedule_name, @enabled=0 + end + IF (@@ERROR <> 0 OR @ReturnCode <> 0) GOTO QuitWithRollback +FETCH NEXT FROM c_schedules into @enabled_schedule, @schedule_name +end + +close c_schedules + +deallocate c_schedules + +EXEC @ReturnCode = msdb.dbo.sp_add_jobserver @job_id = @jobId, @server_name = N'(local)' +IF (@@ERROR <> 0 OR @ReturnCode <> 0) GOTO QuitWithRollback +COMMIT TRANSACTION +GOTO EndSave +QuitWithRollback: + IF (@@TRANCOUNT > 0) ROLLBACK TRANSACTION +EndSave: + +GO diff --git a/TPDT-268 - ACP in task sequence/dba_packages/DeployPerfMonitoringSSRS.sql b/TPDT-268 - ACP in task sequence/dba_packages/DeployPerfMonitoringSSRS.sql new file mode 100644 index 0000000..f410b81 --- /dev/null +++ b/TPDT-268 - ACP in task sequence/dba_packages/DeployPerfMonitoringSSRS.sql @@ -0,0 +1,3465 @@ +/*============================================================================= + + User guide + --------------------------------------------------- + + 01. Create Table [Monitoring_area] + 02. Create Table [Monitoring_counter] + 03. Create Table [Monitoring_history] + 04. Create Table [Monitoring_threshold] + + 05. Create Indexes [NCIX_MonitoringHistory_MHDatetime] + 06. Create Index [NCIX_MonitoringHistory_COL_MHMonitoringCounter] + + 07. Create Security User + + 08. Insert Data in [Monitoring_area] + 09. Insert Data in [Monitoring_counter] + 10. Insert Data in [Monitoring_threshold] + + 11. Create Stored Procedures [mon_Collect_Counters_History] + 12. Create Stored Procedures [mon_Get_Counters_History] + + 13. Create Job [DR92170 - Monitoring SQL Server Performances] + + Usage context + ------------------------------------------ + To get sensor in the server and make a server reporting + + + Parameters + ------------------------------------------ + + Creation : 18.07.18 / KLU + + Modification : + 23.07.2018/LPE : Add [MC_type]=5 in SP [mon_Collect_Counters_History] to get aggregate values. + Modify [MC_type] from 2 to 5 for counter "Deadlock". + 26.07.2018/LPE : Add counter "Processes blocked" + 19.09.2018/SPE : #BUG 48620# [MH_value] could be NULL in table [HCITools].[dbo].[Monitoring_history] + 08.11.2018/FLA : Add counter "Memory Grants Outstanding" + 15.11.2019/LPE : #TFS56565# Optimize performance of table [HCITools].[dbo].[Monitoring_counter] + 17.03.2022/FLA : Change DBA mail +=============================================================================*/ + + +/***************************************************************/ +/********** Create Table [Monitoring_area] *************/ +/***************************************************************/ +USE [HCITools] +GO + +/* ***** Object: Table [dbo].[Monitoring_area] Script Date: 12.07.2018 11:49:12 ***** */ +SET ANSI_NULLS ON +GO + +SET QUOTED_IDENTIFIER ON +GO + +IF NOT EXISTS (SELECT * FROM sys.objects WHERE object_id = OBJECT_ID(N'[dbo].[Monitoring_area]') AND type in (N'U')) +BEGIN + +CREATE TABLE [dbo].[Monitoring_area]( + [Monitoring_area_ID] [bigint] IDENTITY(1,1) NOT NULL, + [MA_name] [nvarchar](60) NOT NULL, + CONSTRAINT [PK_Monitoring_area] PRIMARY KEY CLUSTERED +( + [Monitoring_area_ID] ASC +)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY] +) ON [PRIMARY] +END +GO + +/*****************************************************************/ +/********** Create Table [Monitoring_counter] ************/ +/*****************************************************************/ + +USE [HCITools] +GO + +/****** Object: Table [dbo].[Monitoring_counter] Script Date: 12.07.2018 12:52:58 ******/ +SET ANSI_NULLS ON +GO + +SET QUOTED_IDENTIFIER ON +GO + +IF NOT EXISTS (SELECT * FROM sys.objects WHERE object_id = OBJECT_ID(N'[dbo].[Monitoring_counter]') AND type in (N'U')) +BEGIN + +CREATE TABLE [dbo].[Monitoring_counter]( + [Monitoring_counter_ID] [bigint] IDENTITY(1,1) NOT NULL, + [MC_name] [nvarchar](60) NOT NULL, + [MC_type] [smallint] NOT NULL, + [MC_sql_query] [nvarchar](max) NULL, + [MC_definition] [nvarchar](max) NULL, + [MC_information] [nvarchar](max) NULL, + [MC_problem] [nvarchar](max) NULL, + [MC_remediation] [nvarchar](max) NULL, + [MC_sequence] [smallint] NULL, + [MC_is_visible] [bit] NOT NULL, + [MC_monitoring_area] [bigint] NOT NULL, + CONSTRAINT [PK_Monitoring_counter] PRIMARY KEY CLUSTERED +( + [Monitoring_counter_ID] ASC +)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY] +) ON [PRIMARY] TEXTIMAGE_ON [PRIMARY] +END +GO +IF NOT EXISTS (SELECT * FROM sys.objects WHERE object_id = OBJECT_ID(N'[dbo].[DF_Monitoring_counter_MC_is_visible]') AND type = 'D') +BEGIN +ALTER TABLE [dbo].[Monitoring_counter] ADD CONSTRAINT [DF_Monitoring_counter_MC_is_visible] DEFAULT ((1)) FOR [MC_is_visible] +END +GO +IF NOT EXISTS (SELECT * FROM sys.foreign_keys WHERE object_id = OBJECT_ID(N'[dbo].[FK_Monitoring_counter_Monitoring_area]') AND parent_object_id = OBJECT_ID(N'[dbo].[Monitoring_counter]')) +ALTER TABLE [dbo].[Monitoring_counter] WITH CHECK ADD CONSTRAINT [FK_Monitoring_counter_Monitoring_area] FOREIGN KEY([MC_monitoring_area]) +REFERENCES [dbo].[Monitoring_area] ([Monitoring_area_ID]) +GO +IF EXISTS (SELECT * FROM sys.foreign_keys WHERE object_id = OBJECT_ID(N'[dbo].[FK_Monitoring_counter_Monitoring_area]') AND parent_object_id = OBJECT_ID(N'[dbo].[Monitoring_counter]')) +ALTER TABLE [dbo].[Monitoring_counter] CHECK CONSTRAINT [FK_Monitoring_counter_Monitoring_area] +GO + +/*****************************************************************/ +/********** Create Table [Monitoring_history] ************/ +/*****************************************************************/ + +USE [HCITools] +GO + +/****** Object: Table [dbo].[Monitoring_history] Script Date: 16.07.2018 13:18:06 ******/ +SET ANSI_NULLS ON +GO + +SET QUOTED_IDENTIFIER ON +GO + +IF NOT EXISTS (SELECT * FROM sys.objects WHERE object_id = OBJECT_ID(N'[dbo].[Monitoring_history]') AND type in (N'U')) +BEGIN +CREATE TABLE [dbo].[Monitoring_history]( + [Monitoring_history_ID] [bigint] IDENTITY(1,1) NOT NULL, + [MH_instance_name] [nvarchar](128) NULL, + [MH_value] [bigint] NULL, -- [# SPE] + [MH_original_value] [bigint] NULL, + [MH_datetime] [datetime] NOT NULL, + [MH_monitoring_counter] [bigint] NOT NULL, + CONSTRAINT [PK_Monitoring_history] PRIMARY KEY CLUSTERED +( + [Monitoring_history_ID] ASC +)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY] +) ON [PRIMARY] +END + +GO +IF NOT EXISTS (SELECT * FROM sys.foreign_keys WHERE object_id = OBJECT_ID(N'[dbo].[FK_Monitoring_history_Monitoring_counter]') AND parent_object_id = OBJECT_ID(N'[dbo].[Monitoring_history]')) +ALTER TABLE [dbo].[Monitoring_history] WITH CHECK ADD CONSTRAINT [FK_Monitoring_history_Monitoring_counter] FOREIGN KEY([MH_monitoring_counter]) +REFERENCES [dbo].[Monitoring_counter] ([Monitoring_counter_ID]) +GO +IF EXISTS (SELECT * FROM sys.foreign_keys WHERE object_id = OBJECT_ID(N'[dbo].[FK_Monitoring_history_Monitoring_counter]') AND parent_object_id = OBJECT_ID(N'[dbo].[Monitoring_history]')) +ALTER TABLE [dbo].[Monitoring_history] CHECK CONSTRAINT [FK_Monitoring_history_Monitoring_counter] +GO + +/*****************************************************************/ +/********** Create Table [Monitoring_threshold] **********/ +/*****************************************************************/ +USE [HCITools] +GO + +/****** Object: Table [dbo].[Monitoring_threshold] Script Date: 16.07.2018 13:20:11 ******/ +SET ANSI_NULLS ON +GO + +SET QUOTED_IDENTIFIER ON +GO + +IF NOT EXISTS (SELECT * FROM sys.objects WHERE object_id = OBJECT_ID(N'[dbo].[Monitoring_threshold]') AND type in (N'U')) +BEGIN +CREATE TABLE [dbo].[Monitoring_threshold]( + [Monitoring_threshold_ID] [bigint] IDENTITY(1,1) NOT NULL, + [MT_warning_threshold_low] [bigint] NULL, + [MT_warning_threshold_high] [bigint] NULL, + [MT_critical_threshold_low] [bigint] NULL, + [MT_critical_threshold_high] [bigint] NULL, + [MT_server_name] [nvarchar](256) NULL, + [MT_monitoring_counter] [bigint] NOT NULL, + CONSTRAINT [PK_Monitoring_threshold] PRIMARY KEY CLUSTERED +( + [Monitoring_threshold_ID] ASC +)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY] +) ON [PRIMARY] +END +GO + +IF NOT EXISTS (SELECT * FROM sys.foreign_keys WHERE object_id = OBJECT_ID(N'[dbo].[FK_Monitoring_threshold_Monitoring_counter]') AND parent_object_id = OBJECT_ID(N'[dbo].[Monitoring_threshold]')) +ALTER TABLE [dbo].[Monitoring_threshold] WITH CHECK ADD CONSTRAINT [FK_Monitoring_threshold_Monitoring_counter] FOREIGN KEY([MT_monitoring_counter]) +REFERENCES [dbo].[Monitoring_counter] ([Monitoring_counter_ID]) +GO +IF EXISTS (SELECT * FROM sys.foreign_keys WHERE object_id = OBJECT_ID(N'[dbo].[FK_Monitoring_threshold_Monitoring_counter]') AND parent_object_id = OBJECT_ID(N'[dbo].[Monitoring_threshold]')) +ALTER TABLE [dbo].[Monitoring_threshold] CHECK CONSTRAINT [FK_Monitoring_threshold_Monitoring_counter] +GO + + +/**********************************************************************************************************************************/ +/*****************************************************************/ +/********** Indexes [NCIX_MonitoringHistory_MHDatetime] ********/ +/*****************************************************************/ + +USE [HCITools] +GO + +IF NOT EXISTS (SELECT * FROM sys.indexes WHERE name = 'NCIX_MonitoringHistory_MHDatetime') +BEGIN +Print 'Creation of index NCIX_MonitoringHistory_MHDatetime on table Monitoring_history' + +CREATE NONCLUSTERED INDEX [NCIX_MonitoringHistory_MHDatetime] ON [dbo].[Monitoring_history] +( + [MH_datetime] ASC +) +INCLUDE ( [MH_value], + [MH_monitoring_counter]) WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, SORT_IN_TEMPDB = OFF, DROP_EXISTING = OFF, ONLINE = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY] + +END +Go + +/*****************************************************************/ +/********** Indexes [NCIX_MonitoringHistory_MHDatetime] ********/ +/*****************************************************************/ + +USE [HCITools] +GO + +IF NOT EXISTS (SELECT * FROM sys.indexes WHERE name = 'NCIX_MonitoringHistory_COL_MHMonitoringCounter') +BEGIN +Print 'Creation of index NCIX_MonitoringHistory_COL_MHMonitoringCounter on table Monitoring_history' + +CREATE NONCLUSTERED INDEX [NCIX_MonitoringHistory_COL_MHMonitoringCounter] ON [dbo].[Monitoring_history] +( + [MH_monitoring_counter] ASC +) +INCLUDE ([MH_instance_name]) 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 = ON) ON [PRIMARY] + +END +GO + +/**********************************************************************************************************************************/ +/******************************************************************/ +/******************** Create Security User *******************/ +/******************************************************************/ + +USE [HCITools] +GO +IF NOT EXISTS (SELECT * FROM sys.database_principals WHERE name = 'sqlMonPerfUsr') +BEGIN +CREATE USER [sqlMonPerfUsr] FOR LOGIN [sqlMonPerfUsr] WITH DEFAULT_SCHEMA=[dbo] +END +GO +use [HCITools] +GO +GRANT SELECT ON [dbo].[Monitoring_area] TO [sqlMonPerfUsr] +GO +use [HCITools] +GO +GRANT SELECT ON [dbo].[Monitoring_counter] TO [sqlMonPerfUsr] +GO +use [HCITools] +GO +GRANT SELECT ON [dbo].[Monitoring_history] TO [sqlMonPerfUsr] +GO + +use [HCITools] +GO +GRANT SELECT ON [dbo].[Monitoring_threshold] TO [sqlMonPerfUsr] +GO + +/**********************************************************************************************************************************/ +/*****************************************************************/ +/********** Insert Data in [Monitoring_area] *************/ +/*****************************************************************/ + +USE [HCITools] +GO +SET IDENTITY_INSERT [dbo].[Monitoring_area] ON +IF NOT EXISTS (SELECT * FROM [dbo].[Monitoring_area] WHERE [MA_name] = 'Buffer Manager') +BEGIN +INSERT INTO [dbo].[Monitoring_area] + ([Monitoring_area_ID] + ,[MA_name]) + VALUES((1) + ,('Buffer Manager') + ) +END +GO + +IF NOT EXISTS (SELECT * FROM [dbo].[Monitoring_area] WHERE [MA_name] = 'Cache') +BEGIN +INSERT INTO [dbo].[Monitoring_area] + ([Monitoring_area_ID] + ,[MA_name]) + VALUES((2) + ,('Cache') + ) +END +GO + +IF NOT EXISTS (SELECT * FROM [dbo].[Monitoring_area] WHERE [MA_name] = 'Latches and Locks') +BEGIN +INSERT INTO [dbo].[Monitoring_area] + ([Monitoring_area_ID] + ,[MA_name]) + VALUES((3) + ,('Latches and Locks') + ) +END +GO + +IF NOT EXISTS (SELECT * FROM [dbo].[Monitoring_area] WHERE [MA_name] = 'Memory') +BEGIN +INSERT INTO [dbo].[Monitoring_area] + ([Monitoring_area_ID] + ,[MA_name]) + VALUES((4) + ,('Memory') + ) +END +GO + +IF NOT EXISTS (SELECT * FROM [dbo].[Monitoring_area] WHERE [MA_name] = 'Pages') +BEGIN +INSERT INTO [dbo].[Monitoring_area] + ([Monitoring_area_ID] + ,[MA_name]) + VALUES((5) + ,('Pages') + ) +END +GO + +IF NOT EXISTS (SELECT * FROM [dbo].[Monitoring_area] WHERE [MA_name] = 'SQL Server') +BEGIN +INSERT INTO [dbo].[Monitoring_area] + ([Monitoring_area_ID] + ,[MA_name]) + VALUES((6) + ,('SQL Server') + ) +END +GO + +IF NOT EXISTS (SELECT * FROM [dbo].[Monitoring_area] WHERE [MA_name] = 'Connections') +BEGIN +INSERT INTO [dbo].[Monitoring_area] + ([Monitoring_area_ID] + ,[MA_name]) + VALUES((7) + ,('Connections') + ) +END +GO + +IF NOT EXISTS (SELECT * FROM [dbo].[Monitoring_area] WHERE [MA_name] = 'Sessions') +BEGIN +INSERT INTO [dbo].[Monitoring_area] + ([Monitoring_area_ID] + ,[MA_name]) + VALUES((8) + ,('Sessions') + ) +END +GO + +IF NOT EXISTS (SELECT * FROM [dbo].[Monitoring_area] WHERE [MA_name] = 'Disk') +BEGIN +INSERT INTO [dbo].[Monitoring_area] + ([Monitoring_area_ID] + ,[MA_name]) + VALUES((9) + ,('Disk') + ) +END +GO + +IF NOT EXISTS (SELECT * FROM [dbo].[Monitoring_area] WHERE [MA_name] = 'Processes') +BEGIN +INSERT INTO [dbo].[Monitoring_area] + ([Monitoring_area_ID] + ,[MA_name]) + VALUES((10) + ,('Processes') + ) +END +SET IDENTITY_INSERT [dbo].[Monitoring_area] OFF +GO + +/*****************************************************************/ +/********** Insert Data in [Monitoring_counter] **********/ +/*****************************************************************/ + +USE [HCITools] +GO +SET IDENTITY_INSERT [dbo].[Monitoring_counter] ON +IF NOT EXISTS (SELECT * FROM [dbo].[Monitoring_counter] WHERE [MC_name] = 'Buffer Cache Hit Ratio') +BEGIN +INSERT INTO [dbo].[Monitoring_counter] + ([Monitoring_counter_ID] + ,[MC_name] + ,[MC_type] + ,[MC_sql_query] + ,[MC_definition] + ,[MC_information] + ,[MC_problem] + ,[MC_remediation] + ,[MC_sequence] + ,[MC_is_visible] + ,[MC_monitoring_area]) + VALUES((1) + ,('Buffer Cache Hit Ratio') + ,(1) + ,('SELECT CONVERT(decimal(15,2), 100.0 * t.CacheHitRatio / t.CacheHitRatioBase) + FROM ( + SELECT( + SELECT cntr_value AS ''CacheHitRatio'' + FROM sys.dm_os_performance_counters + WHERE object_name LIKE ''%:Buffer Manager%'' + AND counter_name = ''Buffer cache hit ratio'' + ) AS ''CacheHitRatio'', + ( + SELECT cntr_value AS ''CacheHitRatioBase'' + FROM sys.dm_os_performance_counters + WHERE object_name LIKE ''%:Buffer Manager%'' + AND counter_name = ''Buffer cache hit ratio base'' + ) AS ''CacheHitRatioBase'' + ) AS t; + ') + ,('Indicates the percentage of pages found in the buffer cache without having to read from disk. The ratio is the total number of cache hits divided by the total number of cache lookups over the last few thousand page accesses.') + ,('After a long period of time, the ratio moves very little. Because reading from the cache is much less expensive than reading from disk, you want this ratio to be high. Generally, you can increase the buffer cache hit ratio by increasing the amount of memory available to SQL Server. The higher this ratio, the less often SQL Server has to go to the hard disk to fetch data, and performance is boosted overall. This counter averages the Buffer Cache Hit Ratio from the time the last instance of SQL Server was restarted. This counter is not a real-time measurement, but an average of all the days since SQL Server was last restarted. In OLAP (http://en.wikipedia.org/wiki/Online_analytical_processing) applications, the ratio could be much lower because of the nature of how OLAP works.') + ,('If the returned value is low, this could indicate that your SQL server may not have enough memory to function at peak performance.') + ,('Check your SQL server and verify its memory is being used efficiently. Applications other than SQL may be using a great deal of memory. Try and recover memory by closing unnecessary applications. Installing additional memory may also help.') + ,(1) + ,(1) + ,(1) + ) +END +GO + +IF NOT EXISTS (SELECT * FROM [dbo].[Monitoring_counter] WHERE [MC_name] = 'Page Life Expectancy') +BEGIN +INSERT INTO [dbo].[Monitoring_counter] + ([Monitoring_counter_ID] + ,[MC_name] + ,[MC_type] + ,[MC_sql_query] + ,[MC_definition] + ,[MC_information] + ,[MC_problem] + ,[MC_remediation] + ,[MC_sequence] + ,[MC_is_visible] + ,[MC_monitoring_area]) + VALUES((2) + ,('Page Life Expectancy') + ,(1) + ,('SELECT cntr_value + FROM sys.dm_os_performance_counters + WHERE object_name LIKE ''%:Buffer Manager%'' + AND counter_name = ''Page Life Expectancy''; + ') + ,('This performance counter returns the number of seconds a page will stay in the buffer pool (http://msdn.microsoft.com/en-us/library/aa337525.aspx) without references.') + ,('This performance monitor reports, on average, how long data pages are staying in the buffer.') + ,('If this value gets below 300 seconds, this is a potential indication that your SQL Server could use more memory in order to boost performance. Consistently having pages that stay in memory for less than that amount of time may indicate the need for more memory.') + ,('Add additional memory to your SQL server.') + ,(1) + ,(1) + ,(5) + ) +END +GO + +IF NOT EXISTS (SELECT * FROM [dbo].[Monitoring_counter] WHERE [MC_name] = 'Lock Waits/sec') +BEGIN +INSERT INTO [dbo].[Monitoring_counter] + ([Monitoring_counter_ID] + ,[MC_name] + ,[MC_type] + ,[MC_sql_query] + ,[MC_definition] + ,[MC_information] + ,[MC_problem] + ,[MC_remediation] + ,[MC_sequence] + ,[MC_is_visible] + ,[MC_monitoring_area]) + VALUES((3) + ,('Lock Waits/sec') + ,(2) + ,('SELECT cntr_value + FROM sys.dm_os_performance_counters + WHERE object_name LIKE ''%:Locks%'' + AND counter_name = ''Lock Waits/sec'' + AND instance_name = ''_Total''; + ') + ,('This performance counter reports the number of times users waited to acquire a lock over the past second.') + ,('Note that this counter only gets incremented only when you “wake up†after waiting on the lock. In order for thresholds to be tuned to your environment, thresholds for this performance counter should be set using the Baseline Calculator.') + ,('Non-zero values indicate that there is at least some level of blocking (http://support.microsoft.com/kb/224453) occurring. If you combine this with the Lock Wait Time counter, you can get some idea of how long the blocking lasted. A zero value for this counter can definitively rule out blocking as a potential cause.') + ,('High Read queries should be reviewed.') + ,(1) + ,(1) + ,(3) + ) +END +GO + +IF NOT EXISTS (SELECT * FROM [dbo].[Monitoring_counter] WHERE [MC_name] = 'Page Reads/sec') +BEGIN +INSERT INTO [dbo].[Monitoring_counter] + ([Monitoring_counter_ID] + ,[MC_name] + ,[MC_type] + ,[MC_sql_query] + ,[MC_definition] + ,[MC_information] + ,[MC_problem] + ,[MC_remediation] + ,[MC_sequence] + ,[MC_is_visible] + ,[MC_monitoring_area]) + VALUES((4) + ,('Page Reads/sec') + ,(2) + ,('SELECT cntr_value + FROM sys.dm_os_performance_counters + WHERE object_name LIKE ''%:Buffer Manager%'' + AND counter_name = ''Page reads/sec''; + ') + ,('This performance counter returns the number of physical database page reads issued.') + ,('80 – 90 physical database page reads per second is normal.') + ,('Returned values that are high could indicate indexing or memory constraint.') + ,('Attempt to tune the application so that fewer I/O operations are required. For example, perhaps I/O operations would be reduced if there were the appropriate indexes, or if the database design were de-normalized. If the applications cannot be tuned, you will need to acquire disk devices with more capacity. Because physical I/O operations are expensive, you may be able to minimize the cost either by using a larger data cache, intelligent indexes, more efficient queries, or by changing the database design.') + ,(1) + ,(1) + ,(5) + ) +END +GO + +IF NOT EXISTS (SELECT * FROM [dbo].[Monitoring_counter] WHERE [MC_name] = 'Page Writes/sec') +BEGIN +INSERT INTO [dbo].[Monitoring_counter] + ([Monitoring_counter_ID] + ,[MC_name] + ,[MC_type] + ,[MC_sql_query] + ,[MC_definition] + ,[MC_information] + ,[MC_problem] + ,[MC_remediation] + ,[MC_sequence] + ,[MC_is_visible] + ,[MC_monitoring_area]) + VALUES((5) + ,('Page Writes/sec') + ,(2) + ,('SELECT cntr_value + FROM sys.dm_os_performance_counters + WHERE object_name LIKE ''%:Buffer Manager%'' + AND counter_name = ''Page writes/sec''; + ') + ,('This performance counter returns the number of physical database page writes issued.') + ,('80 – 90 physical database page writes per second is normal.') + ,('If the returned values are high, you should check the Lazy Writer/sec monitor and checkpoint counters. If the value for these counters is also relatively high then, it is a memory constraint.') + ,(NULL) + ,(1) + ,(1) + ,(5) + ) +END +GO + +IF NOT EXISTS (SELECT * FROM [dbo].[Monitoring_counter] WHERE [MC_name] = 'Full Scans/sec') +BEGIN +INSERT INTO [dbo].[Monitoring_counter] + ([Monitoring_counter_ID] + ,[MC_name] + ,[MC_type] + ,[MC_sql_query] + ,[MC_definition] + ,[MC_information] + ,[MC_problem] + ,[MC_remediation] + ,[MC_sequence] + ,[MC_is_visible] + ,[MC_monitoring_area]) + VALUES((6) + ,('Full Scans/sec') + ,(2) + ,('SELECT cntr_value + FROM sys.dm_os_performance_counters + WHERE object_name LIKE ''%:Access Methods%'' + AND counter_name = ''Full Scans/sec''; + ') + ,('This performance counter returns the number of Full Scans on base tables or indexes.') + ,('This is the number of unrestricted full scans per second. These can be either base-table or full-index scans. In order for thresholds to be tuned to your environment, thresholds for this performance counter should be set using the Baseline Calculator.') + ,('Values greater than 1 or 2 indicate table/Index page scans are occurring. If the CPU is running high, you should investigate the cause as related to this counter measurement. You can rule this out as a problem if the full scans are on small tables.') + ,('Following are a few of the main causes of high Full Scans/sec: • Missing indexes • Too many rows requested; Queries with missing indexes or too many rows requested will have a large number of logical reads and an increased CPU time. • Scans are IO-intensive and should run within your databases minimally. Identify the tables that have a large number of scans against them. Review the fill factor you have set up on your indexes and minimize it where appropriate.') + ,(1) + ,(1) + ,(6) + ) +END +GO + +IF NOT EXISTS (SELECT * FROM [dbo].[Monitoring_counter] WHERE [MC_name] = 'User Connections') +BEGIN +INSERT INTO [dbo].[Monitoring_counter] + ([Monitoring_counter_ID] + ,[MC_name] + ,[MC_type] + ,[MC_sql_query] + ,[MC_definition] + ,[MC_information] + ,[MC_problem] + ,[MC_remediation] + ,[MC_sequence] + ,[MC_is_visible] + ,[MC_monitoring_area]) + VALUES((7) + ,('User Connections') + ,(1) + ,('SELECT cntr_value + FROM sys.dm_os_performance_counters + WHERE object_name LIKE ''%:General Statistics%'' + AND counter_name = ''User Connections''; + ') + ,('The User Connections performance counter identifies the number of different users that are connected to your SQL Server at the time the sample was taken.') + ,('You need to watch this counter over time to understand your baseline user connection numbers. Since each user connection consumes some memory space, a high number of user connections can impact throughput and cause a performance slow-down. Once you have an idea of your high and low thresholds during normal usage of your system, you can then look for times when this counter exceeds these high and low marks.') + ,('If the returned value of this counter goes down and the load on the system remains stable, you might have a bottleneck that is not allowing your server to handle the normal load. Keep in mind that this counter value might go down just because less people are using your SQL Server instance. If you see this number jump by 500% from your baseline, you may be seeing a slowdown of your server activity.') + ,('You may want to boost the SQL Server configuration setting, Maximum Worker Threads to a figure higher than the default setting of 255. The setting for Maximum Worker Threads should be higher than the maximum number of user connections your server ever reaches.') + ,(1) + ,(1) + ,(7) + ) +END +GO + +IF NOT EXISTS (SELECT * FROM [dbo].[Monitoring_counter] WHERE [MC_name] = 'Total Server Memory (MB)') +BEGIN +INSERT INTO [dbo].[Monitoring_counter] + ([Monitoring_counter_ID] + ,[MC_name] + ,[MC_type] + ,[MC_sql_query] + ,[MC_definition] + ,[MC_information] + ,[MC_problem] + ,[MC_remediation] + ,[MC_sequence] + ,[MC_is_visible] + ,[MC_monitoring_area]) + VALUES((8) + ,('Total Server Memory (MB)') + ,(1) + ,('SELECT cntr_value/ 1024 + FROM sys.dm_os_performance_counters + WHERE object_name LIKE ''%:Memory Manager%'' + AND counter_name = ''Total Server Memory (KB)''; + ') + ,('This performance counter measures the current amount of memory that SQL Server is using.') + ,('If the value of this counter continues to grow larger, the server has not yet reached its steady state and is still trying to populate the cache and get pages loaded into memory. Performance will likely be somewhat slower if this value continually grows larger since more disk I/O is required. This behavior is normal. Eventually Total Server Memory should approximate Target Server Memory.') + ,('If the Total Server Memory counter is greater than or equal to the Target Server Memory counter, this can indicate that your SQL Server may be under memory pressure.') + ,('Installing additional memory into your SQL server should resolve the problem.') + ,(1) + ,(1) + ,(4) + ) +END +GO + +IF NOT EXISTS (SELECT * FROM [dbo].[Monitoring_counter] WHERE [MC_name] = 'Target Server Memory (MB)') +BEGIN +INSERT INTO [dbo].[Monitoring_counter] + ([Monitoring_counter_ID] + ,[MC_name] + ,[MC_type] + ,[MC_sql_query] + ,[MC_definition] + ,[MC_information] + ,[MC_problem] + ,[MC_remediation] + ,[MC_sequence] + ,[MC_is_visible] + ,[MC_monitoring_area]) + VALUES((9) + ,('Target Server Memory (MB)') + ,(1) + ,('SELECT cntr_value/ 1024 + FROM sys.dm_os_performance_counters + WHERE object_name LIKE ''%:Memory Manager%'' + AND counter_name = ''Target Server Memory (KB)''; + ') + ,('This performance counter measures the total amount of dynamic memory the server can consume.') + ,('This performance counter tells you how much memory SQL Server would like to use to operate efficiently. Compare with Total Server Memory.') + ,('If the Total Server Memory counter is greater than or equal to the Target Server Memory counter, this could indicate that your SQL Server may be under memory pressure.') + ,('Installing additional memory into your SQL server should resolve the problem.') + ,(1) + ,(1) + ,(4) + ) +END +GO + +IF NOT EXISTS (SELECT * FROM [dbo].[Monitoring_counter] WHERE [MC_name] = 'Lazy Writes/sec') +BEGIN +INSERT INTO [dbo].[Monitoring_counter] + ([Monitoring_counter_ID] + ,[MC_name] + ,[MC_type] + ,[MC_sql_query] + ,[MC_definition] + ,[MC_information] + ,[MC_problem] + ,[MC_remediation] + ,[MC_sequence] + ,[MC_is_visible] + ,[MC_monitoring_area]) + VALUES((10) + ,('Lazy Writes/sec') + ,(2) + ,('SELECT cntr_value + FROM sys.dm_os_performance_counters + WHERE object_name LIKE ''%:Buffer Manager%'' + AND counter_name = ''Lazy writes/sec''; + ') + ,('The lazy writer is a system process that flushes out buffers that contain changes that must be written back to disk before the buffer can be reused for a different page and makes them available to user processes.') + ,('This performance counter tracks how many times per second that the Lazy Writer process is moving dirty pages from the buffer to disk in order to free up buffer space. The Lazy Writer eliminates the need to perform frequent checkpoints in order to create available buffers. Generally speaking, this should not be a high value, say more than 20 per second. Ideally, it should be close to zero. If it is zero, this indicates that your SQL Server''''s buffer cache is large and your SQL Server does not need to free up dirty pages.') + ,('If the returned value is high, this can indicate that your SQL Server''''s buffer cache is small and that your SQL Server needs to free up dirty pages.') + ,('Check your SQL server and verify its memory is being used efficiently. Applications other than SQL may be using a great deal of memory. Try and recover memory by closing unnecessary applications. Installing additional memory may also help.') + ,(1) + ,(1) + ,(1) + ) +END +GO + +IF NOT EXISTS (SELECT * FROM [dbo].[Monitoring_counter] WHERE [MC_name] = 'Logins/sec') +BEGIN +INSERT INTO [dbo].[Monitoring_counter] + ([Monitoring_counter_ID] + ,[MC_name] + ,[MC_type] + ,[MC_sql_query] + ,[MC_definition] + ,[MC_information] + ,[MC_problem] + ,[MC_remediation] + ,[MC_sequence] + ,[MC_is_visible] + ,[MC_monitoring_area]) + VALUES((11) + ,('Logins/sec') + ,(2) + ,('SELECT cntr_value + FROM sys.dm_os_performance_counters + WHERE object_name LIKE ''%:General Statistics%'' + AND counter_name = ''Logins/sec''; + ') + ,('This performance counter returns the total number of logins started, per second, and does not include pooled connections.') + ,('Opening and closing connections is an expensive process. A pooled connection is one which is kept open by an application for other requests to re-use.') + ,('If the returned value is high, this can indicate that the application is not correctly using connection pooling.') + ,('Review the Connection Polling (http://msdn.microsoft.com/en-us/library/8xx3tyca.aspx) configuration.') + ,(1) + ,(1) + ,(7) + ) +END +GO + +IF NOT EXISTS (SELECT * FROM [dbo].[Monitoring_counter] WHERE [MC_name] = 'Latch Waits/sec') +BEGIN +INSERT INTO [dbo].[Monitoring_counter] + ([Monitoring_counter_ID] + ,[MC_name] + ,[MC_type] + ,[MC_sql_query] + ,[MC_definition] + ,[MC_information] + ,[MC_problem] + ,[MC_remediation] + ,[MC_sequence] + ,[MC_is_visible] + ,[MC_monitoring_area]) + VALUES((12) + ,('Latch Waits/sec') + ,(2) + ,('SELECT cntr_value + FROM sys.dm_os_performance_counters + WHERE object_name LIKE ''%:Latches%'' + AND counter_name = ''Latch Waits/sec''; + ') + ,('This is the number of latch requests that could not be granted immediately. In other words, these are the amount of latches in a one second period that had to wait.') + ,('Latches are light-weight synchronization constructs that are designed to protect the physical integrity of a page in a similar way to how locks protect the logical consistency of rows. They''re taken any time something wants to modify a page, be it moving the page from disk to memory or via versa, writing a record onto a page, or changing a page''s metadata.') + ,(NULL) + ,(NULL) + ,(1) + ,(1) + ,(3) + ) +END +GO + +IF NOT EXISTS (SELECT * FROM [dbo].[Monitoring_counter] WHERE [MC_name] = 'Batch Requests/sec') +BEGIN +INSERT INTO [dbo].[Monitoring_counter] + ([Monitoring_counter_ID] + ,[MC_name] + ,[MC_type] + ,[MC_sql_query] + ,[MC_definition] + ,[MC_information] + ,[MC_problem] + ,[MC_remediation] + ,[MC_sequence] + ,[MC_is_visible] + ,[MC_monitoring_area]) + VALUES((13) + ,('Batch Requests/sec') + ,(2) + ,('SELECT cntr_value + FROM sys.dm_os_performance_counters + WHERE object_name LIKE ''%:SQL Statistics%'' + AND counter_name = ''Batch Requests/sec''; + ') + ,('This performance counter returns the number of Batch Requests (http://sqlserverplanet.com/dba/understanding-batch-requests-sec) that SQL Server receives per second.') + ,('The values this monitor returns generally follows in step as to how busy your server''s CPUs are. From a network bottleneck approach, a typical 100Mbs network card is only able to handle about 3,000 batch requests per second.') + ,('Generally speaking, over 1,000 batch requests per second indicates a very busy SQL Server. If this is the case, you may soon experience a CPU bottleneck, if you are not already. Of course, this is a relative number, and the more powerful your hardware, the more batch requests per second your SQL Server can handle. Sometimes low Batch Requests/Sec can be misleading. If there were a SQL Statements/sec counter, this would be a more accurate measure of the amount of SQL Server activity. For example, an application may call only a few stored procedures, yet each stored procedure does a great deal of work. In this case, we will see a low number for Batch Requests/sec, but each stored procedure (one batch) will execute many SQL statements that drive up CPU and other resources. As a result, many counter thresholds based on the number of Batch Requests/sec will seem to identify issues because the batch requests on such a server are unusually low for the level of activity on the server.') + ,('Check your SQL server and verify system resources are being used efficiently. Applications other than SQL may be using unnecessary system resources. Try and recover memory by closing unnecessary applications. Installing additional memory and upgrading your hardware should solve this problem.') + ,(1) + ,(1) + ,(6) + ) +END +GO + +IF NOT EXISTS (SELECT * FROM [dbo].[Monitoring_counter] WHERE [MC_name] = 'Transactions/sec') +BEGIN +INSERT INTO [dbo].[Monitoring_counter] + ([Monitoring_counter_ID] + ,[MC_name] + ,[MC_type] + ,[MC_sql_query] + ,[MC_definition] + ,[MC_information] + ,[MC_problem] + ,[MC_remediation] + ,[MC_sequence] + ,[MC_is_visible] + ,[MC_monitoring_area]) + VALUES((14) + ,('Transactions/sec') + ,(2) + ,('SELECT cntr_value + FROM sys.dm_os_performance_counters + WHERE object_name LIKE ''%:Databases%'' + AND counter_name = ''Transactions/sec'' + AND instance_name = ''_Total''; + ') + ,(NULL) + ,(NULL) + ,(NULL) + ,(NULL) + ,(1) + ,(1) + ,(6) + ) +END +GO + +IF NOT EXISTS (SELECT * FROM [dbo].[Monitoring_counter] WHERE [MC_name] = 'Memory Grants Pending') +BEGIN +INSERT INTO [dbo].[Monitoring_counter] + ([Monitoring_counter_ID] + ,[MC_name] + ,[MC_type] + ,[MC_sql_query] + ,[MC_definition] + ,[MC_information] + ,[MC_problem] + ,[MC_remediation] + ,[MC_sequence] + ,[MC_is_visible] + ,[MC_monitoring_area]) + VALUES((15) + ,('Memory Grants Pending') + ,(1) + ,('SELECT cntr_value + FROM sys.dm_os_performance_counters + WHERE object_name LIKE ''%:Memory Manager%'' + AND counter_name = ''Memory Grants Pending''; + ') + ,('This performance counter returns the total number of processes waiting for a workspace memory grant (http://msdn.microsoft.com/en-us/library/ms190924.aspx).') + ,('Memory resources are required for each user request. If sufficient memory is not available, the user waits until there is adequate memory for the query to run.') + ,('Returned values greater than zero for a sustained period of time is a very strong indicator of memory pressure.') + ,('You should first examine the database design, queries, and indexes to ensure the system is properly tuned before installing additional RAM. There may be query inefficiencies in the instance that is causing excessive memory grant requirements. For example, large Sorts (http://msdn.microsoft.com/en-us/library/ms188723.aspx) or Hashes (http://technet.microsoft.com/en-us/library/ms189313.aspx) that can be resolved by tuning the indexing or queries being executed. Compare with Memory Grants Outstanding. If the number of pending grants increases, try the following: • Add more memory to SQL Server • Add more physical memory to the server. • Check for memory pressure. See and correct indexing if you experience “Out of memory†conditions.') + ,(1) + ,(1) + ,(4) + ) +END +GO + +IF NOT EXISTS (SELECT * FROM [dbo].[Monitoring_counter] WHERE [MC_name] = 'Average Lock Wait Time (ms)') +BEGIN +INSERT INTO [dbo].[Monitoring_counter] + ([Monitoring_counter_ID] + ,[MC_name] + ,[MC_type] + ,[MC_sql_query] + ,[MC_definition] + ,[MC_information] + ,[MC_problem] + ,[MC_remediation] + ,[MC_sequence] + ,[MC_is_visible] + ,[MC_monitoring_area]) + VALUES((16) + ,('Average Lock Wait Time (ms)') + ,(2) + ,('SELECT cntr_value + FROM sys.dm_os_performance_counters + WHERE object_name LIKE ''%:Locks%'' + AND counter_name = ''Average Wait Time (ms)'' + AND instance_name = ''_Total''; + ') + ,('This performance counter reports the average amount of Wait time, in milliseconds, for each lock request that resulted in a wait.') + ,('Generally speaking, the lower the value, the better. This value should correlate to the Lock Waits/sec counter and move up or down with it accordingly.') + ,('An average wait time longer than 500ms may indicate excessive blocking (http://support.microsoft.com/kb/224453).') + ,('You should determine which queries are generating locks to identify where the blocking is originating.') + ,(1) + ,(1) + ,(3) + ) +END +GO + +IF NOT EXISTS (SELECT * FROM [dbo].[Monitoring_counter] WHERE [MC_name] = 'Lock Timeouts/sec') +BEGIN +INSERT INTO [dbo].[Monitoring_counter] + ([Monitoring_counter_ID] + ,[MC_name] + ,[MC_type] + ,[MC_sql_query] + ,[MC_definition] + ,[MC_information] + ,[MC_problem] + ,[MC_remediation] + ,[MC_sequence] + ,[MC_is_visible] + ,[MC_monitoring_area]) + VALUES((17) + ,('Lock Timeouts/sec') + ,(2) + ,('SELECT cntr_value + FROM sys.dm_os_performance_counters + WHERE object_name LIKE ''%:Locks%'' + AND counter_name = ''Lock Timeouts/sec'' + AND instance_name = ''_Total''; + ') + ,('This performance counter returns the number of lock requests per second that have timed out, including internal requests for NoWait (http://msdn.microsoft.com/en-us/library/c8bys6hz.aspx) locks.') + ,('This is the number of milliseconds that will pass before Microsoft SQL Server returns a locking error. A value of -1 (default) indicates no time-out period (that is, wait forever). When a wait for a lock exceeds the time-out value, an error is returned. A value of 0 means to not wait at all and return a message as soon as a lock is encountered. In order for thresholds to be tuned to your environment, thresholds for this performance counter should be set using the Baseline Calculator.') + ,('If you see a value above 0 for this counter, your users will experience problems as their queries are not completing.') + ,('You should review your queries to determine which queries are causing this situation.') + ,(1) + ,(1) + ,(3) + ) +END +GO + +IF NOT EXISTS (SELECT * FROM [dbo].[Monitoring_counter] WHERE [MC_name] = 'Longest Transaction Running Time (sec)') +BEGIN +INSERT INTO [dbo].[Monitoring_counter] + ([Monitoring_counter_ID] + ,[MC_name] + ,[MC_type] + ,[MC_sql_query] + ,[MC_definition] + ,[MC_information] + ,[MC_problem] + ,[MC_remediation] + ,[MC_sequence] + ,[MC_is_visible] + ,[MC_monitoring_area]) + VALUES((18) + ,('Longest Transaction Running Time (sec)') + ,(1) + ,('SELECT cntr_value + FROM sys.dm_os_performance_counters + WHERE object_name LIKE ''%:Transactions%'' + AND counter_name = ''Longest Transaction Running Time''; + ') + ,('The length of time, in seconds, the transaction that has been running the longest, has been active.') + ,('Transactions that run longer than others use more resources. They can be used to track down procedures and calls that are taking longer than expected by identifying the specific transaction(s).') + ,('Long running transactions can prevent truncation of transaction logs. This can cause the transaction log files to grow until they consume all available physical disk space shutting down access to the database.') + ,('Check the functionality of the query and/or redesign the long running transaction.') + ,(1) + ,(1) + ,(6) + ) +END +GO + +IF NOT EXISTS (SELECT * FROM [dbo].[Monitoring_counter] WHERE [MC_name] = 'SQL Compilations/sec') +BEGIN +INSERT INTO [dbo].[Monitoring_counter] + ([Monitoring_counter_ID] + ,[MC_name] + ,[MC_type] + ,[MC_sql_query] + ,[MC_definition] + ,[MC_information] + ,[MC_problem] + ,[MC_remediation] + ,[MC_sequence] + ,[MC_is_visible] + ,[MC_monitoring_area]) + VALUES((19) + ,('SQL Compilations/sec') + ,(2) + ,('SELECT cntr_value + FROM sys.dm_os_performance_counters + WHERE object_name LIKE ''%:SQL Statistics%'' + AND counter_name = ''SQL Compilations/sec''; + ') + ,('This performance counter returns the number of times per second that SQL Server compilations have occurred.') + ,('This value should be as low as possible.') + ,('If you see a high value, say above100, then this can be an indication that there are a great deal of ad hoc queries that are running which may cause increased CPU usage.') + ,('Re-write the running ad hoc queries as stored procedures or use the following command: sp_executeSQL.') + ,(1) + ,(1) + ,(6) + ) +END +GO + +IF NOT EXISTS (SELECT * FROM [dbo].[Monitoring_counter] WHERE [MC_name] = 'Deadlocks') +BEGIN +INSERT INTO [dbo].[Monitoring_counter] + ([Monitoring_counter_ID] + ,[MC_name] + ,[MC_type] + ,[MC_sql_query] + ,[MC_definition] + ,[MC_information] + ,[MC_problem] + ,[MC_remediation] + ,[MC_sequence] + ,[MC_is_visible] + ,[MC_monitoring_area]) + VALUES((20) + ,('Deadlocks') + ,(5) + ,('SELECT cntr_value + FROM sys.dm_os_performance_counters + WHERE object_name LIKE ''%:Locks%'' + AND counter_name = ''Number of Deadlocks/sec'' + AND instance_name = ''_Total''; + ') + ,('The number of lock requests that resulted in a deadlock. Since only a COMMIT, ROLLBACK, or deadlock can terminate a transaction (excluding failures or errors), this is an important value to track.') + ,(NULL) + ,('When returning value is above zero users and applications will experience problems. Their queries will abort and the applications may fail.') + ,('You should trace deadlocks and examine trace output in SQL Server log. Deadlocks can be prevented by one or more of the following methods: - Adding missing indexes to support faster queries; - Dropping unnecessary indexes which may slow down INSERTs for example; - Redesigning indexes to be "thinner", for example, removing columns from composite indexes or making table columns "thinner"; - Adding index hints to queries; - Redesigning tables with "thinner" columns like smalldatetime vs. datetime or smallint vs. int; - Modifying the stored procedures to access tables in a similar pattern; - Keeping transactions as short and quick as possible: "mean & lean"; - Removing unnecessary extra activity from the transactions like triggers; - Removing JOINs to Linked Server (remote) tables; - Implementing regular index maintenance; usually weekend schedule suffices; use FILLFACTOR = 80 for dynamic tables; - Setting MAXDOP=1 solves deadlocking in some cases.') + ,(1) + ,(1) + ,(3) + ) +END +GO + +IF NOT EXISTS (SELECT * FROM [dbo].[Monitoring_counter] WHERE [MC_name] = 'Connection Memory (KB)') +BEGIN +INSERT INTO [dbo].[Monitoring_counter] + ([Monitoring_counter_ID] + ,[MC_name] + ,[MC_type] + ,[MC_sql_query] + ,[MC_definition] + ,[MC_information] + ,[MC_problem] + ,[MC_remediation] + ,[MC_sequence] + ,[MC_is_visible] + ,[MC_monitoring_area]) + VALUES((21) + ,('Connection Memory (KB)') + ,(1) + ,('SELECT cntr_value + FROM sys.dm_os_performance_counters + WHERE object_name LIKE ''%Memory Manager%'' + AND counter_name = ''Connection Memory (KB)''; + ') + ,('This performance counter returns the total amount of dynamic memory the server is using for maintaining connections.') + ,('SQL Server sets aside three packet buffers for every connection made from a client. Each buffer is sized according to the default network packet size specified by the sp_configure stored procedure. If the default network packet size is less than 8KB, the memory for these packets comes from SQL Server''s buffer pool. If it is 8KB or larger, the memory is allocated from SQL Server''s MemToLeave region. It is worth noting that the default network packet size for the .NET Framework Data Provider for SQL Server is 8KB, so the buffers associated with managed code client connections typically come from SQL Server''s MemToLeave region. This contrasts with classic ADO applications, where the default packet size is 4KB, and the buffers are allocated form the SQL Server buffer pool.') + ,(NULL) + ,(NULL) + ,(1) + ,(1) + ,(4) + ) +END +GO + +IF NOT EXISTS (SELECT * FROM [dbo].[Monitoring_counter] WHERE [MC_name] = 'Database File Data Reads') +BEGIN +INSERT INTO [dbo].[Monitoring_counter] + ([Monitoring_counter_ID] + ,[MC_name] + ,[MC_type] + ,[MC_sql_query] + ,[MC_definition] + ,[MC_information] + ,[MC_problem] + ,[MC_remediation] + ,[MC_sequence] + ,[MC_is_visible] + ,[MC_monitoring_area]) + VALUES((22) + ,('Database File Data Reads') + ,(4) + ,('SELECT DB_NAME(vfs.database_id) AS [database_name], SUM(vfs.num_of_reads) AS [num_of_reads] + FROM sys.dm_io_virtual_file_stats(NULL, NULL) AS vfs + JOIN sys.master_files AS mf + ON vfs.database_id = mf.database_id + AND vfs.[file_id] = mf.[file_id] + AND mf.type_desc = ''ROWS'' + GROUP BY DB_NAME(vfs.database_id); + ') + ,(NULL) + ,(NULL) + ,(NULL) + ,(NULL) + ,(1) + ,(0) + ,(9) + ) +END +GO + +IF NOT EXISTS (SELECT * FROM [dbo].[Monitoring_counter] WHERE [MC_name] = 'Database IO Stall Reads') +BEGIN +INSERT INTO [dbo].[Monitoring_counter] + ([Monitoring_counter_ID] + ,[MC_name] + ,[MC_type] + ,[MC_sql_query] + ,[MC_definition] + ,[MC_information] + ,[MC_problem] + ,[MC_remediation] + ,[MC_sequence] + ,[MC_is_visible] + ,[MC_monitoring_area]) + VALUES((23) + ,('Database IO Stall Reads') + ,(4) + ,('SELECT DB_NAME(vfs.database_id) AS [database_name], SUM(vfs.io_stall_read_ms) AS [num_of_reads] + FROM sys.dm_io_virtual_file_stats(NULL, NULL) AS vfs + JOIN sys.master_files AS mf + ON vfs.database_id = mf.database_id + AND vfs.[file_id] = mf.[file_id] + AND mf.type_desc = ''ROWS'' + GROUP BY DB_NAME(vfs.database_id); + ') + ,(NULL) + ,(NULL) + ,(NULL) + ,(NULL) + ,(1) + ,(0) + ,(9) + ) +END +GO + +IF NOT EXISTS (SELECT * FROM [dbo].[Monitoring_counter] WHERE [MC_name] = 'Database Read Latency') +BEGIN +INSERT INTO [dbo].[Monitoring_counter] + ([Monitoring_counter_ID] + ,[MC_name] + ,[MC_type] + ,[MC_sql_query] + ,[MC_definition] + ,[MC_information] + ,[MC_problem] + ,[MC_remediation] + ,[MC_sequence] + ,[MC_is_visible] + ,[MC_monitoring_area]) + VALUES((27) + ,('Database Read Latency') + ,(3) + ,('DECLARE @current_datetime SMALLDATETIME + SELECT @current_datetime = MAX(mh.MH_datetime) + FROM [HCITools].[dbo].[Monitoring_history] mh WITH (NOLOCK) + + SELECT (SELECT mc3.Monitoring_counter_ID + FROM [HCITools].[dbo].[Monitoring_counter] mc3 WITH (NOLOCK) + WHERE mc3.MC_name=''Database Read Latency'') as t, + mh1.MH_instance_name, + CASE WHEN mh2.MH_value = 0 + THEN 0 + ELSE mh1.MH_value / mh2.MH_value + END ''ReadLatency'', + @current_datetime + FROM [HCITools].[dbo].[Monitoring_area] ma WITH (NOLOCK) + JOIN [HCITools].[dbo].[Monitoring_counter] mc1 WITH (NOLOCK) + ON mc1.MC_monitoring_area = ma.Monitoring_area_ID + AND mc1.MC_name = ''Database IO Stall Reads'' + JOIN [HCITools].[dbo].[Monitoring_history] mh1 WITH (NOLOCK) + ON mh1.MH_monitoring_counter = mc1.Monitoring_counter_ID + AND mh1.MH_datetime = @current_datetime + JOIN [HCITools].[dbo].[Monitoring_counter] mc2 WITH (NOLOCK) + ON mc2.MC_monitoring_area = ma.Monitoring_area_ID + AND mc2.MC_name = ''Database File Data Reads'' + JOIN [HCITools].[dbo].[Monitoring_history] mh2 WITH (NOLOCK) + ON mh2.MH_monitoring_counter = mc2.Monitoring_counter_ID + AND mh2.MH_instance_name = mh1.MH_instance_name + AND mh2.MH_datetime = mh1.MH_datetime + WHERE ma.MA_name = ''Disk'' + ORDER BY mh1.MH_instance_name; + ') + ,(NULL) + ,(NULL) + ,(NULL) + ,(NULL) + ,(2) + ,(1) + ,(9) + ) +END +GO + +IF NOT EXISTS (SELECT * FROM [dbo].[Monitoring_counter] WHERE [MC_name] = 'Database File Data Writes') +BEGIN +INSERT INTO [dbo].[Monitoring_counter] + ([Monitoring_counter_ID] + ,[MC_name] + ,[MC_type] + ,[MC_sql_query] + ,[MC_definition] + ,[MC_information] + ,[MC_problem] + ,[MC_remediation] + ,[MC_sequence] + ,[MC_is_visible] + ,[MC_monitoring_area]) + VALUES((30) + ,('Database File Data Writes') + ,(4) + ,('SELECT DB_NAME(vfs.database_id) AS [database_name], SUM(vfs.num_of_writes) AS [num_of_writes] + FROM sys.dm_io_virtual_file_stats(NULL, NULL) AS vfs + JOIN sys.master_files AS mf + ON vfs.database_id = mf.database_id + AND vfs.[file_id] = mf.[file_id] + AND mf.type_desc = ''ROWS'' + GROUP BY DB_NAME(vfs.database_id); + ') + ,(NULL) + ,(NULL) + ,(NULL) + ,(NULL) + ,(1) + ,(0) + ,(9) + ) +END +GO + +IF NOT EXISTS (SELECT * FROM [dbo].[Monitoring_counter] WHERE [MC_name] = 'Database IO Stall Writes') +BEGIN +INSERT INTO [dbo].[Monitoring_counter] + ([Monitoring_counter_ID] + ,[MC_name] + ,[MC_type] + ,[MC_sql_query] + ,[MC_definition] + ,[MC_information] + ,[MC_problem] + ,[MC_remediation] + ,[MC_sequence] + ,[MC_is_visible] + ,[MC_monitoring_area]) + VALUES((31) + ,('Database IO Stall Writes') + ,(4) + ,('SELECT DB_NAME(vfs.database_id) AS [database_name], SUM(vfs.io_stall_write_ms) AS [num_of_io_stall_write_ms] + FROM sys.dm_io_virtual_file_stats(NULL, NULL) AS vfs + JOIN sys.master_files AS mf + ON vfs.database_id = mf.database_id + AND vfs.[file_id] = mf.[file_id] + AND mf.type_desc = ''ROWS'' + GROUP BY DB_NAME(vfs.database_id); + ') + ,(NULL) + ,(NULL) + ,(NULL) + ,(NULL) + ,(1) + ,(0) + ,(9) + ) +END +GO + +IF NOT EXISTS (SELECT * FROM [dbo].[Monitoring_counter] WHERE [MC_name] = 'Database Write Latency') +BEGIN +INSERT INTO [dbo].[Monitoring_counter] + ([Monitoring_counter_ID] + ,[MC_name] + ,[MC_type] + ,[MC_sql_query] + ,[MC_definition] + ,[MC_information] + ,[MC_problem] + ,[MC_remediation] + ,[MC_sequence] + ,[MC_is_visible] + ,[MC_monitoring_area]) + VALUES((32) + ,('Database Write Latency') + ,(3) + ,('DECLARE @current_datetime SMALLDATETIME + SELECT @current_datetime = MAX(mh.MH_datetime) + FROM [HCITools].[dbo].[Monitoring_history] mh WITH (NOLOCK) + + SELECT (SELECT mc3.Monitoring_counter_ID + FROM [HCITools].[dbo].[Monitoring_counter] mc3 WITH (NOLOCK) + WHERE mc3.MC_name=''Database Write Latency'') as t, + mh1.MH_instance_name, + CASE WHEN mh2.MH_value = 0 + THEN 0 + ELSE mh1.MH_value / mh2.MH_value + END ''WriteLatency'', + @current_datetime + FROM [HCITools].[dbo].[Monitoring_area] ma WITH (NOLOCK) + JOIN [HCITools].[dbo].[Monitoring_counter] mc1 WITH (NOLOCK) + ON mc1.MC_monitoring_area = ma.Monitoring_area_ID + AND mc1.MC_name = ''Database IO Stall Writes'' + JOIN [HCITools].[dbo].[Monitoring_history] mh1 WITH (NOLOCK) + ON mh1.MH_monitoring_counter = mc1.Monitoring_counter_ID + AND mh1.MH_datetime = @current_datetime + JOIN [HCITools].[dbo].[Monitoring_counter] mc2 WITH (NOLOCK) + ON mc2.MC_monitoring_area = ma.Monitoring_area_ID + AND mc2.MC_name = ''Database File Data Writes'' + JOIN [HCITools].[dbo].[Monitoring_history] mh2 WITH (NOLOCK) + ON mh2.MH_monitoring_counter = mc2.Monitoring_counter_ID + AND mh2.MH_instance_name = mh1.MH_instance_name + AND mh2.MH_datetime = mh1.MH_datetime + WHERE ma.MA_name = ''Disk'' + ORDER BY mh1.MH_instance_name; + ') + ,(NULL) + ,(NULL) + ,(NULL) + ,(NULL) + ,(2) + ,(1) + ,(9) + ) +END +GO + +IF NOT EXISTS (SELECT * FROM [dbo].[Monitoring_counter] WHERE [MC_name] = 'Total Pages') +BEGIN +INSERT INTO [dbo].[Monitoring_counter] + ([Monitoring_counter_ID] + ,[MC_name] + ,[MC_type] + ,[MC_sql_query] + ,[MC_definition] + ,[MC_information] + ,[MC_problem] + ,[MC_remediation] + ,[MC_sequence] + ,[MC_is_visible] + ,[MC_monitoring_area]) + VALUES((33) + ,('Total Pages') + ,(1) + ,('SELECT cntr_value + FROM sys.dm_os_performance_counters + WHERE object_name LIKE ''%:Buffer Manager%'' + AND counter_name = ''Total pages''; + ') + ,('This performance counter returns the number of pages in the buffer pool.') + ,('The returned value includes database, free, and stolen pages. Note: This counter is not available in SQL 2012.') + ,(NULL) + ,(NULL) + ,(1) + ,(1) + ,(1) + ) +END +GO + +IF NOT EXISTS (SELECT * FROM [dbo].[Monitoring_counter] WHERE [MC_name] = 'Free list stalls/sec') +BEGIN +INSERT INTO [dbo].[Monitoring_counter] + ([Monitoring_counter_ID] + ,[MC_name] + ,[MC_type] + ,[MC_sql_query] + ,[MC_definition] + ,[MC_information] + ,[MC_problem] + ,[MC_remediation] + ,[MC_sequence] + ,[MC_is_visible] + ,[MC_monitoring_area]) + VALUES((34) + ,('Free list stalls/sec') + ,(2) + ,('SELECT cntr_value + FROM sys.dm_os_performance_counters + WHERE object_name LIKE ''%:Buffer Manager%'' + AND counter_name = ''Free list stalls/sec''; + ') + ,('Indicates the number of requests per second that had to wait for a free page.') + ,('This displays the frequency with which requests for available database pages are suspended because no buffers are available.') + ,('If the returned value is high, this indicates that not enough memory is available for the SQL Server.') + ,('Check your SQL server and verify its memory is being used efficiently. Applications other than SQL may be using a great deal of memory. Try and recover memory by closing unnecessary applications. Installing additional memory may also help.') + ,(1) + ,(1) + ,(1) + ) +END +GO + +IF NOT EXISTS (SELECT * FROM [dbo].[Monitoring_counter] WHERE [MC_name] = 'Cache Object Counts') +BEGIN +INSERT INTO [dbo].[Monitoring_counter] + ([Monitoring_counter_ID] + ,[MC_name] + ,[MC_type] + ,[MC_sql_query] + ,[MC_definition] + ,[MC_information] + ,[MC_problem] + ,[MC_remediation] + ,[MC_sequence] + ,[MC_is_visible] + ,[MC_monitoring_area]) + VALUES((35) + ,('Cache Object Counts') + ,(1) + ,('SELECT cntr_value + FROM sys.dm_os_performance_counters + WHERE object_name LIKE ''%:Plan Cache%'' + AND counter_name like ''Cache Object Counts%'' + AND instance_name = ''_Total''; + ') + ,('This performance counter returns the number of cache objects in the cache.') + ,('The Plan Cache object provides counters to monitor how SQL Server uses memory to store objects such as stored procedures, ad hoc and prepared Transact-SQL statements, and triggers. Multiple instances of the Plan Cache object can be monitored at the same time, with each instance representing a different type of plan to monitor.') + ,('High numbers of total cached objects use portions of the physical memory available to a SQL instance on a per database basis. This can result in one database cache impacting the performance of other local databases due to memory contention.') + ,('Increase the memory available to SQL services, reduce the number of databases on this instance of SQL, or examine the volume of ad hoc queries running against the server.') + ,(1) + ,(1) + ,(2) + ) +END +GO + +IF NOT EXISTS (SELECT * FROM [dbo].[Monitoring_counter] WHERE [MC_name] = 'Cache Objects in use') +BEGIN +INSERT INTO [dbo].[Monitoring_counter] + ([Monitoring_counter_ID] + ,[MC_name] + ,[MC_type] + ,[MC_sql_query] + ,[MC_definition] + ,[MC_information] + ,[MC_problem] + ,[MC_remediation] + ,[MC_sequence] + ,[MC_is_visible] + ,[MC_monitoring_area]) + VALUES((36) + ,('Cache Objects in use') + ,(1) + ,('SELECT cntr_value + FROM sys.dm_os_performance_counters + WHERE object_name LIKE ''%:Plan Cache%'' + AND counter_name like ''Cache Objects in use%'' + AND instance_name = ''_Total''; + ') + ,('This performance counter returns number of cache objects in use.') + ,('The Plan Cache object provides counters to monitor how SQL Server uses memory to store objects such as stored procedures, ad hoc and prepared Transact-SQL statements, and triggers. Multiple instances of the Plan Cache object can be monitored at the same time, with each instance representing a different type of plan to monitor.') + ,('High numbers of cached objects in use consume the memory available to a SQL server at a higher rate than non-active objects on a per database basis. This can result in one database cache impacting the performance of other local databases due to memory contention.') + ,('Increase the memory available to SQL server, reduce the number of active objects, consolidate stored procedures, consolidate and convert ad hoc queries to stored procedures where possible, or reduce the number of databases on the server.') + ,(1) + ,(1) + ,(2) + ) +END +GO + +IF NOT EXISTS (SELECT * FROM [dbo].[Monitoring_counter] WHERE [MC_name] = 'Cached Plans Lookup') +BEGIN +INSERT INTO [dbo].[Monitoring_counter] + ([Monitoring_counter_ID] + ,[MC_name] + ,[MC_type] + ,[MC_sql_query] + ,[MC_definition] + ,[MC_information] + ,[MC_problem] + ,[MC_remediation] + ,[MC_sequence] + ,[MC_is_visible] + ,[MC_monitoring_area]) + VALUES((37) + ,('Cached Plans Lookup') + ,(2) + ,('select SUM(usecounts) + from sys.dm_exec_cached_plans; + ') + ,('Number of times the cache object has been looked up.') + ,('Not incremented when parameterized queries find a plan in the cache. Can be incremented multiple times when using showplan.') + ,('') + ,('') + ,(1) + ,(1) + ,(2) + ) +END +GO + +IF NOT EXISTS (SELECT * FROM [dbo].[Monitoring_counter] WHERE [MC_name] = 'Logout/sec') +BEGIN +INSERT INTO [dbo].[Monitoring_counter] + ([Monitoring_counter_ID] + ,[MC_name] + ,[MC_type] + ,[MC_sql_query] + ,[MC_definition] + ,[MC_information] + ,[MC_problem] + ,[MC_remediation] + ,[MC_sequence] + ,[MC_is_visible] + ,[MC_monitoring_area]) + VALUES((38) + ,('Logout/sec') + ,(2) + ,('SELECT cntr_value + FROM sys.dm_os_performance_counters + WHERE object_name LIKE ''%:General Statistics%'' + AND counter_name = ''Logouts/sec''; + ') + ,('This performance counter returns the total number of logout operations started, per second.') + ,('Opening and closing connections is an expensive process. When applications do not use a connection pool, each request needs to establish its own connection before the query can be executed. It then has to close it. A pooled connection is one which is kept open by an application for other requests to re-use.') + ,('If the returned value is high, this can indicate that the application is not correctly using connection pooling.') + ,('Review the Connection Polling (http://msdn.microsoft.com/en-us/library/8xx3tyca.aspx) configuration.') + ,(1) + ,(1) + ,(7) + ) +END +GO + +IF NOT EXISTS (SELECT * FROM [dbo].[Monitoring_counter] WHERE [MC_name] = 'Lock Memory (MB)') +BEGIN +INSERT INTO [dbo].[Monitoring_counter] + ([Monitoring_counter_ID] + ,[MC_name] + ,[MC_type] + ,[MC_sql_query] + ,[MC_definition] + ,[MC_information] + ,[MC_problem] + ,[MC_remediation] + ,[MC_sequence] + ,[MC_is_visible] + ,[MC_monitoring_area]) + VALUES((39) + ,('Lock Memory (MB)') + ,(1) + ,('SELECT cntr_type / 1024 + FROM sys.dm_os_performance_counters + WHERE object_name LIKE ''%:Memory Manager%'' + AND counter_name LIKE ''Lock Memory (KB)%''; + ') + ,('This performance counter returns the total amount of dynamic memory the server is using for locks.') + ,('Lock pages in memory is used to prevent older versions of Windows and SQL from allowing Windows operating system page out of the buffer pool.') + ,('Lock pages in memory determines which accounts can use a process to keep data in physical memory, which prevents the system from paging the data to virtual memory on disk. Exercising this privilege could significantly affect system performance by decreasing the amount of available random access memory (RAM).') + ,('Upgrade to Windows 2008 R2 or greater and SQL 2008 or greater.') + ,(1) + ,(1) + ,(4) + ) +END +GO + +IF NOT EXISTS (SELECT * FROM [dbo].[Monitoring_counter] WHERE [MC_name] = 'Granted Workspace Memory (MB)') +BEGIN +INSERT INTO [dbo].[Monitoring_counter] + ([Monitoring_counter_ID] + ,[MC_name] + ,[MC_type] + ,[MC_sql_query] + ,[MC_definition] + ,[MC_information] + ,[MC_problem] + ,[MC_remediation] + ,[MC_sequence] + ,[MC_is_visible] + ,[MC_monitoring_area]) + VALUES((40) + ,('Granted Workspace Memory (MB)') + ,(1) + ,('SELECT cntr_type / 1024 + FROM sys.dm_os_performance_counters + WHERE object_name LIKE ''%:Memory Manager%'' + AND counter_name LIKE ''Granted Workspace Memory (KB)%''; + ') + ,('This performance counter returns the total amount of memory currently granted to executing processes, such as Hash (http://technet.microsoft.com/en-us/library/ms189313.aspx), Sort (http://msdn.microsoft.com/en-us/library/ms188723.aspx), Bulk Copy (http://msdn.microsoft.com/en-us/library/ms130809.aspx), and Index creation (http://technet.microsoft.com/en-us/library/ms190197.aspx) operations.') + ,('This performance counter tells you how much memory has currently been granted to running queries. If there is memory pressure because of workspace memory, this value should be at least 25% of the virtual memory available to SQL Server.') + ,('If the memory pressure is severe, the server might return errors such as 701 or 8645.') + ,('If this is the case, this might be a good reason to consider using SQL Server 64-bit.') + ,(1) + ,(1) + ,(4) + ) +END +GO + +IF NOT EXISTS (SELECT * FROM [dbo].[Monitoring_counter] WHERE [MC_name] = 'Forwarded Records/sec') +BEGIN +INSERT INTO [dbo].[Monitoring_counter] + ([Monitoring_counter_ID] + ,[MC_name] + ,[MC_type] + ,[MC_sql_query] + ,[MC_definition] + ,[MC_information] + ,[MC_problem] + ,[MC_remediation] + ,[MC_sequence] + ,[MC_is_visible] + ,[MC_monitoring_area]) + VALUES((41) + ,('Forwarded Records/sec') + ,(2) + ,('SELECT cntr_value + FROM sys.dm_os_performance_counters + WHERE object_name LIKE ''%:Access Methods%'' + AND counter_name LIKE ''Forwarded Records/sec%''; + ') + ,('This performance counter identifies the use of a pointer which has been created when variable length columns have caused a row to move to a new page in a heap (http://msdn.microsoft.com/en-us/library/ms188270.aspx).') + ,(NULL) + ,('Rows with Varchar (http://msdn.microsoft.com/en-us/library/ms176089.aspx) columns can experience expansion when Varchar values are updated with a longer string. In the case where the row cannot fit in the existing page, the row migrates and access to the row will traverse a pointer. This only happens on heaps (tables without clustered indexes).') + ,('Evaluate clustered indexes for heap tables. In cases where clustered indexes cannot be used, drop non-clustered indexes, build a clustered index to Reorg (http://technet.microsoft.com/en-us/library/ms189858.aspx) pages and rows, drop the clustered index, then recreate non-clustered indexes.') + ,(1) + ,(1) + ,(9) + ) +END +GO + +IF NOT EXISTS (SELECT * FROM [dbo].[Monitoring_counter] WHERE [MC_name] = 'Forwarded Records/Batch Requests') +BEGIN +INSERT INTO [dbo].[Monitoring_counter] + ([Monitoring_counter_ID] + ,[MC_name] + ,[MC_type] + ,[MC_sql_query] + ,[MC_definition] + ,[MC_information] + ,[MC_problem] + ,[MC_remediation] + ,[MC_sequence] + ,[MC_is_visible] + ,[MC_monitoring_area]) + VALUES((42) + ,('Forwarded Records/Batch Requests') + ,(1) + ,('SELECT CASE WHEN mh2.MH_value = 0 + THEN 0 + ELSE mh1.MH_value / mh2.MH_value + END ''Value'' + FROM [HCITools].[dbo].[Monitoring_counter] mc1 WITH (NOLOCK) + JOIN [HCITools].[dbo].[Monitoring_history] mh1 WITH (NOLOCK) + ON mh1.MH_monitoring_counter = mc1.Monitoring_counter_ID + AND mh1.MH_datetime = (SELECT MAX(mh.MH_datetime) + FROM [HCITools].[dbo].[Monitoring_history] mh WITH (NOLOCK)) + JOIN [HCITools].[dbo].[Monitoring_history] mh2 WITH (NOLOCK) + JOIN [HCITools].[dbo].[Monitoring_counter] mc2 WITH (NOLOCK) + ON mc2.Monitoring_counter_ID = mh2.MH_monitoring_counter + AND mc2.MC_name = ''Batch Requests/sec'' + ON mh2.MH_datetime = mh1.MH_datetime + WHERE mc1.MC_name = ''Forwarded Records/sec''; + ') + ,('This performance counter identifies the use of a pointer which has been created when variable length columns have caused a row to move to a new page in a heap (http://msdn.microsoft.com/en-us/library/ms188270.aspx).') + ,('') + ,('Rows with Varchar (http://msdn.microsoft.com/en-us/library/ms176089.aspx) columns can experience expansion when Varchar values are updated with a longer string. In the case where the row cannot fit in the existing page, the row migrates and access to the row will traverse a pointer. This only happens on heaps (tables without clustered indexes).') + ,('Evaluate clustered indexes for heap tables. In cases where clustered indexes cannot be used, drop non-clustered indexes, build a clustered index to Reorg (http://technet.microsoft.com/en-us/library/ms189858.aspx) pages and rows, drop the clustered index, then recreate non-clustered indexes.') + ,(2) + ,(1) + ,(9) + ) +END +GO + +IF NOT EXISTS (SELECT * FROM [dbo].[Monitoring_counter] WHERE [MC_name] = 'Page Splits/sec') +BEGIN +INSERT INTO [dbo].[Monitoring_counter] + ([Monitoring_counter_ID] + ,[MC_name] + ,[MC_type] + ,[MC_sql_query] + ,[MC_definition] + ,[MC_information] + ,[MC_problem] + ,[MC_remediation] + ,[MC_sequence] + ,[MC_is_visible] + ,[MC_monitoring_area]) + VALUES((43) + ,('Page Splits/sec') + ,(2) + ,('SELECT cntr_value + FROM sys.dm_os_performance_counters + WHERE object_name LIKE ''%:Access Methods%'' + AND counter_name LIKE ''Page Splits/sec%''; + ') + ,('This performance counter returns the number of page splits per second.') + ,('The returned value for this monitor should be as low as possible.') + ,('Returned values that are high can indicate the overflowing of index pages. A high value for this counter is not bad in situations where many new pages are being created, since it includes new page allocations.') + ,('To avoid Page Splits (http://careerride.com/SQL-Server-what-is-page-splits.aspx), review the table and index design so as to reduce non-sequential inserts. You can also implement Fillfactor (http://msdn.microsoft.com/en-us/library/ms177459.aspx) and Pad_Index (http://stackoverflow.com/questions/6857007/what-is-the-purpose-of-pad-index-in-this-sql-server-constraint) to leave more empty space per page.') + ,(1) + ,(1) + ,(5) + ) +END +GO + +/* Find the good name ADD the other one Page (Splits/sec) +IF NOT EXISTS (SELECT * FROM [dbo].[Monitoring_counter] WHERE [MC_name] = 'Page Splits2/sec') +BEGIN +INSERT INTO [dbo].[Monitoring_counter] + ([Monitoring_counter_ID] + ,[MC_name] + ,[MC_type] + ,[MC_sql_query] + ,[MC_definition] + ,[MC_information] + ,[MC_problem] + ,[MC_remediation] + ,[MC_sequence] + ,[MC_is_visible] + ,[MC_monitoring_area]) + VALUES((44) + ,('Page Splits/sec') + ,(1) + ,('SELECT CASE WHEN mh2.MH_value = 0 + THEN 0 + ELSE mh1.MH_value / mh2.MH_value + END ''Value'' + FROM [HCITools].[dbo].[Monitoring_counter] mc1 WITH (NOLOCK) + JOIN [HCITools].[dbo].[Monitoring_history] mh1 WITH (NOLOCK) + ON mh1.MH_monitoring_counter = mc1.Monitoring_counter_ID + AND mh1.MH_datetime = (SELECT MAX(mh.MH_datetime) + FROM [HCITools].[dbo].[Monitoring_history] mh WITH (NOLOCK)) + JOIN [HCITools].[dbo].[Monitoring_history] mh2 WITH (NOLOCK) + JOIN [HCITools].[dbo].[Monitoring_counter] mc2 WITH (NOLOCK) + ON mc2.Monitoring_counter_ID = mh2.MH_monitoring_counter + AND mc2.MC_name = ''Batch Requests/sec'' + ON mh2.MH_datetime = mh1.MH_datetime + WHERE mc1.MC_name = ''Page Splits/sec''; + ') + ,('This performance counter displays the number of page splits per second that occur as the result of overflowing index pages.') + ,('The returned value needs to be low as possible.') + ,('High values could mean poor table or index design.') + ,('If the number of page splits is high, consider increasing the Fill Factor (http://msdn.microsoft.com/en-us/library/aa933139.aspx) of your indexes. An increased Fill Factor helps to reduce page splits because there is more room in data pages before it fills up and a page split has to occur. Note that this counter also includes the new page allocations as well and does not necessarily pose a problem. The other place we can confirm the page splits that involve data or index rows moves are the fragmented indexes on page splits.') + ,(2) + ,(1) + ,(5) + ) +END +*/ + +IF NOT EXISTS (SELECT * FROM [dbo].[Monitoring_counter] WHERE [MC_name] = 'Free pages') +BEGIN +INSERT INTO [dbo].[Monitoring_counter] + ([Monitoring_counter_ID] + ,[MC_name] + ,[MC_type] + ,[MC_sql_query] + ,[MC_definition] + ,[MC_information] + ,[MC_problem] + ,[MC_remediation] + ,[MC_sequence] + ,[MC_is_visible] + ,[MC_monitoring_area]) + VALUES((45) + ,('Free pages') + ,(1) + ,('SELECT cntr_value + FROM sys.dm_os_performance_counters + WHERE object_name LIKE ''%:Buffer Manager%'' + AND counter_name LIKE ''Free pages%''; + ') + ,('This performance counter displays the total number of pages on all free lists.') + ,('This is not main indicator of memory problems and could only used as signal of possible memory pressure. In order for thresholds to be tuned to your environment, thresholds for this performance counter should be set using the Baseline Calculator.') + ,('If this counter is critical and other memory counters are good, it is possible that there are no problems with memory.') + ,('Check other memory counters. If they have critical values, you may try to install additional memory into SQL server.') + ,(1) + ,(1) + ,(5) + ) +END +GO + +IF NOT EXISTS (SELECT * FROM [dbo].[Monitoring_counter] WHERE [MC_name] = 'Database Pages') +BEGIN +INSERT INTO [dbo].[Monitoring_counter] + ([Monitoring_counter_ID] + ,[MC_name] + ,[MC_type] + ,[MC_sql_query] + ,[MC_definition] + ,[MC_information] + ,[MC_problem] + ,[MC_remediation] + ,[MC_sequence] + ,[MC_is_visible] + ,[MC_monitoring_area]) + VALUES((46) + ,('Database Pages') + ,(1) + ,('SELECT cntr_value + FROM sys.dm_os_performance_counters + WHERE object_name LIKE ''%:Buffer Manager%'' + AND counter_name LIKE ''Database Pages%''; + ') + ,('This metric tells you have many database pages are currently being occupied in the data cache.') + ,('The higher the buffer manager Database Pages is, the less room there is for SQL Server to cache more data pages. This means that SQL Server may have to free up data cache pages order to make room for pages being moved in from disk to the data cache, which can increase disk IO and hurt performance. There are no specific thresholds for this counter as each server is different. Instead, watch baseline values and look for sudden changes in the baseline value.') + ,('If the value for this counter increases above its typical baseline value, this may indicate memory pressure for the SQL Server instance.') + ,('Investigate buffer management and disk I/O.') + ,(1) + ,(1) + ,(5) + ) +END +GO + +IF NOT EXISTS (SELECT * FROM [dbo].[Monitoring_counter] WHERE [MC_name] = 'SQL Cache Memory (MB)') +BEGIN +INSERT INTO [dbo].[Monitoring_counter] + ([Monitoring_counter_ID] + ,[MC_name] + ,[MC_type] + ,[MC_sql_query] + ,[MC_definition] + ,[MC_information] + ,[MC_problem] + ,[MC_remediation] + ,[MC_sequence] + ,[MC_is_visible] + ,[MC_monitoring_area]) + VALUES((47) + ,('SQL Cache Memory (MB)') + ,(1) + ,('SELECT cntr_value / 1024 + FROM sys.dm_os_performance_counters + WHERE object_name LIKE ''%:Memory Manager%'' + AND counter_name LIKE ''SQL Cache Memory (KB)%''; + ') + ,('This performance counter measures the total amount of dynamic memory the server is using for the Dynamic SQL cache (http://www.sommarskog.se/dynamic_sql.html).') + ,('Most memory used by SQL Server is allocated to the Buffer Pool, which is used to store data pages. SQL Server steals a proportion of this memory for use in caching query plans. The overall amount of memory available to SQL Server depends upon the amount of memory installed on the server, the architecture of the server, the version and edition of SQL Server and the amount of memory pressure being experienced by SQL Server. This pressure can be internal (SQL Server resources need memory) or external (operating system needs memory). SQL Server is designed to respond to memory pressure when necessary.') + ,('Memory contention with the buffer pool.') + ,('Increase memory available to SQL server.') + ,(1) + ,(1) + ,(4) + ) +END +GO + +IF NOT EXISTS (SELECT * FROM [dbo].[Monitoring_counter] WHERE [MC_name] = 'Optimizer Memory (MB)') +BEGIN +INSERT INTO [dbo].[Monitoring_counter] + ([Monitoring_counter_ID] + ,[MC_name] + ,[MC_type] + ,[MC_sql_query] + ,[MC_definition] + ,[MC_information] + ,[MC_problem] + ,[MC_remediation] + ,[MC_sequence] + ,[MC_is_visible] + ,[MC_monitoring_area]) + VALUES((48) + ,('Optimizer Memory (MB)') + ,(1) + ,('SELECT cntr_value / 1024 + FROM sys.dm_os_performance_counters + WHERE object_name LIKE ''%:Memory Manager%'' + AND counter_name LIKE ''Optimizer Memory (KB)%''; + ') + ,('This performance counter returns the total amount of dynamic memory the server is using for query optimization.') + ,('There are no thresholds associated with this performance counter.') + ,(NULL) + ,(NULL) + ,(1) + ,(1) + ,(4) + ) +END +GO + +IF NOT EXISTS (SELECT * FROM [dbo].[Monitoring_counter] WHERE [MC_name] = 'Workfiles Created/sec') +BEGIN +INSERT INTO [dbo].[Monitoring_counter] + ([Monitoring_counter_ID] + ,[MC_name] + ,[MC_type] + ,[MC_sql_query] + ,[MC_definition] + ,[MC_information] + ,[MC_problem] + ,[MC_remediation] + ,[MC_sequence] + ,[MC_is_visible] + ,[MC_monitoring_area]) + VALUES((49) + ,('Workfiles Created/sec') + ,(2) + ,('SELECT cntr_value + FROM sys.dm_os_performance_counters + WHERE object_name LIKE ''%:Access Methods%'' + AND counter_name LIKE ''Workfiles Created/sec%''; + ') + ,('This is the number of work files created per second.') + ,('For example, work files could be used to store temporary results for hash joins and hash aggregates. The returned value should be less than 20. Tempdb work files are used in processing hash operations when the amount of data being processed is too large to fit into the available memory.') + ,('High values can indicate thrash in the tempdb file as well as poorly coded queries.') + ,('It is possible to reduce the value this monitor returns by making queries more efficient by adding/changing indexes. Adding additional memory will also help.') + ,(1) + ,(1) + ,(4) + ) +END +GO + +IF NOT EXISTS (SELECT * FROM [dbo].[Monitoring_counter] WHERE [MC_name] = 'Worktables Created/sec') +BEGIN +INSERT INTO [dbo].[Monitoring_counter] + ([Monitoring_counter_ID] + ,[MC_name] + ,[MC_type] + ,[MC_sql_query] + ,[MC_definition] + ,[MC_information] + ,[MC_problem] + ,[MC_remediation] + ,[MC_sequence] + ,[MC_is_visible] + ,[MC_monitoring_area]) + VALUES((50) + ,('Worktables Created/sec') + ,(2) + ,('SELECT cntr_value + FROM sys.dm_os_performance_counters + WHERE object_name LIKE ''%:Access Methods%'' + AND counter_name LIKE ''Worktables Created/sec%''; + ') + ,('This performance counter displays the number of work tables created per second.') + ,('For example, work tables could be used to store temporary results for query spool, lob variables, XML variables, and cursors. The returned value should be less than 20. Worktables are used for queries that use various spools (table spool, index spool, and so on).') + ,('High values could cause general slowdown.') + ,('Remediation requires rewriting your procedures.') + ,(1) + ,(1) + ,(4) + ) +END +GO + +IF NOT EXISTS (SELECT * FROM [dbo].[Monitoring_counter] WHERE [MC_name] = 'Probe Scans/sec') +BEGIN +INSERT INTO [dbo].[Monitoring_counter] + ([Monitoring_counter_ID] + ,[MC_name] + ,[MC_type] + ,[MC_sql_query] + ,[MC_definition] + ,[MC_information] + ,[MC_problem] + ,[MC_remediation] + ,[MC_sequence] + ,[MC_is_visible] + ,[MC_monitoring_area]) + VALUES((51) + ,('Probe Scans/sec') + ,(2) + ,('SELECT cntr_value + FROM sys.dm_os_performance_counters + WHERE object_name LIKE ''%:Access Methods%'' + AND counter_name LIKE ''Probe Scans/sec%''; + ') + ,('This performance counter returns the number of Probe Scans, per second, that are used to find at most, one single qualified row in an index or base table directly.') + ,(NULL) + ,(NULL) + ,(NULL) + ,(1) + ,(1) + ,(6) + ) +END +GO + +IF NOT EXISTS (SELECT * FROM [dbo].[Monitoring_counter] WHERE [MC_name] = 'Range Scans/sec') +BEGIN +INSERT INTO [dbo].[Monitoring_counter] + ([Monitoring_counter_ID] + ,[MC_name] + ,[MC_type] + ,[MC_sql_query] + ,[MC_definition] + ,[MC_information] + ,[MC_problem] + ,[MC_remediation] + ,[MC_sequence] + ,[MC_is_visible] + ,[MC_monitoring_area]) + VALUES((52) + ,('Range Scans/sec') + ,(2) + ,('SELECT cntr_value + FROM sys.dm_os_performance_counters + WHERE object_name LIKE ''%:Access Methods%'' + AND counter_name LIKE ''Range Scans/sec%''; + ') + ,('This performance counter returns the number of Qualified Range Scans through indexes per second.') + ,('This monitor returns the number of qualified range scans through indexes per second.') + ,(NULL) + ,(NULL) + ,(1) + ,(1) + ,(6) + ) +END +GO + +IF NOT EXISTS (SELECT * FROM [dbo].[Monitoring_counter] WHERE [MC_name] = 'Auto-Param Attempts/sec') +BEGIN +INSERT INTO [dbo].[Monitoring_counter] + ([Monitoring_counter_ID] + ,[MC_name] + ,[MC_type] + ,[MC_sql_query] + ,[MC_definition] + ,[MC_information] + ,[MC_problem] + ,[MC_remediation] + ,[MC_sequence] + ,[MC_is_visible] + ,[MC_monitoring_area]) + VALUES((53) + ,('Auto-Param Attempts/sec') + ,(2) + ,('SELECT cntr_value + FROM sys.dm_os_performance_counters + WHERE object_name LIKE ''%:SQL Statistics%'' + AND counter_name LIKE ''Auto-Param Attempts/sec%''; + ') + ,('This performance counter returns the number of auto-parameterization (http://msdn.microsoft.com/en-us/library/ms186219.aspx) attempts per second.') + ,('The total for this monitor should be the sum of the failed, safe, and unsafe auto-parameterizations. Auto-parameterization occurs when an instance of SQL Server tries to parameterize a Transact-SQL request by replacing some literals with parameters so that reuse of the resulting cached execution plan across multiple similar-looking requests is possible. Note that auto-parameterizations are also known as simple parameterizations in newer versions of SQL Server. This counter does not include forced parameterizations (http://technet.microsoft.com/en-us/library/ms175037.aspx).') + ,('Bad T-SQL coding practices can increase recompilation frequency and adversely affect SQL Server''s performance. Such situations can be debugged and corrected in many cases.') + ,(NULL) + ,(1) + ,(1) + ,(6) + ) +END +GO + +IF NOT EXISTS (SELECT * FROM [dbo].[Monitoring_counter] WHERE [MC_name] = 'Failed Auto-Params/sec') +BEGIN +INSERT INTO [dbo].[Monitoring_counter] + ([Monitoring_counter_ID] + ,[MC_name] + ,[MC_type] + ,[MC_sql_query] + ,[MC_definition] + ,[MC_information] + ,[MC_problem] + ,[MC_remediation] + ,[MC_sequence] + ,[MC_is_visible] + ,[MC_monitoring_area]) + VALUES((54) + ,('Failed Auto-Params/sec') + ,(2) + ,('SELECT cntr_value + FROM sys.dm_os_performance_counters + WHERE object_name LIKE ''%:SQL Statistics%'' + AND counter_name LIKE ''Failed Auto-Params/sec%''; + ') + ,('This performance counter returns the number of failed auto-parameterization (http://msdn.microsoft.com/en-us/library/ms186219.aspx) attempts per second.') + ,('The value returned by this monitor should be low. Note that auto-parameterizations are also known as simple parameterizations in later versions of SQL Server. Preferred values should be near zero. In order for thresholds to be tuned to your environment, thresholds for this performance counter should be set using the Baseline Calculator.') + ,('Bad T-SQL coding practices can increase recompilation frequency and adversely affect SQL Server''s performance. Such situations can be debugged and corrected in many cases.') + ,('') + ,(1) + ,(1) + ,(6) + ) +END +GO + +IF NOT EXISTS (SELECT * FROM [dbo].[Monitoring_counter] WHERE [MC_name] = 'Plan Re-Use Ratio') +BEGIN +INSERT INTO [dbo].[Monitoring_counter] + ([Monitoring_counter_ID] + ,[MC_name] + ,[MC_type] + ,[MC_sql_query] + ,[MC_definition] + ,[MC_information] + ,[MC_problem] + ,[MC_remediation] + ,[MC_sequence] + ,[MC_is_visible] + ,[MC_monitoring_area]) + VALUES((55) + ,('Plan Re-Use Ratio') + ,(1) + ,('SELECT CASE WHEN mh1.MH_value > 0 + THEN CONVERT(DECIMAL(15,2),(mh1.MH_value*1.0-mh2.MH_value*1.0)/mh1.MH_value*100) + ELSE 0 + END + FROM [HCITools].[dbo].[Monitoring_counter] mc1 WITH (NOLOCK) + JOIN [HCITools].[dbo].[Monitoring_history] mh1 WITH (NOLOCK) + ON mh1.MH_monitoring_counter = mc1.Monitoring_counter_ID + AND mh1.MH_datetime = (SELECT MAX(mh.MH_datetime) + FROM [HCITools].[dbo].[Monitoring_history] mh WITH (NOLOCK)) + JOIN [HCITools].[dbo].[Monitoring_history] mh2 WITH (NOLOCK) + JOIN [HCITools].[dbo].[Monitoring_counter] mc2 WITH (NOLOCK) + ON mc2.Monitoring_counter_ID = mh2.MH_monitoring_counter + AND mc2.MC_name = ''SQL Compilations/sec'' + ON mh2.MH_datetime = mh1.MH_datetime + WHERE mc1.MC_name = ''Batch Requests/sec''; + ') + ,('A query plan is used to execute a query.') + ,('Plan re-use is desirable for OLTP workloads because re-creating the same plan (for similar or identical transactions) is a waste of CPU resources. In order for thresholds to be tuned to your environment, thresholds for this performance counter should be set using the Baseline Calculator.') + ,('Zero cost plans will not be cached (not re-used) in SQL 2005 SP2. Applications that use zero cost plans will have a lower plan re-use but this is not a performance issue.') + ,('Review your plan re-use design. Tune your plan re-use design as it is described in the following article (http://sqlmag.com/sql-server/fine-tuning-plan-reuse).') + ,(2) + ,(1) + ,(6) + ) +END +GO + +IF NOT EXISTS (SELECT * FROM [dbo].[Monitoring_counter] WHERE [MC_name] = 'SQL Re-Compilations/sec') +BEGIN +INSERT INTO [dbo].[Monitoring_counter] + ([Monitoring_counter_ID] + ,[MC_name] + ,[MC_type] + ,[MC_sql_query] + ,[MC_definition] + ,[MC_information] + ,[MC_problem] + ,[MC_remediation] + ,[MC_sequence] + ,[MC_is_visible] + ,[MC_monitoring_area]) + VALUES((56) + ,('SQL Re-Compilations/sec') + ,(2) + ,('SELECT cntr_value + FROM sys.dm_os_performance_counters + WHERE object_name LIKE ''%:SQL Statistics%'' + AND counter_name = ''SQL Re-Compilations/sec''; + ') + ,(NULL) + ,(NULL) + ,(NULL) + ,(NULL) + ,(1) + ,(1) + ,(6) + ) +END +GO + +IF NOT EXISTS (SELECT * FROM [dbo].[Monitoring_counter] WHERE [MC_name] = 'Recompilations/Compilation Ratio') +BEGIN +INSERT INTO [dbo].[Monitoring_counter] + ([Monitoring_counter_ID] + ,[MC_name] + ,[MC_type] + ,[MC_sql_query] + ,[MC_definition] + ,[MC_information] + ,[MC_problem] + ,[MC_remediation] + ,[MC_sequence] + ,[MC_is_visible] + ,[MC_monitoring_area]) + VALUES((57) + ,('Recompilations/Compilation Ratio') + ,(1) + ,('SELECT CASE WHEN mh1.MH_value > 0 + THEN CASE WHEN mh2.MH_value > 0 + THEN CONVERT(DECIMAL(15,2),mh1.MH_value*1.0/mh2.MH_value*100) + ELSE 100 + END + ELSE 0 + END + FROM [HCITools].[dbo].[Monitoring_counter] mc1 WITH (NOLOCK) + JOIN [HCITools].[dbo].[Monitoring_history] mh1 WITH (NOLOCK) + ON mh1.MH_monitoring_counter = mc1.Monitoring_counter_ID + AND mh1.MH_datetime = (SELECT MAX(mh.MH_datetime) + FROM [HCITools].[dbo].[Monitoring_history] mh WITH (NOLOCK)) + JOIN [HCITools].[dbo].[Monitoring_history] mh2 WITH (NOLOCK) + JOIN [HCITools].[dbo].[Monitoring_counter] mc2 WITH (NOLOCK) + ON mc2.Monitoring_counter_ID = mh2.MH_monitoring_counter + AND mc2.MC_name = ''SQL Compilations/sec'' + ON mh2.MH_datetime = mh1.MH_datetime + WHERE mc1.MC_name = ''SQL Re-Compilations/sec''; + ') + ,('This performance counter shows the ratio of SQL Recompilations to SQL Compilations.') + ,('SQL Recompilations should be less than 10% of SQL Compilations. In order for thresholds to be tuned to your environment, thresholds for this performance counter should be set using the Baseline Calculator.') + ,('Returned values that are high can indicate more temporary tables in use.') + ,('Change stored procedures to not change schemas, Use table variables instead of temporary tables.') + ,(2) + ,(1) + ,(6) + ) +END +GO + +IF NOT EXISTS (SELECT * FROM [dbo].[Monitoring_counter] WHERE [MC_name] = 'Checkpoint Pages/sec') +BEGIN +INSERT INTO [dbo].[Monitoring_counter] + ([Monitoring_counter_ID] + ,[MC_name] + ,[MC_type] + ,[MC_sql_query] + ,[MC_definition] + ,[MC_information] + ,[MC_problem] + ,[MC_remediation] + ,[MC_sequence] + ,[MC_is_visible] + ,[MC_monitoring_area]) + VALUES((58) + ,('Checkpoint Pages/sec') + ,(2) + ,('SELECT cntr_value + FROM sys.dm_os_performance_counters + WHERE object_name LIKE ''%:Buffer Manager%'' + AND counter_name LIKE ''Checkpoint Pages/sec%''; + ') + ,('The checkpoint pages per second counter measures the number of pages written to disk by a checkpoint operation.') + ,('You should watch this counter over time to establish a baseline for your systems. Once a baseline value has been established you can watch this value to see if it is climbing.') + ,('If this counter is climbing, it might mean you are running into memory pressures that are causing dirty pages to be flushed to disk more frequently than normal.') + ,(NULL) + ,(1) + ,(1) + ,(5) + ) +END +GO + +IF NOT EXISTS (SELECT * FROM [dbo].[Monitoring_counter] WHERE [MC_name] = 'SQL Server Average CPU Load') +BEGIN +INSERT INTO [dbo].[Monitoring_counter] + ([Monitoring_counter_ID] + ,[MC_name] + ,[MC_type] + ,[MC_sql_query] + ,[MC_definition] + ,[MC_information] + ,[MC_problem] + ,[MC_remediation] + ,[MC_sequence] + ,[MC_is_visible] + ,[MC_monitoring_area]) + VALUES((59) + ,('SQL Server Average CPU Load') + ,(1) + ,('SELECT CONVERT(DECIMAL(5,2),AVG(y.SQLServerProcessCPUUtilization)) AS [SQLServerProcessCPUUtilization] + FROM (SELECT TOP(5) + SQLProcessUtilization*1.0 AS [SQLServerProcessCPUUtilization] + FROM (SELECT record.value(''(./Record/@id)[1]'', ''int'') AS record_id + ,record.value(''(./Record/SchedulerMonitorEvent/SystemHealth/ProcessUtilization)[1]'', ''int'') AS [SQLProcessUtilization] + FROM (SELECT CONVERT(xml, record) AS [record] + FROM sys.dm_os_ring_buffers + WHERE ring_buffer_type = N''RING_BUFFER_SCHEDULER_MONITOR'' + AND record LIKE ''%%'') AS x + ) AS y + ORDER BY record_id DESC + ) AS y; + ') + ,(NULL) + ,(NULL) + ,(NULL) + ,(NULL) + ,(1) + ,(1) + ,(10) + ) +END +GO + +IF NOT EXISTS (SELECT * FROM [dbo].[Monitoring_counter] WHERE [MC_name] = 'System Idle Average CPU Load') +BEGIN +INSERT INTO [dbo].[Monitoring_counter] + ([Monitoring_counter_ID] + ,[MC_name] + ,[MC_type] + ,[MC_sql_query] + ,[MC_definition] + ,[MC_information] + ,[MC_problem] + ,[MC_remediation] + ,[MC_sequence] + ,[MC_is_visible] + ,[MC_monitoring_area]) + VALUES((60) + ,('System Idle Average CPU Load') + ,(1) + ,('SELECT CONVERT(DECIMAL(5,2),AVG(y.SystemIdleProcess)) AS [SystemIdleProcess] + FROM (SELECT TOP(5) + SystemIdle*1.0 AS [SystemIdleProcess] + FROM (SELECT record.value(''(./Record/@id)[1]'', ''int'') AS record_id + ,record.value(''(./Record/SchedulerMonitorEvent/SystemHealth/SystemIdle)[1]'', ''int'') AS [SystemIdle] + FROM (SELECT CONVERT(xml, record) AS [record] + FROM sys.dm_os_ring_buffers + WHERE ring_buffer_type = N''RING_BUFFER_SCHEDULER_MONITOR'' + AND record LIKE ''%%'') AS x + ) AS y + ORDER BY record_id DESC + ) AS y; + ') + ,(NULL) + ,(NULL) + ,(NULL) + ,(NULL) + ,(1) + ,(1) + ,(10) + ) +END + +IF NOT EXISTS (SELECT * FROM [dbo].[Monitoring_counter] WHERE [MC_name] = 'Processes blocked') +BEGIN +INSERT INTO [dbo].[Monitoring_counter] + ([Monitoring_counter_ID] + ,[MC_name] + ,[MC_type] + ,[MC_sql_query] + ,[MC_definition] + ,[MC_information] + ,[MC_problem] + ,[MC_remediation] + ,[MC_sequence] + ,[MC_is_visible] + ,[MC_monitoring_area]) + VALUES((63) + ,('Processes blocked') + ,(1) + ,('SELECT cntr_value + FROM sys.dm_os_performance_counters + WHERE counter_name = ''Processes blocked''; + ') + ,NULL + ,NULL + ,NULL + ,NULL + ,(1) + ,(1) + ,(3) + ) +END +GO + +IF NOT EXISTS (SELECT * FROM [dbo].[Monitoring_counter] WHERE [MC_name] = 'Memory Grants Outstanding') +BEGIN +INSERT INTO [dbo].[Monitoring_counter] + ([Monitoring_counter_ID] + ,[MC_name] + ,[MC_type] + ,[MC_sql_query] + ,[MC_definition] + ,[MC_information] + ,[MC_problem] + ,[MC_remediation] + ,[MC_sequence] + ,[MC_is_visible] + ,[MC_monitoring_area]) + VALUES((64) + ,('Memory Grants Outstanding') + ,(1) + ,('SELECT cntr_value + FROM sys.dm_os_performance_counters + WHERE counter_name = ''Memory Grants Outstanding''; + ') + ,('Specifies the total number of processes that have successfully acquired a workspace memory grant') + ,NULL + ,NULL + ,NULL + ,(1) + ,(1) + ,(4) + ) +END +GO + +SET IDENTITY_INSERT [dbo].[Monitoring_counter] OFF +GO + +/*****************************************************************/ +/********** Insert Data in [Monitoring_threshold] ********/ +/*****************************************************************/ + +USE [HCITools] +GO +SET IDENTITY_INSERT [dbo].[Monitoring_threshold] ON +IF NOT EXISTS (SELECT * FROM [dbo].[Monitoring_threshold] WHERE [MT_monitoring_counter] = 1) +BEGIN +INSERT INTO [dbo].[Monitoring_threshold] + ([Monitoring_threshold_ID] + ,[MT_warning_threshold_low] + ,[MT_warning_threshold_high] + ,[MT_critical_threshold_low] + ,[MT_critical_threshold_high] + ,[MT_server_name] + ,[MT_monitoring_counter]) + VALUES((1) + ,(90) + ,(95) + ,(0) + ,(90) + ,(NULL) + ,(1) + ) +END +GO + +IF NOT EXISTS (SELECT * FROM [dbo].[Monitoring_threshold] WHERE [MT_monitoring_counter] = 2) +BEGIN +INSERT INTO [dbo].[Monitoring_threshold] + ([Monitoring_threshold_ID] + ,[MT_warning_threshold_low] + ,[MT_warning_threshold_high] + ,[MT_critical_threshold_low] + ,[MT_critical_threshold_high] + ,[MT_server_name] + ,[MT_monitoring_counter]) + VALUES((2) + ,(NULL) + ,(NULL) + ,(0) + ,(750) + ,(NULL) + ,(2) + ) +END +GO + +IF NOT EXISTS (SELECT * FROM [dbo].[Monitoring_threshold] WHERE [MT_monitoring_counter] = 16) +BEGIN +INSERT INTO [dbo].[Monitoring_threshold] + ([Monitoring_threshold_ID] + ,[MT_warning_threshold_low] + ,[MT_warning_threshold_high] + ,[MT_critical_threshold_low] + ,[MT_critical_threshold_high] + ,[MT_server_name] + ,[MT_monitoring_counter]) + VALUES((3) + ,(400) + ,(500) + ,(500) + ,(NULL) + ,(NULL) + ,(16) + ) +END +GO + +IF NOT EXISTS (SELECT * FROM [dbo].[Monitoring_threshold] WHERE [MT_monitoring_counter] = 20) +BEGIN +INSERT INTO [dbo].[Monitoring_threshold] + ([Monitoring_threshold_ID] + ,[MT_warning_threshold_low] + ,[MT_warning_threshold_high] + ,[MT_critical_threshold_low] + ,[MT_critical_threshold_high] + ,[MT_server_name] + ,[MT_monitoring_counter]) + VALUES((4) + ,(NULL) + ,(NULL) + ,(1) + ,(NULL) + ,(NULL) + ,(20) + ) +END +GO + +IF NOT EXISTS (SELECT * FROM [dbo].[Monitoring_threshold] WHERE [MT_monitoring_counter] = 15) +BEGIN +INSERT INTO [dbo].[Monitoring_threshold] + ([Monitoring_threshold_ID] + ,[MT_warning_threshold_low] + ,[MT_warning_threshold_high] + ,[MT_critical_threshold_low] + ,[MT_critical_threshold_high] + ,[MT_server_name] + ,[MT_monitoring_counter]) + VALUES((5) + ,(NULL) + ,(NULL) + ,(1) + ,(NULL) + ,(NULL) + ,(15) + ) +END +GO + +IF NOT EXISTS (SELECT * FROM [dbo].[Monitoring_threshold] WHERE [MT_monitoring_counter] = 4) +BEGIN +INSERT INTO [dbo].[Monitoring_threshold] + ([Monitoring_threshold_ID] + ,[MT_warning_threshold_low] + ,[MT_warning_threshold_high] + ,[MT_critical_threshold_low] + ,[MT_critical_threshold_high] + ,[MT_server_name] + ,[MT_monitoring_counter]) + VALUES((6) + ,(24000) + ,(27000) + ,(27000) + ,(NULL) + ,(NULL) + ,(4) + ) +END +GO + +IF NOT EXISTS (SELECT * FROM [dbo].[Monitoring_threshold] WHERE [MT_monitoring_counter] = 32) +BEGIN +INSERT INTO [dbo].[Monitoring_threshold] + ([Monitoring_threshold_ID] + ,[MT_warning_threshold_low] + ,[MT_warning_threshold_high] + ,[MT_critical_threshold_low] + ,[MT_critical_threshold_high] + ,[MT_server_name] + ,[MT_monitoring_counter]) + VALUES((7) + ,(25) + ,(30) + ,(30) + ,(NULL) + ,(NULL) + ,(32) + ) +END +GO + +IF NOT EXISTS (SELECT * FROM [dbo].[Monitoring_threshold] WHERE [MT_monitoring_counter] = 27) +BEGIN +INSERT INTO [dbo].[Monitoring_threshold] + ([Monitoring_threshold_ID] + ,[MT_warning_threshold_low] + ,[MT_warning_threshold_high] + ,[MT_critical_threshold_low] + ,[MT_critical_threshold_high] + ,[MT_server_name] + ,[MT_monitoring_counter]) + VALUES((8) + ,(25) + ,(30) + ,(30) + ,(NULL) + ,(NULL) + ,(27) + ) +END +SET IDENTITY_INSERT [dbo].[Monitoring_threshold] OFF +GO + +/*******************************************************************************************************/ +/********** Create Stored Procedures for Monitoring: [mon_Collect_Counters_History] ************/ +/*******************************************************************************************************/ + + +USE [HCITools] +GO + +/****** Object: StoredProcedure [dbo].[mon_Collect_Counters_History] Script Date: 18.07.2018 10:52:46 ******/ +SET ANSI_NULLS ON +GO + +SET QUOTED_IDENTIFIER ON +GO + + + +IF EXISTS (SELECT * FROM sys.objects WHERE object_id = OBJECT_ID(N'[dbo].[mon_Collect_Counters_History]') AND type in (N'P', N'PC')) +DROP PROCEDURE [dbo].[mon_Collect_Counters_History] +GO + + +CREATE PROCEDURE [dbo].[mon_Collect_Counters_History] + @in_debug INT = NULL +AS + +/*============================================================================= + + Explication du traitement realise par la SP + ------------------------------------------- + To collect performance counters in SQL Server + + Contexte d'utilisation + ---------------------- + Job : SQL Server Performance - DR92170 + + Parametres + ---------- + @in_debug + + Creation : 18.07.2018 / LPE + + Modifications : + 23.07.2018/LPE : Add [MC_type]=5 to get aggregate values + +=============================================================================*/ + +SET NOCOUNT ON; +--SET QUOTED_IDENTIFIER ON + +DECLARE @result_sp INT, + @errno INT, + @errmsg VARCHAR(255); + + +/*------------------- Declaration des variables --------------------*/ +DECLARE @c_monitoring_counter_id BIGINT, + @c_mc_type SMALLINT, + @c_mc_sql_query NVARCHAR(MAX), + @cmd NVARCHAR(MAX), + @monitoring_history_id BIGINT, + @last_original_value BIGINT, + @last_datetime DATETIME, + @current_datetime SMALLDATETIME + + +/*------------ Affectation des parametres aux variables ------------*/ + + +/*-------------------- Test des parametres input -------------------*/ + + + + +/*---------------------------- Traitement --------------------------*/ +DECLARE @t_current_value TABLE + (t_current_instance NVARCHAR(128), + t_current_value BIGINT) + +DECLARE @tInstanceHistory TABLE + (tInstance_name NVARCHAR(128), + tLast_original_value BIGINT, + tLast_datetime SMALLDATETIME) + +SELECT @current_datetime = CAST(GETDATE() AS SMALLDATETIME) + +DECLARE c_counters CURSOR LOCAL FORWARD_ONLY STATIC FOR +SELECT Monitoring_counter_ID, + MC_type, + MC_sql_query + FROM [HCITools].[dbo].[Monitoring_counter] + ORDER BY MC_sequence + +OPEN c_counters +FETCH NEXT FROM c_counters +INTO @c_monitoring_counter_id, + @c_mc_type, + @c_mc_sql_query + +WHILE @@FETCH_STATUS = 0 +BEGIN + + SET @cmd = NULL + SET @last_original_value = NULL + SET @last_datetime = NULL + DELETE FROM @t_current_value + DELETE FROM @tInstanceHistory + + IF(@c_mc_type = 1) /* 1=instant value*/ + BEGIN + + INSERT INTO @t_current_value + (t_current_value) + EXEC (@c_mc_sql_query) + + INSERT INTO [HCITools].[dbo].[Monitoring_history] + ([MH_monitoring_counter], + [MH_value], + [MH_datetime]) + SELECT TOP 1 + @c_monitoring_counter_id, + cv.t_current_value, + @current_datetime + FROM @t_current_value cv + + END /* @c_mc_type = 1 */ + ELSE IF(@c_mc_type = 2) /* 2=aggregate value (per second) */ + BEGIN + + SELECT @last_original_value = mh.MH_original_value, + @last_datetime = mh.MH_datetime + FROM [HCITools].[dbo].[Monitoring_history] mh WITH (NOLOCK) + WHERE mh.Monitoring_history_ID = (SELECT MAX(mh2.Monitoring_history_ID) + FROM [HCITools].[dbo].[Monitoring_history] mh2 WITH (NOLOCK) + WHERE mh2.MH_monitoring_counter = @c_monitoring_counter_id) + + INSERT @t_current_value + (t_current_value) + EXEC (@c_mc_sql_query) + + INSERT INTO [HCITools].[dbo].[Monitoring_history] + ([MH_monitoring_counter], + [MH_value], + [MH_original_value], + [MH_datetime]) + SELECT @c_monitoring_counter_id, + CASE WHEN @last_original_value IS NULL + THEN t.t_current_value -- Pour le premier, on ne divise pas par les secondes... à voir + ELSE CASE WHEN t.t_current_value >= @last_original_value + THEN (t.t_current_value - @last_original_value) / DATEDIFF(ss,@last_datetime,GETDATE()) + ELSE t.t_current_value / DATEDIFF(ss,@last_datetime,GETDATE()) + END + END, + t.t_current_value, + @current_datetime + FROM @t_current_value t + + END /* @c_mc_type = 2 */ + ELSE IF(@c_mc_type = 3) /* 3=instant value with instance */ + BEGIN + + INSERT INTO [HCITools].[dbo].[Monitoring_history] + ([MH_monitoring_counter], + [MH_instance_name], + [MH_value], + [MH_datetime]) + EXEC (@c_mc_sql_query) + + END /* @c_mc_type = 3 */ + ELSE IF(@c_mc_type = 4) /* 4=aggregate value with instance (per second) */ + BEGIN + + INSERT INTO @tInstanceHistory + (tInstance_name, + tLast_original_value, + tLast_datetime) + SELECT mh.MH_instance_name, + mh.MH_original_value, + mh.MH_datetime + FROM [HCITools].[dbo].[Monitoring_history] mh WITH (NOLOCK) + WHERE mh.Monitoring_history_ID = (SELECT MAX(mh2.Monitoring_history_ID) + FROM [HCITools].[dbo].[Monitoring_history] mh2 WITH (NOLOCK) + WHERE mh2.MH_monitoring_counter = @c_monitoring_counter_id + AND mh2.MH_instance_name = mh.MH_instance_name) + + INSERT @t_current_value + (t_current_instance, + t_current_value) + EXEC (@c_mc_sql_query) + + INSERT INTO [HCITools].[dbo].[Monitoring_history] + ([MH_monitoring_counter], + [MH_instance_name], + [MH_value], + [MH_original_value], + [MH_datetime]) + SELECT @c_monitoring_counter_id, + t.t_current_instance, + CASE WHEN i.tLast_original_value IS NULL + THEN t.t_current_value -- Pour le premier, on ne divise pas par les secondes... à voir + ELSE CASE WHEN t.t_current_value >= i.tLast_original_value + THEN (t.t_current_value - i.tLast_original_value) / DATEDIFF(ss,i.tLast_datetime,GETDATE()) + ELSE t.t_current_value / DATEDIFF(ss,i.tLast_datetime,GETDATE()) + END + END, + t.t_current_value, + @current_datetime + FROM @t_current_value t + LEFT JOIN @tInstanceHistory i + ON i.tInstance_name = t.t_current_instance + + END /* @c_mc_type = 4 */ + ELSE IF(@c_mc_type = 5) /* 5=aggregate value */ + BEGIN + + SELECT @last_original_value = mh.MH_original_value + FROM [HCITools].[dbo].[Monitoring_history] mh WITH (NOLOCK) + WHERE mh.Monitoring_history_ID = (SELECT MAX(mh2.Monitoring_history_ID) + FROM [HCITools].[dbo].[Monitoring_history] mh2 WITH (NOLOCK) + WHERE mh2.MH_monitoring_counter = @c_monitoring_counter_id) + + INSERT @t_current_value + (t_current_value) + EXEC (@c_mc_sql_query) + + INSERT INTO [HCITools].[dbo].[Monitoring_history] + ([MH_monitoring_counter], + [MH_value], + [MH_original_value], + [MH_datetime]) + SELECT @c_monitoring_counter_id, + CASE WHEN @last_original_value IS NULL + THEN t.t_current_value + ELSE CASE WHEN t.t_current_value >= @last_original_value + THEN (t.t_current_value - @last_original_value) + ELSE t.t_current_value + END + END, + t.t_current_value, + @current_datetime + FROM @t_current_value t + + END /* @c_mc_type = 5 */ + + FETCH NEXT FROM c_counters + INTO @c_monitoring_counter_id, + @c_mc_type, + @c_mc_sql_query + +END + +CLOSE c_counters; +DEALLOCATE c_counters; + + +/*------------------ Retour au programme appelant -----------------*/ + +return(@@error); + +/*---------------------- Traitement des erreurs ----------------------*/ +error_99: + raiserror (@result_sp, @errno, @errmsg) ; + return(@errno); + +GO + + +/**************************************************************************************************/ +/******* Create Stored Procedures for Monitoring: [mon_Get_Counters_History] *************/ +/**************************************************************************************************/ + +/*============================================================================= + + User guide + ------------------------------------------ + Create Stored Procedures for Monitoring: mon_Get_Counters_History + + + Usage context + ------------------------------------------ + To get sensor in the server and make a server reporting + + + Parameters + ------------------------------------------ + + Creation : 18.07.18 / KLU + + Modification : + + +=============================================================================*/ + +USE [HCITools] +GO + +/****** Object: StoredProcedure [dbo].[mon_Get_Counters_History] Script Date: 18.07.2018 10:53:19 ******/ +SET ANSI_NULLS ON +GO + +SET QUOTED_IDENTIFIER ON +GO + + +IF EXISTS (SELECT * FROM sys.objects WHERE object_id = OBJECT_ID(N'[dbo].[mon_Get_Counters_History]') AND type in (N'P', N'PC')) +DROP PROCEDURE [dbo].[mon_Get_Counters_History] +GO + + +CREATE PROCEDURE [dbo].[mon_Get_Counters_History] + @in_start_datetime SMALLDATETIME, + @in_end_datetime SMALLDATETIME, + @in_group_counter_list NVARCHAR(200) = NULL, + @in_segment SMALLINT = NULL, + @in_frequency_in_min SMALLINT = NULL, + @in_debug INT = NULL +AS + + +/*============================================================================= + + Explication du traitement realise par la SP + ------------------------------------------- + To get sensor in the server and make a server reporting + + Contexte d'utilisation + ---------------------- + SSRS : GraphMonPerfSQLServer.sln + + Parametres + ---------- + @in_start_datetime + @in_end_datetime + @in_group_counter_list + @in_segment + @in_frequency_in_min + @in_debug + + Creation : 18.07.2018 / LPE + + Modifications : + +=============================================================================*/ + + +SET NOCOUNT ON; + +DECLARE @result_sp INT, + @errno INT, + @errmsg VARCHAR(255); + + +/*------------------- Declaration des variables --------------------*/ +DECLARE @param_start_datetime SMALLDATETIME, + @param_end_datetime SMALLDATETIME, + @param_group_counter_list NVARCHAR(200), + @param_segment SMALLINT, + @param_frequency_in_min SMALLINT; + +/*------------------------- Dataset final -------------------------*/ +DECLARE @tCalcCounterHistory TABLE + (MC_monitoring_area BIGINT + ,Monitoring_counter_ID BIGINT + ,MH_instance_name NVARCHAR(128) + ,MT_warning_threshold_low BIGINT + ,MT_warning_threshold_high BIGINT + ,MT_critical_threshold_low BIGINT + ,MT_critical_threshold_high BIGINT + ,MH_datetime SMALLDATETIME + ,MH_value BIGINT + ,MH_min_value BIGINT + ,MH_max_value BIGINT + ,MH_min_datetime SMALLDATETIME + ,MH_max_datetime SMALLDATETIME + ) + +/*------------ Affectation des parametres aux variables ------------*/ +SELECT @param_start_datetime = ISNULL(@in_start_datetime, '2015-01-01'), + @param_end_datetime = ISNULL(@in_end_datetime, '2079-06-06'), + @param_group_counter_list = @in_group_counter_list, + @param_segment = ISNULL(@in_segment,24), /* Par defaut, on decoupe en 24 plages horaires */ + @param_frequency_in_min = ISNULL(@in_frequency_in_min,5); /* Par defaut, frequence de recolte des donnees de 5 minutes*/ + + +/*-------------------- Test des parametres input -------------------*/ +IF @param_start_datetime IS NULL +OR @param_start_datetime IS NULL +BEGIN + SELECT @errno = 70003, + @errmsg = 'Invalid input parameters in stored procedure [mon_Get_Counters_History]!'; + GOTO error_99; +END; + + +/*--- Extraction de la liste des groupes de compteurs a retourner ---*/ +IF @in_group_counter_list IS NOT NULL +BEGIN + + DECLARE @xml XML, + @delimiter VARCHAR(1) + + DECLARE @tMonitoring_area_list TABLE + (Monitoring_area_ID BIGINT) + + SET @delimiter = ',' + + SET @xml = CAST((''+REPLACE(@param_group_counter_list, @delimiter, '')+'') AS XML) + + INSERT INTO @tMonitoring_area_list + (Monitoring_area_ID) + SELECT C.value('.', 'bigint') AS value + FROM @xml.nodes('X') AS X(C) + + IF @in_debug = 1 + SELECT Monitoring_area_ID AS 'SELECT "@in_group_counter_list"' + FROM @tMonitoring_area_list + +END /* IF @in_group_counter_list IS NOT NULL */ + + +/*---------------- Recolte des plages de date/heure ----------------*/ +DECLARE @tDatetimeRange TABLE + (tdrDatetimeFrom SMALLDATETIME, + tdrDatetimeTo SMALLDATETIME) + +DECLARE @datetime_range_in_m INT, + @datetime_range_in_s INT, + @current_max_MH_datetime SMALLDATETIME + + +/* Recherche de la date la plus recente ayant une valeur */ +SELECT @current_max_MH_datetime = MAX(mh.MH_datetime) + FROM Monitoring_history mh WITH (NOLOCK) + JOIN Monitoring_counter mc WITH (NOLOCK) + ON mc.Monitoring_counter_ID = mh.MH_monitoring_counter + WHERE mc.MC_is_visible = 1 + AND ( @param_group_counter_list IS NULL + OR EXISTS(SELECT 1 + FROM @tMonitoring_area_list mal + WHERE mal.Monitoring_area_ID = mc.MC_monitoring_area)) +IF @current_max_MH_datetime < @param_end_datetime + SET @param_end_datetime = @current_max_MH_datetime + + +/* Calcul de la taille de la plage horaire aggregee avec gestion des arrondis */ +SELECT @datetime_range_in_s = DATEDIFF(SECOND,@param_start_datetime,@param_end_datetime) / @param_segment +SELECT @datetime_range_in_m = DATEDIFF(MINUTE, '1900-01-01', DATEADD(SECOND,@datetime_range_in_s+(30*@param_frequency_in_min),'1900-01-01'))/@param_frequency_in_min*@param_frequency_in_min + + +/* On aggrege les donnees uniquement si la plage horaire est superieur a la frequence de recolte des donnees */ +IF @datetime_range_in_m > @param_frequency_in_min +BEGIN /* donnees agregees */ + +-- SET @datetime_range_in_m = @param_frequency_in_min + + /* Calcul des plages horaires. On commence par la date la plus recente. */ + ;WITH mycte AS + ( + SELECT @param_end_datetime AS DateValue + UNION ALL + SELECT DATEADD(MINUTE,-@datetime_range_in_m,DateValue) + FROM mycte + WHERE DATEADD(MINUTE,-@datetime_range_in_m,DateValue) >= @param_start_datetime + ) + INSERT INTO @tDatetimeRange + (tdrDatetimeFrom, + tdrDatetimeTo) + SELECT DATEADD(MINUTE,-@datetime_range_in_m,DateValue), + DateValue + FROM mycte + ORDER BY mycte.DateValue ASC + OPTION (MAXRECURSION 0) + + IF @in_debug = 1 + SELECT '@tDatetimeRange', + * + FROM @tDatetimeRange + + + /* Extraction des valeurs des compteurs agregees par plage horaire */ + INSERT INTO @tCalcCounterHistory + (MC_monitoring_area + ,Monitoring_counter_ID + ,MH_instance_name + ,MT_warning_threshold_low + ,MT_warning_threshold_high + ,MT_critical_threshold_low + ,MT_critical_threshold_high + ,MH_datetime + ,MH_value + ,MH_min_value + ,MH_max_value + ,MH_min_datetime + ,MH_max_datetime) + SELECT mc.MC_monitoring_area + ,mc.Monitoring_counter_ID + ,mh.MH_instance_name + ,mt.MT_warning_threshold_low + ,mt.MT_warning_threshold_high + ,mt.MT_critical_threshold_low + ,mt.MT_critical_threshold_high + ,DATEADD(MINUTE,DATEDIFF(MINUTE,dtr.tdrDatetimeFrom,dtr.tdrDatetimeTo)/2,dtr.tdrDatetimeFrom) AS MH_datetime + ,AVG(mh.[MH_value]) AS MH_value + ,MIN(mh.[MH_value]) AS MH_min_value + ,MAX(mh.[MH_value]) AS MH_max_value + ,dtr.tdrDatetimeFrom AS MH_min_datetime + ,dtr.tdrDatetimeTo AS MH_max_datetime + FROM @tDatetimeRange dtr + CROSS JOIN [HCITools].[dbo].[Monitoring_counter] mc WITH (NOLOCK) + LEFT JOIN [HCITools].[dbo].[Monitoring_threshold] mt WITH (NOLOCK) + ON mt.MT_monitoring_counter = mc.Monitoring_counter_ID + LEFT JOIN [HCITools].[dbo].[Monitoring_history] mh WITH (NOLOCK) + ON mh.MH_datetime > dtr.tdrDatetimeFrom AND mh.MH_datetime <= dtr.tdrDatetimeTo + AND mh.MH_monitoring_counter = mc.Monitoring_counter_ID + WHERE mc.MC_is_visible = 1 + AND ( @param_group_counter_list IS NULL + OR EXISTS(SELECT 1 + FROM @tMonitoring_area_list mal + WHERE mal.Monitoring_area_ID = mc.MC_monitoring_area) + ) + GROUP BY dtr.tdrDatetimeFrom, + dtr.tdrDatetimeTo + ,mc.MC_monitoring_area + ,mc.Monitoring_counter_ID + ,mh.MH_instance_name + ,mt.MT_warning_threshold_low + ,mt.MT_warning_threshold_high + ,mt.MT_critical_threshold_low + ,mt.MT_critical_threshold_high + ,DATEADD(MINUTE,DATEDIFF(MINUTE,dtr.tdrDatetimeFrom,dtr.tdrDatetimeTo)/2,dtr.tdrDatetimeFrom) + ORDER BY mc.MC_monitoring_area + ,mc.Monitoring_counter_ID + ,mh.MH_instance_name + ,dtr.tdrDatetimeFrom + ,dtr.tdrDatetimeTo + +END /* donnees agregees */ +ELSE +BEGIN /* donnees non-agregees */ + + INSERT INTO @tCalcCounterHistory + (MC_monitoring_area + ,Monitoring_counter_ID + ,MH_instance_name + ,MT_warning_threshold_low + ,MT_warning_threshold_high + ,MT_critical_threshold_low + ,MT_critical_threshold_high + ,MH_datetime + ,MH_value + ,MH_min_value + ,MH_max_value + ,MH_min_datetime + ,MH_max_datetime) + SELECT mc.MC_monitoring_area + ,mc.Monitoring_counter_ID + ,mh.MH_instance_name + ,mt.MT_warning_threshold_low + ,mt.MT_warning_threshold_high + ,mt.MT_critical_threshold_low + ,mt.MT_critical_threshold_high + ,mh.MH_datetime + ,mh.[MH_value] + ,mh.[MH_value] AS MH_min_value + ,mh.[MH_value] AS MH_max_value + ,(SELECT TOP 1 mh2.MH_datetime -- FAIRE UN CASE AVEC LE DERNIER REDEMARRAGE DU SERVEUR SQL + FROM [HCITools].[dbo].[Monitoring_history] mh2 WITH (NOLOCK) + WHERE mh2.MH_monitoring_counter = mh.MH_monitoring_counter + AND mh2.MH_datetime < mh.MH_datetime + ORDER BY mh2.MH_datetime DESC) AS MH_min_datetime + ,mh.MH_datetime AS MH_max_datetime + FROM [HCITools].[dbo].[Monitoring_counter] mc WITH (NOLOCK) + JOIN [HCITools].[dbo].[Monitoring_history] mh WITH (NOLOCK) + ON mh.MH_datetime > @param_start_datetime AND mh.MH_datetime <= @param_end_datetime + AND mh.MH_monitoring_counter = mc.Monitoring_counter_ID + LEFT JOIN [HCITools].[dbo].[Monitoring_threshold] mt WITH (NOLOCK) + ON mt.MT_monitoring_counter = mc.Monitoring_counter_ID + WHERE mc.MC_is_visible = 1 + AND ( @param_group_counter_list IS NULL + OR EXISTS(SELECT 1 + FROM @tMonitoring_area_list mal + WHERE mal.Monitoring_area_ID = mc.MC_monitoring_area) + ) + ORDER BY mc.MC_monitoring_area + ,mc.Monitoring_counter_ID + ,mh.MH_instance_name + ,mh.MH_datetime + +END /* donnees non-agregees */ + + +/*---------- Calcul de la limite critique superieure lorsqu'elle est infinie -----------*/ +/*--- (pour eviter les valeurs trop hautes qui pejorent les performances du rapport) ---*/ +UPDATE cch1 + SET cch1.MT_critical_threshold_high = CASE WHEN (SELECT MAX(cch2.MH_max_value) + FROM @tCalcCounterHistory cch2 + WHERE cch2.Monitoring_counter_ID = cch1.Monitoring_counter_ID) > cch1.MT_critical_threshold_low + THEN (SELECT MAX(cch2.MH_max_value) + FROM @tCalcCounterHistory cch2 + WHERE cch2.Monitoring_counter_ID = cch1.Monitoring_counter_ID) + 10 + ELSE cch1.MT_critical_threshold_low + 10 + END + FROM @tCalcCounterHistory cch1 + WHERE cch1.MT_critical_threshold_low IS NOT NULL + AND cch1.MT_critical_threshold_high IS NULL + + +/*---------------------- Dataset final ------------------*/ +SELECT MC_monitoring_area + ,Monitoring_counter_ID + ,MH_instance_name + ,MT_warning_threshold_low + ,MT_warning_threshold_high + ,MT_critical_threshold_low + ,MT_critical_threshold_high + ,MH_datetime + ,MH_value + ,MH_min_value + ,MH_max_value + ,MH_min_datetime + ,MH_max_datetime + FROM @tCalcCounterHistory + + +/*------------------ Retour au programme appelant -----------------*/ + +return(@@error); + +/*---------------------- Traitement des erreurs ----------------------*/ +error_99: + raiserror( @result_sp, @errno, @errmsg ) ; + return(@errno); + + + +GO + + +/******************************************************************************************/ +/********** User right for SP [mon_Get_Counters_History] ***************************/ +/******************************************************************************************/ + +use [HCITools] +GO +GRANT EXECUTE ON [dbo].[mon_Get_Counters_History] TO [sqlMonPerfUsr] +GO + + +/******************************************************************************************/ +/********** Create Job [DR92170 - Monitoring SQL Server Performances] *************/ +/******************************************************************************************/ + +/* Drop existing standard schedule for job */ +declare @schedule_id int +declare c_schedules cursor local forward_only static for + select ss.schedule_id + from msdb.dbo.sysjobschedules sjs +INNER JOIN msdb.dbo.sysschedules ss + ON sjs.schedule_id = ss.schedule_id + AND ss.name NOT LIKE '%#SPEC#' +INNER JOIN msdb.dbo.sysjobs sj + ON sjs.job_id = sj.job_id + WHERE sj.name = N'DR92170 - Monitoring SQL Server Performances' + +open c_schedules + +FETCH NEXT FROM c_schedules into @schedule_id +while @@fetch_status = 0 +begin + IF ((select COUNT(*) from msdb.dbo.sysjobschedules where schedule_id=@schedule_id) = 1) + EXEC msdb.dbo.sp_delete_schedule @schedule_id=@schedule_id, @force_delete = 1 +FETCH NEXT FROM c_schedules into @schedule_id +end + +close c_schedules + +deallocate c_schedules + +IF EXISTS (SELECT job_id FROM msdb.dbo.sysjobs_view WHERE name = N'DR92170 - Monitoring SQL Server Performances') +EXEC msdb.dbo.sp_delete_job @job_name = N'DR92170 - Monitoring SQL Server Performances', @delete_unused_schedule=0 +GO + +IF EXISTS (SELECT job_id FROM msdb.dbo.sysjobs_view WHERE name = N'DR90290 - Monitoring SQL Server Counters') +EXEC msdb.dbo.sp_delete_job @job_name = N'DR90290 - Monitoring SQL Server Counters', @delete_unused_schedule=0 +GO + +/* Creation Job and Steps*/ +BEGIN TRANSACTION +DECLARE @ReturnCode INT +SELECT @ReturnCode = 0 + +IF NOT EXISTS (SELECT name FROM msdb.dbo.syscategories WHERE name=N'Database Maintenance' AND category_class=1) +BEGIN +EXEC @ReturnCode = msdb.dbo.sp_add_category @class=N'JOB', @type=N'LOCAL', @name=N'Database Maintenance' +IF (@@ERROR <> 0 OR @ReturnCode <> 0) GOTO QuitWithRollback + +END + +/* Add Job */ +DECLARE @jobId BINARY(16) +EXEC @ReturnCode = msdb.dbo.sp_add_job @job_name=N'DR92170 - Monitoring SQL Server Performances', + @enabled=1, + @notify_level_eventlog=0, + @notify_level_email=0, + @notify_level_netsend=0, + @notify_level_page=0, + @delete_level=0, + @description=N'This job get all performances of this server + +Created by: KLU +Date: 28.06.2018', + @category_name=N'Database Maintenance', + @start_step_id=1, + @owner_login_name=N'sa', @job_id = @jobId OUTPUT +IF (@@ERROR <> 0 OR @ReturnCode <> 0) GOTO QuitWithRollback + +/* Add Step */ +EXEC @ReturnCode = msdb.dbo.sp_add_jobstep @job_id=@jobId, @step_name=N'Empty step', + @step_id=1, + @cmdexec_success_code=0, + @on_success_action=3, + @on_success_step_id=0, + @on_fail_action=3, + @on_fail_step_id=0, + @retry_attempts=0, + @retry_interval=0, + @os_run_priority=0, @subsystem=N'TSQL', + @command=N'/* Empty step */', + @database_name=N'master', + @output_file_name=NULL, + @flags=0, + @database_user_name=NULL, + @server=NULL, + @additional_parameters=NULL, + @proxy_id=NULL, + @proxy_name=NULL +IF (@@ERROR <> 0 OR @ReturnCode <> 0) GOTO QuitWithRollback +/* Add Step */ +EXEC @ReturnCode = msdb.dbo.sp_add_jobstep @job_id=@jobId, @step_name=N'Get Counters Data', + @step_id=2, + @cmdexec_success_code=0, + @on_success_action=3, + @on_success_step_id=0, + @on_fail_action=4, + @on_fail_step_id=4, + @retry_attempts=0, + @retry_interval=0, + @os_run_priority=0, @subsystem=N'TSQL', + @command=N'EXECUTE [HCITools].[dbo].[mon_Collect_Counters_History]', + @database_name=N'HCITools', + @output_file_name=NULL, + @flags=0, + @database_user_name=NULL, + @server=NULL, + @additional_parameters=NULL, + @proxy_id=NULL, + @proxy_name=NULL +IF (@@ERROR <> 0 OR @ReturnCode <> 0) GOTO QuitWithRollback +/* Add Step */ +EXEC @ReturnCode = msdb.dbo.sp_add_jobstep @job_id=@jobId, @step_name=N'Empty step for success', + @step_id=3, + @cmdexec_success_code=0, + @on_success_action=1, + @on_success_step_id=0, + @on_fail_action=4, + @on_fail_step_id=4, + @retry_attempts=0, + @retry_interval=0, + @os_run_priority=0, @subsystem=N'TSQL', + @command=N'/* Empty step */ +exec Get_Job_Error_Info @in_JobName = ''DR92170 - Monitoring SQL Server Performances'', @in_Recipients = ''DBA_operator''', + @database_name=N'HCITools', + @output_file_name=NULL, + @flags=0, + @database_user_name=NULL, + @server=NULL, + @additional_parameters=NULL, + @proxy_id=NULL, + @proxy_name=NULL +IF (@@ERROR <> 0 OR @ReturnCode <> 0) GOTO QuitWithRollback +/* Add Step */ +EXEC @ReturnCode = msdb.dbo.sp_add_jobstep @job_id=@jobId, @step_name=N'Send email KO', + @step_id=4, + @cmdexec_success_code=0, + @on_success_action=2, + @on_success_step_id=0, + @on_fail_action=2, + @on_fail_step_id=0, + @retry_attempts=0, + @retry_interval=0, + @os_run_priority=0, @subsystem=N'TSQL', + @command=N'exec Get_Job_Error_Info @in_JobName = ''DR92170 - Monitoring SQL Server Performances'', @in_Recipients = ''DBA_operator''', + @database_name=N'HCITools', + @output_file_name=NULL, + @flags=0, + @database_user_name=NULL, + @server=NULL, + @additional_parameters=NULL, + @proxy_id=NULL, + @proxy_name=NULL +IF (@@ERROR <> 0 OR @ReturnCode <> 0) GOTO QuitWithRollback +EXEC @ReturnCode = msdb.dbo.sp_update_job @job_id = @jobId, @start_step_id = 1 +IF (@@ERROR <> 0 OR @ReturnCode <> 0) GOTO QuitWithRollback + +/* Add Standard Schedule */ +EXEC @ReturnCode = msdb.dbo.sp_add_jobschedule @job_id=@jobId, @name=N'DR92170-DR', + @enabled=1, + @freq_type=4, + @freq_interval=1, + @freq_subday_type=4, + @freq_subday_interval=5, + @freq_relative_interval=0, + @freq_recurrence_factor=0, + @active_start_date=20180719, + @active_end_date=99991231, + @active_start_time=0, + @active_end_time=235959 +IF (@@ERROR <> 0 OR @ReturnCode <> 0) GOTO QuitWithRollback + +/* Attach existing specific schedule for job */ +declare @enabled_schedule int, + @schedule_name nvarchar(50) +declare c_schedules cursor local forward_only static for +select enabled, name + from msdb.dbo.sysschedules + where name LIKE 'DR92170%' + and name LIKE '%#SPEC#' + +open c_schedules + +FETCH NEXT FROM c_schedules into @enabled_schedule, @schedule_name +while @@fetch_status = 0 +begin + EXEC @ReturnCode = msdb.dbo.sp_attach_schedule @job_id = @jobId, @schedule_name=@schedule_name + IF(@enabled_schedule = 1) + begin + SET @schedule_name = SUBSTRING(@schedule_name,0,LEN(@schedule_name)-5) + IF EXISTS (select name from msdb.dbo.sysschedules where name = @schedule_name) + EXEC @ReturnCode = msdb.dbo.sp_update_schedule @name=@schedule_name, @enabled=0 + end + IF (@@ERROR <> 0 OR @ReturnCode <> 0) GOTO QuitWithRollback +FETCH NEXT FROM c_schedules into @enabled_schedule, @schedule_name +end + +close c_schedules + +deallocate c_schedules + +EXEC @ReturnCode = msdb.dbo.sp_add_jobserver @job_id = @jobId, @server_name = N'(local)' +IF (@@ERROR <> 0 OR @ReturnCode <> 0) GOTO QuitWithRollback +COMMIT TRANSACTION +GOTO EndSave +QuitWithRollback: + IF (@@TRANCOUNT > 0) ROLLBACK TRANSACTION +EndSave: + +GO + +-- #BUG 48620# [MH_value] could be NULL in table [HCITools].[dbo].[Monitoring_history] [#SPE] + +USE [HCITools] +GO + +IF NOT EXISTS (SELECT 1 FROM sys.columns WHERE object_id=object_id('Monitoring_history') AND name = 'MH_value' and is_nullable = 1) +BEGIN + ALTER TABLE dbo.[Monitoring_history] ALTER COLUMN [MH_value] bigint NULL +END +GO \ No newline at end of file diff --git a/TPDT-268 - ACP in task sequence/dba_packages/DeployTempDB.sql b/TPDT-268 - ACP in task sequence/dba_packages/DeployTempDB.sql new file mode 100644 index 0000000..8c3b539 --- /dev/null +++ b/TPDT-268 - ACP in task sequence/dba_packages/DeployTempDB.sql @@ -0,0 +1,549 @@ +/* Création des catégories manquantes si besoin*/ +USE [msdb] + +IF NOT EXISTS (SELECT name FROM msdb.dbo.syscategories WHERE name=N'DBA-Maintenance' AND category_class=1) +BEGIN + EXEC msdb.dbo.sp_add_category @class=N'JOB', @type=N'LOCAL', @name=N'DBA-Maintenance' +END +IF NOT EXISTS (SELECT name FROM msdb.dbo.syscategories WHERE name=N'DBA-Monitoring' AND category_class=1) +BEGIN + EXEC msdb.dbo.sp_add_category @class=N'JOB', @type=N'LOCAL', @name=N'DBA-Monitoring' +END +IF NOT EXISTS (SELECT name FROM msdb.dbo.syscategories WHERE name=N'SQL Server Agent Alerts' AND category_class=2) +BEGIN + EXEC msdb.dbo.sp_add_category @class=N'ALERT', @type=N'NONE', @name=N'SQL Server Agent Alerts' +END +IF NOT EXISTS (SELECT name FROM msdb.dbo.syscategories WHERE name=N'DBA-Configuration' AND category_class=1) +BEGIN + EXEC msdb.dbo.sp_add_category @class=N'JOB', @type=N'LOCAL', @name=N'DBA-Configuration' +END + +/*============================================================================= + + Création d'une alerte sur l'autogrow de tempDB + + ----------------------------------------------- + Ce script créer une alerte sur les autogrows de tempDB et envoie un mail d'alerte le cas échéant + + Contexte d'utilisation + ---------------------- + Cette alerte doit être créée après l'installation d'une nouvelle instance SQL. + + Création : 14.07.2015 / FLA + + Modifications : 21.07.2016 / FLA : Standardisation du nom du job et du schedule + 20.12.2018 / SPE : #TFS49408# Migrate identification table [master].[cfg].[Identity] + 17.03.2022 - FLA : Change DBA mail + +=============================================================================*/ +/* Drop existing standard schedule for job */ +declare @schedule_id int +declare c_schedules cursor local forward_only static for + select ss.schedule_id + from msdb.dbo.sysjobschedules sjs +INNER JOIN msdb.dbo.sysschedules ss + ON sjs.schedule_id = ss.schedule_id + AND ss.name NOT LIKE '%#SPEC#' +INNER JOIN msdb.dbo.sysjobs sj + ON sjs.job_id = sj.job_id + WHERE sj.name = N'_92010 - Response - DATABASE Growth Event' + +open c_schedules + +FETCH NEXT FROM c_schedules into @schedule_id +while @@fetch_status = 0 +begin + IF ((select COUNT(*) from msdb.dbo.sysjobschedules where schedule_id=@schedule_id) = 1) + EXEC msdb.dbo.sp_delete_schedule @schedule_id=@schedule_id, @force_delete = 1 +FETCH NEXT FROM c_schedules into @schedule_id +end + +close c_schedules + +deallocate c_schedules + +IF EXISTS (SELECT job_id FROM msdb.dbo.sysjobs_view WHERE name = N'_92010 - Response - DATABASE Growth Event') +EXEC msdb.dbo.sp_delete_job @job_name = N'_92010 - Response - DATABASE Growth Event', @delete_unused_schedule=0 +GO + +/* Creation Job and Steps*/ +BEGIN TRANSACTION +DECLARE @ReturnCode INT +SELECT @ReturnCode = 0 + +IF NOT EXISTS (SELECT name FROM msdb.dbo.syscategories WHERE name=N'DBA-Monitoring' AND category_class=1) +BEGIN +EXEC @ReturnCode = msdb.dbo.sp_add_category @class=N'JOB', @type=N'LOCAL', @name=N'DBA-Monitoring' +IF (@@ERROR <> 0 OR @ReturnCode <> 0) GOTO QuitWithRollback + +END + +/* Add Job */ +DECLARE @jobId BINARY(16) +EXEC @ReturnCode = msdb.dbo.sp_add_job @job_name=N'_92010 - Response - DATABASE Growth Event', + @enabled=1, + @notify_level_eventlog=0, + @notify_level_email=0, + @notify_level_netsend=0, + @notify_level_page=0, + @delete_level=0, + @description=N'Sends notifications to DBA when DATABASE File Growth event(s) occur(s)', + @category_name=N'DBA-Monitoring', + @start_step_id=1, + @owner_login_name=N'sa', @job_id = @jobId OUTPUT +IF (@@ERROR <> 0 OR @ReturnCode <> 0) GOTO QuitWithRollback + +/* Add Step */ +EXEC @ReturnCode = msdb.dbo.sp_add_jobstep @job_id=@jobId, @step_name=N'Empty step', + @step_id=1, + @cmdexec_success_code=0, + @on_success_action=3, + @on_success_step_id=0, + @on_fail_action=3, + @on_fail_step_id=0, + @retry_attempts=0, + @retry_interval=0, + @os_run_priority=0, @subsystem=N'TSQL', + @command=N'/* Empty step */', + @database_name=N'master', + @output_file_name=NULL, + @flags=0, + @database_user_name=NULL, + @server=NULL, + @additional_parameters=NULL, + @proxy_id=NULL, + @proxy_name=NULL +IF (@@ERROR <> 0 OR @ReturnCode <> 0) GOTO QuitWithRollback +/* Add Step */ +EXEC @ReturnCode = msdb.dbo.sp_add_jobstep @job_id=@jobId, @step_name=N'Send e-mail in response to WMI alert(s)', + @step_id=2, + @cmdexec_success_code=0, + @on_success_action=3, + @on_success_step_id=0, + @on_fail_action=4, + @on_fail_step_id=4, + @retry_attempts=0, + @retry_interval=1, + @os_run_priority=0, @subsystem=N'TSQL', + @command=N'declare @mysubject nvarchar(200) + set @mysubject = ''Database file growth event - ''''$(ESCAPE_SQUOTE(WMI(DatabaseName)))'''' on server '' + @@SERVERNAME + + exec aps_Send_Mail_with_template + @in_param_message = ''File Name: $(ESCAPE_SQUOTE(WMI(FileName))) +Growth Size (KB): $(ESCAPE_SQUOTE(WMI(IntegerData))) +Start Time: $(ESCAPE_SQUOTE(WMI(STartTime))) +Duration (ms): $(ESCAPE_SQUOTE(WMI(Duration))) +Application Name: $(ESCAPE_SQUOTE(WMI(ApplicationName))) +Host Name: $(ESCAPE_SQUOTE(WMI(HostName))) +Login Name: $(ESCAPE_SQUOTE(WMI(LoginName))) +Session Login Name: $(ESCAPE_SQUOTE(WMI(SessionLoginName)))'', + + @in_param_subject = @mysubject, + @in_param_varchar_2 = ''DBA_operator;'';', + @database_name=N'HCITools', + @output_file_name=NULL, + @flags=0, + @database_user_name=NULL, + @server=NULL, + @additional_parameters=NULL, + @proxy_id=NULL, + @proxy_name=NULL +IF (@@ERROR <> 0 OR @ReturnCode <> 0) GOTO QuitWithRollback +/* Add Step */ +EXEC @ReturnCode = msdb.dbo.sp_add_jobstep @job_id=@jobId, @step_name=N'Empty step for success', + @step_id=3, + @cmdexec_success_code=0, + @on_success_action=1, + @on_success_step_id=0, + @on_fail_action=4, + @on_fail_step_id=4, + @retry_attempts=0, + @retry_interval=0, + @os_run_priority=0, @subsystem=N'TSQL', + @command=N'/* Empty step */', + @database_name=N'master', + @output_file_name=NULL, + @flags=0, + @database_user_name=NULL, + @server=NULL, + @additional_parameters=NULL, + @proxy_id=NULL, + @proxy_name=NULL +IF (@@ERROR <> 0 OR @ReturnCode <> 0) GOTO QuitWithRollback +/* Add Step */ +EXEC @ReturnCode = msdb.dbo.sp_add_jobstep @job_id=@jobId, @step_name=N'Send email KO', + @step_id=4, + @cmdexec_success_code=0, + @on_success_action=2, + @on_success_step_id=0, + @on_fail_action=2, + @on_fail_step_id=0, + @retry_attempts=0, + @retry_interval=0, + @os_run_priority=0, @subsystem=N'TSQL', + @command=N'exec Get_Job_Error_Info @in_JobName = ''_92010 - Response - DATABASE Growth Event'', @in_Recipients = ''DBA_operator''', + @database_name=N'HCITools', + @output_file_name=NULL, + @flags=0, + @database_user_name=NULL, + @server=NULL, + @additional_parameters=NULL, + @proxy_id=NULL, + @proxy_name=NULL +IF (@@ERROR <> 0 OR @ReturnCode <> 0) GOTO QuitWithRollback +EXEC @ReturnCode = msdb.dbo.sp_update_job @job_id = @jobId, @start_step_id = 1 +IF (@@ERROR <> 0 OR @ReturnCode <> 0) GOTO QuitWithRollback + +/* Attach existing specific schedule for job */ +declare @enabled_schedule int, + @schedule_name nvarchar(50) +declare c_schedules cursor local forward_only static for +select enabled, name + from msdb.dbo.sysschedules + where name LIKE '_92010%' + and name LIKE '%#SPEC#' + +open c_schedules + +FETCH NEXT FROM c_schedules into @enabled_schedule, @schedule_name +while @@fetch_status = 0 +begin + EXEC @ReturnCode = msdb.dbo.sp_attach_schedule @job_id = @jobId, @schedule_name=@schedule_name + IF(@enabled_schedule = 1) + begin + SET @schedule_name = SUBSTRING(@schedule_name,0,LEN(@schedule_name)-5) + IF EXISTS (select name from msdb.dbo.sysschedules where name = @schedule_name) + EXEC @ReturnCode = msdb.dbo.sp_update_schedule @name=@schedule_name, @enabled=0 + end + IF (@@ERROR <> 0 OR @ReturnCode <> 0) GOTO QuitWithRollback +FETCH NEXT FROM c_schedules into @enabled_schedule, @schedule_name +end + +close c_schedules + +deallocate c_schedules + +EXEC @ReturnCode = msdb.dbo.sp_add_jobserver @job_id = @jobId, @server_name = N'(local)' +IF (@@ERROR <> 0 OR @ReturnCode <> 0) GOTO QuitWithRollback +COMMIT TRANSACTION +GOTO EndSave +QuitWithRollback: + IF (@@TRANCOUNT > 0) ROLLBACK TRANSACTION +EndSave: + +GO + +IF EXISTS (SELECT name FROM msdb.dbo.sysalerts WHERE name = N'DBA - WMI: Database Growth Events') +EXEC msdb.dbo.sp_delete_alert @name=N'DBA - WMI: Database Growth Events' +GO + +IF NOT EXISTS (SELECT name FROM msdb.dbo.syscategories WHERE name=N'SQL Server Agent Alerts' AND category_class=2) +EXEC msdb.dbo.sp_add_category @class=N'ALERT', @type=N'NONE', @name=N'SQL Server Agent Alerts' +GO + + +DECLARE @namespace NVARCHAR(200); +IF (SERVERPROPERTY('InstanceName') IS NOT NULL) +BEGIN + SELECT @namespace = N'\\.\root\Microsoft\SqlServer\ServerEvents\' + + CONVERT(NVARCHAR(128), SERVERPROPERTY('InstanceName')); +END; +ELSE +BEGIN + SELECT @namespace = N'\\.\root\Microsoft\SqlServer\ServerEvents\APSSQL'; +END; + +/* Création de l'alerte sur l'autogrow de tempDB */ +EXEC msdb.dbo.sp_add_alert @name=N'DBA - WMI: Database Growth Events', + @message_id=0, + @severity=0, + @enabled=1, + @category_name=N'SQL Server Agent Alerts', + @delay_between_responses=300, + @include_event_description_in=1, + @notification_message=N'WMI - DB Growth notification', + @wmi_namespace=@namespace, + @wmi_query=N'select * from DATA_FILE_AUTO_GROW where DatabaseID = 2', + @job_name=N'_92010 - Response - DATABASE Growth Event' +GO + +DECLARE @alert_replace_runtime_tokens INT +EXECUTE master.dbo.xp_instance_regread N'HKEY_LOCAL_MACHINE', + N'SOFTWARE\Microsoft\MSSQLServer\SQLServerAgent', + N'AlertReplaceRuntimeTokens', + @alert_replace_runtime_tokens OUTPUT, + N'no_output' + + +if ISNULL(@alert_replace_runtime_tokens, 0) = 0 +EXEC msdb.dbo.sp_set_sqlagent_properties @alert_replace_runtime_tokens=1 +GO + + +/**********************************************************************************************/ +/********** CREATION DES FICHIERS TEMPDB MANQUANT et RESIZE DU LOG DE TRANSACTION ************/ +/**********************************************************************************************/ +declare @Client varchar(4) +select @Client = Customer from master.[cfg].[Identity] +EXEC HCITools.dbo.Set_TempDB @in_Entity = @Client, @in_Mode = 0 + +/*============================================================================= + + Modification automatique du fichier MDF pour tempDB en fonction des paramètres en entrée + + ----------------------------------------------- +Ce script shrink et resize automatiquement le fichiers de tempDB en fonction des paramètres en entrée. +Il créer un job lancé au démarrage de l'instance afin de pouvoir modifier le fichier de tempDB hors production + +Création : 01.11.2016 / FLA + +=============================================================================*/ +IF (CAST(CAST(SERVERPROPERTY('productversion') as varchar(4)) as FLOAT) >= 13) GOTO QuitWithRollback +declare @job_name varchar(100), + @command varchar(500) + +IF @Client = 'SUN' + SET @job_name = N'_94021 - Redefine TempDB file Size' +ELSE IF @Client = 'AMA' + SET @job_name = N'_94022 - Redefine TempDB file Size' +ELSE IF @Client = 'CVI' + SET @job_name = N'_94024 - Redefine TempDB file Size' + +declare @schedule_id int +/* Drop existing standard schedule for job */ + declare c_schedules cursor local forward_only static for + select ss.schedule_id + from msdb.dbo.sysjobschedules sjs +INNER JOIN msdb.dbo.sysschedules ss + ON sjs.schedule_id = ss.schedule_id + AND ss.name NOT LIKE '%#SPEC#' +INNER JOIN msdb.dbo.sysjobs sj + ON sjs.job_id = sj.job_id + WHERE sj.name = @job_name + +open c_schedules + +FETCH NEXT FROM c_schedules into @schedule_id +while @@fetch_status = 0 +begin + IF ((select COUNT(*) from msdb.dbo.sysjobschedules where schedule_id=@schedule_id) = 1) + EXEC msdb.dbo.sp_delete_schedule @schedule_id=@schedule_id, @force_delete = 1 +FETCH NEXT FROM c_schedules into @schedule_id +end + +close c_schedules +deallocate c_schedules + +IF EXISTS (SELECT job_id FROM msdb.dbo.sysjobs_view WHERE name = @job_name) +EXEC msdb.dbo.sp_delete_job @job_name = @job_name, @delete_unused_schedule=0 + +/* Creation Job and Steps*/ +BEGIN TRANSACTION +DECLARE @ReturnCode INT +SELECT @ReturnCode = 0 + +IF NOT EXISTS (SELECT name FROM msdb.dbo.syscategories WHERE name=N'DBA-Monitoring' AND category_class=1) +BEGIN +EXEC @ReturnCode = msdb.dbo.sp_add_category @class=N'JOB', @type=N'LOCAL', @name=N'DBA-Monitoring' +IF (@@ERROR <> 0 OR @ReturnCode <> 0) GOTO QuitWithRollback + +END + +/* Add Job */ +DECLARE @jobId BINARY(16) +EXEC @ReturnCode = msdb.dbo.sp_add_job @job_name=@job_name, + @enabled=1, + @notify_level_eventlog=0, + @notify_level_email=0, + @notify_level_netsend=0, + @notify_level_page=0, + @delete_level=0, + @description=N'Redefine tempDB file size + +01.11.2016 - FLA - Created +', + @category_name=N'DBA-Monitoring', + @start_step_id=1, + @owner_login_name=N'sa', @job_id = @jobId OUTPUT +IF (@@ERROR <> 0 OR @ReturnCode <> 0) GOTO QuitWithRollback + +/* Add Step */ +EXEC @ReturnCode = msdb.dbo.sp_add_jobstep @job_id=@jobId, @step_name=N'Empty step', + @step_id=1, + @cmdexec_success_code=0, + @on_success_action=3, + @on_success_step_id=0, + @on_fail_action=3, + @on_fail_step_id=0, + @retry_attempts=0, + @retry_interval=0, + @os_run_priority=0, @subsystem=N'TSQL', + @command=N'/* Empty step */', + @database_name=N'master', + @output_file_name=NULL, + @flags=0, + @database_user_name=NULL, + @server=NULL, + @additional_parameters=NULL, + @proxy_id=NULL, + @proxy_name=NULL +IF (@@ERROR <> 0 OR @ReturnCode <> 0) GOTO QuitWithRollback + + +IF @Client = 'SUN' + SET @command=N'EXEC [Set_TempDB] @in_Entity = ''SUN''' +ELSE IF @Client = 'AMA' + SET @command=N'EXEC [Set_TempDB] @in_Entity = ''AMA''' +ELSE IF @Client = 'CVI' + SET @command=N'EXEC [Set_TempDB] @in_Entity = ''CVI''' + +/* Add Step */ +EXEC @ReturnCode = msdb.dbo.sp_add_jobstep @job_id=@jobId, @step_name=N'Redefine TempDB file Size', + @step_id=2, + @cmdexec_success_code=0, + @on_success_action=3, + @on_success_step_id=0, + @on_fail_action=4, + @on_fail_step_id=4, + @retry_attempts=0, + @retry_interval=1, + @os_run_priority=0, @subsystem=N'TSQL', + @command=@command, + @database_name=N'HCITools', + @output_file_name=NULL, + @flags=0, + @database_user_name=NULL, + @server=NULL, + @additional_parameters=NULL, + @proxy_id=NULL, + @proxy_name=NULL +IF (@@ERROR <> 0 OR @ReturnCode <> 0) GOTO QuitWithRollback + +IF @Client = 'SUN' + SET @command=N'/* Empty step */ +exec Get_Job_Error_Info @in_JobName = ''_94021 - Redefine TempDB file Size'', @in_Recipients = ''DBA_operator''' +ELSE IF @Client = 'AMA' + SET @command=N'/* Empty step */ +exec Get_Job_Error_Info @in_JobName = ''_94022 - Redefine TempDB file Size'', @in_Recipients = ''DBA_operator''' + +ELSE IF @Client = 'CVI' + SET @command=N'/* Empty step */ +exec Get_Job_Error_Info @in_JobName = ''_94024 - Redefine TempDB file Size'', @in_Recipients = ''DBA_operator''' + + +/* Add Step */ +EXEC @ReturnCode = msdb.dbo.sp_add_jobstep @job_id=@jobId, @step_name=N'Empty step for success', + @step_id=3, + @cmdexec_success_code=0, + @on_success_action=1, + @on_success_step_id=0, + @on_fail_action=4, + @on_fail_step_id=4, + @retry_attempts=0, + @retry_interval=0, + @os_run_priority=0, @subsystem=N'TSQL', + @command=@command, + @database_name=N'HCITools', + @output_file_name=NULL, + @flags=0, + @database_user_name=NULL, + @server=NULL, + @additional_parameters=NULL, + @proxy_id=NULL, + @proxy_name=NULL +IF (@@ERROR <> 0 OR @ReturnCode <> 0) GOTO QuitWithRollback + +IF @Client = 'SUN' + SET @command=N'exec Get_Job_Error_Info @in_JobName = ''_94021 - Redefine TempDB file Size'', @in_Recipients = ''DBA_operator''' +ELSE IF @Client = 'AMA' + SET @command=N'exec Get_Job_Error_Info @in_JobName = ''_94022 - Redefine TempDB file Size'', @in_Recipients = ''DBA_operator''' +ELSE IF @Client = 'CVI' + SET @command=N'exec Get_Job_Error_Info @in_JobName = ''_94024 - Redefine TempDB file Size'', @in_Recipients = ''DBA_operator''' + +/* Add Step */ +EXEC @ReturnCode = msdb.dbo.sp_add_jobstep @job_id=@jobId, @step_name=N'Send email KO', + @step_id=4, + @cmdexec_success_code=0, + @on_success_action=2, + @on_success_step_id=0, + @on_fail_action=2, + @on_fail_step_id=0, + @retry_attempts=0, + @retry_interval=0, + @os_run_priority=0, @subsystem=N'TSQL', + @command=@command, + @database_name=N'HCITools', + @output_file_name=NULL, + @flags=0, + @database_user_name=NULL, + @server=NULL, + @additional_parameters=NULL, + @proxy_id=NULL, + @proxy_name=NULL +IF (@@ERROR <> 0 OR @ReturnCode <> 0) GOTO QuitWithRollback +EXEC @ReturnCode = msdb.dbo.sp_update_job @job_id = @jobId, @start_step_id = 1 +IF (@@ERROR <> 0 OR @ReturnCode <> 0) GOTO QuitWithRollback + +IF @Client = 'SUN' + SET @job_name=N'_94021' +ELSE IF @Client = 'AMA' + SET @job_name=N'_94022' +ELSE IF @Client = 'CVI' + SET @job_name=N'_94024' + +/* Add Standard Schedule */ +EXEC @ReturnCode = msdb.dbo.sp_add_jobschedule @job_id=@jobId, @name=@job_name, + @enabled=1, + @freq_type=64, + @freq_interval=0, + @freq_subday_type=0, + @freq_subday_interval=0, + @freq_relative_interval=0, + @freq_recurrence_factor=0, + @active_start_date=20160408, + @active_end_date=99991231, + @active_start_time=0, + @active_end_time=235959 +IF (@@ERROR <> 0 OR @ReturnCode <> 0) GOTO QuitWithRollback + +/* Attach existing specific schedule for job */ +declare @enabled_schedule int, + @schedule_name nvarchar(50) +declare c_schedules cursor local forward_only static for +select enabled, name + from msdb.dbo.sysschedules + where name LIKE @job_name+'%' + and name LIKE '%#SPEC#' + +open c_schedules + +FETCH NEXT FROM c_schedules into @enabled_schedule, @schedule_name +while @@fetch_status = 0 +begin + EXEC @ReturnCode = msdb.dbo.sp_attach_schedule @job_id = @jobId, @schedule_name=@schedule_name + IF(@enabled_schedule = 1) + begin + SET @schedule_name = SUBSTRING(@schedule_name,0,LEN(@schedule_name)-5) + IF EXISTS (select name from msdb.dbo.sysschedules where name = @schedule_name) + EXEC @ReturnCode = msdb.dbo.sp_update_schedule @name=@schedule_name, @enabled=0 + end + IF (@@ERROR <> 0 OR @ReturnCode <> 0) GOTO QuitWithRollback +FETCH NEXT FROM c_schedules into @enabled_schedule, @schedule_name +end + +close c_schedules + +deallocate c_schedules + +EXEC @ReturnCode = msdb.dbo.sp_add_jobserver @job_id = @jobId, @server_name = N'(local)' +IF (@@ERROR <> 0 OR @ReturnCode <> 0) GOTO QuitWithRollback +COMMIT TRANSACTION +GOTO EndSave +QuitWithRollback: + IF (@@TRANCOUNT > 0) ROLLBACK TRANSACTION +EndSave: + +GO + + + diff --git a/TPDT-268 - ACP in task sequence/dba_packages/DeployTriggerDDLAudit.sql b/TPDT-268 - ACP in task sequence/dba_packages/DeployTriggerDDLAudit.sql new file mode 100644 index 0000000..d821a96 --- /dev/null +++ b/TPDT-268 - ACP in task sequence/dba_packages/DeployTriggerDDLAudit.sql @@ -0,0 +1,581 @@ +/*============================================================================= + + Explication du traitement realise par le script SQL pour creer un trigger + capturant les evenements DDL specifies + --------------------------------------------------- + 1. Creation du schema [dba] + 2. Creation de la table [DDL_audit] + 3. Authorisations de la table [DDL_audit] + 4. Creation du trigger [tDDL_Capture_DDL_Events] + 5. Activation du trigger [tDDL_Capture_DDL_Events] + 6. Création de la table "SQL_Errors" + 7. Création de la SP "get_Error_Info" + 8. Création de la SP "Purge_DDL_audit" + 9. Création de la catégorie "DBA-Maintenance" + 10. Création du job de l'agent SQL "D93110 - Purge DDL audit" + + + Creation : 12.08.2016 / LPE + + Modifications : 17.03.2022 - FLA : Change DBA mail + 18.01.2023 - SPE : Mise en place d une nouvelle colonne datetime2 + +=============================================================================*/ + + +/****************************************************************/ +/************** CREATION DU SCHEMA [dba] ****************/ +/****************************************************************/ +USE [master] +GO + +IF NOT EXISTS (SELECT * FROM master.sys.schemas WHERE name = N'dba') +BEGIN + EXEC('CREATE SCHEMA [dba] AUTHORIZATION [dbo]') +END +GO + + + +/****************************************************************/ +/********** CREATION DE LA TABLE [DDL_audit] ************/ +/****************************************************************/ +USE [master] +GO + +IF NOT EXISTS (SELECT * FROM master.sys.objects WHERE object_id = OBJECT_ID(N'[dba].[DDL_audit]') AND type in (N'U')) +BEGIN + + CREATE TABLE [master].[dba].[DDL_audit]( + [DA_DDL_audit_ID] [bigint] IDENTITY(1,1) NOT NULL, + [DA_Event_Xml] [xml] NULL, + [DA_App_Name] [nvarchar](128) NULL, + [DA_Host_Name] [nvarchar](128) NULL, + [DA_Create_Date] [datetime2](0) NOT NULL CONSTRAINT DF_DA_Create_Date DEFAULT GETDATE(), + ) ON [PRIMARY] TEXTIMAGE_ON [PRIMARY] + +END +GO + +IF NOT EXISTS (SELECT 1 FROM sys.columns WHERE OBJECT_NAME(object_id) = 'DDL_audit' AND name = 'DA_Create_Date') +BEGIN + ALTER TABLE [master].[dba].[DDL_audit] ADD [DA_Create_Date] [datetime2](0) NULL CONSTRAINT DF_DA_Create_Date DEFAULT GETDATE() +END +GO + +IF EXISTS (SELECT TOP 1 1 FROM [master].[dba].[DDL_audit] WHERE [DA_Create_Date] IS NULL) +BEGIN + UPDATE [master].[dba].[DDL_audit] SET [DA_Create_Date] = DA_Event_Xml.value('(./EVENT_INSTANCE/PostTime)[1]','NVARCHAR(MAX)') + ALTER TABLE [master].[dba].[DDL_audit] ALTER COLUMN [DA_Create_Date] [datetime2](0) NOT NULL +END +GO + +IF NOT EXISTS(SELECT 1 FROM sys.indexes WHERE name = 'NCIX_DDL_audit_COL_DA_Create_Date') +BEGIN + CREATE NONCLUSTERED INDEX [NCIX_DDL_audit_COL_DA_Create_Date] ON [dba].[DDL_audit] + ( + [DA_Create_Date] ASC + ) + WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, SORT_IN_TEMPDB = OFF, DROP_EXISTING = OFF, ONLINE = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY] +END +GO + +/****************************************************************/ +/******* AUTHORISATIONS DE LA TABLE [DDL_audit] *********/ +/****************************************************************/ +USE [master] +GO +GRANT INSERT ON [master].[dba].[DDL_audit] TO [public] AS [dbo] +GO + +/****************************************************************/ +/**** CREATION DU TRIGGER [tDDL_Capture_DDL_Events] ****/ +/****************************************************************/ +USE [master] +GO + +IF EXISTS (SELECT * FROM master.sys.server_triggers WHERE parent_class_desc = 'SERVER' AND name = N'tDDL_Capture_DDL_Events') + DROP TRIGGER [tDDL_Capture_DDL_Events] ON ALL SERVER +GO + +CREATE TRIGGER [tDDL_Capture_DDL_Events] +ON ALL SERVER +FOR RENAME, + DDL_SERVER_LEVEL_EVENTS, + DDL_TABLE_EVENTS, + DDL_VIEW_EVENTS, + DDL_INDEX_EVENTS, + DDL_SYNONYM_EVENTS, + DDL_FUNCTION_EVENTS, + DDL_PROCEDURE_EVENTS, + DDL_TRIGGER_EVENTS, + DDL_EVENT_NOTIFICATION_EVENTS, + DDL_ASSEMBLY_EVENTS, + DDL_TYPE_EVENTS, + DDL_DATABASE_SECURITY_EVENTS, + DDL_SSB_EVENTS, + DDL_XML_SCHEMA_COLLECTION_EVENTS, + DDL_PARTITION_EVENTS, + DDL_DEFAULT_EVENTS, + DDL_EXTENDED_PROPERTY_EVENTS, + DDL_FULLTEXT_CATALOG_EVENTS, + DDL_PLAN_GUIDE_EVENTS, + DDL_RULE_EVENTS, + DDL_FULLTEXT_STOPLIST_EVENTS +AS + +/*============================================================================= + + DDL trigger capturing listed DDL Events + + List of available DDL Events: + ---------------------------- + WITH DirectReports(name, parent_type, type, level, sort) AS + ( + SELECT CONVERT(varchar(255),type_name), + parent_type, + type, + 1, + CONVERT(varchar(255),type_name) + FROM sys.trigger_event_types + WHERE parent_type IS NULL + + UNION ALL + + SELECT CONVERT(varchar(255), REPLICATE ('| ' , level) + e.type_name), + e.parent_type, + e.type, + level + 1, + CONVERT (varchar(255), RTRIM(sort) + '| ' + e.type_name) + FROM sys.trigger_event_types AS e + INNER JOIN DirectReports AS d + ON d.type = e.parent_type + ) + SELECT parent_type, + type, + name + FROM DirectReports + ORDER BY sort; + + + Creation : 12.08.16 / LPE + + Modifications : + DD.MM.YY / xxx : +=============================================================================*/ + +SET NOCOUNT ON; + +INSERT [master].[dba].[DDL_audit] + (DA_Event_Xml, + DA_App_Name, + DA_Host_Name) +SELECT EVENTDATA(), + APP_NAME(), + HOST_NAME(); + +GO + + +/****************************************************************/ +/**** ACTIVATION DU TRIGGER [tDDL_Capture_DDL_Events] ****/ +/****************************************************************/ +ENABLE TRIGGER [tDDL_Capture_DDL_Events] ON ALL SERVER +GO + + + + + + +/*****************************************************************/ +/********* 9. CREATE Table "SQL_Errors" **************************/ +/*****************************************************************/ +USE [HCITools] +GO + +IF NOT EXISTS (SELECT * FROM sys.objects WHERE object_id = OBJECT_ID(N'[dbo].[SQL_Errors]') AND type in (N'U')) +BEGIN + + CREATE TABLE [dbo].[SQL_Errors]( + [ServerName] [nvarchar](50) NULL, + [AppName] [nvarchar](128) NULL, + [UserName] [sysname] NULL, + [ObjectName] [sysname] NULL, + [Date] [datetime] NULL, + [SourceType] [tinyint] NULL, + [ErrorMessage] [varchar](max) NULL + ) ON [PRIMARY] TEXTIMAGE_ON [PRIMARY] + +END +GO + + +/*****************************************************************/ +/********* 10. CREATE SP "get_Error_Info" ************************/ +/*****************************************************************/ +SET ANSI_PADDING ON +GO + +USE [HCITools] +GO + +IF EXISTS (SELECT * FROM sys.objects WHERE object_id = OBJECT_ID(N'[dbo].[get_Error_Info]') AND type in (N'P', N'PC')) +DROP PROCEDURE [dbo].[get_Error_Info] +GO + +SET ANSI_NULLS ON +GO + +SET QUOTED_IDENTIFIER ON +GO + + +CREATE PROCEDURE [dbo].[get_Error_Info] + @in_debug tinyint = 0, + @in_Recipients varchar(8000) = '', + @in_LogToTable tinyint = 0, + @in_Context tinyint = 1, -- 1 = SP, 2 = Job + @in_RaiseError tinyint = 1 +AS +declare @ErrorMessage nvarchar(4000) = ERROR_MESSAGE(), + @ErrorNumber int = ERROR_NUMBER(), + @ErrorSeverity int = ERROR_SEVERITY(), + @ErrorState int = ERROR_STATE(), + @ErrorLine int = ERROR_LINE(), + @ErrorProc nvarchar(128) = COALESCE(ERROR_PROCEDURE(), 'Not within procedure'), + @Error varchar(max) + + +BEGIN TRY +select @Error = 'Error Number: ' + CAST(@ErrorNumber AS varchar(10)) + CHAR(13) + + 'Error Message: ' + @ErrorMessage + CHAR(13) + + 'Error Severity: ' + CAST(@ErrorSeverity AS varchar(10)) + CHAR(13) + + 'Error State: ' + CAST(@ErrorState AS varchar(10)) + CHAR(13) + + 'Error Line: ' + CAST(@ErrorLine AS varchar(10)) + CHAR(13) + + 'Error Proc: ' + @ErrorProc + CHAR(13) + +PRINT @Error + +IF @in_Recipients <> '' +BEGIN + IF @in_Context = 1 + exec dbo.aps_Send_Mail_with_template @in_job_type = 0,@in_param_message = @Error, @in_param_varchar_2 = @in_Recipients + ELSE + BEGIN + exec dbo.aps_Send_Mail_with_template @in_param_varchar_2 = @in_Recipients + END +END + +IF @in_LogToTable = 1 + INSERT INTO SQL_Errors VALUES (@@SERVERNAME,APP_NAME(),CURRENT_USER,@ErrorProc,GETDATE(),@in_Context,@Error) + +END TRY +BEGIN CATCH + + RAISERROR ('Erreur dans la SP [dbo].[get_Error_Info]',16,1) + RETURN + +END CATCH + + +IF @in_RaiseError = 1 + RAISERROR (@ErrorMessage, + @ErrorSeverity, + @ErrorState + ); + +GO + +/*****************************************************************/ +/********** 11. CREATE SP "Purge_DDL_audit" **********************/ +/*****************************************************************/ +USE [HCITools] +GO + +IF EXISTS (SELECT * FROM sys.objects WHERE object_id = OBJECT_ID(N'[dbo].[Purge_DDL_audit]') AND type in (N'P', N'PC')) +DROP PROCEDURE [dbo].[Purge_DDL_audit] +GO + +SET ANSI_NULLS ON +GO + +SET QUOTED_IDENTIFIER ON +GO + +CREATE PROCEDURE [dbo].[Purge_DDL_audit] + @in_NbDays int = 30, + @in_debug int = null +AS +/*============================================================================= + + Explication du traitement realise par la SP + ------------------------------------------- + Cette SP sert à supprimer les traces des evenements DDL de plus de XX jours + dans la table master.dba.DDL_audit + + Contexte d'utilisation + ---------------------- + Cette SP est appelée par le job D93110 - Purge DDL audit + + Parametres + ---------- + @in_NbDays : nombre de jours glissant à conserver (30 par défaut) + @in_debug : non utilisé + + Creation : 12.08.16 / LPE + + Modifications : 18.01.2023 - SPE: Delete avec l aide de la nouvelle colonne Datetime2 DA_Create_Date + +=============================================================================*/ + +set nocount on; + +declare @result_sp int, + @errno int, + @errmsg varchar(255) + +/*------------------- Declaration des variables --------------------*/ + + +/*------------ Affectation des parametres aux variables ------------*/ + + +/*-------------------------- Traitement ---------------------------*/ +BEGIN TRY + + DELETE FROM master.dba.DDL_audit WHERE DA_Create_Date < DateAdd(dd,-@in_NbDays,getdate()) + +END TRY +BEGIN CATCH + + /* Traitement des erreurs (avec RaiseError) */ + EXEC dbo.get_Error_Info @in_RaiseError = 1 + +END CATCH + +/*------------------ Retour au programme appelant -----------------*/ + + +/*---------------------- Traitement des erreurs ----------------------*/ + +GO + + +/********************************************************************************/ +/********* 12. CREATE SQL AGENT JOB CATEGORY "DBA-Maintenance" ******************/ +/********************************************************************************/ +USE [msdb] +GO + +IF NOT EXISTS (SELECT name FROM msdb.dbo.syscategories WHERE name=N'DBA-Maintenance' AND category_class=1) +BEGIN + + EXEC msdb.dbo.sp_add_category @class=N'JOB', @type=N'LOCAL', @name=N'DBA-Maintenance' + +END + + +/*****************************************************************************/ +/********* 13. CREATE SQL AGENT JOB "D93110 - Purge DDL audit" *************/ +/*****************************************************************************/ +USE [msdb] +GO +/* Drop existing standard schedule for job */ +declare @schedule_id int +declare c_schedules cursor local forward_only static for + select ss.schedule_id + from msdb.dbo.sysjobschedules sjs +INNER JOIN msdb.dbo.sysschedules ss + ON sjs.schedule_id = ss.schedule_id + AND ss.name NOT LIKE '%#SPEC#' +INNER JOIN msdb.dbo.sysjobs sj + ON sjs.job_id = sj.job_id + WHERE sj.name = N'D93110 - Purge DDL audit' + +open c_schedules + +FETCH NEXT FROM c_schedules into @schedule_id +while @@fetch_status = 0 +begin + IF ((select COUNT(*) from msdb.dbo.sysjobschedules where schedule_id=@schedule_id) = 1) + EXEC msdb.dbo.sp_delete_schedule @schedule_id=@schedule_id, @force_delete = 1 +FETCH NEXT FROM c_schedules into @schedule_id +end + +close c_schedules + +deallocate c_schedules + +IF EXISTS (SELECT job_id FROM msdb.dbo.sysjobs_view WHERE name = N'D93110 - Purge DDL audit') +EXEC msdb.dbo.sp_delete_job @job_name = N'D93110 - Purge DDL audit', @delete_unused_schedule=0 +GO + +/* Creation Job and Steps*/ +BEGIN TRANSACTION +DECLARE @ReturnCode INT +SELECT @ReturnCode = 0 + +IF NOT EXISTS (SELECT name FROM msdb.dbo.syscategories WHERE name=N'DBA-Maintenance' AND category_class=1) +BEGIN +EXEC @ReturnCode = msdb.dbo.sp_add_category @class=N'JOB', @type=N'LOCAL', @name=N'DBA-Maintenance' +IF (@@ERROR <> 0 OR @ReturnCode <> 0) GOTO QuitWithRollback + +END + +/* Add Job */ +DECLARE @jobId BINARY(16) +EXEC @ReturnCode = msdb.dbo.sp_add_job @job_name=N'D93110 - Purge DDL audit', + @enabled=1, + @notify_level_eventlog=0, + @notify_level_email=0, + @notify_level_netsend=0, + @notify_level_page=0, + @delete_level=0, + @description=N'Purge DDL Events History in table master.dba.DDL_audit', + @category_name=N'DBA-Maintenance', + @start_step_id=1, + @owner_login_name=N'sa', @job_id = @jobId OUTPUT +IF (@@ERROR <> 0 OR @ReturnCode <> 0) GOTO QuitWithRollback + +/* Add Step */ +EXEC @ReturnCode = msdb.dbo.sp_add_jobstep @job_id=@jobId, @step_name=N'Empty step', + @step_id=1, + @cmdexec_success_code=0, + @on_success_action=3, + @on_success_step_id=0, + @on_fail_action=3, + @on_fail_step_id=0, + @retry_attempts=0, + @retry_interval=0, + @os_run_priority=0, @subsystem=N'TSQL', + @command=N'/* Empty step */', + @database_name=N'master', + @output_file_name=NULL, + @flags=0, + @database_user_name=NULL, + @server=NULL, + @additional_parameters=NULL, + @proxy_id=NULL, + @proxy_name=NULL +IF (@@ERROR <> 0 OR @ReturnCode <> 0) GOTO QuitWithRollback +/* Add Step */ +EXEC @ReturnCode = msdb.dbo.sp_add_jobstep @job_id=@jobId, @step_name=N'Purge DDL audit', + @step_id=2, + @cmdexec_success_code=0, + @on_success_action=3, + @on_success_step_id=0, + @on_fail_action=4, + @on_fail_step_id=4, + @retry_attempts=0, + @retry_interval=1, + @os_run_priority=0, @subsystem=N'TSQL', + @command=N'exec [dbo].[Purge_DDL_audit] @in_NbDays = 30', + @database_name=N'HCITools', + @output_file_name=NULL, + @flags=0, + @database_user_name=NULL, + @server=NULL, + @additional_parameters=NULL, + @proxy_id=NULL, + @proxy_name=NULL +IF (@@ERROR <> 0 OR @ReturnCode <> 0) GOTO QuitWithRollback +/* Add Step */ +EXEC @ReturnCode = msdb.dbo.sp_add_jobstep @job_id=@jobId, @step_name=N'Empty step for success', + @step_id=3, + @cmdexec_success_code=0, + @on_success_action=1, + @on_success_step_id=0, + @on_fail_action=4, + @on_fail_step_id=4, + @retry_attempts=0, + @retry_interval=0, + @os_run_priority=0, @subsystem=N'TSQL', + @command=N'/* Empty step */ +exec Get_Job_Error_Info @in_JobName = ''D93110 - Purge DDL audit'', @in_Recipients = ''DBA_operator''', + @database_name=N'HCITools', + @output_file_name=NULL, + @flags=0, + @database_user_name=NULL, + @server=NULL, + @additional_parameters=NULL, + @proxy_id=NULL, + @proxy_name=NULL +IF (@@ERROR <> 0 OR @ReturnCode <> 0) GOTO QuitWithRollback +/* Add Step */ +EXEC @ReturnCode = msdb.dbo.sp_add_jobstep @job_id=@jobId, @step_name=N'Send email KO', + @step_id=4, + @cmdexec_success_code=0, + @on_success_action=2, + @on_success_step_id=0, + @on_fail_action=2, + @on_fail_step_id=0, + @retry_attempts=0, + @retry_interval=0, + @os_run_priority=0, @subsystem=N'TSQL', + @command=N'exec Get_Job_Error_Info @in_JobName = ''D93110 - Purge DDL audit'', @in_Recipients = ''DBA_operator''', + @database_name=N'HCITools', + @output_file_name=NULL, + @flags=0, + @database_user_name=NULL, + @server=NULL, + @additional_parameters=NULL, + @proxy_id=NULL, + @proxy_name=NULL +IF (@@ERROR <> 0 OR @ReturnCode <> 0) GOTO QuitWithRollback +EXEC @ReturnCode = msdb.dbo.sp_update_job @job_id = @jobId, @start_step_id = 1 +IF (@@ERROR <> 0 OR @ReturnCode <> 0) GOTO QuitWithRollback + +/* Add Standard Schedule */ +EXEC @ReturnCode = msdb.dbo.sp_add_jobschedule @job_id=@jobId, @name=N'D93110-D', + @enabled=1, + @freq_type=4, + @freq_interval=1, + @freq_subday_type=1, + @freq_subday_interval=0, + @freq_relative_interval=0, + @freq_recurrence_factor=0, + @active_start_date=20151116, + @active_end_date=99991231, + @active_start_time=30000, + @active_end_time=235959 +IF (@@ERROR <> 0 OR @ReturnCode <> 0) GOTO QuitWithRollback + +/* Attach existing specific schedule for job */ +declare @enabled_schedule int, + @schedule_name nvarchar(50) +declare c_schedules cursor local forward_only static for +select enabled, name + from msdb.dbo.sysschedules + where name LIKE 'D93110%' + and name LIKE '%#SPEC#' + +open c_schedules + +FETCH NEXT FROM c_schedules into @enabled_schedule, @schedule_name +while @@fetch_status = 0 +begin + EXEC @ReturnCode = msdb.dbo.sp_attach_schedule @job_id = @jobId, @schedule_name=@schedule_name + IF(@enabled_schedule = 1) + begin + SET @schedule_name = SUBSTRING(@schedule_name,0,LEN(@schedule_name)-5) + IF EXISTS (select name from msdb.dbo.sysschedules where name = @schedule_name) + EXEC @ReturnCode = msdb.dbo.sp_update_schedule @name=@schedule_name, @enabled=0 + end + IF (@@ERROR <> 0 OR @ReturnCode <> 0) GOTO QuitWithRollback +FETCH NEXT FROM c_schedules into @enabled_schedule, @schedule_name +end + +close c_schedules + +deallocate c_schedules + +EXEC @ReturnCode = msdb.dbo.sp_add_jobserver @job_id = @jobId, @server_name = N'(local)' +IF (@@ERROR <> 0 OR @ReturnCode <> 0) GOTO QuitWithRollback +COMMIT TRANSACTION +GOTO EndSave +QuitWithRollback: + IF (@@TRANCOUNT > 0) ROLLBACK TRANSACTION +EndSave: + +GO diff --git a/TPDT-268 - ACP in task sequence/dba_packages/DeployTriggerDMLAudit.sql b/TPDT-268 - ACP in task sequence/dba_packages/DeployTriggerDMLAudit.sql new file mode 100644 index 0000000..e9f2d3d Binary files /dev/null and b/TPDT-268 - ACP in task sequence/dba_packages/DeployTriggerDMLAudit.sql differ diff --git a/TPDT-268 - ACP in task sequence/dba_packages/DeployTriggerLoginAudit.sql b/TPDT-268 - ACP in task sequence/dba_packages/DeployTriggerLoginAudit.sql new file mode 100644 index 0000000..70187ad --- /dev/null +++ b/TPDT-268 - ACP in task sequence/dba_packages/DeployTriggerLoginAudit.sql @@ -0,0 +1,547 @@ +/*============================================================================= + + Explication du traitement realise par la SP + ------------------------------------------- + 1. Création de la clé asymétrique + 2. Création du login [DBA_CLR] + 3. Création du user [DBA_CLR] + 4. Création du schéma [dba] + 5. Création de la table [master].[dba].[Login_audit] + 6. Activation de la CLR sur le serveur si besoin + 7. Création de la CLR "DBA_CLR" et de la function "[master].[dba].[Get_Hostname_By_PID]" + 8. Création du trigger "tDDL_Login_Audit" + 9. Création de la table "SQL_Errors" + 10. Création de la SP "get_Error_Info" + 11. Création de la SP "Purge_Login_audit" + 12. Création de la catégorie "DBA-Maintenance" + 13. Création du job de l'agent SQL "D93030 - Purge Login audit" + + Creation : 30.03.2016 / FLA + + Modifications : 31.03.2016 / FLA : Ajout d'une clé asymétrique sur la CLR afin de sécuriser l'execution de la CLR (éviter le TRUSTWORTHY sur master) + 25.05.2016 / FLA : Standardisation du chemin de la CLR et ajout de la table SQL_Errors et de la SP get_Error_Info + 22.07.2016 / FLA : Standardisation du job et du schedule + 09.09.2016 / FLA : Ajout de Get_Job_Error_Info dans empty step et Send Mail KO + 03.05.2017 / FLA : Ajout du test d'existance pour la clé assymmetrique + 17.02.2021 / SPE : Modification de la CLR + 17.03.2022 / FLA : Change DBA mail + +=============================================================================*/ + +/*****************************************************************/ +/********* 1. CREATE SCHEMA [dba] ********************************/ +/*****************************************************************/ +DECLARE @cmd varchar(1000) +IF NOT EXISTS (SELECT * FROM sys.schemas WHERE name = N'dba') + BEGIN + SET @cmd='CREATE SCHEMA [dba] AUTHORIZATION dbo'; + EXEC (@cmd); +END; + +/*****************************************************************/ +/********* 2. CREATE TABLE [master].[dba].[Login_audit] *********/ +/*****************************************************************/ +USE [master] +GO +IF EXISTS (SELECT * FROM sys.objects WHERE object_id = OBJECT_ID(N'[master].[dba].[Login_audit]') AND type in (N'U')) +DROP TABLE [master].[dba].[Login_audit] + +CREATE TABLE [master].[dba].[Login_audit] +( + Login_Time datetime, + Login_Name sysname, + Host_Name nvarchar(128), + Program_Name nvarchar(128), + SessionID smallint +) + +/*****************************************************************/ +/********* 3. CHECK CLR ENABLED *********************************/ +/*****************************************************************/ +declare @IsValid tinyint +SELECT @IsValid = CAST(value_in_use as tinyint) FROM master.sys.configurations c WITH (NOLOCK) WHERE c.name = 'clr enabled' + +IF @IsValid = 0 +BEGIN + exec master.dbo.sp_configure 'clr enabled',1 + RECONFIGURE +END + +/*****************************************************************/ +/********* 4. CREATE CLR "DBA_CLR" ******************************/ +/*****************************************************************/ +IF EXISTS (SELECT * FROM sys.objects WHERE object_id = OBJECT_ID(N'[dba].[Get_Hostname_By_PID]') AND type in (N'FN', N'IF', N'TF', N'FS', N'FT')) +DROP FUNCTION [dba].[Get_Hostname_By_PID] +GO + +IF EXISTS (SELECT * FROM sys.assemblies asms WHERE asms.name = N'DBA_CLR' and is_user_defined = 1) +DROP ASSEMBLY [DBA_CLR] + +SET ANSI_NULLS, ANSI_PADDING, ANSI_WARNINGS, ARITHABORT, CONCAT_NULL_YIELDS_NULL, QUOTED_IDENTIFIER ON; +SET NUMERIC_ROUNDABORT OFF; + +USE [master]; + +GO +PRINT N'Creating [DBA_CLR]...'; + +GO + +CREATE ASSEMBLY [DBA_CLR] + FROM 0x4D5A90000300000004000000FFFF0000B800000000000000400000000000000000000000000000000000000000000000000000000000000000000000800000000E1FBA0E00B409CD21B8014CCD21546869732070726F6772616D2063616E6E6F742062652072756E20696E20444F53206D6F64652E0D0D0A2400000000000000504500004C010300778E2A600000000000000000E00022200B013000001200000006000000000000423100000020000000400000000000100020000000020000040000000000000004000000000000000080000000020000A76A0000030040850000100000100000000010000010000000000000100000000000000000000000F03000004F00000000400000CC03000000000000000000000000000000000000006000000C000000B82F00001C0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000200000080000000000000000000000082000004800000000000000000000002E7465787400000048110000002000000012000000020000000000000000000000000000200000602E72737263000000CC030000004000000004000000140000000000000000000000000000400000402E72656C6F6300000C00000000600000000200000018000000000000000000000000000040000042000000000000000000000000000000002431000000000000480000000200050030210000080E000009000000000000000000000000000000382F00008000000000000000000000000000000000000000000000000000000000000000000000001B300500A200000001000011730D00000A0A0F00FE16120000016F0E00000A280F00000A281000000A0C7E20000004086F1100000A1F0A12001201280100000626066F0E00000A281200000A2C3F7201000070731300000A0D096F1400000A096F1500000A2572350000706F1600000A6F1700000A6F0E00000A281800000A1304DE28092C06096F1900000ADC066F0E00000A731A00000A1304DE0F26725B000070281800000A1304DE0011042A0000011C000002004D002A77000A00000000000000009090000F0E0000011E02281B00000A2A2E7E1C00000A80200000042A42534A4201000100000000000C00000076322E302E35303732370000000005006C00000048040000237E0000B4040000FC05000023537472696E677300000000B00A00006400000023555300140B0000100000002347554944000000240B0000E402000023426C6F620000000000000002000001571D02140900000000FA013300160000010000001B000000030000002000000004000000060000001C0000001E0000000C00000001000000010000000100000001000000030000000000370301000000000006008C029A040600F9029A040600D80187040F00BA0400000600EC01940306006F02940306003B0294030600E00294030600AC0294030600C502940306000302940306001E02940306005C03550306005F0555030600390488050A005A0250040A00230150040A001703ED040E00460587040A00B30372050600010055030600230355030A00A603C1030A00180172050A000001C103060032015503060080045503000000001B00000000000100010001010000610000003500010001000100100024050000390020000100060670008C01568043038F0156804C018F015680C6058F0156808D008F015680AA008F01568071018F0156805F018F0156803E018F015680C8018F01568024048F0156807D018F015680DA058F015680CF008F01568096008F0156804E058F015680B5058F015680A4018F0156808B018F01568097018F01568002058F01568013058F015680C9048F015680DB048F01568003048F015680E2038F015680A4058F015680D4038F015680F1038F01568007008F01568066038F0131003F004800000000008000962079039301010050200000000096002400A00106001C2100000000861873040600070024210000000091187904A7010700000001006B0400000200C50000000300390502000400470402000500F100000001003800090073040100110073040600190073040A00290073041000310073041000390073041000410073041000490073041000510073041000590073041000610073041000810073040600790073040600710021032100A900C20125009900E2002A009900B7003000B100ED053400A10073041000B90061030600A1000A013900C90094051000C90016043E00910066054200D100BA010600910073041000710073040600D9001104480008000800F60008000C00FB00080010000001080014000501080018000A0108001C000F01080020001401080024001901080028001E0108002C002301080030002801080034002D0108003800320108003C003701080040003C0108004400410108004800460108004C004B01080050005001080054005501080058005A0108005C005F01080060006401080064006901080068006E0108006C007301080070007801080074007D0108007800820108007C0087012E000B00AB012E001300B4012E001B00D3012E002300DC012E002B00E9012E00330003022E003B0009022E004300DC012E004B001F022E00530003022E005B00440240006300510215002A030001030079030100048000000100000000000000010000005400590000000200000000000000000000004B008400000000000200000000000000000000004B007800000000000200000000000000000000004B005503000000000000000000496E7433320057545353657373696F6E416464726573735634003C4D6F64756C653E004765745F486F73746E616D655F42795F50494400705F73504944005754535F43555252454E545F5345525645525F48414E444C45004442415F434C52005754535F494E464F5F434C4153530076616C75655F5F0053797374656D2E44617461006D73636F726C6962005754534F454D496400575453436C69656E74486172647761726549640057545353657373696F6E4964006765745F53657373696F6E49640073657373696F6E496400575453436C69656E7450726F6475637449640047657450726F63657373427949640070427974657352657475726E6564004462436F6D6D616E6400437265617465436F6D6D616E640053716C436F6D6D616E6400446174614163636573734B696E640049446973706F7361626C6500575453446F6D61696E4E616D65005754534170706C69636174696F6E4E616D650057545357696E53746174696F6E4E616D6500575453557365724E616D6500575453436C69656E744E616D650057545349646C6554696D65005754534C6F676F6E54696D6500575453436C69656E7450726F746F636F6C5479706500446973706F736500506172736500575453436F6E6E65637453746174650044656275676761626C6541747472696275746500417373656D626C795469746C6541747472696275746500417373656D626C7954726164656D61726B41747472696275746500417373656D626C7946696C6556657273696F6E41747472696275746500417373656D626C79436F6E66696775726174696F6E4174747269627574650053716C46756E6374696F6E41747472696275746500417373656D626C794465736372697074696F6E41747472696275746500436F6D70696C6174696F6E52656C61786174696F6E7341747472696275746500417373656D626C7950726F6475637441747472696275746500417373656D626C79436F7079726967687441747472696275746500417373656D626C79436F6D70616E794174747269627574650052756E74696D65436F6D7061746962696C6974794174747269627574650053716C537472696E6700546F537472696E670057747361706933322E646C6C004442415F434C522E646C6C00575453496E697469616C50726F6772616D0053797374656D00456E756D004F70656E00575453497352656D6F746553657373696F6E00575453517565727953657373696F6E496E666F726D6174696F6E0053797374656D2E5265666C656374696F6E004462436F6E6E656374696F6E0053716C436F6E6E656374696F6E0053797374656D2E446174612E436F6D6D6F6E00575453436F6E666967496E666F0057545353657373696F6E496E666F0057545356616C69646174696F6E496E666F00575453436C69656E74496E666F005A65726F00457865637574655363616C617200575453436C69656E744275696C644E756D62657200537472696E674275696C646572007070427566666572004D6963726F736F66742E53716C5365727665722E5365727665720068536572766572002E63746F72002E6363746F7200496E745074720053797374656D2E446961676E6F73746963730053797374656D2E52756E74696D652E436F6D70696C6572536572766963657300446562756767696E674D6F64657300575453496E636F6D696E674672616D6573005754534F7574676F696E674672616D65730053797374656D2E446174612E53716C547970657300575453496E636F6D696E674279746573005754534F7574676F696E6742797465730055736572446566696E656446756E6374696F6E7300777473496E666F436C6173730050726F6365737300575453436C69656E7441646472657373004F626A656374006F705F496D706C696369740053797374656D2E446174612E53716C436C69656E740053797374656D2E54657874007365745F436F6D6D616E64546578740057545353657373696F6E496E666F457800575453436C69656E74446973706C617900575453576F726B696E674469726563746F727900575453436C69656E744469726563746F72790049734E756C6C4F72456D7074790000003363006F006E007400650078007400200063006F006E006E0065006300740069006F006E0020003D00200074007200750065000025530045004C00450043005400200048004F00530054005F004E0041004D0045002800290000074E002F0041000000AD4183DC0A95444CAE124F7F9765B9A200042001010803200001052001011111042001010E0B0705123D09124D125111490320000E040001080E050001124D0803200008040001020E04200012610320001C05000111490E02061808B77A5C561934E08980A00024000004800000940000000602000000240000525341310004000001000100D559E9027E54E681D077DCD321A45AEF640CBE14B1B7C9491EBE3916C7B99EC8089088712047E314BD08708CF611E1344D633B82BC3DC6CABDC7F6265336E062667D3ADD844995FA87B1A4C47D9220D5AC9AE19AE67283074F3F0141F0C83FF8A72AAB1293414C33ECF686739C2C80647F522FA1DC4346CFD82942D1E1030DC10400000000040100000004020000000403000000040400000004050000000406000000040700000004080000000409000000040A000000040B000000040C000000040D000000040E000000040F0000000410000000041100000004120000000413000000041400000004150000000416000000041700000004180000000419000000041A000000041B000000041C000000041D000000020608030611080C0005021808110810123D100906000111491149030000010801000800000000001E01000100540216577261704E6F6E457863657074696F6E5468726F7773010801000200000000000C0100074442415F434C52000019010014434C52207573656420696E20484349546F6F6C7300000501000000001501001048434920536F6C7574696F6E7320534100002401001F436F7079726967687420C2A92048434920536F6C7574696F6E73203230323100000C010007312E302E302E300000808F010001005455794D6963726F736F66742E53716C5365727665722E5365727665722E446174614163636573734B696E642C2053797374656D2E446174612C2056657273696F6E3D322E302E302E302C2043756C747572653D6E65757472616C2C205075626C69634B6579546F6B656E3D623737613563353631393334653038390A4461746141636365737301000000000020A1910363F11F4E4DF1FD852764C09F9EF5DD0319F513F71E75B234CD52AF8F7B58EBF62B522DC7B29003D380616E2C11F9D6914FECC3D09ADAE9D692025AC703C5633D80A2B3D49957523CD16F217B8A2A7952AEF7747BC8F966E4E94DED951FBCA6755044EC81F2392D23D7AF2B8E2F2936FC6AF4A275B7875BB274B0772500000000778E2A6000000000020000001C010000D42F0000D4110000525344538F02BFF45E699D439E082092AF09354501000000443A5C5446535C4442412E546F6F6C735C4D61696E5C434C525C6F626A5C52656C656173655C4442415F434C522E706462000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001831000000000000000000003231000000200000000000000000000000000000000000000000000024310000000000000000000000005F436F72446C6C4D61696E006D73636F7265652E646C6C0000000000FF25002000100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000100100000001800008000000000000000000000000000000100010000003000008000000000000000000000000000000100000000004800000058400000700300000000000000000000700334000000560053005F00560045005200530049004F004E005F0049004E0046004F0000000000BD04EFFE00000100000001000000000000000100000000003F000000000000000400000002000000000000000000000000000000440000000100560061007200460069006C00650049006E0066006F00000000002400040000005400720061006E0073006C006100740069006F006E00000000000000B004D0020000010053007400720069006E006700460069006C00650049006E0066006F000000AC020000010030003000300030003000340062003000000042001500010043006F006D006D0065006E0074007300000043004C00520020007500730065006400200069006E00200048004300490054006F006F006C0073000000000042001100010043006F006D00700061006E0079004E0061006D00650000000000480043004900200053006F006C007500740069006F006E00730020005300410000000000380008000100460069006C0065004400650073006300720069007000740069006F006E00000000004400420041005F0043004C0052000000300008000100460069006C006500560065007200730069006F006E000000000031002E0030002E0030002E003000000038000C00010049006E007400650072006E0061006C004E0061006D00650000004400420041005F0043004C0052002E0064006C006C00000062001F0001004C006500670061006C0043006F007000790072006900670068007400000043006F0070007900720069006700680074002000A9002000480043004900200053006F006C007500740069006F006E00730020003200300032003100000000002A00010001004C006500670061006C00540072006100640065006D00610072006B007300000000000000000040000C0001004F0072006900670069006E0061006C00460069006C0065006E0061006D00650000004400420041005F0043004C0052002E0064006C006C000000300008000100500072006F0064007500630074004E0061006D006500000000004400420041005F0043004C0052000000340008000100500072006F006400750063007400560065007200730069006F006E00000031002E0030002E0030002E003000000038000800010041007300730065006D0062006C0079002000560065007200730069006F006E00000031002E0030002E0030002E00300000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000003000000C000000443100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 + WITH PERMISSION_SET = UNSAFE; +GO + +PRINT N'Creating [dba].[Get_Hostname_By_PID]...'; + +GO + +CREATE FUNCTION [dba].[Get_Hostname_By_PID] +(@p_sPID NVARCHAR (MAX)) +RETURNS NVARCHAR (MAX) +AS + EXTERNAL NAME [DBA_CLR].[UserDefinedFunctions].[Get_Hostname_By_PID] + +GO +PRINT N'Update complete.'; + +GO + + +/*****************************************************************/ +/********* 5. CREATE TRIGGER tDDL_Login_Audit ********************/ +/*****************************************************************/ +IF EXISTS (SELECT * FROM master.sys.server_triggers WHERE parent_class_desc = 'SERVER' AND name = N'tDDL_Login_Audit') +DROP TRIGGER [tDDL_Login_Audit] ON ALL SERVER +GO + +CREATE TRIGGER [tDDL_Login_Audit] +ON ALL SERVER WITH EXECUTE AS 'sa' +AFTER LOGON +AS +BEGIN + IF PROGRAM_NAME() LIKE 'Microsoft SQL Server Management Studio%' + BEGIN + declare @IsValid tinyint + select @IsValid = COUNT(*) from master.sys.sysobjects WITH (NOLOCK) where name in ('Login_audit','Get_Hostname_By_PID') + + IF @IsValid = 2 + BEGIN + IF (HOST_NAME() = SERVERPROPERTY ('MachineName')) + BEGIN + SELECT @IsValid = CAST(value_in_use as tinyint) FROM master.sys.configurations c WITH (NOLOCK) WHERE c.name = 'clr enabled' + + IF @IsValid = 1 + BEGIN + INSERT INTO master.dba.Login_audit + SELECT GETDATE(),ORIGINAL_LOGIN(), master.dba.Get_Hostname_By_PID(HOST_ID()),PROGRAM_NAME(),@@SPID + END + ELSE + PRINT('CLR disabled pour le trigger tDDL_Login_Audit') + END + ELSE + BEGIN + INSERT INTO master.dba.Login_audit + SELECT GETDATE(),ORIGINAL_LOGIN(), HOST_NAME(),PROGRAM_NAME(),@@SPID + END + END + ELSE + PRINT('CLR ou table manquante pour le trigger tDDL_Login_Audit') + END +END +GO + + +/*****************************************************************/ +/********* 6. CREATE Table "SQL_Errors" **************************/ +/*****************************************************************/ +USE [HCITools] +GO + +IF EXISTS (SELECT * FROM sys.objects WHERE object_id = OBJECT_ID(N'[dbo].[SQL_Errors]') AND type in (N'U')) +DROP TABLE [dbo].[SQL_Errors] +GO + +SET ANSI_NULLS ON +GO + +SET QUOTED_IDENTIFIER ON +GO + +SET ANSI_PADDING ON +GO + +CREATE TABLE [dbo].[SQL_Errors]( + [ServerName] [nvarchar](50) NULL, + [AppName] [nvarchar](128) NULL, + [UserName] [sysname] NULL, + [ObjectName] [sysname] NULL, + [Date] [datetime] NULL, + [SourceType] [tinyint] NULL, + [ErrorMessage] [varchar](max) NULL +) ON [PRIMARY] TEXTIMAGE_ON [PRIMARY] + +GO + + +/*****************************************************************/ +/********* 7. CREATE SP "get_Error_Info" ************************/ +/*****************************************************************/ +SET ANSI_PADDING ON +GO + +USE [HCITools] +GO + +IF EXISTS (SELECT * FROM sys.objects WHERE object_id = OBJECT_ID(N'[dbo].[get_Error_Info]') AND type in (N'P', N'PC')) +DROP PROCEDURE [dbo].[get_Error_Info] +GO + +SET ANSI_NULLS ON +GO + +SET QUOTED_IDENTIFIER ON +GO + + +CREATE PROCEDURE [dbo].[get_Error_Info] + @in_debug tinyint = 0, + @in_Recipients varchar(8000) = '', + @in_LogToTable tinyint = 0, + @in_Context tinyint = 1, -- 1 = SP, 2 = Job + @in_RaiseError tinyint = 1 +AS +declare @ErrorMessage nvarchar(4000) = ERROR_MESSAGE(), + @ErrorNumber int = ERROR_NUMBER(), + @ErrorSeverity int = ERROR_SEVERITY(), + @ErrorState int = ERROR_STATE(), + @ErrorLine int = ERROR_LINE(), + @ErrorProc nvarchar(128) = COALESCE(ERROR_PROCEDURE(), 'Not within procedure'), + @Error varchar(max) + + +BEGIN TRY +select @Error = 'Error Number: ' + CAST(@ErrorNumber AS varchar(10)) + CHAR(13) + + 'Error Message: ' + @ErrorMessage + CHAR(13) + + 'Error Severity: ' + CAST(@ErrorSeverity AS varchar(10)) + CHAR(13) + + 'Error State: ' + CAST(@ErrorState AS varchar(10)) + CHAR(13) + + 'Error Line: ' + CAST(@ErrorLine AS varchar(10)) + CHAR(13) + + 'Error Proc: ' + @ErrorProc + CHAR(13) + +IF @in_Recipients <> '' +BEGIN + IF @in_Context = 1 + exec dbo.aps_Send_Mail_with_template @in_job_type = 0,@in_param_message = @Error, @in_param_varchar_2 = @in_Recipients + ELSE + BEGIN + exec dbo.aps_Send_Mail_with_template @in_param_varchar_2 = @in_Recipients + END +END + +IF @in_LogToTable = 1 + INSERT INTO SQL_Errors VALUES (@@SERVERNAME,APP_NAME(),CURRENT_USER,@ErrorProc,GETDATE(),@in_Context,@Error) + +END TRY +BEGIN CATCH + + RAISERROR ('Erreur dans la SP [dbo].[get_Error_Info]',16,1) + RETURN + +END CATCH + + +IF @in_RaiseError = 1 + RAISERROR (@ErrorMessage, + @ErrorSeverity, + @ErrorState + ); + +GO + +/*****************************************************************/ +/********* 8. CREATE SP "Purge_Login_audit" *********************/ +/*****************************************************************/ +USE [HCITools] +GO + +IF EXISTS (SELECT * FROM sys.objects WHERE object_id = OBJECT_ID(N'[dbo].[Purge_Login_audit]') AND type in (N'P', N'PC')) +DROP PROCEDURE [dbo].[Purge_Login_audit] +GO + +SET ANSI_NULLS ON +GO + +SET QUOTED_IDENTIFIER ON +GO + +CREATE PROCEDURE [dbo].[Purge_Login_audit] + @in_NbDays int = 30, + @in_debug int = null +AS +/*============================================================================= + + Explication du traitement realise par la SP + ------------------------------------------- + Cette SP sert à supprimer les traces de login de plus de XX jours dans la table master.dba.Login_audit + + Contexte d'utilisation + ---------------------- + Cette SP est appelée par le job D93030 - Purge Login audit + + Parametres + ---------- + @in_NbDays : nombre de jours glissant à conserver (30 par défaut) + @in_debug : non utilisé + + Creation : 30.03.16 / FLA + + Modifications : + +=============================================================================*/ + +set nocount on; + +declare @result_sp int, + @errno int, + @errmsg varchar(255) + +/*------------------- Declaration des variables --------------------*/ + + +/*------------ Affectation des parametres aux variables ------------*/ + + +/*-------------------------- Traitement ---------------------------*/ +BEGIN TRY + + DELETE FROM master.dba.Login_audit WHERE Login_Time < DateAdd(dd,-@in_NbDays,getdate()) + +/*---------------------- Traitement des erreurs ----------------------*/ +END TRY +BEGIN CATCH + + /* Traitement des erreurs (avec RaiseError) */ + EXEC dbo.get_Error_Info @in_RaiseError = 1 + +END CATCH + +GO + + +/********************************************************************************/ +/********* 9. CREATE SQL AGENT JOB CATEGORY "DBA-Maintenance" ******************/ +/********************************************************************************/ +USE [msdb] +GO + +IF NOT EXISTS (SELECT name FROM msdb.dbo.syscategories WHERE name=N'DBA-Maintenance' AND category_class=1) +BEGIN + + EXEC msdb.dbo.sp_add_category @class=N'JOB', @type=N'LOCAL', @name=N'DBA-Maintenance' + +END + + +/*****************************************************************************/ +/********* 10. CREATE SQL AGENT JOB "D93030 - Purge Login audit" *************/ +/*****************************************************************************/ +USE [msdb] +GO +/* Drop existing standard schedule for job */ +declare @schedule_id int +declare c_schedules cursor local forward_only static for + select ss.schedule_id + from msdb.dbo.sysjobschedules sjs +INNER JOIN msdb.dbo.sysschedules ss + ON sjs.schedule_id = ss.schedule_id + AND ss.name NOT LIKE '%#SPEC#' +INNER JOIN msdb.dbo.sysjobs sj + ON sjs.job_id = sj.job_id + WHERE sj.name = N'D93030 - Purge Login audit' + +open c_schedules + +FETCH NEXT FROM c_schedules into @schedule_id +while @@fetch_status = 0 +begin + IF ((select COUNT(*) from msdb.dbo.sysjobschedules where schedule_id=@schedule_id) = 1) + EXEC msdb.dbo.sp_delete_schedule @schedule_id=@schedule_id, @force_delete = 1 +FETCH NEXT FROM c_schedules into @schedule_id +end + +close c_schedules + +deallocate c_schedules + +IF EXISTS (SELECT job_id FROM msdb.dbo.sysjobs_view WHERE name = N'D93030 - Purge Login audit') +EXEC msdb.dbo.sp_delete_job @job_name = N'D93030 - Purge Login audit', @delete_unused_schedule=0 +GO + +/* Creation Job and Steps*/ +BEGIN TRANSACTION +DECLARE @ReturnCode INT +SELECT @ReturnCode = 0 + +IF NOT EXISTS (SELECT name FROM msdb.dbo.syscategories WHERE name=N'DBA-Maintenance' AND category_class=1) +BEGIN +EXEC @ReturnCode = msdb.dbo.sp_add_category @class=N'JOB', @type=N'LOCAL', @name=N'DBA-Maintenance' +IF (@@ERROR <> 0 OR @ReturnCode <> 0) GOTO QuitWithRollback + +END + +/* Add Job */ +DECLARE @jobId BINARY(16) +EXEC @ReturnCode = msdb.dbo.sp_add_job @job_name=N'D93030 - Purge Login audit', + @enabled=1, + @notify_level_eventlog=0, + @notify_level_email=0, + @notify_level_netsend=0, + @notify_level_page=0, + @delete_level=0, + @description=N'Purge Login History in table master.dba.Login_audit', + @category_name=N'DBA-Maintenance', + @start_step_id=1, + @owner_login_name=N'sa', @job_id = @jobId OUTPUT +IF (@@ERROR <> 0 OR @ReturnCode <> 0) GOTO QuitWithRollback + +/* Add Step */ +EXEC @ReturnCode = msdb.dbo.sp_add_jobstep @job_id=@jobId, @step_name=N'Empty step', + @step_id=1, + @cmdexec_success_code=0, + @on_success_action=3, + @on_success_step_id=0, + @on_fail_action=3, + @on_fail_step_id=0, + @retry_attempts=0, + @retry_interval=0, + @os_run_priority=0, @subsystem=N'TSQL', + @command=N'/* Empty step */', + @database_name=N'master', + @output_file_name=NULL, + @flags=0, + @database_user_name=NULL, + @server=NULL, + @additional_parameters=NULL, + @proxy_id=NULL, + @proxy_name=NULL +IF (@@ERROR <> 0 OR @ReturnCode <> 0) GOTO QuitWithRollback +/* Add Step */ +EXEC @ReturnCode = msdb.dbo.sp_add_jobstep @job_id=@jobId, @step_name=N'Purge Login audit', + @step_id=2, + @cmdexec_success_code=0, + @on_success_action=3, + @on_success_step_id=0, + @on_fail_action=4, + @on_fail_step_id=4, + @retry_attempts=0, + @retry_interval=1, + @os_run_priority=0, @subsystem=N'TSQL', + @command=N'exec [dbo].[Purge_Login_audit] @in_NbDays = 30', + @database_name=N'HCITools', + @output_file_name=NULL, + @flags=0, + @database_user_name=NULL, + @server=NULL, + @additional_parameters=NULL, + @proxy_id=NULL, + @proxy_name=NULL +IF (@@ERROR <> 0 OR @ReturnCode <> 0) GOTO QuitWithRollback +/* Add Step */ +EXEC @ReturnCode = msdb.dbo.sp_add_jobstep @job_id=@jobId, @step_name=N'Empty step for success', + @step_id=3, + @cmdexec_success_code=0, + @on_success_action=1, + @on_success_step_id=0, + @on_fail_action=4, + @on_fail_step_id=4, + @retry_attempts=0, + @retry_interval=0, + @os_run_priority=0, @subsystem=N'TSQL', + @command=N'/* Empty step */ +exec Get_Job_Error_Info @in_JobName = ''D93030 - Purge Login audit'', @in_Recipients = ''DBA_operator''', + @database_name=N'HCITools', + @output_file_name=NULL, + @flags=0, + @database_user_name=NULL, + @server=NULL, + @additional_parameters=NULL, + @proxy_id=NULL, + @proxy_name=NULL +IF (@@ERROR <> 0 OR @ReturnCode <> 0) GOTO QuitWithRollback +/* Add Step */ +EXEC @ReturnCode = msdb.dbo.sp_add_jobstep @job_id=@jobId, @step_name=N'Send email KO', + @step_id=4, + @cmdexec_success_code=0, + @on_success_action=2, + @on_success_step_id=0, + @on_fail_action=2, + @on_fail_step_id=0, + @retry_attempts=0, + @retry_interval=0, + @os_run_priority=0, @subsystem=N'TSQL', + @command=N'exec Get_Job_Error_Info @in_JobName = ''D93030 - Purge Login audit'', @in_Recipients = ''DBA_operator''', + @database_name=N'HCITools', + @output_file_name=NULL, + @flags=0, + @database_user_name=NULL, + @server=NULL, + @additional_parameters=NULL, + @proxy_id=NULL, + @proxy_name=NULL +IF (@@ERROR <> 0 OR @ReturnCode <> 0) GOTO QuitWithRollback +EXEC @ReturnCode = msdb.dbo.sp_update_job @job_id = @jobId, @start_step_id = 1 +IF (@@ERROR <> 0 OR @ReturnCode <> 0) GOTO QuitWithRollback + +/* Add Standard Schedule */ +EXEC @ReturnCode = msdb.dbo.sp_add_jobschedule @job_id=@jobId, @name=N'D93030-D', + @enabled=1, + @freq_type=4, + @freq_interval=1, + @freq_subday_type=1, + @freq_subday_interval=0, + @freq_relative_interval=0, + @freq_recurrence_factor=0, + @active_start_date=20151116, + @active_end_date=99991231, + @active_start_time=30000, + @active_end_time=235959 +IF (@@ERROR <> 0 OR @ReturnCode <> 0) GOTO QuitWithRollback + +/* Attach existing specific schedule for job */ +declare @enabled_schedule int, + @schedule_name nvarchar(50) +declare c_schedules cursor local forward_only static for +select enabled, name + from msdb.dbo.sysschedules + where name LIKE 'D93030%' + and name LIKE '%#SPEC#' + +open c_schedules + +FETCH NEXT FROM c_schedules into @enabled_schedule, @schedule_name +while @@fetch_status = 0 +begin + EXEC @ReturnCode = msdb.dbo.sp_attach_schedule @job_id = @jobId, @schedule_name=@schedule_name + IF(@enabled_schedule = 1) + begin + SET @schedule_name = SUBSTRING(@schedule_name,0,LEN(@schedule_name)-5) + IF EXISTS (select name from msdb.dbo.sysschedules where name = @schedule_name) + EXEC @ReturnCode = msdb.dbo.sp_update_schedule @name=@schedule_name, @enabled=0 + end + IF (@@ERROR <> 0 OR @ReturnCode <> 0) GOTO QuitWithRollback +FETCH NEXT FROM c_schedules into @enabled_schedule, @schedule_name +end + +close c_schedules + +deallocate c_schedules + +EXEC @ReturnCode = msdb.dbo.sp_add_jobserver @job_id = @jobId, @server_name = N'(local)' +IF (@@ERROR <> 0 OR @ReturnCode <> 0) GOTO QuitWithRollback +COMMIT TRANSACTION +GOTO EndSave +QuitWithRollback: + IF (@@TRANCOUNT > 0) ROLLBACK TRANSACTION +EndSave: + +GO diff --git a/TPDT-268 - ACP in task sequence/dba_packages/Deploy_CLR_DBA_Commvault.sql b/TPDT-268 - ACP in task sequence/dba_packages/Deploy_CLR_DBA_Commvault.sql new file mode 100644 index 0000000..f1c0cbd --- /dev/null +++ b/TPDT-268 - ACP in task sequence/dba_packages/Deploy_CLR_DBA_Commvault.sql @@ -0,0 +1,1058 @@ +USE [HCITools]; +GO + +SET ANSI_NULLS ON; +GO + +SET QUOTED_IDENTIFIER ON; +GO + + +/*============================================================================= + + Explication du traitement realise par la SP + ------------------------------------------- + Create CLR DBA_Commvault and functions: +-FUNCTION [dba].[Commvault_File_Exists]; +-FUNCTION [dba].[Commvault_Login]; +-FUNCTION [dba].[Commvault_Backup]; +-FUNCTION [dba].[Commvault_Restore]; +-FUNCTION [dba].[Commvault_Logout]; +-FUNCTION [dba].[Commvault_Job_Status]; +-FUNCTION [dba].[Commvault_Job_Kill]; + + Create SP Commvault_Operation + + Create table Commvault_last_app_backup + + Usage context + ---------------------- + Executed from msi and sp to backup using commvault + + Parameters + ---------- + + Creation : 10.01.2022 / rtc #TFS66782# + + Modifications : 24.01.2022 / SPE - OCTPDBA-126 : Commvault error handling + 06.05.2022 / SPE - OCTPDBA-231 : Modify Commvault CLR Security + 06.07.2022 / SPE - Add Commvault_Operation SP on it + 12.07.2022 / SPE - Modify if environment variable is null + 05.08.2022 / RTC - Add option to drop existing connections to database before simple resotre + 31.10.2022 / SPE - OCTPDBA-356: Add Restore to file procedure in DBA Commvault CLR + 18.11.2022 / SPE - OCTPDBA-358: Add database with filestream filegroup MOVE feature in [HCITools].[dba].[Commvault_Operation] CLR + 20.04.2023 / SPE - OCTPDBA-567: Modify Commvault SP to remove the timeout and the kill session + 12.07.2023 / TSC - OCTPDBA-699: updated CLR and modified logic in Commvault_Operation to return db file info in lower case + +=============================================================================*/ + +/* CREATE CLR */ + +/************************************* DROP *********************************/ + +/* Drop Function [dba].[Commvault_File_Exists] */ +EXEC ('IF EXISTS (SELECT * FROM sys.objects WHERE object_id = OBJECT_ID(N''[dba].[Commvault_File_Exists]'') AND type = N''FS'') +DROP FUNCTION [dba].[Commvault_File_Exists]'); + +/* Drop Function [dba].[Commvault_Login]...' */ +EXEC ('IF EXISTS (SELECT * FROM sys.objects WHERE object_id = OBJECT_ID(N''[dba].[Commvault_Login]'') AND type = N''FS'') +DROP FUNCTION [dba].[Commvault_Login]'); + +/* Drop Function [dba].[Commvault_Backup]...' */ +EXEC ('IF EXISTS (SELECT * FROM sys.objects WHERE object_id = OBJECT_ID(N''[dba].[Commvault_Backup]'') AND type = N''FS'') +DROP FUNCTION [dba].[Commvault_Backup]'); + +/* Drop Function [dba].[Commvault_Restore]...' */ +EXEC ('IF EXISTS (SELECT * FROM sys.objects WHERE object_id = OBJECT_ID(N''[dba].[Commvault_Restore]'') AND type = N''FS'') +DROP FUNCTION [dba].[Commvault_Restore]'); + +/* Drop Function [dba].[Commvault_Job_Status]...' */ +EXEC ('IF EXISTS (SELECT * FROM sys.objects WHERE object_id = OBJECT_ID(N''[dba].[Commvault_Job_Status]'') AND type = N''FS'') +DROP FUNCTION [dba].[Commvault_Job_Status]'); + +/* Drop Function [dba].[Commvault_Job_Kill]...' */ +EXEC ('IF EXISTS (SELECT * FROM sys.objects WHERE object_id = OBJECT_ID(N''[dba].[Commvault_Job_Kill]'') AND type = N''FS'') +DROP FUNCTION [dba].[Commvault_Job_Kill]'); + +/* Drop Function [dba].[Commvault_Logout]...' */ +EXEC ('IF EXISTS (SELECT * FROM sys.objects WHERE object_id = OBJECT_ID(N''[dba].[Commvault_Logout]'') AND type = N''FS'') +DROP FUNCTION [dba].[Commvault_Logout]'); + +/* Drop assembly Assembly [DBA.Commvault] */ +EXEC ('IF EXISTS (SELECT * FROM sys.assemblies asms WHERE asms.name = N''DBA.Commvault'') +DROP ASSEMBLY [DBA.Commvault]'); + +/************************************ CREATE ********************************/ + +PRINT N'Creating Assembly [DBA.Commvault]...'; + + +GO +CREATE ASSEMBLY [DBA.Commvault] + AUTHORIZATION [dbo] + FROM 0x4D5A90000300000004000000FFFF0000B800000000000000400000000000000000000000000000000000000000000000000000000000000000000000800000000E1FBA0E00B409CD21B8014CCD21546869732070726F6772616D2063616E6E6F742062652072756E20696E20444F53206D6F64652E0D0D0A2400000000000000504500004C010300918EAE640000000000000000E00022200B01300000B400000008000000000000EED200000020000000E0000000000010002000000002000004000000000000000600000000000000002001000002000047F800000300608500001000001000000000100000100000000000001000000000000000000000009CD200004F00000000E000000804000000000000000000000000000000000000000001000C00000064D100001C0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000200000080000000000000000000000082000004800000000000000000000002E74657874000000F4B200000020000000B4000000020000000000000000000000000000200000602E727372630000000804000000E000000006000000B60000000000000000000000000000400000402E72656C6F6300000C000000000001000002000000BC00000000000000000000000000004000004200000000000000000000000000000000D0D20000000000004800000002000500944F00005081000009000000000000000000000000000000E4D000008000000000000000000000000000000000000000000000000000000000000000000000001B3005009604000001000011007E02000004280D00000A2D0C7E02000004280E00000A2B0117130A110A2C0C00720100007080020000040002280F00000A280D00000A2D0D02280F00000A280E00000A2B0117130B110B2C1100725B0000707271000070731000000A7A03280F00000A280D00000A2D0D03280F00000A280E00000A2B0117130C110C2C110072B70000707271000070731000000A7A0E05280F00000A280D00000A2D0E0E05280F00000A280E00000A2B0117130D110D2C110072D10000707271000070731000000A7A140A7E0200000472E9000070281100000A281200000A0A06280A00000600281300000A0B07731400000A0C000872090100706F1500000A6F1600000A130E2B3E110E6F1700000A130F00110F6F1800000A281900000A13111211230000000000000840281A00000A281B00000A131011102C0A00110F6F1C00000A000000110E6F1D00000A2DB9DE0D110E2C08110E6F1E00000A00DC000872370100706F1500000A6F1600000A13122B3E11126F1700000A13130011136F1800000A281900000A13111211230000000000000840281A00000A281B00000A131411142C0A0011136F1C00000A00000011126F1D00000A2DB9DE0D11122C0811126F1E00000A00DC077257010070281900000A131112117279010070281F00000A729D010070282000000A0D0772A7010070281900000A131112117279010070281F00000A72BB010070282000000A13047E01000004096F0E000006000E0472C5010070282100000A131511152C26000E04178D2300000125161F2C9D6F2200000A13161104111616732300000A282400000A000072C501007013050F02282500000A72C5010070282100000A131711172C1E00110572C70100700F02282500000A72E7010070282000000A1305002B1000110572EB010070281100000A1305000F03282500000A72C5010070282100000A131811182C1E001105721B0200700F03282500000A72E7010070282000000A1305002B100011057237020070281100000A130500110472C5010070282100000A131911192C17001105725D020070110472E7010070282000000A130500732600000A130611066F2700000A7E0200000472E9000070281100000A6F2800000A0011066F2700000A1F0A8D1E00000125167285020070A2251709A2251872A1020070A225190F00282500000AA2251A72BD020070A2251B0F01282500000AA2251C72E7010070A2251D1105A2251E72DD020070A2251F090F05282500000AA2282900000A6F2A00000A0011066F2700000A176F2B00000A0011066F2700000A176F2C00000A0011066F2700000A166F2D00000A0011066F2700000A176F2E00000A0011066F2F00000A2672C501007013072B1700110711066F3000000A6F3100000A281100000A13070011066F3000000A6F3200000A16FE01131A111A2DD411066F3300000A00733400000A1308110811076F3500000A0072C5010070283600000A13090011086F3700000A6F3800000A131B2B29111B6F3900000A7417000001131C00111C6F3A00000A166F3B00000A6F3C00000A283600000A130900111B6F1D00000A2DCEDE16111B7518000001131D111D2C08111D6F1E00000A00DC1109131E2B00111E2A000001280000020002014B4D010D0000000002006D014BB8010D000000000200410436770416000000001B3008009804000002000011007E02000004280D00000A2D0C7E02000004280E00000A2B0117130911092C0C007201000070800200000400140A7E0200000472E9000070281100000A281200000A0A06280A00000600281300000A0B0772E9020070281900000A130A120A7279010070281F00000A729D010070282000000A0C07731400000A0D0009720D0300706F1500000A6F1600000A130B2B3E110B6F1700000A130C00110C6F1800000A281900000A130A120A2300000000000020C0281A00000A281B00000A130D110D2C0A00110C6F1C00000A000000110B6F1D00000A2DB9DE0D110B2C08110B6F1E00000A00DC0E0B130E110E2C6E001B8D1E0000012516281900000A130A120A723D030070281F00000AA225177257030070A225180F00282500000AA225197257030070A2251A0F03282500000AA2282900000A130F725B030070110F281100000A283D00000A267E01000004050E0708110F6F1100000600002B42000F05282500000A72C5010070283E00000A131011102C10007E01000004086F0F00000600002B19007E01000004050E040E070E080E090E0A086F1000000600000072C501007013040F05282500000A72C5010070282100000A131111112C40001C8D1E00000125161104A2251772A7030070A225180F05282500000AA2251972D7030070A2251A0F05282500000AA2251B72E7010070A2282900000A1304000F06282500000A72C5010070282100000A131211122C1C001104721B0400700F06282500000A72E7010070282000000A130400732600000A130511056F2700000A7E0200000472E9000070281100000A6F2800000A000E0B1313111339890000000011056F2700000A1F0C8D1E00000125167285020070A2251708A2251872A1020070A225190F00282500000AA2251A72BD020070A2251B0F01282500000AA2251C7261040070A2251D0F02282500000AA2251E7281040070A2251F090F03282500000AA2251F0A72A5040070A2251F0B0F0D282500000AA2282900000A6F2A00000A000038B4000000000E0C1314111439A70000000011056F2700000A1F108D1E00000125167285020070A2251708A2251872A1020070A225190F00282500000AA2251A72BD020070A2251B0F01282500000AA2251C7261040070A2251D0F02282500000AA2251E7281040070A2251F090F03282500000AA2251F0A72A2050070A2251F0B0F04282500000AA2251F0C72E7010070A2251F0D1104A2251F0E72DD020070A2251F0F0F0D282500000AA2282900000A6F2A00000A00000011056F2700000A176F2B00000A0011056F2700000A176F2C00000A0011056F2700000A166F2D00000A0011056F2700000A176F2E00000A0011056F2F00000A2672C501007013062B1700110611056F3000000A6F3100000A281100000A13060011056F3000000A6F3200000A16FE01131511152DD411056F3300000A00733400000A1307110711066F3500000A0072C5010070283600000A13080011076F3700000A6F3800000A13162B2911166F3900000A741700000113170011176F3A00000A166F3B00000A6F3C00000A283600000A13080011166F1D00000A2DCEDE1611167518000001131811182C0811186F1E00000A00DC110813192B0011192A011C000002008E004BD9000D0000000002004304367904160000000013300500F801000003000011007E02000004280D00000A2D0C7E02000004280E00000A2B01170D092C0C00720100007080020000040002280F00000A280D00000A2D0D02280F00000A280E00000A2B0117130411042C110072BA0500707271000070731000000A7A03280F00000A280D00000A2D0D03280F00000A280E00000A2B0117130511052C110072C60500707271000070731000000A7A04280F00000A280D00000A2D0D04280F00000A280E00000A2B0117130611062C110072D10000707271000070731000000A7A140A7E0200000472DA050070281100000A281200000A0A06280A00000600732600000A0B076F2700000A7E0200000472DA050070281100000A6F2800000A00076F2700000A1C8D1E000001251672F0050070A225170F00282500000AA225187202060070A225190F01282500000AA2251A72DD020070A2251B0F02282500000AA2282900000A6F2A00000A00076F2700000A176F2B00000A00076F2700000A176F2C00000A00076F2700000A166F2D00000A00076F2700000A176F2E00000A00076F2F00000A2672C5010070283600000A0C0F01282500000A720E060070283E00000A130711072C2D002B1300076F3000000A6F3100000A283600000A0C00076F3000000A6F3200000A16FE01130811082DD9002B1300076F3000000A6F3F00000A283600000A0C00076F3300000A000813092B0011092A133005003501000004000011007E02000004280D00000A2D0C7E02000004280E00000A2B01170C082C0C00720100007080020000040003280F00000A280D00000A2D0D03280F00000A280E00000A2B01170D092C110072D10000707271000070731000000A7A02280F00000A280D00000A2D0D02280F00000A280E00000A2B0117130411042C110072BA0500707271000070731000000A7A140A7E0200000472E9000070281100000A281200000A0A06280A00000600732600000A0B076F2700000A7E020000046F4000000A00076F2700000A72120600706F2800000A00076F2700000A72300600700F00282500000A72500600700F01282500000A282000000A6F2A00000A00076F2700000A176F2B00000A00076F2700000A176F2C00000A00076F2F00000A26076F3300000A00076F4100000A284200000A13052B0011052A2202280B000006002A2E730D00000680010000042A000013300500E801000005000011007E02000004280D00000A2D0C7E02000004280E00000A2B0117130411042C0C0072010000708002000004007E02000004284300000A0A0616FE01130511052C10726C0600707280060070731000000A7A02280F00000A280D00000A2D0D02280F00000A280E00000A2B0117130611062C11007241070070724D070070731000000A7A03280F00000A280D00000A2D0D02280F00000A280E00000A2B0117130711072C110072870700707299070070731000000A7A140B7E0200000472D3070070281100000A281200000A0B07280A00000600732600000A0C086F2700000A7E0200000472D3070070281100000A6F2800000A00086F2700000A1B8D1E000001251672EB070070A225170F00282500000AA2251872F3070070A225190F01282500000AA2251A72FF070070A2282900000A6F2A00000A00086F2700000A176F2B00000A00086F2700000A176F2C00000A00086F2700000A166F2D00000A00086F2700000A176F2E00000A00086F2F00000A2672C5010070283600000A0D2B190009086F3000000A6F3100000A283600000A284400000A0D00086F3000000A6F3200000A16FE01130811082DD3086F3300000A000972C5010070283600000A284500000A284600000A130911092C110072090800707215080070731000000A7A0009130A2B00110A2A13300300F700000006000011007E02000004280D00000A2D0C7E02000004280E00000A2B01170C082C0C00720100007080020000040002280F00000A280D00000A2D0D02280F00000A280E00000A2B01170D092C110072D10000707271000070731000000A7A140A7E020000047243080070281100000A281200000A0A06280A00000600732600000A0B076F2700000A7E020000046F4000000A00076F2700000A725D0800706F2800000A00076F2700000A72750800700F00282500000A281100000A6F2A00000A00076F2700000A176F2B00000A00076F2700000A176F2C00000A00076F2F00000A26076F3300000A00076F4100000A284200000A13042B0011042A001330020047000000070000110002280F00000A280D00000A2D0D02280F00000A280E00000A2B01170A062C1100727F0800707271000070731000000A7A0F00282500000A284700000A284800000A0B2B00072A00133002002E0000000800001100026F4900000A6F4A00000A0A0672890800706F4B00000A16FE010B072C0C00729D080070734C00000A7A2B002A2202284D00000A002A7A72E3080070284E00000A252D0B267201090070284E00000A80020000042A2A02284D00000A0000002A3A0003721F090070284F00000A002A3A00037284140070284F00000A002A0013300600890F00000900001100733400000A0A067255310070725D31007072693100706F5000000A0B06726F3100706F5100000A0C0672973100706F5100000A0D0672A93100706F5100000A13040672B33100706F5100000A13050672C73100706F5100000A13060672D93100706F5100000A13070672EF3100706F5100000A13080672013200706F5100000A130906721D3200706F5100000A130A0672293200706F5100000A130B06723D3200706F5100000A130C0672573200706F5100000A130D0672573200706F5100000A130E0672733200706F5100000A130F06725B0000706F5100000A131006725B0000706F5100000A131106725B0000706F5100000A131206725B0000706F5100000A131306728F3200706F5100000A131406728F3200706F5100000A13150672B70000706F5100000A13160672B70000706F5100000A131706729F3200706F5100000A13180672B13200706F5100000A13190672C13200706F5100000A131A0672D93200706F5100000A131B0672F53200706F5100000A131C0672053300706F5100000A131D0672233300706F5100000A131E06723D3300706F5100000A131F0672533300706F5100000A13200672673300706F5100000A132106727B3300706F5100000A13220672933300706F5100000A13230672A33300706F5100000A13240672BF3300706F5100000A13250672D73300706F5100000A13260672E73300706F5100000A13270672FD3300706F5100000A13280672113400706F5100000A132906721D3400706F5100000A132A06721D3400706F5100000A132B06723B3400706F5100000A132C06726D3400706F5100000A132D0672A13400706F5100000A132E06725B0000706F5100000A132F0672C93400706F5100000A13300672C93400706F5100000A13310672DB3400706F5100000A13320672DB3400706F5100000A13330672F53400706F5100000A13340672093500706F5100000A13350672213500706F5100000A13360672373500706F5100000A133706725F3500706F5100000A13380672853500706F5100000A13390672933500706F5100000A133A0672A73500706F5100000A133B0672C53500706F5100000A133C0672E33500706F5100000A133D0672013600706F5100000A133E06721B3600706F5100000A133F0672533600706F5100000A13400672733600706F5100000A134106729F3600706F5100000A13420672BD3600706F5100000A13430672DD3600706F5100000A13440672F33600706F5100000A13450672153700706F5100000A13460672293700706F5100000A13470672453700706F5100000A13480672573700706F5100000A13490672773700706F5100000A134A06728D3700706F5100000A134B06729F3700706F5100000A134C0672BB3700706F5100000A134D0672EB3700706F5100000A134E06722D3800706F5100000A134F06725F3800706F5100000A13500672973800706F5100000A13510672C33800706F5100000A13520672E13800706F5100000A13530672EF3800706F5100000A13540672213900706F5100000A13550672473900706F5100000A135606726B3900706F5100000A135706727F3900706F5100000A13580672993900706F5100000A13590672AF3900706F5100000A135A0672C73900706F5100000A135B0672F33900706F5100000A135C0672053A00706F5100000A135D06722B3A00706F5100000A135E0672433A00706F5100000A135F0672693A00706F5100000A13600672913A00706F5100000A13610672AD3A00706F5100000A13620672B93A00706F5100000A13630672C33A00706F5100000A13640672D53A00706F5100000A13650672F53A00706F5100000A1366110672133B00706F5200000A001107721F3B00706F5200000A001108723F3B00706F5200000A00110972533B00706F5200000A00110D726B3B00706F5200000A00110E726B3B00706F5200000A00110F72C50100706F5200000A00111072C50100706F5200000A00111172C50100706F5200000A00111272C50100706F5200000A00111372C50100706F5200000A001114728D3B00706F5200000A001115728D3B00706F5200000A00111672C50100706F5200000A00111772C50100706F5200000A00111A72A33B00706F5200000A00111B72A33B00706F5200000A00111F72B33B00706F5200000A00112272C50100706F5200000A00112372B73B00706F5200000A00112472133B00706F5200000A00112C72133B00706F5200000A00113272C13B00706F5200000A00113372C13B00706F5200000A00113472133B00706F5200000A00113972133B00706F5200000A00113A72B73B00706F5200000A00113B72133B00706F5200000A00113C723B3C00706F5200000A00113D725D3C00706F5200000A00113E72133B00706F5200000A00113F72133B00706F5200000A00114072133B00706F5200000A00114172133B00706F5200000A00114272133B00706F5200000A00114372133B00706F5200000A00114472133B00706F5200000A00114572133B00706F5200000A00114672133B00706F5200000A00114972133B00706F5200000A00115272133B00706F5200000A00115672133B00706F5200000A0011470F01282500000A6F5200000A0011480F01282500000A6F5200000A00110B72C50100706F5200000A00112D72793C00706F5200000A00112B72793C00706F5200000A00112F72C50100706F5200000A00114D72B73B00706F5200000A00114E72133B00706F5200000A00114F72133B00706F5200000A00115072133B00706F5200000A00115172133B00706F5200000A00115372133B00706F5200000A00115472133B00706F5200000A00115572133B00706F5200000A00115B72133B00706F5200000A00115C727D3C00706F5200000A00115D72B73B00706F5200000A00115F72C50100706F5200000A00116072C50100706F5200000A00116272833C00706F5200000A00116472C50100706F5200000A00116572133B00706F5200000A00116672C50100706F5200000A0006076F5300000A2606086F5300000A2608096F5300000A260911046F5300000A26110411056F5300000A26110511066F5300000A26110411076F5300000A26110411086F5300000A26110411096F5300000A261104110A6F5300000A26110A110B6F5300000A2609110C6F5300000A26110C110D6F5300000A26110C110F6F5300000A26110C11106F5300000A26110C11146F5300000A26110C11166F5300000A260911186F5300000A26111811196F5300000A261119111A6F5300000A261119111B6F5300000A261118111C6F5300000A26111C111D6F5300000A26111C11576F5300000A26111D111E6F5300000A26111D11356F5300000A26111D11386F5300000A26111D114A6F5300000A26111D114C6F5300000A26111E111F6F5300000A26111E11206F5300000A26111E11216F5300000A26111E11236F5300000A26111E11246F5300000A26111E11256F5300000A26111E11306F5300000A26111E11346F5300000A26112011116F5300000A261120110E6F5300000A26112111226F5300000A26112511266F5300000A26112511276F5300000A26112511286F5300000A26112511296F5300000A261125112A6F5300000A261125112E6F5300000A26112E112F6F5300000A26112A112C6F5300000A26112A112D6F5300000A26112A112B6F5300000A26113011326F5300000A26113511366F5300000A26113611126F5300000A26113511376F5300000A26113711136F5300000A26113711156F5300000A26113711176F5300000A26113811396F5300000A261138113A6F5300000A261138113B6F5300000A261138113C6F5300000A261138113D6F5300000A261138113E6F5300000A261138113F6F5300000A26113811406F5300000A26113811416F5300000A26113811426F5300000A26113811436F5300000A26113811446F5300000A26113811456F5300000A26113811466F5300000A2617136717136805178D2300000125161F7C9D6F2200000A1369001169136C16136D389D020000116C116D9A136E00116E6F5400000A178D2300000125161F2C9D6F2200000A136F0F05282500000A729D3C00706F5500000A16FE01137111712C1A000F05282500000A729D3C0070281100000A283600000A1005000F04282500000A729D3C00706F5500000A16FE01137211722C1A000F04282500000A729D3C0070281100000A283600000A1004000F06282500000A729D3C00706F5500000A16FE01137311732C1A000F06282500000A729D3C0070281100000A283600000A1006000672A13C00706F5100000A1370116F179A72AF3C00706F4B00000A1374117439950000000011701F0D8D1E000001251672B93C0070A225170F01282500000AA2251872BD3C0070A225190F02282500000AA2251A72BD3C0070A2251B116F169AA2251C72BD3C0070A2251D0F05282500000AA2251E0F02282500000AA2251F097257030070A2251F0A1267285600000AA2251F0B72C93C0070A2251F0C116F179AA2282900000A6F5200000A0011671758136700381601000000116F179A72DD3C00706F4B00000A1375117539920000000011701F0D8D1E000001251672B93C0070A225170F01282500000AA2251872BD3C0070A225190F02282500000AA2251A72BD3C0070A2251B116F169AA2251C72BD3C0070A2251D0F04282500000AA2251E0F02282500000AA2251F097257030070A2251F0A1268285600000AA2251F0B72E73C0070A2251F0C116F179AA2282900000A6F5200000A00116817581368002B6B0011701F0A8D1E000001251672B93C0070A225170F01282500000AA2251872BD3C0070A225190F02282500000AA2251A72BD3C0070A2251B116F169AA2251C72BD3C0070A2251D0F06282500000AA2251E72BD3C0070A2251F09116F179AA2282900000A6F5200000A000000113811706F5300000A2600116D1758136D116D116C8E693F58FDFFFF113811476F5300000A26113811486F5300000A26113811316F5300000A26113811496F5300000A26113111336F5300000A26114A114B6F5300000A26114C114D6F5300000A26114C114E6F5300000A26114C114F6F5300000A26114C11506F5300000A26114C11516F5300000A26114C11526F5300000A26114C11536F5300000A26114C11546F5300000A26114C11556F5300000A26114C11566F5300000A26115711586F5300000A26111C11596F5300000A261159115A6F5300000A26115A115B6F5300000A26115A115C6F5300000A26115A115D6F5300000A261159115E6F5300000A26115E115F6F5300000A26115E11606F5300000A26115E11616F5300000A26116111626F5300000A26116111636F5300000A26116311646F5300000A26115E11656F5300000A26115911666F5300000A26735700000A136A116A16732300000A6F5800000A00116A176F5900000A000E07116A285A00000A136B06116B6F5B00000A00116B6F5C00000A002A00000013300600DE0E00000A00001100733400000A0A067255310070725D31007072693100706F5000000A0B06726F3100706F5100000A0C0672FB3C00706F5100000A0D0672973100706F5100000A13040672A93100706F5100000A13050672B33100706F5100000A13060672C73100706F5100000A13070672D93100706F5100000A13080672EF3100706F5100000A13090672013200706F5100000A130A06723D3200706F5100000A130B0672573200706F5100000A130C0672573200706F5100000A130D0672733200706F5100000A130E06725B0000706F5100000A130F06725B0000706F5100000A131006725B0000706F5100000A131106728F3200706F5100000A131206728F3200706F5100000A13130672B70000706F5100000A131406729F3200706F5100000A13150672B13200706F5100000A13160672C13200706F5100000A13170672D93200706F5100000A13180672F53200706F5100000A13190672053300706F5100000A131A0672233300706F5100000A131B06723D3300706F5100000A131C0672533300706F5100000A131D0672673300706F5100000A131E06727B3300706F5100000A131F0672933300706F5100000A13200672A33300706F5100000A13210672BF3300706F5100000A13220672D73300706F5100000A13230672E73300706F5100000A13240672FD3300706F5100000A132506721D3400706F5100000A132606723B3400706F5100000A132706722F3D00706F5100000A132806725B0000706F5100000A13290672C93400706F5100000A132A0672C93400706F5100000A132B06724B3D00706F5100000A132C06725D3D00706F5100000A132D0672873D00706F5100000A132E0672A73D00706F5100000A132F0672DB3D00706F5100000A13300672F73D00706F5100000A13310672133E00706F5100000A13320672373E00706F5100000A133306725B3E00706F5100000A133406726D3E00706F5100000A13350672933E00706F5100000A13360672B93E00706F5100000A13370672E53E00706F5100000A13380672053F00706F5100000A13390672333F00706F5100000A133A0672F73D00706F5100000A133B0672633F00706F5100000A133C0672893F00706F5100000A133D0672A13F00706F5100000A133E0672BB3F00706F5100000A133F0672DF3F00706F5100000A13400672094000706F5100000A13410672234000706F5100000A134206724F4000706F5100000A134306727F4000706F5100000A13440672B34000706F5100000A13450672DB3400706F5100000A13460672DB3400706F5100000A13470672F53400706F5100000A13480672093500706F5100000A13490672D54000706F5100000A134A0672FD4000706F5100000A134B0672213500706F5100000A134C06725F3500706F5100000A134D0672853500706F5100000A134E0672933500706F5100000A134F0672A73500706F5100000A13500672C53500706F5100000A13510672E33500706F5100000A13520672013600706F5100000A135306721B3600706F5100000A13540672533600706F5100000A13550672733600706F5100000A135606729F3600706F5100000A13570672BD3600706F5100000A13580672DD3600706F5100000A13590672F33600706F5100000A135A0672153700706F5100000A135B0672293700706F5100000A135C0672453700706F5100000A135D0672773700706F5100000A135E06729F3700706F5100000A135F0672C33800706F5100000A13600672473900706F5100000A136106726B3900706F5100000A13620672993900706F5100000A13630672373500706F5100000A13640672B70000706F5100000A136506725B0000706F5100000A1366110772133B00706F5200000A001108721F3B00706F5200000A001109723F3B00706F5200000A00110A72533B00706F5200000A00110C726B3B00706F5200000A00110D726B3B00706F5200000A00110E72C50100706F5200000A00110F72C50100706F5200000A00111072C50100706F5200000A00111172214100706F5200000A00114B72133B00706F5200000A001112728D3B00706F5200000A001113728D3B00706F5200000A00111472C50100706F5200000A00111772A33B00706F5200000A00111872A33B00706F5200000A00111C72B33B00706F5200000A00111F72C50100706F5200000A00112072B73B00706F5200000A00112172133B00706F5200000A00112772133B00706F5200000A00112872133B00706F5200000A00114672C13B00706F5200000A00114772C13B00706F5200000A00112C72133B00706F5200000A00112D72793C00706F5200000A00112E72C50100706F5200000A00112F72B73B00706F5200000A00113072133B00706F5200000A00113172B73B00706F5200000A00113272354100700E04281100000A6F5200000A00113372133B00706F5200000A00113472133B00706F5200000A00113572133B00706F5200000A00113672C50100706F5200000A00113772133B00706F5200000A00114872133B00706F5200000A00114E72133B00706F5200000A00114F72133B00706F5200000A00115072133B00706F5200000A001151723B3C00706F5200000A001152725D3C00706F5200000A00115372133B00706F5200000A00115472133B00706F5200000A00115572133B00706F5200000A00115672133B00706F5200000A00115772133B00706F5200000A00115872133B00706F5200000A00115972133B00706F5200000A00115A72133B00706F5200000A00115B72133B00706F5200000A00116072133B00706F5200000A00116172133B00706F5200000A00115C0F01282500000A6F5200000A00115D0F01282500000A6F5200000A00112972C50100706F5200000A00113A72133B00706F5200000A00113B72133B00706F5200000A00113C72133B00706F5200000A00113D72133B00706F5200000A00113E72133B00706F5200000A00113F72133B00706F5200000A00114172133B00706F5200000A00114372133B00706F5200000A00114472133B00706F5200000A00114572534100706F5200000A00116572674100706F5200000A00116672214100706F5200000A0006076F5300000A2606086F5300000A2608096F5300000A260811046F5300000A26110411056F5300000A26110511066F5300000A26110611076F5300000A26110511086F5300000A26110511096F5300000A261105110A6F5300000A261104110B6F5300000A26110B110C6F5300000A26110B110E6F5300000A26110B110F6F5300000A26110B11126F5300000A26110B11146F5300000A26110411156F5300000A26111511166F5300000A26111611176F5300000A26111611186F5300000A26111511196F5300000A26111511456F5300000A261119111A6F5300000A26111911626F5300000A26116211426F5300000A26114211436F5300000A26111911636F5300000A26116311446F5300000A26111A111B6F5300000A26111A11496F5300000A261149114C6F5300000A26114C11116F5300000A26114911646F5300000A26116411116F5300000A26116411136F5300000A26116411656F5300000A26111A114A6F5300000A26114A114B6F5300000A26111A114D6F5300000A26111A11396F5300000A261139113A6F5300000A26111A115E6F5300000A26111A115F6F5300000A26111A11406F5300000A26114011416F5300000A26111B111C6F5300000A26111B111D6F5300000A26111B111E6F5300000A26111B11206F5300000A26111B11216F5300000A26111B11226F5300000A26111B112A6F5300000A26111B11486F5300000A26111D11106F5300000A26111D110D6F5300000A26111E111F6F5300000A26112211236F5300000A26112211246F5300000A26112211256F5300000A26112211266F5300000A26112611276F5300000A26112211286F5300000A26112A11466F5300000A26114D114E6F5300000A26114D114F6F5300000A26114D11506F5300000A26114D11516F5300000A26114D11526F5300000A26114D11536F5300000A26114D11546F5300000A26114D11556F5300000A26114D11566F5300000A26114D11576F5300000A26114D11586F5300000A26114D11596F5300000A26114D115A6F5300000A26114D115B6F5300000A2604178D2300000125161F7C9D6F2200000A1367001167136A16136B38BF010000116A116B9A136C00116C178D2300000125161F2C9D6F2200000A136D0672A13C00706F5100000A136E116D179A72AF3C00706F4B00000A136F116F2C7C00116E1F0C8D1E000001251672B93C0070A225170F01282500000AA2251872BD3C0070A225190F01282500000AA2251A72BD3C0070A2251B116D169AA2251C727B410070A2251D0E04A2251E729D3C0070A2251F09116D169AA2251F0A72C93C0070A2251F0B116D179AA2282900000A6F5200000A000038F500000000116D179A72DD3C00706F4B00000A137011702C7900116E1F0C8D1E000001251672B93C0070A225170F01282500000AA2251872BD3C0070A225190F01282500000AA2251A72BD3C0070A2251B116D169AA2251C727B410070A2251D0E04A2251E729D3C0070A2251F09116D169AA2251F0A72E73C0070A2251F0B116D179AA2282900000A6F5200000A00002B6600116E1F0A8D1E000001251672B93C0070A225170F01282500000AA2251872BD3C0070A225190F01282500000AA2251A72BD3C0070A2251B116D169AA2251C727B410070A2251D0E04A2251E72A3410070A2251F09116D179AA2282900000A6F5200000A000000114D116E6F5300000A2600116B1758136B116B116A8E693F36FEFFFF114D115C6F5300000A26114D115D6F5300000A26114D112B6F5300000A26112B11476F5300000A26114D112C6F5300000A26114D112D6F5300000A26114D112E6F5300000A26114D112F6F5300000A26114D11306F5300000A26114D11316F5300000A26114D11326F5300000A26114D11336F5300000A26114D11346F5300000A26114D11356F5300000A26114D11366F5300000A26114D11376F5300000A26114D11386F5300000A26115F11606F5300000A26115F11616F5300000A26115F113B6F5300000A26115F113C6F5300000A26115F113D6F5300000A26115F113E6F5300000A26115F113F6F5300000A26114C11666F5300000A26111911636F5300000A26735700000A1368116816732300000A6F5800000A001168176F5900000A00051168285A00000A13690611696F5B00000A0011696F5C00000A002A000042534A4201000100000000000C00000076342E302E33303331390000000005006C000000E4060000237E0000500700009809000023537472696E677300000000E8100000B4410000235553009C520000100000002347554944000000AC520000A42E000023426C6F620000000000000002000001571D02080900000000FA01330016000001000000320000000400000004000000110000002B0000005C00000002000000120000000A0000000200000001000000040000000000F40401000000000006008703F3060600F403F3060600C602E0060F00130700000600DA02850506006A0385050600360385050600DB0385050600A70385050600C00385050600F10285050600190385050A00550396060A006E043F07060043025407060003063D000E00BF07E00612009C08190506000F0062000600CC053D000600BB013C050600B906AC071200CA0019050600E9003C050A001D003F07060000083C050A0043053F0712009107190512008206190506007A043C050600BA053C050600D5043D000600010062000600D5053D0006003E063C05060054040809060005013D000600650408090E00F205E0060E001A01E006060043063D00060050063D0012007108190512009705190512000C031905060065093D000600C2053C05060090083C05120076051905060020003C050000000026000000000001000100010010004B0800000C00010001000100100024020000690002000700000010005B063D08690003000D0031006E069F2C1600AF04A32C51804700A32C51803500A32C50200000000096001C06A62C01001C25000000009600E001B62C0700DC29000000009600DC07D42C1500E02B0000000096000605DF2C1800212D000000008618D30606001A002A2D000000009118D906E82C1A00382D0000000096005A0587011A002C2F000000009600C008EC2C1C003030000000009600D507F32C1D0084300000000096001402FA2C1E00BE30000000008618D30606001F00C730000000009118D906E82C1F00E630000000008618D30606001F00F130000000008600AA0210001F00003100000000860076021000200010310000000086008C02002D2100A8400000000086005A02102D280000000100B00100000200410100000300AD0100000400E804000005002D0600000600810400000100B00100000200410100000300300400000400AF00000005006C01000006008E01000007002D01000008001106000009009E0400000A008D0400000B00B60400000C00F20100000D00010200000E008104000001002F00000002008C06000003008104000001002F00000002008104000001006A0500000200930000000100810400000100DA0400000100BA0800000100630100000100630100000100AF00000002006C01000003001106000004009E04000005008D0400000600B604000007005B0100000100AF00000002001106000003005B01000004007C010900D30601001100D30606001900D3060A002900D30610003100D30610003900D30610004100D30610004900D30610005100D30610005900D30610006100D30610006900D3060600F10089094E00F1009C004E0071001F085300F900D3065900F100F9075F007900F50065000101CE046B008100D3061000810022076F000C00C50682001400A80892001101C4019700A9002F099C00A900F107A100A9004E05A7001101BF020600B100FF08AF00C1003B020600A9007804B300F100F907B800F1007B09C000F1002B08C6002101D306CD0029013107D20071002604DC008900D30606008900E405E00039014E011000F100F907E6003901C707100039010A01EC0039013709CD0039011204CD003901E408CD008900B408AF008900D108F3005101D701DC0049012C05AF008900310806009100D306060091002405100071001308F90091007C08FF00B900C5060501B100A8080A01B90082070E01610149041401B9002604DC0071014A094801F1006F09C00051018900DC0039015A0910008900BD006B01C90013086F017101D5074E007100AE05870171006F099001D9003C0499012901D5074E00D9001308B00179000708DC00D1007804DC00F100A307BB017901D3061000D100D30606008101D200C00129011409C50191007005B20291006308BB02B90021091000B9007D00C202F100B106DC00F100DF04BB0191017804DC00E100D3060600E1006104C902E1005808CD00E9005302D00291004404D802E900350206000E000C006B040E001000CF0F20006300CC2D2E000B00192D2E001300222D2E001B00412D2E0023004A2D2E002B005D2D2E003300842D2E003B008A2D2E0043004A2D2E004B00982D2E005300842D2E005B00BF2D40006300E92D60006300072E80006300282EE0006300472E00016300632E20016300802E15001B014E015F0175019F01AA01B601CB01DE027A008B0004800000010000000000000001000000C9033D080000040000000000000000000000C003590000000000040000000000000000000000C0034D0000000000040000000000000000000000C0033C0500000000040000000000000000000000C003190500000000000000000049456E756D657261626C6560310049456E756D657261746F7260310053716C496E743332003C4D6F64756C653E006A6F62494400524553544F52450053797374656D2E494F0042414B55500053797374656D2E44617461006D73636F726C69620053797374656D2E436F6C6C656374696F6E732E47656E6572696300417070656E644368696C640052656164546F456E640070617373776F72640049734E756C6C4F725768697465537061636500726573746F7265536F75726365006765745F45786974436F646500586D6C4E6F646500476574456E7669726F6E6D656E745661726961626C650049446973706F7361626C650043726561746546726F6D5369676E656446696C65007365745F57696E646F775374796C650050726F6365737357696E646F775374796C650064657374696E6174696F6E496E7374616E63655F696E7374616E63654E616D65007365745F46696C654E616D650074656D706C61746546696C654E616D65006E657744617461626173654E616D6500726573746F7265466F6C6465724E616D650064657374696E6174696F6E496E7374616E63655F636C69656E744E616D6500737562636C69656E744E616D65004461746554696D65006765745F4C61737441636365737354696D6500526561644C696E6500436F6D6D7661756C745F526573746F726500696E5F66696C65526573746F726500696E5F6461746162617365526573746F7265005665726966795369676E617475726500444241436F6D6D7661756C744261736500436C6F736500446973706F7365005835303943657274696669636174650043726561746500437265617465526573746F7265546F46696C6554656D706C61746500437265617465526573746F726554656D706C61746500437265617465526573746F7265576974684D6F766554656D706C617465004372656174654261636B757054656D706C6174650044656C6574650044656275676761626C6541747472696275746500417373656D626C795469746C6541747472696275746500417373656D626C7954726164656D61726B41747472696275746500586D6C41747472696275746500417373656D626C7946696C6556657273696F6E41747472696275746500417373656D626C79436F6E66696775726174696F6E4174747269627574650053716C46756E6374696F6E41747472696275746500417373656D626C794465736372697074696F6E41747472696275746500436F6D70696C6174696F6E52656C61786174696F6E7341747472696275746500417373656D626C7950726F6475637441747472696275746500417373656D626C79436F7079726967687441747472696275746500417373656D626C79436F6D70616E794174747269627574650052756E74696D65436F6D7061746962696C697479417474726962757465007365745F5573655368656C6C45786563757465006765745F56616C756500746F54696D6556616C7565006F705F547275650053617665006765745F4974656D4F660055544638456E636F64696E67007365745F456E636F64696E670053716C537472696E6700546F537472696E6700746F6B656E737472696E6700696E5F7461726765744C44465061746800696E5F7461726765744D4446506174680043565061746800696E5F74617267657446696C6553747265616D506174680047657454656D7050617468007061746800456E647357697468006261636B75704C6576656C004442412E436F6D6D7661756C742E646C6C00436F6D6D7661756C745F4A6F625F4B696C6C0053797374656D2E586D6C004C6F6164586D6C006765745F456E644F6653747265616D0053797374656D0053716C426F6F6C65616E006F705F4C6573735468616E00436F6D6D7661756C745F4C6F67696E006C6F67696E00437265617465586D6C4465636C61726174696F6E0053797374656D2E5265666C656374696F6E00586D6C417474726962757465436F6C6C656374696F6E006F705F4164646974696F6E00417267756D656E74457863657074696F6E0046696C65496E666F0046696C6553797374656D496E666F006765745F5374617274496E666F0050726F636573735374617274496E666F004469726563746F7279496E666F00646246696C65696E666F00436F6D6D7661756C745F4261636B7570006461746162617365746F6261636B757000436861720053747265616D526561646572005465787452656164657200584D4C54656D706C6174654D616E61676572005F786D6C54656D706C6174654D616E6167657200586D6C57726974657200636F6C66696C746572004D6963726F736F66742E53716C5365727665722E53657276657200546F4C6F7765720049456E756D657261746F7200476574456E756D657261746F72002E63746F72002E6363746F720053797374656D2E446961676E6F73746963730053797374656D2E52756E74696D652E436F6D70696C6572536572766963657300446562756767696E674D6F64657300456E756D657261746546696C6573005772697465416C6C4C696E65730053797374656D2E446174612E53716C54797065730053797374656D2E53656375726974792E43727970746F6772617068792E58353039436572746966696361746573006765745F4174747269627574657300586D6C57726974657253657474696E677300436F6E7461696E730053797374656D2E436F6C6C656374696F6E730050726F63657373007365745F417267756D656E74730045786973747300436F6D6D7661756C745F4A6F625F537461747573004164644461797300436F6E636174004F626A656374006765745F5375626A656374006F705F496D706C69636974006F705F4578706C696369740053706C69740057616974466F7245786974004442412E436F6D6D7661756C7400444241436F6D6D7661756C74007365745F496E64656E7400437265617465456C656D656E7400586D6C456C656D656E74006765745F446F63756D656E74456C656D656E7400456E7669726F6E6D656E7400586D6C446F63756D656E74006765745F43757272656E7400537461727400786365727400436F6D6D7661756C745F4C6F676F7574006765745F5374616E646172644F7574707574007365745F52656469726563745374616E646172644F7574707574004D6F76654E6578740053797374656D2E54657874005772697465416C6C54657874007365745F496E6E657254657874006765745F4E6F77007365745F4372656174654E6F57696E646F77004372656174654469726563746F7279007365745F576F726B696E674469726563746F7279006F705F457175616C697479006F705F496E657175616C6974790049734E756C6C4F72456D7074790000005943003A005C00500072006F006700720061006D002000460069006C00650073005C0043006F006D006D007600610075006C0074005C0043006F006E00740065006E007400530074006F00720065005C004200610073006500001563006C00690065006E0074004E0061006D006500004541007200670075006D0065006E0074002000730068006F0075006C00640020006800610076006500200061002000760061006C00690064002000760061006C0075006500001969006E007300740061006E00630065004E0061006D006500001774006F006B0065006E0073007400720069006E006700001F5C0071006F007000650072006100740069006F006E002E00650078006500002D6200610063006B00750070005F00740065006D0070006C006100740065005F0032002A002E0078006D006C00001F6F006E00640065006D0061006E0064005F0032002A002E0074007800740000216200610063006B00750070005F00740065006D0070006C006100740065005F00002379007900790079004D004D0064006400480048006D006D007300730066006600660000092E0078006D006C0000136F006E00640065006D0061006E0064005F0000092E007400780074000001001F2D0073007500620063006C00690065006E0074004E0061006D006500200001032000002F2D0073007500620063006C00690065006E0074004E0061006D0065002000640065006600610075006C0074002000011B2D006200610063006B00750070004C006500760065006C00200001252D006200610063006B00750070004C006500760065006C002000460055004C004C00200001272D006F006E00640065006D0061006E00640069006E00700075007400660069006C0065002000011B2000450058004500430055005400450020002D00610066002000011B20002D0063006C00690065006E0074004E0061006D0065002000011F20002D0069006E007300740061006E00630065004E0061006D0065002000010B20002D0074006B002000012372006500730074006F00720065005F00740065006D0070006C006100740065005F00002F72006500730074006F00720065005F00740065006D0070006C006100740065005F0032002A002E0078006D006C00001979007900790079004D004D0064006400480048006D006D0000035F00004B5C005C006800630069006D006F006E002E00630065006E007400720061006C0069006E006600720061002E006E00650074005C00530051004C0052006500730074006F00720065005C00002F2D00640065007300740043006C00690065006E0074002F0063006C00690065006E0074004E0061006D0065002000014320002D00640065007300740069006E006100740069006F006E0049006E007300740061006E00630065002F0063006C00690065006E0074004E0061006D006500200001452D00640065007300740069006E006100740069006F006E0049006E007300740061006E00630065002F0069006E007300740061006E00630065004E0061006D0065002000011F20002D0074006F00540069006D006500560061006C0075006500200022000123220020002D0072006500730074006F007200650053006F00750072006300650020000180FB20002D00640065007300740043006C00690065006E0074002F0063006C00690065006E0074004E0061006D006500200073007700740070006D006F006E0030003100200020002D00640065007300740069006E006100740069006F006E0049006E007300740061006E00630065002F0063006C00690065006E0074004E0061006D006500200073007700740070006D006F006E003000310020002D00640065007300740069006E006100740069006F006E0049006E007300740061006E00630065002F0069006E007300740061006E00630065004E0061006D006500200053005700540050004D004F004E003000310020002D0074006B002000011720002D00640061007400610062006100730065002000010B6A006F00620049004400001363006F006C00660069006C0074006500720000155C0071006C006900730074002E00650078006500001120004A004F00420020002D006A002000010B20002D0063006F00200001037300001D71006F007000650072006100740069006F006E002E00650078006500001F20004A004F00420043004F004E00540052004F004C0020002D006A002000011B20002D006F0020006B0069006C006C0020002D0074006B00200001136400690072006500630074006F00720079000080BF540068006500200043006F006D006D007600610075006C00740020006400690072006500630074006F007200790020006E006F007400200066006F007500640020006F006E00200074006800690073002000730079007300740065006D002C00200070006C006500610073006500200069006E007300740061006C006C00200061006E006400200063006F006E00660069006700750072006500200043006F006D006D007600610075006C007400200063006C00690065006E0074002100000B6C006F00670069006E00003941007200670075006D0065006E0074002000730068006F0075006C00640020006800610076006500200061002000760061006C00750065000011700061007300730077006F00720064000039700061007300730077006F00720064002000730068006F0075006C00640020006800610076006500200061002000760061006C007500650000175C0071006C006F00670069006E002E0065007800650000072D0075002000010B20002D00700073002000010920002D0067007400010B4C006F00670069006E00002D49006E00760061006C006900640020004C006F00670069006E002F00500061007300730077006F007200640000195C0071006C006F0067006F00750074002E00650078006500001771006C006F0067006F00750074002E0065007800650000092D0074006B00200001097000610074006800001343006F006D006D007600610075006C00740000454500520052004F00520020004F004E00200045005800450020005300490047004E0041005400550052004500200049004E002000530051004C00200043004C0052002100001D430056005F0049006E007300740061006E0063006500300030003100001D430056005F0049006E007300740061006E0063006500300030003200008B633C003F0078006D006C002000760065007200730069006F006E003D00220031002E0030002200200065006E0063006F00640069006E0067003D0022007500740066002D003800220020007300740061006E00640061006C006F006E0065003D0022006E006F0022003F003E000D000A003C0054004D004D00730067005F004300720065006100740065005400610073006B005200650071003E000D000A00200020003C007400610073006B0049006E0066006F003E000D000A0020002000200020003C007400610073006B003E000D000A002000200020002000200020003C007400610073006B0046006C006100670073003E000D000A00200020002000200020002000200020003C00640069007300610062006C00650064003E00660061006C00730065003C002F00640069007300610062006C00650064003E000D000A002000200020002000200020003C002F007400610073006B0046006C006100670073003E000D000A002000200020002000200020003C0070006F006C0069006300790054007900700065003E0044004100540041005F00500052004F00540045004300540049004F004E003C002F0070006F006C0069006300790054007900700065003E000D000A002000200020002000200020003C007400610073006B0054007900700065003E0049004D004D004500440049004100540045003C002F007400610073006B0054007900700065003E000D000A002000200020002000200020003C0069006E006900740069006100740065006400460072006F006D003E0043004F004D004D0041004E0044004C0049004E0045003C002F0069006E006900740069006100740065006400460072006F006D003E000D000A0020002000200020003C002F007400610073006B003E000D000A0020002000200020003C006100730073006F00630069006100740069006F006E0073003E000D000A002000200020002000200020003C006200610063006B00750070007300650074004E0061006D0065003E00640065006600610075006C0074004200610063006B00750070005300650074003C002F006200610063006B00750070007300650074004E0061006D0065003E000D000A002000200020002000200020003C0073007500620063006C00690065006E0074004E0061006D0065003E00220022003C002F0073007500620063006C00690065006E0074004E0061006D0065003E000D000A002000200020002000200020003C0063006C00690065006E0074004E0061006D0065003E00220022003C002F0063006C00690065006E0074004E0061006D0065003E000D000A002000200020002000200020003C006100700070004E0061006D0065003E00530051004C0020005300650072007600650072003C002F006100700070004E0061006D0065003E000D000A002000200020002000200020003C0069006E007300740061006E00630065004E0061006D0065003E00220022003C002F0069006E007300740061006E00630065004E0061006D0065003E000D000A0020002000200020003C002F006100730073006F00630069006100740069006F006E0073003E000D000A0020002000200020003C007300750062005400610073006B0073003E000D000A002000200020002000200020003C007300750062005400610073006B003E000D000A00200020002000200020002000200020003C007300750062005400610073006B0054007900700065003E004200410043004B00550050003C002F007300750062005400610073006B0054007900700065003E000D000A00200020002000200020002000200020003C006F007000650072006100740069006F006E0054007900700065003E004200410043004B00550050003C002F006F007000650072006100740069006F006E0054007900700065003E000D000A002000200020002000200020003C002F007300750062005400610073006B003E000D000A002000200020002000200020003C006F007000740069006F006E0073003E000D000A00200020002000200020002000200020003C006200610063006B00750070004F007000740073003E000D000A0020002000200020002000200020002000200020003C006200610063006B00750070004C006500760065006C003E003C002F006200610063006B00750070004C006500760065006C003E000D000A0020002000200020002000200020002000200020003C006D0065006400690061004F007000740020002F003E000D000A0020002000200020002000200020002000200020003C0064006100740061004F00700074003E000D000A002000200020002000200020002000200020002000200020003C0075007300650043006100740061006C006F0067005300650072007600650072003E00660061006C00730065003C002F0075007300650043006100740061006C006F0067005300650072007600650072003E000D000A002000200020002000200020002000200020002000200020003C0065006E0066006F007200630065005400720061006E00730061006300740069006F006E004C006F006700550073006100670065003E00660061006C00730065003C002F0065006E0066006F007200630065005400720061006E00730061006300740069006F006E004C006F006700550073006100670065003E000D000A002000200020002000200020002000200020002000200020003C0073006B006900700043006F006E00730069007300740065006E006300790043006800650063006B003E00660061006C00730065003C002F0073006B006900700043006F006E00730069007300740065006E006300790043006800650063006B003E000D000A0020002000200020002000200020002000200020003C002F0064006100740061004F00700074003E000D000A0020002000200020002000200020002000200020003C00720075006E0049006E006300720065006D0065006E00740061006C004200610063006B00750070003E0074007200750065003C002F00720075006E0049006E006300720065006D0065006E00740061006C004200610063006B00750070003E000D000A0020002000200020002000200020002000200020003C0069006E0063004C006500760065006C003E004200450046004F00520045005F00530059004E00540048003C002F0069006E0063004C006500760065006C003E000D000A0020002000200020002000200020002000200020003C0064006F004E006F0074005400720075006E0063006100740065004C006F0067003E00660061006C00730065003C002F0064006F004E006F0074005400720075006E0063006100740065004C006F0067003E000D000A0020002000200020002000200020002000200020003C0073007900620061007300650053006B0069007000460075006C006C00610066007400650072004C006F00670042006B0070003E00660061006C00730065003C002F0073007900620061007300650053006B0069007000460075006C006C00610066007400650072004C006F00670042006B0070003E000D000A00200020002000200020002000200020003C002F006200610063006B00750070004F007000740073003E000D000A00200020002000200020002000200020003C00610064006D0069006E004F007000740073003E000D000A0020002000200020002000200020002000200020003C007500700064006100740065004F007000740069006F006E0020002F003E000D000A00200020002000200020002000200020003C002F00610064006D0069006E004F007000740073003E000D000A002000200020002000200020003C002F006F007000740069006F006E0073003E000D000A0020002000200020003C002F007300750062005400610073006B0073003E000D000A00200020003C002F007400610073006B0049006E0066006F003E000D000A003C002F0054004D004D00730067005F004300720065006100740065005400610073006B005200650071003E00019CCF3C003F0078006D006C002000760065007200730069006F006E003D00220031002E0030002200200065006E0063006F00640069006E0067003D0022007500740066002D003800220020007300740061006E00640061006C006F006E0065003D0022006E006F0022003F003E000D000A003C0054004D004D00730067005F004300720065006100740065005400610073006B005200650071003E000D000A00200020003C007400610073006B0049006E0066006F003E000D000A0020002000200020003C007400610073006B003E000D000A002000200020002000200020003C007400610073006B0046006C006100670073003E000D000A00200020002000200020002000200020003C00640069007300610062006C00650064003E00660061006C00730065003C002F00640069007300610062006C00650064003E000D000A002000200020002000200020003C002F007400610073006B0046006C006100670073003E000D000A002000200020002000200020003C0070006F006C0069006300790054007900700065003E0044004100540041005F00500052004F00540045004300540049004F004E003C002F0070006F006C0069006300790054007900700065003E000D000A002000200020002000200020003C007400610073006B0054007900700065003E0049004D004D004500440049004100540045003C002F007400610073006B0054007900700065003E000D000A002000200020002000200020003C0069006E006900740069006100740065006400460072006F006D003E0043004F004D004D0041004E0044004C0049004E0045003C002F0069006E006900740069006100740065006400460072006F006D003E000D000A0020002000200020003C002F007400610073006B003E000D000A0020002000200020003C006100730073006F00630069006100740069006F006E0073003E000D000A002000200020002000200020003C006200610063006B00750070007300650074004E0061006D0065003E00640065006600610075006C0074004200610063006B00750070005300650074003C002F006200610063006B00750070007300650074004E0061006D0065003E000D000A002000200020002000200020003C0073007500620063006C00690065006E0074004E0061006D0065003E003C002F0073007500620063006C00690065006E0074004E0061006D0065003E000D000A002000200020002000200020003C0063006C00690065006E0074004E0061006D0065003E003C002F0063006C00690065006E0074004E0061006D0065003E000D000A002000200020002000200020003C006100700070004E0061006D0065003E00530051004C0020005300650072007600650072003C002F006100700070004E0061006D0065003E000D000A002000200020002000200020003C0069006E007300740061006E00630065004E0061006D0065003E003C002F0069006E007300740061006E00630065004E0061006D0065003E000D000A0020002000200020003C002F006100730073006F00630069006100740069006F006E0073003E000D000A0020002000200020003C007300750062005400610073006B0073003E000D000A002000200020002000200020003C007300750062005400610073006B003E000D000A00200020002000200020002000200020003C007300750062005400610073006B0054007900700065003E0052004500530054004F00520045003C002F007300750062005400610073006B0054007900700065003E000D000A00200020002000200020002000200020003C006F007000650072006100740069006F006E0054007900700065003E0052004500530054004F00520045003C002F006F007000650072006100740069006F006E0054007900700065003E000D000A002000200020002000200020003C002F007300750062005400610073006B003E000D000A002000200020002000200020003C006F007000740069006F006E0073003E000D000A00200020002000200020002000200020003C0072006500730074006F00720065004F007000740069006F006E0073003E000D000A0020002000200020002000200020002000200020003C00620072006F007700730065004F007000740069006F006E003E000D000A002000200020002000200020002000200020002000200020003C0063006F006D006D00430065006C006C00490064003E0032003C002F0063006F006D006D00430065006C006C00490064003E000D000A002000200020002000200020002000200020002000200020003C006200610063006B00750070007300650074003E000D000A00200020002000200020002000200020002000200020002000200020003C0063006C00690065006E0074004E0061006D0065003E003C002F0063006C00690065006E0074004E0061006D0065003E000D000A00200020002000200020002000200020002000200020002000200020003C006200610063006B00750070007300650074004E0061006D0065003E00640065006600610075006C0074004200610063006B00750070005300650074003C002F006200610063006B00750070007300650074004E0061006D0065003E000D000A002000200020002000200020002000200020002000200020003C002F006200610063006B00750070007300650074003E000D000A002000200020002000200020002000200020002000200020003C00740069006D006500520061006E00670065003E000D000A00200020002000200020002000200020002000200020002000200020003C0074006F00540069006D006500560061006C00750065003E003C002F0074006F00540069006D006500560061006C00750065003E000D000A002000200020002000200020002000200020002000200020003C002F00740069006D006500520061006E00670065003E000D000A002000200020002000200020002000200020002000200020003C006E006F0049006D006100670065003E0074007200750065003C002F006E006F0049006D006100670065003E000D000A002000200020002000200020002000200020002000200020003C007500730065004500780061006300740049006E006400650078003E00660061006C00730065003C002F007500730065004500780061006300740049006E006400650078003E000D000A002000200020002000200020002000200020002000200020003C006D0065006400690061004F007000740069006F006E003E000D000A00200020002000200020002000200020002000200020002000200020003C006C0069006200720061007200790020002F003E000D000A00200020002000200020002000200020002000200020002000200020003C006D0065006400690061004100670065006E00740020002F003E000D000A00200020002000200020002000200020002000200020002000200020003C006400720069007600650050006F006F006C0020002F003E000D000A00200020002000200020002000200020002000200020002000200020003C0063006F007000790050007200650063006500640065006E00630065003E000D000A0020002000200020002000200020002000200020002000200020002000200020003C0063006F007000790050007200650063006500640065006E00630065004100700070006C0069006300610062006C0065003E00660061006C00730065003C002F0063006F007000790050007200650063006500640065006E00630065004100700070006C0069006300610062006C0065003E000D000A00200020002000200020002000200020002000200020002000200020003C002F0063006F007000790050007200650063006500640065006E00630065003E000D000A002000200020002000200020002000200020002000200020003C002F006D0065006400690061004F007000740069006F006E003E000D000A002000200020002000200020002000200020002000200020003C00740069006D0065005A006F006E0065003E000D000A00200020002000200020002000200020002000200020002000200020003C00540069006D0065005A006F006E0065004E0061006D0065003E0028005500540043002B00300031003A00300030002900200041006D007300740065007200640061006D002C0020004200650072006C0069006E002C0020004200650072006E002C00200052006F006D0065002C002000530074006F0063006B0068006F006C006D002C0020005600690065006E006E0061003C002F00540069006D0065005A006F006E0065004E0061006D0065003E000D000A002000200020002000200020002000200020002000200020003C002F00740069006D0065005A006F006E0065003E000D000A002000200020002000200020002000200020002000200020003C006C006900730074004D0065006400690061003E00660061006C00730065003C002F006C006900730074004D0065006400690061003E000D000A0020002000200020002000200020002000200020003C002F00620072006F007700730065004F007000740069006F006E003E000D000A0020002000200020002000200020002000200020003C00640065007300740069006E006100740069006F006E003E000D000A002000200020002000200020002000200020002000200020003C00640065007300740043006C00690065006E0074003E000D000A00200020002000200020002000200020002000200020002000200020003C0063006C00690065006E0074004E0061006D0065003E003C002F0063006C00690065006E0074004E0061006D0065003E000D000A002000200020002000200020002000200020002000200020003C002F00640065007300740043006C00690065006E0074003E000D000A002000200020002000200020002000200020002000200020003C00640065007300740069006E006100740069006F006E0049006E007300740061006E00630065003E000D000A00200020002000200020002000200020002000200020002000200020003C0063006C00690065006E0074004E0061006D0065003E003C002F0063006C00690065006E0074004E0061006D0065003E000D000A00200020002000200020002000200020002000200020002000200020003C006100700070004E0061006D0065003E00530051004C0020005300650072007600650072003C002F006100700070004E0061006D0065003E000D000A00200020002000200020002000200020002000200020002000200020003C0069006E007300740061006E00630065004E0061006D0065003E003C002F0069006E007300740061006E00630065004E0061006D0065003E000D000A002000200020002000200020002000200020002000200020003C002F00640065007300740069006E006100740069006F006E0049006E007300740061006E00630065003E000D000A0020002000200020002000200020002000200020003C002F00640065007300740069006E006100740069006F006E003E000D000A0020002000200020002000200020002000200020003C00730071006C005300650072007600650072005200730074004F007000740069006F006E003E000D000A002000200020002000200020002000200020002000200020003C00640062004F006E006C0079003E00660061006C00730065003C002F00640062004F006E006C0079003E000D000A002000200020002000200020002000200020002000200020003C006F00760065007200570072006900740065003E0074007200750065003C002F006F00760065007200570072006900740065003E000D000A002000200020002000200020002000200020002000200020003C0070006F0069006E0074004F006600540069006D0065005200730074003E00660061006C00730065003C002F0070006F0069006E0074004F006600540069006D0065005200730074003E000D000A002000200020002000200020002000200020002000200020003C00730071006C0052006500730074006F007200650054007900700065003E00440041005400410042004100530045005F0052004500530054004F00520045003C002F00730071006C0052006500730074006F007200650054007900700065003E000D000A002000200020002000200020002000200020002000200020003C00730071006C005200650063006F0076006500720054007900700065003E00530054004100540045005F005200450043004F005600450052003C002F00730071006C005200650063006F0076006500720054007900700065003E000D000A002000200020002000200020002000200020002000200020003C00730074006F007000530074006100720074005300530041003E00660061006C00730065003C002F00730074006F007000530074006100720074005300530041003E000D000A002000200020002000200020002000200020002000200020003C00700072006500730065007200760065005200650070006C00690063006100740069006F006E00530065007400740069006E00670073003E00660061006C00730065003C002F00700072006500730065007200760065005200650070006C00690063006100740069006F006E00530065007400740069006E00670073003E000D000A002000200020002000200020002000200020002000200020003C00730074006F0070004D00610072006B0052006500730074006F00720065003E00660061006C00730065003C002F00730074006F0070004D00610072006B0052006500730074006F00720065003E000D000A002000200020002000200020002000200020002000200020003C00730074006F0070004200650066006F00720065004D00610072006B0052006500730074006F00720065003E00660061006C00730065003C002F00730074006F0070004200650066006F00720065004D00610072006B0052006500730074006F00720065003E000D000A002000200020002000200020002000200020002000200020003C007000610072007400690061006C0052006500730074006F00720065003E00660061006C00730065003C002F007000610072007400690061006C0052006500730074006F00720065003E000D000A002000200020002000200020002000200020002000200020003C006C006F0067005300680069007000700069006E0067004F006E006C0079003E00660061006C00730065003C002F006C006F0067005300680069007000700069006E0067004F006E006C0079003E000D000A002000200020002000200020002000200020002000200020003C0066006600670052006500730074006F00720065003E00660061006C00730065003C002F0066006600670052006500730074006F00720065003E000D000A002000200020002000200020002000200020002000200020003C00690067006E006F0072006500460075006C006C004200610063006B00750070003E00660061006C00730065003C002F00690067006E006F0072006500460075006C006C004200610063006B00750070003E000D000A002000200020002000200020002000200020002000200020003C007600530053004200610063006B00750070003E00660061006C00730065003C002F007600530053004200610063006B00750070003E000D000A002000200020002000200020002000200020002000200020003C0070006F0069006E00740049006E00540069006D0065003E000D000A00200020002000200020002000200020002000200020002000200020003C00740069006D006500560061006C00750065003E003C002F00740069006D006500560061006C00750065003E000D000A002000200020002000200020002000200020002000200020003C002F0070006F0069006E00740049006E00540069006D0065003E000D000A002000200020002000200020002000200020002000200020003C0072006500730074006F007200650053006F0075007200630065003E003C002F0072006500730074006F007200650053006F0075007200630065003E000D000A002000200020002000200020002000200020002000200020003C00640061007400610062006100730065003E003C002F00640061007400610062006100730065003E000D000A002000200020002000200020002000200020002000200020003C00740069006D0065005A006F006E0065003E000D000A00200020002000200020002000200020002000200020002000200020003C00540069006D0065005A006F006E0065004E0061006D0065003E0028005500540043002B00300031003A00300030002900200041006D007300740065007200640061006D002C0020004200650072006C0069006E002C0020004200650072006E002C00200052006F006D0065002C002000530074006F0063006B0068006F006C006D002C0020005600690065006E006E0061003C002F00540069006D0065005A006F006E0065004E0061006D0065003E000D000A002000200020002000200020002000200020002000200020003C002F00740069006D0065005A006F006E0065003E000D000A002000200020002000200020002000200020002000200020003C006B00650065007000440061007400610043006100700074007500720065003E00660061006C00730065003C002F006B00650065007000440061007400610043006100700074007500720065003E000D000A002000200020002000200020002000200020002000200020003C00640072006F00700043006F006E006E0065006300740069006F006E00730054006F00440061007400610062006100730065003E0074007200750065003C002F00640072006F00700043006F006E006E0065006300740069006F006E00730054006F00440061007400610062006100730065003E000D000A0020002000200020002000200020002000200020003C002F00730071006C005300650072007600650072005200730074004F007000740069006F006E003E000D000A0020002000200020002000200020002000200020003C00660069006C0065004F007000740069006F006E003E000D000A002000200020002000200020002000200020002000200020003C006D0061007000460069006C006500730020002F003E000D000A0020002000200020002000200020002000200020003C002F00660069006C0065004F007000740069006F006E003E000D000A0020002000200020002000200020002000200020003C0063006F006D006D006F006E004F007000740069006F006E0073003E000D000A002000200020002000200020002000200020002000200020003C006F006E006500500061007300730052006500730074006F00720065003E00660061006C00730065003C002F006F006E006500500061007300730052006500730074006F00720065003E000D000A002000200020002000200020002000200020002000200020003C0063006C0075007300740065007200440042004200610063006B0065006400750070003E00660061006C00730065003C002F0063006C0075007300740065007200440042004200610063006B0065006400750070003E000D000A0020002000200020002000200020002000200020003C002F0063006F006D006D006F006E004F007000740069006F006E0073003E000D000A00200020002000200020002000200020003C002F0072006500730074006F00720065004F007000740069006F006E0073003E000D000A00200020002000200020002000200020003C00610064006D0069006E004F007000740073003E000D000A0020002000200020002000200020002000200020003C007500700064006100740065004F007000740069006F006E0020002F003E000D000A00200020002000200020002000200020003C002F00610064006D0069006E004F007000740073003E000D000A002000200020002000200020003C002F006F007000740069006F006E0073003E000D000A0020002000200020003C002F007300750062005400610073006B0073003E000D000A00200020003C002F007400610073006B0049006E0066006F003E000D000A003C002F0054004D004D00730067005F004300720065006100740065005400610073006B005200650071003E00010731002E003000000B5500540046002D00380001056E006F00002754004D004D00730067005F004300720065006100740065005400610073006B0052006500710000117400610073006B0049006E0066006F0000097400610073006B0000137400610073006B0046006C006100670073000011640069007300610062006C0065006400001570006F006C00690063007900540079007000650000117400610073006B005400790070006500001B69006E006900740069006100740065006400460072006F006D00000B61006C00650072007400001361006C006500720074004E0061006D00650000196100730073006F00630069006100740069006F006E007300001B6200610063006B00750070007300650074004E0061006D006500001B73007500620063006C00690065006E0074004E0061006D006500000F6100700070004E0061006D00650000117300750062005400610073006B007300000F7300750062005400610073006B0000177300750062005400610073006B005400790070006500001B6F007000650072006100740069006F006E005400790070006500000F6F007000740069006F006E007300001D72006500730074006F00720065004F007000740069006F006E0073000019620072006F007700730065004F007000740069006F006E00001563006F006D006D00430065006C006C004900640000136200610063006B00750070007300650074000013740069006D006500520061006E0067006500001774006F00540069006D006500560061006C0075006500000F6E006F0049006D00610067006500001B7500730065004500780061006300740049006E0064006500780000176D0065006400690061004F007000740069006F006E00000F6C0069006200720061007200790000156D0065006400690061004100670065006E00740000136400720069007600650050006F006F006C00000B64007200690076006500001D63006F007000790050007200650063006500640065006E0063006500003163006F007000790050007200650063006500640065006E00630065004100700070006C0069006300610062006C0065000033730079006E006300680072006F006E006F007500730043006F007000790050007200650063006500640065006E00630065000027700072006F007800790046006F00720053006E006100700043006C00690065006E00740073000011740069006D0065005A006F006E0065000019540069006D0065005A006F006E0065004E0061006D00650000136C006900730074004D0065006400690061000017640065007300740069006E006100740069006F006E000015640065007300740043006C00690065006E0074000027640065007300740069006E006100740069006F006E0049006E007300740061006E00630065000025730071006C005300650072007600650072005200730074004F007000740069006F006E00000D640062004F006E006C00790000136F0076006500720057007200690074006500001D70006F0069006E0074004F006600540069006D006500520073007400001D730071006C0052006500730074006F00720065005400790070006500001D730071006C005200650063006F0076006500720054007900700065000019730074006F007000530074006100720074005300530041000037700072006500730065007200760065005200650070006C00690063006100740069006F006E00530065007400740069006E0067007300001F730074006F0070004D00610072006B0052006500730074006F0072006500002B730074006F0070004200650066006F00720065004D00610072006B0052006500730074006F0072006500001D7000610072007400690061006C0052006500730074006F0072006500001F6C006F0067005300680069007000700069006E0067004F006E006C007900001566006600670052006500730074006F00720065000021690067006E006F0072006500460075006C006C004200610063006B007500700000137600530053004200610063006B0075007000001B72006500730074006F007200650053006F007500720063006500001164006100740061006200610073006500001F6B00650065007000440061007400610043006100700074007500720065000015660069006C0065004F007000740069006F006E0000116D0061007000460069006C0065007300001B63006F006D006D006F006E004F007000740069006F006E007300002F64006500740065006300740052006500670075006C0061007200450078007000720065007300730069006F006E00004172006500730074006F0072006500440065007600690063006500460069006C00650073004100730052006500670075006C0061007200460069006C0065007300003172006500730074006F0072006500530070006100630065005200650073007400720069006300740069006F006E0073000037690067006E006F00720065004E0061006D0065007300700061006300650052006500710075006900720065006D0065006E0074007300002B73006B00690070004500720072006F007200730041006E00640043006F006E00740069006E0075006500001D6F006E006500500061007300730052006500730074006F0072006500000D72006500760065007200740000317200650063006F0076006500720041006C006C00500072006F007400650063007400650064004D00610069006C007300002569007300460072006F006D00420072006F007700730065004200610063006B0075007000002363006C0075007300740065007200440042004200610063006B0065006400750070000013610064006D0069006E004F0070007400730000197500700064006100740065004F007000740069006F006E00001563006F006D006D006F006E004F00700074007300001773007400610072007400550070004F00700074007300002B7300740061007200740049006E00530075007300700065006E006400650064005300740061007400650000117000720069006F0072006900740079000025750073006500440065006600610075006C0074005000720069006F007200690074007900001770007200650050006F00730074004F0070007400730000257000720065005200650063006F00760065007200790043006F006D006D0061006E006400002770006F00730074005200650063006F00760065007200790043006F006D006D0061006E006400001B69006D0070006500720073006F006E006100740069006F006E00000B6C006500760065006C0000097500730065007200001175007300650072004E0061006D006500001F720075006E0050006F00730074005700680065006E004600610069006C00001D6A006F0062004400650073006300720069007000740069006F006E00000B660061006C0073006500001F44004100540041005F00500052004F00540045004300540049004F004E00001349004D004D00450044004900410054004500001743004F004D004D0041004E0044004C0049004E0045000021640065006600610075006C0074004200610063006B00750070005300650074000015530051004C002000530065007200760065007200000F52004500530054004F00520045000003320000097400720075006500007928005500540043002B00300031003A00300030002900200041006D007300740065007200640061006D002C0020004200650072006C0069006E002C0020004200650072006E002C00200052006F006D0065002C002000530074006F0063006B0068006F006C006D002C0020005600690065006E006E0061000021440041005400410042004100530045005F0052004500530054004F0052004500001B530054004100540045005F005200450043004F005600450052000003300000053600360000194E004F005F00530045004C0045004300540049004F004E0000035C00000D64006500760069006300650000092E006C006400660000037C00000B7C00230031003200210000132E006C00640066007C00230031003200210000092E006D006400660000132E006D00640066007C0023003100320021000033700072006F00630065007300730069006E00670069006E0073007400720075006300740069006F006E0069006E0066006F00001B750073006500490053004300530049004D006F0075006E007400001163006C006F006E00650045006E007600002963006C006F006E00650052006500730072007600540069006D00650050006500720069006F006400001F63006F006D006D006F006E004D006F0075006E00740050006100740068000033640072006F00700043006F006E006E0065006300740069006F006E00730054006F0044006100740061006200610073006500001B730071006C005600650072006900660079004F006E006C007900001B72006500730074006F007200650054006F004400690073006B00002372006500730074006F007200650054006F004400690073006B005000610074006800002361007400740061006300680054006F00530051004C00530065007200760065007200001163006800650063006B00730075006D00002563006F006E00740069006E0075006500610066007400650072006500720072006F007200002573006E00610070004F006F0070005300740061006700650046006F006C00640065007200002B72006500730074006F00720065004F006E006C007900460075006C006C004200610063006B0075007000001F730074006100670069006E00670049006E007300740061006E0063006500002D7600690072007400750061006C005300650072007600650072005200730074004F007000740069006F006E00002F6900730042006C006F0063006B004C006500760065006C005200650070006C00690063006100740069006F006E0000256900730044004200410072006300680069007600650052006500730074006F00720065000017730079006E00630052006500730074006F00720065000019760061006C00690064006100740065004F006E006C007900002363006F007000790054006F004F0062006A00650063007400530074006F007200650000296400620044006100740061004D00610073006B0069006E0067004F007000740069006F006E0073000019690073005300740061006E00640061006C006F006E006500002B63006F006E00740065006E00740049006E0064006500780069006E0067004F007000740069006F006E00002F73007500620043006C00690065006E0074004200610073006500640041006E0061006C007900740069006300730000336E006F00740069006600790055007300650072004F006E004A006F00620043006F006D0070006C006500740069006F006E0000217300750062005400610073006B004F007000650072006100740069006F006E0000277300680061007200650050006F0069006E0074005200730074004F007000740069006F006E00002366006500740063006800530071006C00440061007400610062006100730065007300001373007700740070006D006F006E0030003100001D45003A005C00530051004C0052006500730074006F00720065005C0000134F0056004500520057005200490054004500001353005700540050004D004F004E003000310000277C00230031003200210045003A005C00530051004C0052006500730074006F00720065005C00000D5C007C0023003100320021000000000016A2766BD2CEAE4796F96F16D7F1993F00042001010803200001052001011111042001010E38071F123D0E12410E0E0E12450E124911390202020215124D011251125102115515124D011251125102021D0E020202021259125D12611139040001020E0500010E1139052002010E0E0500020E0E0E050001123D0E0300000E0A2001151280850112510E071512808501125108200015124D0113000615124D01125104200013000420001155040000115505200111550D0700020211551155032000020420010E0E0700040E0E0E0E0E050002020E0E0620011D0E1D030420010102090003010E1D0E1280990320000E05200012809D0500010E1D0E062001011180A10520001280A505000111390E0520001280AD04200012590320001C0520001280B10620011280B5082C071A123D0E0E12410E12450E1249113902115515124D011251125102020E0202020202021259125D1261113905000112410E10070A123D1245113902020202020211390B0706123D124502020211650320000805000111650811070B02123D124511390202020202021139080002113911391139080002116D1139113905000102116D0A0705123D12450202116505070202116D050001116D020407020E02042001020E0400010E0E050002010E0E80E507761249125D125D125D125D125D125D125D125D125D125D125D125D125D125D125D125D125D125D125D125D125D125D125D125D125D125D125D125D125D125D125D125D125D125D125D125D125D125D125D125D125D125D125D125D125D125D125D125D125D125D125D125D125D125D125D125D125D125D125D125D125D125D125D125D125D125D125D125D125D125D125D125D125D125D125D125D125D125D125D125D125D125D125D125D125D125D125D125D125D125D125D125D125D125D125D125D125D125D125D125D125D125D08081D0E127112751D0E080E1D0E125D02020202020820031280C50E0E0E0620011280AD0E062001125D125D0620010112809907000212750E127105200101127580E007711249125D125D125D125D125D125D125D125D125D125D125D125D125D125D125D125D125D125D125D125D125D125D125D125D125D125D125D125D125D125D125D125D125D125D125D125D125D125D125D125D125D125D125D125D125D125D125D125D125D125D125D125D125D125D125D125D125D125D125D125D125D125D125D125D125D125D125D125D125D125D125D125D125D125D125D125D125D125D125D125D125D125D125D125D125D125D125D125D125D125D125D125D125D125D125D125D125D125D125D125D125D125D1D0E127112751D0E080E1D0E125D020208B77A5C561934E08980A00024000004800000940000000602000000240000525341310004000001000100D559E9027E54E681D077DCD321A45AEF640CBE14B1B7C9491EBE3916C7B99EC8089088712047E314BD08708CF611E1344D633B82BC3DC6CABDC7F6265336E062667D3ADD844995FA87B1A4C47D9220D5AC9AE19AE67283074F3F0141F0C83FF8A72AAB1293414C33ECF686739C2C80647F522FA1DC4346CFD82942D1E1030DC18B623C003F0078006D006C002000760065007200730069006F006E003D00220031002E0030002200200065006E0063006F00640069006E0067003D0022007500740066002D003800220020007300740061006E00640061006C006F006E0065003D0022006E006F0022003F003E000D000A003C0054004D004D00730067005F004300720065006100740065005400610073006B005200650071003E000D000A00200020003C007400610073006B0049006E0066006F003E000D000A0020002000200020003C007400610073006B003E000D000A002000200020002000200020003C007400610073006B0046006C006100670073003E000D000A00200020002000200020002000200020003C00640069007300610062006C00650064003E00660061006C00730065003C002F00640069007300610062006C00650064003E000D000A002000200020002000200020003C002F007400610073006B0046006C006100670073003E000D000A002000200020002000200020003C0070006F006C0069006300790054007900700065003E0044004100540041005F00500052004F00540045004300540049004F004E003C002F0070006F006C0069006300790054007900700065003E000D000A002000200020002000200020003C007400610073006B0054007900700065003E0049004D004D004500440049004100540045003C002F007400610073006B0054007900700065003E000D000A002000200020002000200020003C0069006E006900740069006100740065006400460072006F006D003E0043004F004D004D0041004E0044004C0049004E0045003C002F0069006E006900740069006100740065006400460072006F006D003E000D000A0020002000200020003C002F007400610073006B003E000D000A0020002000200020003C006100730073006F00630069006100740069006F006E0073003E000D000A002000200020002000200020003C006200610063006B00750070007300650074004E0061006D0065003E00640065006600610075006C0074004200610063006B00750070005300650074003C002F006200610063006B00750070007300650074004E0061006D0065003E000D000A002000200020002000200020003C0073007500620063006C00690065006E0074004E0061006D0065003E00220022003C002F0073007500620063006C00690065006E0074004E0061006D0065003E000D000A002000200020002000200020003C0063006C00690065006E0074004E0061006D0065003E00220022003C002F0063006C00690065006E0074004E0061006D0065003E000D000A002000200020002000200020003C006100700070004E0061006D0065003E00530051004C0020005300650072007600650072003C002F006100700070004E0061006D0065003E000D000A002000200020002000200020003C0069006E007300740061006E00630065004E0061006D0065003E00220022003C002F0069006E007300740061006E00630065004E0061006D0065003E000D000A0020002000200020003C002F006100730073006F00630069006100740069006F006E0073003E000D000A0020002000200020003C007300750062005400610073006B0073003E000D000A002000200020002000200020003C007300750062005400610073006B003E000D000A00200020002000200020002000200020003C007300750062005400610073006B0054007900700065003E004200410043004B00550050003C002F007300750062005400610073006B0054007900700065003E000D000A00200020002000200020002000200020003C006F007000650072006100740069006F006E0054007900700065003E004200410043004B00550050003C002F006F007000650072006100740069006F006E0054007900700065003E000D000A002000200020002000200020003C002F007300750062005400610073006B003E000D000A002000200020002000200020003C006F007000740069006F006E0073003E000D000A00200020002000200020002000200020003C006200610063006B00750070004F007000740073003E000D000A0020002000200020002000200020002000200020003C006200610063006B00750070004C006500760065006C003E003C002F006200610063006B00750070004C006500760065006C003E000D000A0020002000200020002000200020002000200020003C006D0065006400690061004F007000740020002F003E000D000A0020002000200020002000200020002000200020003C0064006100740061004F00700074003E000D000A002000200020002000200020002000200020002000200020003C0075007300650043006100740061006C006F0067005300650072007600650072003E00660061006C00730065003C002F0075007300650043006100740061006C006F0067005300650072007600650072003E000D000A002000200020002000200020002000200020002000200020003C0065006E0066006F007200630065005400720061006E00730061006300740069006F006E004C006F006700550073006100670065003E00660061006C00730065003C002F0065006E0066006F007200630065005400720061006E00730061006300740069006F006E004C006F006700550073006100670065003E000D000A002000200020002000200020002000200020002000200020003C0073006B006900700043006F006E00730069007300740065006E006300790043006800650063006B003E00660061006C00730065003C002F0073006B006900700043006F006E00730069007300740065006E006300790043006800650063006B003E000D000A0020002000200020002000200020002000200020003C002F0064006100740061004F00700074003E000D000A0020002000200020002000200020002000200020003C00720075006E0049006E006300720065006D0065006E00740061006C004200610063006B00750070003E0074007200750065003C002F00720075006E0049006E006300720065006D0065006E00740061006C004200610063006B00750070003E000D000A0020002000200020002000200020002000200020003C0069006E0063004C006500760065006C003E004200450046004F00520045005F00530059004E00540048003C002F0069006E0063004C006500760065006C003E000D000A0020002000200020002000200020002000200020003C0064006F004E006F0074005400720075006E0063006100740065004C006F0067003E00660061006C00730065003C002F0064006F004E006F0074005400720075006E0063006100740065004C006F0067003E000D000A0020002000200020002000200020002000200020003C0073007900620061007300650053006B0069007000460075006C006C00610066007400650072004C006F00670042006B0070003E00660061006C00730065003C002F0073007900620061007300650053006B0069007000460075006C006C00610066007400650072004C006F00670042006B0070003E000D000A00200020002000200020002000200020003C002F006200610063006B00750070004F007000740073003E000D000A00200020002000200020002000200020003C00610064006D0069006E004F007000740073003E000D000A0020002000200020002000200020002000200020003C007500700064006100740065004F007000740069006F006E0020002F003E000D000A00200020002000200020002000200020003C002F00610064006D0069006E004F007000740073003E000D000A002000200020002000200020003C002F006F007000740069006F006E0073003E000D000A0020002000200020003C002F007300750062005400610073006B0073003E000D000A00200020003C002F007400610073006B0049006E0066006F003E000D000A003C002F0054004D004D00730067005F004300720065006100740065005400610073006B005200650071003E009CCE3C003F0078006D006C002000760065007200730069006F006E003D00220031002E0030002200200065006E0063006F00640069006E0067003D0022007500740066002D003800220020007300740061006E00640061006C006F006E0065003D0022006E006F0022003F003E000D000A003C0054004D004D00730067005F004300720065006100740065005400610073006B005200650071003E000D000A00200020003C007400610073006B0049006E0066006F003E000D000A0020002000200020003C007400610073006B003E000D000A002000200020002000200020003C007400610073006B0046006C006100670073003E000D000A00200020002000200020002000200020003C00640069007300610062006C00650064003E00660061006C00730065003C002F00640069007300610062006C00650064003E000D000A002000200020002000200020003C002F007400610073006B0046006C006100670073003E000D000A002000200020002000200020003C0070006F006C0069006300790054007900700065003E0044004100540041005F00500052004F00540045004300540049004F004E003C002F0070006F006C0069006300790054007900700065003E000D000A002000200020002000200020003C007400610073006B0054007900700065003E0049004D004D004500440049004100540045003C002F007400610073006B0054007900700065003E000D000A002000200020002000200020003C0069006E006900740069006100740065006400460072006F006D003E0043004F004D004D0041004E0044004C0049004E0045003C002F0069006E006900740069006100740065006400460072006F006D003E000D000A0020002000200020003C002F007400610073006B003E000D000A0020002000200020003C006100730073006F00630069006100740069006F006E0073003E000D000A002000200020002000200020003C006200610063006B00750070007300650074004E0061006D0065003E00640065006600610075006C0074004200610063006B00750070005300650074003C002F006200610063006B00750070007300650074004E0061006D0065003E000D000A002000200020002000200020003C0073007500620063006C00690065006E0074004E0061006D0065003E003C002F0073007500620063006C00690065006E0074004E0061006D0065003E000D000A002000200020002000200020003C0063006C00690065006E0074004E0061006D0065003E003C002F0063006C00690065006E0074004E0061006D0065003E000D000A002000200020002000200020003C006100700070004E0061006D0065003E00530051004C0020005300650072007600650072003C002F006100700070004E0061006D0065003E000D000A002000200020002000200020003C0069006E007300740061006E00630065004E0061006D0065003E003C002F0069006E007300740061006E00630065004E0061006D0065003E000D000A0020002000200020003C002F006100730073006F00630069006100740069006F006E0073003E000D000A0020002000200020003C007300750062005400610073006B0073003E000D000A002000200020002000200020003C007300750062005400610073006B003E000D000A00200020002000200020002000200020003C007300750062005400610073006B0054007900700065003E0052004500530054004F00520045003C002F007300750062005400610073006B0054007900700065003E000D000A00200020002000200020002000200020003C006F007000650072006100740069006F006E0054007900700065003E0052004500530054004F00520045003C002F006F007000650072006100740069006F006E0054007900700065003E000D000A002000200020002000200020003C002F007300750062005400610073006B003E000D000A002000200020002000200020003C006F007000740069006F006E0073003E000D000A00200020002000200020002000200020003C0072006500730074006F00720065004F007000740069006F006E0073003E000D000A0020002000200020002000200020002000200020003C00620072006F007700730065004F007000740069006F006E003E000D000A002000200020002000200020002000200020002000200020003C0063006F006D006D00430065006C006C00490064003E0032003C002F0063006F006D006D00430065006C006C00490064003E000D000A002000200020002000200020002000200020002000200020003C006200610063006B00750070007300650074003E000D000A00200020002000200020002000200020002000200020002000200020003C0063006C00690065006E0074004E0061006D0065003E003C002F0063006C00690065006E0074004E0061006D0065003E000D000A00200020002000200020002000200020002000200020002000200020003C006200610063006B00750070007300650074004E0061006D0065003E00640065006600610075006C0074004200610063006B00750070005300650074003C002F006200610063006B00750070007300650074004E0061006D0065003E000D000A002000200020002000200020002000200020002000200020003C002F006200610063006B00750070007300650074003E000D000A002000200020002000200020002000200020002000200020003C00740069006D006500520061006E00670065003E000D000A00200020002000200020002000200020002000200020002000200020003C0074006F00540069006D006500560061006C00750065003E003C002F0074006F00540069006D006500560061006C00750065003E000D000A002000200020002000200020002000200020002000200020003C002F00740069006D006500520061006E00670065003E000D000A002000200020002000200020002000200020002000200020003C006E006F0049006D006100670065003E0074007200750065003C002F006E006F0049006D006100670065003E000D000A002000200020002000200020002000200020002000200020003C007500730065004500780061006300740049006E006400650078003E00660061006C00730065003C002F007500730065004500780061006300740049006E006400650078003E000D000A002000200020002000200020002000200020002000200020003C006D0065006400690061004F007000740069006F006E003E000D000A00200020002000200020002000200020002000200020002000200020003C006C0069006200720061007200790020002F003E000D000A00200020002000200020002000200020002000200020002000200020003C006D0065006400690061004100670065006E00740020002F003E000D000A00200020002000200020002000200020002000200020002000200020003C006400720069007600650050006F006F006C0020002F003E000D000A00200020002000200020002000200020002000200020002000200020003C0063006F007000790050007200650063006500640065006E00630065003E000D000A0020002000200020002000200020002000200020002000200020002000200020003C0063006F007000790050007200650063006500640065006E00630065004100700070006C0069006300610062006C0065003E00660061006C00730065003C002F0063006F007000790050007200650063006500640065006E00630065004100700070006C0069006300610062006C0065003E000D000A00200020002000200020002000200020002000200020002000200020003C002F0063006F007000790050007200650063006500640065006E00630065003E000D000A002000200020002000200020002000200020002000200020003C002F006D0065006400690061004F007000740069006F006E003E000D000A002000200020002000200020002000200020002000200020003C00740069006D0065005A006F006E0065003E000D000A00200020002000200020002000200020002000200020002000200020003C00540069006D0065005A006F006E0065004E0061006D0065003E0028005500540043002B00300031003A00300030002900200041006D007300740065007200640061006D002C0020004200650072006C0069006E002C0020004200650072006E002C00200052006F006D0065002C002000530074006F0063006B0068006F006C006D002C0020005600690065006E006E0061003C002F00540069006D0065005A006F006E0065004E0061006D0065003E000D000A002000200020002000200020002000200020002000200020003C002F00740069006D0065005A006F006E0065003E000D000A002000200020002000200020002000200020002000200020003C006C006900730074004D0065006400690061003E00660061006C00730065003C002F006C006900730074004D0065006400690061003E000D000A0020002000200020002000200020002000200020003C002F00620072006F007700730065004F007000740069006F006E003E000D000A0020002000200020002000200020002000200020003C00640065007300740069006E006100740069006F006E003E000D000A002000200020002000200020002000200020002000200020003C00640065007300740043006C00690065006E0074003E000D000A00200020002000200020002000200020002000200020002000200020003C0063006C00690065006E0074004E0061006D0065003E003C002F0063006C00690065006E0074004E0061006D0065003E000D000A002000200020002000200020002000200020002000200020003C002F00640065007300740043006C00690065006E0074003E000D000A002000200020002000200020002000200020002000200020003C00640065007300740069006E006100740069006F006E0049006E007300740061006E00630065003E000D000A00200020002000200020002000200020002000200020002000200020003C0063006C00690065006E0074004E0061006D0065003E003C002F0063006C00690065006E0074004E0061006D0065003E000D000A00200020002000200020002000200020002000200020002000200020003C006100700070004E0061006D0065003E00530051004C0020005300650072007600650072003C002F006100700070004E0061006D0065003E000D000A00200020002000200020002000200020002000200020002000200020003C0069006E007300740061006E00630065004E0061006D0065003E003C002F0069006E007300740061006E00630065004E0061006D0065003E000D000A002000200020002000200020002000200020002000200020003C002F00640065007300740069006E006100740069006F006E0049006E007300740061006E00630065003E000D000A0020002000200020002000200020002000200020003C002F00640065007300740069006E006100740069006F006E003E000D000A0020002000200020002000200020002000200020003C00730071006C005300650072007600650072005200730074004F007000740069006F006E003E000D000A002000200020002000200020002000200020002000200020003C00640062004F006E006C0079003E00660061006C00730065003C002F00640062004F006E006C0079003E000D000A002000200020002000200020002000200020002000200020003C006F00760065007200570072006900740065003E0074007200750065003C002F006F00760065007200570072006900740065003E000D000A002000200020002000200020002000200020002000200020003C0070006F0069006E0074004F006600540069006D0065005200730074003E00660061006C00730065003C002F0070006F0069006E0074004F006600540069006D0065005200730074003E000D000A002000200020002000200020002000200020002000200020003C00730071006C0052006500730074006F007200650054007900700065003E00440041005400410042004100530045005F0052004500530054004F00520045003C002F00730071006C0052006500730074006F007200650054007900700065003E000D000A002000200020002000200020002000200020002000200020003C00730071006C005200650063006F0076006500720054007900700065003E00530054004100540045005F005200450043004F005600450052003C002F00730071006C005200650063006F0076006500720054007900700065003E000D000A002000200020002000200020002000200020002000200020003C00730074006F007000530074006100720074005300530041003E00660061006C00730065003C002F00730074006F007000530074006100720074005300530041003E000D000A002000200020002000200020002000200020002000200020003C00700072006500730065007200760065005200650070006C00690063006100740069006F006E00530065007400740069006E00670073003E00660061006C00730065003C002F00700072006500730065007200760065005200650070006C00690063006100740069006F006E00530065007400740069006E00670073003E000D000A002000200020002000200020002000200020002000200020003C00730074006F0070004D00610072006B0052006500730074006F00720065003E00660061006C00730065003C002F00730074006F0070004D00610072006B0052006500730074006F00720065003E000D000A002000200020002000200020002000200020002000200020003C00730074006F0070004200650066006F00720065004D00610072006B0052006500730074006F00720065003E00660061006C00730065003C002F00730074006F0070004200650066006F00720065004D00610072006B0052006500730074006F00720065003E000D000A002000200020002000200020002000200020002000200020003C007000610072007400690061006C0052006500730074006F00720065003E00660061006C00730065003C002F007000610072007400690061006C0052006500730074006F00720065003E000D000A002000200020002000200020002000200020002000200020003C006C006F0067005300680069007000700069006E0067004F006E006C0079003E00660061006C00730065003C002F006C006F0067005300680069007000700069006E0067004F006E006C0079003E000D000A002000200020002000200020002000200020002000200020003C0066006600670052006500730074006F00720065003E00660061006C00730065003C002F0066006600670052006500730074006F00720065003E000D000A002000200020002000200020002000200020002000200020003C00690067006E006F0072006500460075006C006C004200610063006B00750070003E00660061006C00730065003C002F00690067006E006F0072006500460075006C006C004200610063006B00750070003E000D000A002000200020002000200020002000200020002000200020003C007600530053004200610063006B00750070003E00660061006C00730065003C002F007600530053004200610063006B00750070003E000D000A002000200020002000200020002000200020002000200020003C0070006F0069006E00740049006E00540069006D0065003E000D000A00200020002000200020002000200020002000200020002000200020003C00740069006D006500560061006C00750065003E003C002F00740069006D006500560061006C00750065003E000D000A002000200020002000200020002000200020002000200020003C002F0070006F0069006E00740049006E00540069006D0065003E000D000A002000200020002000200020002000200020002000200020003C0072006500730074006F007200650053006F0075007200630065003E003C002F0072006500730074006F007200650053006F0075007200630065003E000D000A002000200020002000200020002000200020002000200020003C00640061007400610062006100730065003E003C002F00640061007400610062006100730065003E000D000A002000200020002000200020002000200020002000200020003C00740069006D0065005A006F006E0065003E000D000A00200020002000200020002000200020002000200020002000200020003C00540069006D0065005A006F006E0065004E0061006D0065003E0028005500540043002B00300031003A00300030002900200041006D007300740065007200640061006D002C0020004200650072006C0069006E002C0020004200650072006E002C00200052006F006D0065002C002000530074006F0063006B0068006F006C006D002C0020005600690065006E006E0061003C002F00540069006D0065005A006F006E0065004E0061006D0065003E000D000A002000200020002000200020002000200020002000200020003C002F00740069006D0065005A006F006E0065003E000D000A002000200020002000200020002000200020002000200020003C006B00650065007000440061007400610043006100700074007500720065003E00660061006C00730065003C002F006B00650065007000440061007400610043006100700074007500720065003E000D000A002000200020002000200020002000200020002000200020003C00640072006F00700043006F006E006E0065006300740069006F006E00730054006F00440061007400610062006100730065003E0074007200750065003C002F00640072006F00700043006F006E006E0065006300740069006F006E00730054006F00440061007400610062006100730065003E000D000A0020002000200020002000200020002000200020003C002F00730071006C005300650072007600650072005200730074004F007000740069006F006E003E000D000A0020002000200020002000200020002000200020003C00660069006C0065004F007000740069006F006E003E000D000A002000200020002000200020002000200020002000200020003C006D0061007000460069006C006500730020002F003E000D000A0020002000200020002000200020002000200020003C002F00660069006C0065004F007000740069006F006E003E000D000A0020002000200020002000200020002000200020003C0063006F006D006D006F006E004F007000740069006F006E0073003E000D000A002000200020002000200020002000200020002000200020003C006F006E006500500061007300730052006500730074006F00720065003E00660061006C00730065003C002F006F006E006500500061007300730052006500730074006F00720065003E000D000A002000200020002000200020002000200020002000200020003C0063006C0075007300740065007200440042004200610063006B0065006400750070003E00660061006C00730065003C002F0063006C0075007300740065007200440042004200610063006B0065006400750070003E000D000A0020002000200020002000200020002000200020003C002F0063006F006D006D006F006E004F007000740069006F006E0073003E000D000A00200020002000200020002000200020003C002F0072006500730074006F00720065004F007000740069006F006E0073003E000D000A00200020002000200020002000200020003C00610064006D0069006E004F007000740073003E000D000A0020002000200020002000200020002000200020003C007500700064006100740065004F007000740069006F006E0020002F003E000D000A00200020002000200020002000200020003C002F00610064006D0069006E004F007000740073003E000D000A002000200020002000200020003C002F006F007000740069006F006E0073003E000D000A0020002000200020003C002F007300750062005400610073006B0073003E000D000A00200020003C002F007400610073006B0049006E0066006F003E000D000A003C002F0054004D004D00730067005F004300720065006100740065005400610073006B005200650071003E000306121002060E0F0006113911391139113911390E11391D000E113911391139113911391139113911390E113911391139020211390A000311391139113911390800021165113911390300000106000111651139060001116D113905000101123D0F200701113911390E1139113911390E0820040111390E0E0E0801000800000000001E01000100540216577261704E6F6E457863657074696F6E5468726F7773010801000701000000001201000D4442412E436F6D6D7661756C74000026010021434C52207573656420666F7220436F6D6D7661756C74206F7065726174696F6E7300000501000000000D01000847616C656E696361000026010021436F7079726967687420C2A92047616C656E6963615F313930392E32203230323100000C010007312E302E302E3000001C01000100540E044E616D6510436F6D6D7661756C745F4261636B75701D01000100540E044E616D6511436F6D6D7661756C745F526573746F72652001000100540E044E616D6514436F6D6D7661756C745F4A6F625F5374617475731E01000100540E044E616D6512436F6D6D7661756C745F4A6F625F4B696C6C1B01000100540E044E616D650F436F6D6D7661756C745F4C6F67696E1C01000100540E044E616D6510436F6D6D7661756C745F4C6F676F75742101000100540E044E616D6515436F6D6D7661756C745F46696C655F45786973747300004DB105E5CBE12ED5BED31F6BE8540C87FB9E4F6236A89D42432F2B877EA083E4E9BD52CCD480F2114BE6875815BC19B66742DA8B74709D3911F695E3F3BDDB1CC520E97FCB44F2120A702E186009E36F5FE7BC799FD46D55B093486A38216B80A932BB2357459498396969B0661B808FB7462F704D3AE36767E6D1FB5AF62DAF00000000918EAE6400000000020000001C01000080D1000080B3000052534453E519C7734F9AB9488C65CC7EA866AB8C01000000433A5C6465765C7265706F735C7466735F4442412E546F6F6C735C4D61696E5C434C525C4442412E436F6D6D7661756C745C6F626A5C44656275675C4442412E436F6D6D7661756C742E706462000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000C4D200000000000000000000DED20000002000000000000000000000000000000000000000000000D0D20000000000000000000000005F436F72446C6C4D61696E006D73636F7265652E646C6C0000000000FF25002000100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000100100000001800008000000000000000000000000000000100010000003000008000000000000000000000000000000100000000004800000058E00000AC0300000000000000000000AC0334000000560053005F00560045005200530049004F004E005F0049004E0046004F0000000000BD04EFFE00000100000001000000000000000100000000003F000000000000000400000002000000000000000000000000000000440000000100560061007200460069006C00650049006E0066006F00000000002400040000005400720061006E0073006C006100740069006F006E00000000000000B0040C030000010053007400720069006E006700460069006C00650049006E0066006F000000E802000001003000300030003000300034006200300000005C002200010043006F006D006D0065006E0074007300000043004C00520020007500730065006400200066006F007200200043006F006D006D007600610075006C00740020006F007000650072006100740069006F006E007300000032000900010043006F006D00700061006E0079004E0061006D00650000000000470061006C0065006E006900630061000000000044000E000100460069006C0065004400650073006300720069007000740069006F006E00000000004400420041002E0043006F006D006D007600610075006C0074000000300008000100460069006C006500560065007200730069006F006E000000000031002E0030002E0030002E003000000044001200010049006E007400650072006E0061006C004E0061006D00650000004400420041002E0043006F006D006D007600610075006C0074002E0064006C006C0000006600210001004C006500670061006C0043006F007000790072006900670068007400000043006F0070007900720069006700680074002000A9002000470061006C0065006E006900630061005F0031003900300039002E00320020003200300032003100000000002A00010001004C006500670061006C00540072006100640065006D00610072006B00730000000000000000004C00120001004F0072006900670069006E0061006C00460069006C0065006E0061006D00650000004400420041002E0043006F006D006D007600610075006C0074002E0064006C006C0000003C000E000100500072006F0064007500630074004E0061006D006500000000004400420041002E0043006F006D006D007600610075006C0074000000340008000100500072006F006400750063007400560065007200730069006F006E00000031002E0030002E0030002E003000000038000800010041007300730065006D0062006C0079002000560065007200730069006F006E00000031002E0030002E0030002E00300000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000D000000C000000F03200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 + WITH PERMISSION_SET = UNSAFE; + + +GO +ALTER ASSEMBLY [DBA.Commvault] + DROP FILE ALL + ADD FILE FROM 0x4D6963726F736F667420432F432B2B204D534620372E30300D0A1A44530000000002000001000000530000008C0100000000000052000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000E0010000000000000000F8FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF18FEFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0BCA310138000000001000000010000000000000FFFFFFFF04000000FFFF030000000000FFFFFFFF00000000FFFFFFFF00000000FFFFFFFF0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000BCA310138000000001000000010000000000000FFFFFFFF04000000FFFF030000000000FFFFFFFF00000000FFFFFFFF00000000FFFFFFFF0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000BCA3101380000000010000000100000000000001700FFFF04000000FFFF03000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000BCA3101380000000010000000100000000000001900FFFF04000000FFFF030000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000006000000200000003C000000000000004000000000000000000000000300000005000000060000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000007000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000400000056003C110F0000000700000000000000000004005802170034654323202D20342E362E302D332E32333235392E382B6333636331643063656561623161363564613032313765343033383531613165386133303038366100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000F862513FC607D311905300C04FA302A1C4454B99E9E6D211903F00C04FA302A10B9D865A1166D311BD2A0000F80849BD0FD02988B8111342878B770E8597AC162000000000000000D3F840FD09615600CC8E811DE9C725158B56C7A11541B391EF2021147A35FFD2000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000F862513FC607D311905300C04FA302A1C4454B99E9E6D211903F00C04FA302A10B9D865A1166D311BD2A0000F80849BD0FD02988B8111342878B770E8597AC1620000000000000009D031C03F27BCE7C56462593DC0E8068BC2502FA2EC6D34D67621B8F20355050000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000F862513FC607D311905300C04FA302A1C4454B99E9E6D211903F00C04FA302A10B9D865A1166D311BD2A0000F80849BD0FD02988B8111342878B770E8597AC162000000000000000BC1239B6E2EE502A1B67CC0BB67FE5A5564E053D834BA4CF919DE3DD6A62094D000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000F862513FC607D311905300C04FA302A1C4454B99E9E6D211903F00C04FA302A10B9D865A1166D311BD2A0000F80849BD0FD02988B8111342878B770E8597AC162000000000000000B69236CBF4D6A4B918B41D662A499BA165D4865C6965611728FD2E51E075FA67000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000F862513FC607D311905300C04FA302A1C4454B99E9E6D211903F00C04FA302A10B9D865A1166D311BD2A0000F80849BD0FD02988B8111342878B770E8597AC162000000000000000820D57E19110B281BB9A191D9958391EC159094982937744C3FEB26D48E9929B0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000652E000000000000652E0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000FEEFFEEF01000000E402000000433A5C6465765C7265706F735C7466735F4442412E546F6F6C735C4D61696E5C434C525C4442412E436F6D6D7661756C745C444241436F6D6D7661756C742E63730000633A5C6465765C7265706F735C7466735F6462612E746F6F6C735C6D61696E5C636C725C6462612E636F6D6D7661756C745C646261636F6D6D7661756C742E637300433A5C6465765C7265706F735C7466735F4442412E546F6F6C735C4D61696E5C434C525C4442412E436F6D6D7661756C745C444241436F6D6D7661756C74426173652E637300633A5C6465765C7265706F735C7466735F6462612E746F6F6C735C6D61696E5C636C725C6462612E636F6D6D7661756C745C646261636F6D6D7661756C74626173652E637300433A5C6465765C7265706F735C7466735F4442412E546F6F6C735C4D61696E5C434C525C4442412E436F6D6D7661756C745C584D4C54656D706C6174654D616E616765722E637300633A5C6465765C7265706F735C7466735F6462612E746F6F6C735C6D61696E5C636C725C6462612E636F6D6D7661756C745C786D6C74656D706C6174656D616E616765722E637300433A5C6465765C7265706F735C7466735F4442412E546F6F6C735C4D61696E5C434C525C4442412E436F6D6D7661756C745C50726F706572746965735C417373656D626C79496E666F2E637300633A5C6465765C7265706F735C7466735F6462612E746F6F6C735C6D61696E5C636C725C6462612E636F6D6D7661756C745C70726F706572746965735C617373656D626C79696E666F2E637300433A5C55736572735C75703230383730305C417070446174615C4C6F63616C5C54656D705C2E4E45544672616D65776F726B2C56657273696F6E3D76342E382E53716C436C72417474726962757465732E637300633A5C75736572735C75703230383730305C617070646174615C6C6F63616C5C74656D705C2E6E65746672616D65776F726B2C76657273696F6E3D76342E382E73716C636C72617474726962757465732E63730011000000120100005A010000A2010000EF01000043000000010000003C020000900200000000000000000000000000000000000000000000000000004400000086000000CC0000000B000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001BE23001300100008454BA1AB4B4D901010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000050000000A00000001000000F001000000000000CC000000280000001BE23001D115AE3D680000008600000043000000CC000000650000000000000000000000EF010000280000001BE23001CB3F438668000000A201000043000000EF0100006500000000000000000000005A010000280000001BE23001AB3B7BAD6800000012010000430000005A01000065000000000000000000000090020000280000001BE23001154EAB02680000003C020000430000009002000065000000000000000000000044000000280000001BE23001C3BE01576800000001000000430000004400000065000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000040000003A002A1100000000D001000000000000E8010000000000000000000007000006660C00000100000000436F6D6D7661756C745F4C6F67696E00000000160003110400000074010000E8010000660C0000010000001E002411554D6963726F736F66742E53716C5365727665722E536572766572000A0024115553797374656D001A0024115553797374656D2E446174612E53716C5479706573000000160024115553797374656D2E446961676E6F7374696373000E0024115553797374656D2E494F0000320024115553797374656D2E53656375726974792E43727970746F6772617068792E5835303943657274696669636174657300002200201100000000050000110000000000000000666F6C646572457869737473000000001A0020110100000005000011000000000000000078636572740000001A0020110200000005000011000000000000000070726F63000000001A00201103000000050000110000000000000000546F6B656E0000000200060056000404C93FEAC6B359D649BC250902BBABB460000000004D0044003200000004020000040000000C0000000100060004060001280000000180D5018386018434018601020E0281070281BF0282880286160286DC160100020006003A002A1100000000AC02000000000000F70000000000000000000000080000064E0E00000100000000436F6D6D7661756C745F4C6F676F757400000016000311D401000060020000F70000004E0E0000010000001A0020110000000006000011000000000000000078636572740000001A0020110100000006000011000000000000000070726F63000000000200060046000404C93FEAC6B359D649BC250902BBABB460000000004D0044003200000004020000040100000C0000000700000604060003180000000181F30182A2020E0280D01601000000020006002E002A11000000001C0300000000000047000000000000000000000009000006450F00000100000000457869737473003A000404C93FEAC6B359D649BC250902BBABB460000000004D0044003200000004020000040100000C00000007000006040600000C000000020C1601020006003A002A1100000000D4030000000000002E00000000000000000000000A0000068C0F000001000000005665726966795369676E6174757265000000001600031120030000940300002E0000008C0F0000010000001E002011000000000800001100000000000000007075626C6973686572000000020006003A000404C93FEAC6B359D649BC250902BBABB460000000004D0044003200000004020000040100000C00000007000006040600000C00000001130242020006002E002A110000000038040000000000001E00000000000000000000000C000006BA0F000001000000002E6363746F72002E000404C93FEAC6B359D649BC250902BBABB460000000004D0044003200000004010000040100000C0000000700000602000600F200000028020000660C000001000100E8010000000000002C0000001C020000000000001700008001000000190000801C000000EEEFFE80200000001A000080210000001B0000802B0000001C0000802C0000001E000080370000001F0000803D000000EEEFFE80410000002000008051000000220000806E000000EEEFFE80720000002300008073000000240000808300000027000080A0000000EEEFFE80A400000028000080A500000029000080B50000002C000080B70000002D000080CC0000002E000080D300000031000080D900000032000080F4000000330000803701000034000080440100003500008051010000360000805E010000370000806B0100003A000080720100003B0000807D010000EEEFFE807F0100003D000080800100003E000080970100003F000080980100003C000080A8010000EEEFFE80AC01000040000080B301000043000080CA010000EEEFFE80CE01000043000080CF01000043000080DF01000044000080E001000044000080E5010000460000800500060009005F000000000009000A000D00490009000A000900360009001B00000000000D00990009005D000000000009000A000D005200090060000000000009000A000D0055000900260009004F00090020000900260009003B0009005C000900400009002E0009003000090036000900160009001E000000000009000A000D00350009000A00090031000000000009001C0009001900000000001A001B001C005B000E000F0010001D0005000600F20000002C0100004E0E000001000100F7000000000000001700000020010000000000004F00008001000000510000801B000000EEEFFE801E000000520000801F0000005300008029000000540000802A0000005600008046000000EEEFFE8049000000570000804A000000580000815A0000005D0000805C0000005E000080710000005F00008078000000620000807E000000630000808F00000064000080A000000065000080BD00000066000080CA00000067000080D70000006A000080DE0000006B000080E50000006E000080F4000000700000800500060009005F000000000009000A000D00490009000A00090069000000000009000A000D00370009002600090050000900200009002600090032000900310009003F000900400009002E000900160009001C0009001E0005000600F20000006C000000450F000001000100470000000000000007000000600000000000000079000080010000007A0000801D000000EEEFFE80200000007B000080210000007C000080310000007F00008045000000800000800500060009005B000000000009000A000D0057000900280005000600F2000000780000008C0F0000010001002E00000000000000080000006C000000000000008300008001000000840000800D000000850000801C000000EEEFFE801F0000008600008020000000870000802B000000890000802D0000008A000080050006000900350009002E000000000009000A000D0047000900100005000600F200000024000000BA0F0000010001001E000000000000000100000018000000000000000D00008005009000F400000008000000860000000000000028000000000000002000000038000000580000007000000088000000A0000000C0000000D8000000F00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000040000003A002A1100000000EC0300000000000096040000000000000000000001000006000000000100000000436F6D6D7661756C745F4261636B75700000001600031104000000580300009604000000000000010000000A0024115553797374656D00320024115553797374656D2E53656375726974792E43727970746F6772617068792E5835303943657274696669636174657300001A0024115553797374656D2E446174612E53716C5479706573000000160024115553797374656D2E446961676E6F7374696373000E0024115553797374656D2E586D6C001E002411554D6963726F736F66742E53716C5365727665722E536572766572000E0024115553797374656D2E494F0000120024115553797374656D2E546578740000000012002411554442412E436F6D6D7661756C7400001A0020110000000001000011000000000000000078636572740000001E0020110100000001000011000000000000000074656D705061746800000000160020110200000001000011000000000000000064697200260020110300000001000011000000000000000074656D706C61746546696C654E616D650000000026002011040000000100001100000000000000006F6E64656D616E64696E70757466696C6500000026002011050000000100001100000000000000006F7074696F6E616C436F6D6D616E6473000000001A0020110600000001000011000000000000000070726F63000000002600201107000000010000110000000000000000716F7065726174696F6E526573756C74000000001600201108000000010000110000000000000000786D6C001A002011090000000100001100000000000000004A6F6249440000001600031140000000AC0200003E00000004010000010000001A0020110F00000001000011000000000000000066696C6500000000020006001600031140000000E40200003E0000006F010000010000001A0020111300000001000011000000000000000066696C65000000000200060016000311400000001C030000260000002C020000010000001A00201116000000010000110000000000000000616C6C6462000000020006001600031140000000540300002900000043040000010000001A0020111C0000000100001100000000000000006E6F64650000000002000600020006008E000404C93FEAC6B359D649BC250902BBABB460000000004D0044003200000004020000040000000C0000000100090004060001600000000183F50184B901852C01871E018796018991018BEE018E2C018F39018F8F020E0280D00281D90282D006855A01855A0285B50006863C01863C02869002886F0188DE0289B1028A7C028B3C028E4C068FA4018FA400160100020006003A002A1100000000980600000000000098040000000000000000000002000006960400000100000000436F6D6D7661756C745F526573746F7265000016000311F0030000140600009804000096040000010000001A0020110000000002000011000000000000000078636572740000001E0020110100000002000011000000000000000074656D705061746800000000260020110200000002000011000000000000000054656D706C61746546696C656E616D650000000016002011030000000200001100000000000000006469720026002011040000000200001100000000000000006F7074696F6E616C436F6D6D616E6473000000001A0020110500000002000011000000000000000070726F63000000002600201106000000020000110000000000000000716F7065726174696F6E526573756C74000000001600201107000000020000110000000000000000786D6C001A002011080000000200001100000000000000004A6F624944000000160003112C040000940500003E00000026050000010000001A0020110C00000002000011000000000000000066696C650000000002000600160003112C040000D80500006C0000008405000001000000260020110F000000020000110000000000000000726573746F7265466F6C6465724E616D6500000002000600160003112C0400001006000029000000DB080000010000001A002011170000000200001100000000000000006E6F64650000000002000600020006007E000404C93FEAC6B359D649BC250902BBABB460000000004D0044003200000004020000040100000C0000000100000604060000500000000181010181940181C301826E018831018A7D018F670190740190CA020E0006829C01829C0282F80283AF01842D0285D9028851028949028ADC028CBA028F870690DF0190DF001601020006003E002A1100000000A407000000000000F80100000000000000000000030000062E0900000100000000436F6D6D7661756C745F4A6F625F537461747573000000160003119C0600004C070000F80100002E090000010000001A0020110000000003000011000000000000000078636572740000001A0020110100000003000011000000000000000070726F63000000001E00201102000000030000110000000000000000716C697374526573756C74000200060052000404C93FEAC6B359D649BC250902BBABB460000000004D0044003200000004020000040100000C00000001000006040600002400000001840B0184C10186B2020E0280D00281CA0282D00286CF0287031601020006003A002A1100000000800800000000000035010000000000000000000004000006260B00000100000000436F6D6D7661756C745F4A6F625F4B696C6C0016000311A80700003408000035010000260B0000010000001A0020110000000004000011000000000000000078636572740000001A0020110100000004000011000000000000000070726F63000000000200060046000404C93FEAC6B359D649BC250902BBABB460000000004D0044003200000004020000040100000C0000000100000604060000180000000182D3018383020E0280D00281C21601020006002E002A1100000000E4080000000000000B0000000000000000000000060000065B0C000001000000002E6363746F72002E000404C93FEAC6B359D649BC250902BBABB460000000004D0044003200000004010000040100000C0000000100000602000600F20000007C050000000000000100010096040000000000007300000070050000000000001C000080010000001E0000801C000000EEEFFE80200000001F00008021000000200000802B000000210000802C0000002300008049000000EEEFFE804D000000240000804E000000250000815E000000290000807B000000EEEFFE807F0000002A000080800000002B000081900000002F000080AF000000EEEFFE80B300000030000080B400000031000081C400000036000080C600000037000080DB00000038000080E20000003B000080E80000003F000080EF00000041000080F00000004100008002010000EEEFFE8004010000410000800D010000420000800E0100004300008033010000EEEFFE80370100004400008038010000450000804001000046000080410100004700008042010000410000804D010000EEEFFE8059010000EEEFFE805A010000490000805B010000490000806D010000EEEFFE806F01000049000080780100004A000080790100004B0000809E010000EEEFFE80A20100004C000080A30100004D000080AB0100004E000080AC0100004F000080AD01000049000080B8010000EEEFFE80C4010000EEEFFE80C501000051000080E9010000520000800E020000530000801A0200005700008028020000EEEFFE802C020000580000802D0200005A000080410200005B000080510200005C000080520200005F00008059020000600000806C020000EEEFFE80700200006000008071020000600000808B020000600000808C020000EEEFFE808E020000600000808F020000600000809D020000600000809E02000061000080B1020000EEEFFE80B502000061000080B602000061000080D002000061000080D1020000EEEFFE80D302000061000080D402000061000080E202000061000080E302000062000080F1020000EEEFFE80F502000062000080F6020000620000800B030000620000800C0300006500008013030000660000802F030000670000809803000068000080A603000069000080B40300006A000080C20300006B000080D00300006E000080D80300006F000080DF030000EEEFFE80E103000071000080E203000072000080F703000073000080F80300007000008009040000EEEFFE800D0400007400008015040000770000801C04000078000080260400007A000080320400007B000080330400007B00008041040000EEEFFE80430400007B000080510400007C000080520400007D0000806B0400007E0000806C0400007B00008077040000EEEFFE808C040000EEEFFE808D0400008100008093040000820000800500060009005F000000000009000A000D00490009000A00090069000000000009000A000D004F0009006D000000000009000A000D00370009006B000000000009000A000D00370009002600090053000900200009002E0009003900090010001E004A000000000012001A0009000A000D003F00000000000D000E0011001F000D000E0009000A001B001D000000000000000000090010001E0043000000000012001A0009000A000D003F00000000000D000E0011001F000D000E0009000A001B001D000000000000000000090077000900710009004400090024000000000009000A000D003A000D00530009000A00090026000900270000000000280029002A007E007F00800000000000860087008800C800C900CA000900250000000000260027002800780079007A0000000000800081008200BD00BE00BF0009002500000000002600270028007E007F0080000900260009003F000900CC000900400009002E00090030000900360009001600090026000000000009000A000D00520009000A00090031000000000009001C0009002D000900270009001E0009001000220035000000000012001E0009000A000D002E0009000A001F00210000000000000000000900160005000600F2000000BC0400009604000001000100980400000000000063000000B0040000000000009E00008001000000A00000801C000000EEEFFE8020000000A100008021000000A20000802B000000A30000802C000000A60000802E000000A700008043000000A80000804A000000A900008050000000AA00008074000000AD0000807B000000AF0000807C000000AF0000808E000000EEEFFE8090000000AF00008099000000B00000809A000000B1000080BF000000EEEFFE80C3000000B2000080C4000000B3000080CC000000B4000080CD000000B5000080CE000000AF000080D9000000EEEFFE80E5000000EEEFFE80E6000000B8000080EA000000EEEFFE80EE000000B9000080EF000000BB00008036010000BC00008048010000C000008059010000C10000805A010000EEEFFE805C010000C30000805D010000C400008070010000EEEFFE8074010000C500008075010000C700008081010000C800008082010000EEEFFE8084010000CA00008085010000CC0000819C010000CE0000809D010000CF0000809E010000D2000080A5010000D3000080B8010000EEEFFE80BC010000D3000080BD010000D3000080FB010000D3000080FC010000D40000800F020000EEEFFE8013020000D400008014020000D40000802E020000D40000802F020000D800008036020000D900008052020000DA00008056020000EEEFFE805D020000DB0000805E020000DC000080E0020000DD000080E1020000EEEFFE80E6020000DF000080E7020000E0000080EB020000EEEFFE80F2020000E0000080F3020000E100008098030000E200008099030000E30000809A030000E5000080A8030000E6000080B6030000E7000080C4030000E8000080D2030000EB000080DA030000EC000080E1030000EEEFFE80E3030000EE000080E4030000EF000080F9030000F0000080FA030000ED0000800B040000EEEFFE800F040000F100008017040000F40000801E040000F500008028040000F700008034040000F800008035040000F800008043040000EEEFFE8045040000F800008053040000F900008054040000FA0000806D040000FB0000806E040000F800008079040000EEEFFE808E040000EEEFFE808F040000FE00008095040000FF0000800500060009005F000000000009000A000D00490009000A0009002600090053000900200009002E000900780009003900090010001E004B000000000012001A0009000A000D004000000000000D000E0011001F000D000E0009000A001B001D000000000000000000090024000000000009000A000D0083000D0068000D007D0009000A000000000009000A000D003C00000000000D000E0011004D000D000E00000000000D000E00110092000D000E0009000A0009002600090038000000000039003A003B00F500F600F70009003A00000000003B003C003D00B700B800B9000900260009003F00090024000000000009000A000D00850109000A000000000009000A000D002C00000000002D002E00110052010D000E0009000A000900400009002E00090030000900360009001600090026000000000009000A000D00520009000A00090031000000000009001C0009002D000900270009001E0009001000220035000000000012001E0009000A000D002E0009000A001F00210000000000000000000900160005000600F20000004C0200002E09000001000100F8010000000000002F00000040020000000000000A010080010000000C0100801B000000EEEFFE801E0000000D0100801F0000000E010080290000000F0100802A0000001101008047000000EEEFFE804B000000120100804C000000130100815C0000001701008079000000EEEFFE807D000000180100807E000000190100818E0000001D010080AB000000EEEFFE80AF0000001E010080B00000001F010081C000000023010080C200000024010080D700000025010080DE00000027010080E400000028010080FF000000290100804C0100002A010080590100002B010080660100002C010080730100002D010080800100003001008087010000320100809201000034010080A5010000EEEFFE80A901000035010080AA010000EEEFFE80AC01000037010080AD01000038010080BE01000039010080BF01000036010080CF010000EEEFFE80D30100003A010080D4010000EEEFFE80D60100003C010080D70100003D010080E80100003E010080E901000040010080F001000043010080F5010000440100800500060009005F000000000009000A000D00490009000A0009005F000000000009000A000D004F00090067000000000009000A000D004F0009006B000000000009000A000D004F000900260009004E00090020000900260009003A00090077000900400009002E0009003000090036000900160009002400090024000000000009000A00000000000D000E0011003E000D000E000D0035000000000009000A000000000009000A000D003B0009000A0009001C0009001C0005000600F20000005C010000260B00000100010035010000000000001B00000050010000000000004E01008001000000500100801B000000EEEFFE801E000000510100801F0000005201008029000000530100802A0000005501008046000000EEEFFE8049000000560100804A000000570100815A0000005B01008077000000EEEFFE807B0000005C0100807C0000005D0100818C000000620100808E00000063010080A300000064010080AA00000066010080B000000067010080C100000068010080D200000069010080FB0000006A010080080100006B010080150100006E0100801C0100006F010080230100007201008032010000730100800500060009005F000000000009000A000D00490009000A00090069000000000009000A000D00370009005D000000000009000A000D00370009002600090053000900200009002600090032000900340009006A000900400009002E000900160009001C0009001E0005000600F2000000240000005B0C0000010001000B000000000000000100000018000000000000000D00008005005F00F40000000800000001000000000000002800000008010000280100004001000060010000780100009C010000B4010000D8010000F001000008020000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000004000000F400000010000000A2010000000000003C0200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000040000002E002A1100000000D4000000000000000A00000000000000000000000D000006D80F000001000000002E63746F72000016000311040000009C0000000A000000D80F0000010000001A0024115553797374656D2E446174612E53716C54797065730000000E0024115553797374656D2E494F0000120024115553797374656D2E54657874000000000E0024115553797374656D2E586D6C000200060032000404C93FEAC6B359D649BC250902BBABB460000000004D004400320000000401000004000000100000000300000000000400020006003E002A110000000048010000000000000E00000000000000000000000E000006E20F000001000000004372656174654261636B757054656D706C6174650000002E000404C93FEAC6B359D649BC250902BBABB460000000004D0044003200000004010000040100000C0000000D000006020006003E002A1100000000BC010000000000000E00000000000000000000000F000006F00F00000100000000437265617465526573746F726554656D706C61746500002E000404C93FEAC6B359D649BC250902BBABB460000000004D0044003200000004010000040100000C0000000D0000060200060046002A11000000000413000000000000890F0000000000000000000010000006FE0F00000100000000437265617465526573746F7265576974684D6F766554656D706C617465000016000311C001000064110000890F0000FE0F0000010000001A00201100000000090000110000000000000000786D6C446F6300001A00201101000000090000110000000000000000646F634E6F6465001E00201102000000090000110000000000000000726F6F744E6F6465000000001E002011030000000900001100000000000000007461736B496E666F000000001A002011040000000900001100000000000000007461736B000000001E002011050000000900001100000000000000007461736B466C6167730000001E0020110600000009000011000000000000000064697361626C6564000000001E00201107000000090000110000000000000000706F6C6963795479706500001E002011080000000900001100000000000000007461736B54797065000000002200201109000000090000110000000000000000696E6974696174656446726F6D0000001A0020110A000000090000110000000000000000616C6572740000001E0020110B000000090000110000000000000000616C6572744E616D65000000220020110C0000000900001100000000000000006173736F63696174696F6E7300000000220020110D0000000900001100000000000000006261636B75707365744E616D65000000220020110E0000000900001100000000000000006261636B75707365744E616D65320000220020110F000000090000110000000000000000737562636C69656E744E616D653200001E00201110000000090000110000000000000000636C69656E744E616D6532001E00201111000000090000110000000000000000636C69656E744E616D6533001E00201112000000090000110000000000000000636C69656E744E616D6534001E00201113000000090000110000000000000000636C69656E744E616D6535001A002011140000000900001100000000000000006170704E616D65001E002011150000000900001100000000000000006170704E616D6532000000002200201116000000090000110000000000000000696E7374616E63654E616D65330000002200201117000000090000110000000000000000696E7374616E63654E616D65320000001E002011180000000900001100000000000000007375625461736B73000000001A002011190000000900001100000000000000007375625461736B001E0020111A0000000900001100000000000000007375625461736B5479706500220020111B0000000900001100000000000000006F7065726174696F6E547970650000001A0020111C0000000900001100000000000000006F7074696F6E7300220020111D000000090000110000000000000000726573746F72654F7074696F6E730000220020111E00000009000011000000000000000062726F7773654F7074696F6E000000001E0020111F000000090000110000000000000000636F6D6D43656C6C496400001E002011200000000900001100000000000000006261636B75707365740000001E0020112100000009000011000000000000000074696D6552616E67650000002200201122000000090000110000000000000000746F54696D6556616C756532000000001A002011230000000900001100000000000000006E6F496D6167650022002011240000000900001100000000000000007573654578616374496E6465780000001E002011250000000900001100000000000000006D656469614F7074696F6E001A002011260000000900001100000000000000006C696272617279001E002011270000000900001100000000000000006D656469614167656E7400001E002011280000000900001100000000000000006472697665506F6F6C0000001A002011290000000900001100000000000000006472697665000000220020112A000000090000110000000000000000636F7079507265636564656E63650000220020112B000000090000110000000000000000636F7079507265636564656E636532002E0020112C000000090000110000000000000000636F7079507265636564656E63654170706C696361626C65000000002E0020112D00000009000011000000000000000073796E6368726F6E6F7573436F7079507265636564656E6365000000260020112E00000009000011000000000000000070726F7879466F72536E6170436C69656E7473001E0020112F000000090000110000000000000000636C69656E744E616D6536001E0020113000000009000011000000000000000074696D655A6F6E65000000001E0020113100000009000011000000000000000074696D655A6F6E6532000000220020113200000009000011000000000000000054696D655A6F6E654E616D6500000000220020113300000009000011000000000000000054696D655A6F6E654E616D65320000001E002011340000000900001100000000000000006C6973744D656469610000001E0020113500000009000011000000000000000064657374696E6174696F6E001E0020113600000009000011000000000000000064657374436C69656E740000260020113700000009000011000000000000000064657374696E6174696F6E496E7374616E636500260020113800000009000011000000000000000073716C5365727665725273744F7074696F6E00001A0020113900000009000011000000000000000064624F6E6C7900001E0020113A0000000900001100000000000000006F7665725772697465000000220020113B000000090000110000000000000000706F696E744F6654696D655273740000220020113C00000009000011000000000000000073716C526573746F7265547970650000220020113D00000009000011000000000000000073716C5265636F766572547970650000220020113E00000009000011000000000000000073746F705374617274535341000000002E0020113F00000009000011000000000000000070726573657276655265706C69636174696F6E53657474696E677300220020114000000009000011000000000000000073746F704D61726B526573746F7265002A0020114100000009000011000000000000000073746F704265666F72654D61726B526573746F726500000022002011420000000900001100000000000000007061727469616C526573746F7265000022002011430000000900001100000000000000006C6F675368697070696E674F6E6C79001E00201144000000090000110000000000000000666667526573746F72650000260020114500000009000011000000000000000069676E6F726546756C6C4261636B7570000000001E002011460000000900001100000000000000007653534261636B75700000002200201147000000090000110000000000000000726573746F7265536F757263653200001E0020114800000009000011000000000000000064617461626173653200000022002011490000000900001100000000000000006B6565704461746143617074757265001E0020114A00000009000011000000000000000066696C654F7074696F6E00001E0020114B0000000900001100000000000000006D617046696C657300000000220020114C000000090000110000000000000000636F6D6D6F6E4F7074696F6E730000002A0020114D000000090000110000000000000000646574656374526567756C617245787072657373696F6E00360020114E000000090000110000000000000000726573746F726544657669636546696C65734173526567756C617246696C6573000000002E0020114F000000090000110000000000000000726573746F726553706163655265737472696374696F6E73000000002E0020115000000009000011000000000000000069676E6F72654E616D657370616365526571756972656D656E7473002A00201151000000090000110000000000000000736B69704572726F7273416E64436F6E74696E756500000022002011520000000900001100000000000000006F6E6550617373526573746F726500001A0020115300000009000011000000000000000072657665727400002E002011540000000900001100000000000000007265636F766572416C6C50726F7465637465644D61696C73000000002600201155000000090000110000000000000000697346726F6D42726F7773654261636B757000002600201156000000090000110000000000000000636C757374657244424261636B656475700000001E0020115700000009000011000000000000000061646D696E4F70747300000022002011580000000900001100000000000000007570646174654F7074696F6E000000001E00201159000000090000110000000000000000636F6D6D6F6E4F70747300001E0020115A000000090000110000000000000000737461727455704F707473002A0020115B0000000900001100000000000000007374617274496E53757370656E64656453746174650000001E0020115C0000000900001100000000000000007072696F7269747900000000260020115D00000009000011000000000000000075736544656661756C745072696F7269747900001E0020115E000000090000110000000000000000707265506F73744F70747300260020115F0000000900001100000000000000007072655265636F76657279436F6D6D616E6400002600201160000000090000110000000000000000706F73745265636F76657279436F6D6D616E64002200201161000000090000110000000000000000696D706572736F6E6174696F6E0000001A002011620000000900001100000000000000006C6576656C0000001A0020116300000009000011000000000000000075736572000000001E00201164000000090000110000000000000000757365724E616D6500000000220020116500000009000011000000000000000072756E506F73745768656E4661696C0022002011660000000900001100000000000000006A6F624465736372697074696F6E00001A002011670000000900001100000000000000006370746D646600001A002011680000000900001100000000000000006370746C646600002600201169000000090000110000000000000000646246696C65496E666F53656C656374696F6E001E0020116A00000009000011000000000000000073657474696E6773000000001A0020116B0000000900001100000000000000007772697465720000160003110802000060110000970200006E1B0000010000001E0020116E000000090000110000000000000000646246696C6553686F72740016000311D01000005C11000090020000751B0000010000001E0020116F00000009000011000000000000000073706C697446756C6C0000001A0020117000000009000011000000000000000064657669636500000200060002000600020006009A010404C93FEAC6B359D649BC250902BBABB460000000004D0044003200000004020000040100000C0000000D000006040600006C010000011C014D0180A10180F001813201816C0181B00181F201823801827A0182C60183020183460183900183DC0184290184760184BD01850401854B0185920185D201861301865E0186A90186EB01872B0187730187BF0187FF01884D0188970188DD0189210189650189AE0189EE018A3A018A82018AC2018B08018B4C018B88018BD6018C25018C87018CEB018D43018D8A018DCC018E0F018E59018EA4018EE8018F30018F76018FCE0190240190620190A60190F40191420191900191DA0192420192920192EE01933C01938C0193D20194240194680194B50194F801954801958E0195D001961C01967C0196EE0197500197B80198140198620198A00199020199580199AC0199F0019A3A019A80019AC8019B24019B66019BBC019C04019C5A019CB2019CFE019D3A019D74019DB6019E0601B9E101B9FE01BA3D01C00047B501C000484F07BA7709BA7701BA7701BAD401BC8B02BB1302BB8602BBF902BCCB02BE510200060046002A11000000004824000000000000DE0E0000000000000000000011000006871F00000100000000437265617465526573746F7265546F46696C6554656D706C617465000000001600031108130000B4220000DE0E0000871F0000010000001A002011000000000A0000110000000000000000786D6C446F6300001A002011010000000A0000110000000000000000646F634E6F6465001E002011020000000A0000110000000000000000726F6F744E6F6465000000002E002011030000000A000011000000000000000070726F63657373696E67696E737472756374696F6E696E666F0000001E002011040000000A00001100000000000000007461736B496E666F000000001A002011050000000A00001100000000000000007461736B000000001E002011060000000A00001100000000000000007461736B466C6167730000001E002011070000000A000011000000000000000064697361626C6564000000001E002011080000000A0000110000000000000000706F6C6963795479706500001E002011090000000A00001100000000000000007461736B5479706500000000220020110A0000000A0000110000000000000000696E6974696174656446726F6D000000220020110B0000000A00001100000000000000006173736F63696174696F6E7300000000220020110C0000000A00001100000000000000006261636B75707365744E616D65000000220020110D0000000A00001100000000000000006261636B75707365744E616D65320000220020110E0000000A0000110000000000000000737562636C69656E744E616D653200001E0020110F0000000A0000110000000000000000636C69656E744E616D6532001E002011100000000A0000110000000000000000636C69656E744E616D6533001E002011110000000A0000110000000000000000636C69656E744E616D6534001A002011120000000A00001100000000000000006170704E616D65001E002011130000000A00001100000000000000006170704E616D65320000000022002011140000000A0000110000000000000000696E7374616E63654E616D65330000001E002011150000000A00001100000000000000007375625461736B73000000001A002011160000000A00001100000000000000007375625461736B001E002011170000000A00001100000000000000007375625461736B547970650022002011180000000A00001100000000000000006F7065726174696F6E547970650000001A002011190000000A00001100000000000000006F7074696F6E7300220020111A0000000A0000110000000000000000726573746F72654F7074696F6E730000220020111B0000000A000011000000000000000062726F7773654F7074696F6E000000001E0020111C0000000A0000110000000000000000636F6D6D43656C6C496400001E0020111D0000000A00001100000000000000006261636B75707365740000001E0020111E0000000A000011000000000000000074696D6552616E6765000000220020111F0000000A0000110000000000000000746F54696D6556616C756532000000001A002011200000000A00001100000000000000006E6F496D6167650022002011210000000A00001100000000000000007573654578616374496E6465780000001E002011220000000A00001100000000000000006D656469614F7074696F6E001A002011230000000A00001100000000000000006C696272617279001E002011240000000A00001100000000000000006D656469614167656E7400001E002011250000000A00001100000000000000006472697665506F6F6C00000022002011260000000A0000110000000000000000636F7079507265636564656E636500002E002011270000000A0000110000000000000000636F7079507265636564656E63654170706C696361626C650000000022002011280000000A000011000000000000000075736549534353494D6F756E740000001E002011290000000A0000110000000000000000636C69656E744E616D6536001E0020112A0000000A000011000000000000000074696D655A6F6E65000000001E0020112B0000000A000011000000000000000074696D655A6F6E65320000001E0020112C0000000A0000110000000000000000636C6F6E65456E76000000002A0020112D0000000A0000110000000000000000636C6F6E65526573727654696D65506572696F6400000000220020112E0000000A0000110000000000000000636F6D6D6F6E4D6F756E7450617468002E0020112F0000000A000011000000000000000064726F70436F6E6E656374696F6E73546F446174616261736500000022002011300000000A000011000000000000000073716C5665726966794F6E6C7900000022002011310000000A0000110000000000000000726573746F7265546F4469736B00000026002011320000000A0000110000000000000000726573746F7265546F4469736B5061746800000026002011330000000A0000110000000000000000617474616368546F53514C5365727665720000001E002011340000000A0000110000000000000000636865636B73756D0000000026002011350000000A0000110000000000000000636F6E74696E756561667465726572726F72000026002011360000000A0000110000000000000000736E61704F6F705374616765466F6C64657200002A002011370000000A0000110000000000000000726573746F72654F6E6C7946756C6C4261636B757000000022002011380000000A000011000000000000000073746167696E67496E7374616E6365002A002011390000000A00001100000000000000007669727475616C5365727665725273744F7074696F6E00002A0020113A0000000A00001100000000000000006973426C6F636B4C6576656C5265706C69636174696F6E00220020113B0000000A0000110000000000000000726573746F7265546F4469736B320000260020113C0000000A00001100000000000000006973444241726368697665526573746F726500001E0020113D0000000A000011000000000000000073796E63526573746F726500220020113E0000000A000011000000000000000076616C69646174654F6E6C7900000000260020113F0000000A0000110000000000000000636F7079546F4F626A65637453746F72650000002A002011400000000A00001100000000000000006462446174614D61736B696E674F7074696F6E730000000022002011410000000A000011000000000000000069735374616E64616C6F6E65000000002A002011420000000A0000110000000000000000636F6E74656E74496E646578696E674F7074696F6E0000002A002011430000000A0000110000000000000000737562436C69656E744261736564416E616C7974696373002E002011440000000A00001100000000000000006E6F74696679557365724F6E4A6F62436F6D706C6574696F6E00000026002011450000000A00001100000000000000007375625461736B4F7065726174696F6E0000000022002011460000000A000011000000000000000054696D655A6F6E654E616D650000000022002011470000000A000011000000000000000054696D655A6F6E654E616D65320000001E002011480000000A00001100000000000000006C6973744D656469610000001E002011490000000A000011000000000000000064657374696E6174696F6E00260020114A0000000A00001100000000000000007368617265506F696E745273744F7074696F6E00260020114B0000000A0000110000000000000000666574636853716C4461746162617365730000001E0020114C0000000A000011000000000000000064657374436C69656E740000260020114D0000000A000011000000000000000073716C5365727665725273744F7074696F6E00001A0020114E0000000A000011000000000000000064624F6E6C7900001E0020114F0000000A00001100000000000000006F766572577269746500000022002011500000000A0000110000000000000000706F696E744F6654696D65527374000022002011510000000A000011000000000000000073716C526573746F726554797065000022002011520000000A000011000000000000000073716C5265636F76657254797065000022002011530000000A000011000000000000000073746F705374617274535341000000002E002011540000000A000011000000000000000070726573657276655265706C69636174696F6E53657474696E67730022002011550000000A000011000000000000000073746F704D61726B526573746F7265002A002011560000000A000011000000000000000073746F704265666F72654D61726B526573746F726500000022002011570000000A00001100000000000000007061727469616C526573746F7265000022002011580000000A00001100000000000000006C6F675368697070696E674F6E6C79001E002011590000000A0000110000000000000000666667526573746F72650000260020115A0000000A000011000000000000000069676E6F726546756C6C4261636B7570000000001E0020115B0000000A00001100000000000000007653534261636B7570000000220020115C0000000A0000110000000000000000726573746F7265536F757263653200001E0020115D0000000A00001100000000000000006461746162617365320000001E0020115E0000000A000011000000000000000066696C654F7074696F6E0000220020115F0000000A0000110000000000000000636F6D6D6F6E4F7074696F6E7300000022002011600000000A00001100000000000000006F6E6550617373526573746F7265000026002011610000000A0000110000000000000000636C757374657244424261636B656475700000001E002011620000000A000011000000000000000061646D696E4F7074730000001E002011630000000A0000110000000000000000636F6D6D6F6E4F707473000026002011640000000A000011000000000000000064657374696E6174696F6E496E7374616E63650022002011650000000A0000110000000000000000696E7374616E63654E616D65000000001A002011660000000A0000110000000000000000746573740000000026002011670000000A0000110000000000000000646246696C65496E666F53656C656374696F6E001E002011680000000A000011000000000000000073657474696E6773000000001A002011690000000A000011000000000000000077726974657200001600031150130000B0220000B90100005D2B0000010000001E0020116C0000000A0000110000000000000000646246696C6553686F7274001600031120220000AC220000B2010000642B0000010000001E0020116D0000000A000011000000000000000073706C697446756C6C0000001A0020116E0000000A000011000000000000000064657669636500000200060002000600020006008E010404C93FEAC6B359D649BC250902BBABB460000000004D0044003200000004020000040100000C0000000D0000060406000360010000011C014D0180A10180F00181560181980181D201821601825801829E0182E001832C0183760183C201840F01845C0184A30184EA0185310185710185B20185FD01863F01867F0186C70187130187530187A10187EB0188310188750188B901890201894201898E0189D6018A16018A5C018AA0018AEE018B50018B9C018BE3018C25018C68018CAA018D04018D54018DB8018E04018E50018EA4018EF8018F3A018F90018FE60190420190920190F001915001919D0191F301923B0192850192D901933301937D0193D901943901949D0194EF0195390195840195C80196100196680196BC0197020197580197960197DA0198280198760198C401990E0199760199C6019A22019A70019AC0019B06019B58019B9C019BE9019C2C019C72019CBE019D0C019D60019DA4019DEA019E42019E8C01BD0001C000477301C000480D07BD3A09BD3A01BD3A01BD9701BDD402BE0E02BF2F00000002000600F200000048000000D80F0000010001000A00000000000000040000003C00000000000000A200008007000000A300008008000000A400008009000000A50000800900240009000A000D000E0009000A00F20000003C000000E20F0000010001000E00000000000000030000003000000000000000AA00008001000000AB0000800D000000AC00008009000A001100340009000A00F20000003C000000F00F0000010001000E00000000000000030000003000000000000000B300008001000000B40000800D000000B500008009000A001100360009000A00F2000000600F0000FE0F000001000100890F00000000000046010000540F000000000000C800008001000000C900008007000000CA0000801D000000CC00008029000000CE00008035000000CF00008042000000D00000804F000000D10000805C000000D200008069000000D300008076000000D400008083000000D500008090000000D60000809D000000D7000080AA000000D8000080B7000000D9000080C4000000DA000080D1000000DB000080DE000000DC000080EB000000DD000080F8000000DE00008005010000DF00008012010000E00000801F010000E10000802C010000E200008039010000E300008046010000E400008053010000E500008060010000E60000806D010000E70000807A010000E800008087010000E900008094010000EA000080A1010000EB000080AE010000EC000080BB010000ED000080C8010000EE000080D5010000EF000080E2010000F0000080EF010000F1000080FC010000F200008009020000F300008016020000F400008023020000F500008030020000F60000803D020000F70000804A020000F800008057020000F900008064020000FA00008071020000FB0000807E020000FC0000808B020000FD00008098020000FE000080A5020000FF000080B202000000010080BF02000001010080CC02000002010080D902000003010080E602000004010080F30200000501008000030000060100800D030000070100801A030000080100802703000009010080340300000A010080410300000B0100804E0300000C0100805B0300000D010080680300000E010080750300000F01008082030000100100808F030000110100809C03000012010080A903000013010080B603000014010080C303000015010080D003000016010080DD03000017010080EA03000018010080F703000019010080040400001A010080110400001B0100801E0400001C0100802B0400001D010080380400001E010080450400001F01008052040000200100805F040000210100806C04000022010080790400002301008086040000240100809304000025010080A004000026010080AD04000027010080BA04000028010080C704000029010080D40400002A010080E10400002B010080EE0400002C010080FB0400002D010080080500002E010080150500002F01008022050000300100802F050000310100803C0500003301008049050000340100805605000035010080630500003601008070050000370100807D050000380100808A05000039010080970500003A010080A40500003B010080B10500003C010080BE0500003D010080CB0500003E010080D80500003F010080E505000040010080F205000041010080FF050000420100800C0600004301008019060000440100802606000045010080330600004601008040060000470100804D060000480100805A06000049010080670600004A010080740600004B010080810600004C0100808E0600004D0100809B0600004E010080A80600004F010080B506000050010080C206000051010080CF06000052010080DC06000053010080E906000054010080F606000055010080030700005601008010070000570100801D070000580100802A07000059010080370700005A010080440700005B010080510700005C0100805E0700005D0100806D0700005E0100807C0700005F01008089070000600100809607000061010080A307000062010080B007000063010080BD07000064010080CA07000065010080D707000066010080E407000067010080F107000068010080FE070000690100800B0800006A010080180800006B010080250800006C010080320800006D0100803F0800006E0100804C0800006F01008059080000700100806608000071010080730800007201008080080000730100808D0800007501008095080000760100809D08000077010080A508000078010080AE08000079010080B80800007A010080C20800007B010080CC0800007C010080D60800007D010080E00800007E010080EA0800007F010080F408000080010080FD08000081010080070900008201008011090000830100801B0900008401008025090000850100802F09000086010080380900008701008042090000880100804C09000089010080560900008A010080600900008B0100806A0900008C010080740900008D0100807E0900008E010080880900008F01008092090000900100809C09000091010080A609000092010080B009000093010080BA09000094010080C409000095010080CE09000096010080D809000097010080E209000098010080EC09000099010080F60900009A010080000A00009B0100800A0A00009C010080140A00009D0100801E0A00009E010080280A00009F010080320A0000A00100803C0A0000A1010080460A0000A2010080500A0000A30100805A0A0000A4010080640A0000A50100806E0A0000A6010080780A0000A7010080820A0000A80100808C0A0000A9010080960A0000AA010080A00A0000AB010080AA0A0000AC010080B40A0000AD010080BE0A0000AE010080C80A0000AF010080D20A0000B0010080DC0A0000B1010080E60A0000B2010080F00A0000B3010080FA0A0000B4010080040B0000B50100800E0B0000B6010080180B0000B7010080220B0000B80100802C0B0000B9010080360B0000BA010080400B0000BB0100804A0B0000BD0100804D0B0000BE010080500B0000C1010080630B0000C2010080640B0000C20100806B0B0000EEEFFE80700B0000C2010080770B0000C3010080780B0000C4010080910B0000C5010080A70B0000EEEFFE80AB0B0000C5010080AC0B0000C5010080C40B0000C5010080C50B0000C6010080DB0B0000EEEFFE80DF0B0000C6010080E00B0000C6010080F80B0000C6010080F90B0000C70100800F0C0000EEEFFE80130C0000C7010080140C0000C70100802C0C0000C70100802D0C0000C90100803A0C0000CD0100804A0C0000EEEFFE80510C0000CD010080520C0000CE010080DA0C0000CF010080E00C0000D0010080E10C0000EEEFFE80E60C0000D2010080E70C0000D3010081F70C0000EEEFFE80FE0C0000D4010080FF0C0000D4010080870D0000D50100808D0D0000D60100808E0D0000EEEFFE80900D0000D7010080910D0000D7010080FA0D0000D7010080FB0D0000D8010080FC0D0000DA010080060E0000DB010080070E0000EEEFFE800D0E0000C2010080180E0000DD010080220E0000DE0100802C0E0000DF010080360E0000E0010080400E0000E10100804A0E0000E2010080540E0000E30100805E0E0000E4010080680E0000E5010080720E0000E60100807C0E0000E7010080860E0000E8010080900E0000E90100809A0E0000EA010080A40E0000EB010080AE0E0000EC010080B80E0000ED010080C20E0000EE010080CC0E0000EF010080D60E0000F0010080E00E0000F1010080EA0E0000F2010080F40E0000F3010080FE0E0000F4010080080F0000F5010080120F0000F60100801C0F0000F7010080260F0000F8010080300F0000F90100803A0F0000FA010080440F0000FB0100804E0F0000FD010080550F0000FE010080630F0000FF0100806C0F000000020080770F000001020080800F000002020080880F00000302008009000A000D0034000D0051000D004C000D0041000D0039000D0043000D0041000D0045000D0041000D004B000D003B000D0043000D0049000D004B000D004C000D004C000D0046000D0046000D0046000D0046000D003F000D0040000D004A000D004A000D0041000D003F000D0047000D004B000D003F000D004D000D0049000D0045000D0043000D0043000D0048000D003F000D004B000D0047000D003F000D0045000D0043000D003B000D004D000D004E000D0061000D0063000D0057000D0046000D0041000D0042000D0049000D004A000D0043000D0047000D0045000D0057000D0055000D003D000D0043000D004D000D004D000D004D000D0049000D0067000D004F000D005B000D004D000D004F000D0045000D0051000D0043000D004C000D0042000D004F000D0045000D0041000D004B000D005F000D0071000D0061000D0067000D005B000D004D000D003D000D0061000D0055000D0053000D0043000D0049000D0045000D0047000D005B000D0041000D0055000D0047000D0055000D0057000D004B000D003B000D0039000D0041000D004F000D004D000D002A000D0036000D002E000D0035000D003A000D003B000D002B000D0028000D0028000D0028000D0028000D002E000D002F000D002A000D002A000D002F000D0031000D0028000D0029000D0028000D002F000D003A000D0065000D0066000D002B000D0028000D002A000D0030000D003B000D0038000D002E000D003D000D0031000D0037000D0030000D0031000D002C000D0032000D002B000D0031000D0030000D0033000D003C000D0037000D0026000D0037000D002D000D0028000D0038000D0042000D003A000D003D000D0037000D0028000D003A000D0034000D0037000D0027000D0033000D002F000D0030000D002E000D0025000D0031000D002B000D0029000D002A000D002C000D0028000D0029000D002D000D002A000D0028000D002D000D0025000D002A000D0030000D0035000D0036000D0033000D002F000D0035000D002C000D002B000D002E000D0030000D002B000D0031000D002C000D0036000D0035000D003C000D0034000D0037000D0032000D0031000D0031000D002F000D0035000D0033000D0030000D0031000D0030000D0033000D0031000D002E000D0031000D0030000D002C000D0035000D003A000D003A000D0042000D0043000D0039000D0030000D0031000D0031000D003A000D003A000D0037000D003C000D0034000D0037000D003C000D003C000D003C000D003A000D0049000D003D000D0043000D003C000D003D000D0038000D003E000D0037000D001C000D001C000D0042000D0014002C003F0000000000160028000D000E001100470011003C00000000003D003E003F0070007100720011003C00000000003D003E003F007000710072001100430000000000440045004600850086008700110041001100330000000000340035001500E400150029001100120000000000110012001500370000000000380039003A00090119002D0015001600000000001A001B001C00C700C800C90011001200110038000D000E000000000029002B000D003C000D0037000D0037000D003D000D0032000D002E000D0040000D0049000D0041000D0044000D003E000D0037000D002F000D0041000D003B000D003A000D0031000D002D000D0031000D003C000D002F000D0039000D0031000D0039000D003A000D0034000D002E000D002D000D0028000D0036000D0034000D0042000D0039000D0024000D004D000D0021000D001C0009000A00F2000000AC0E0000871F000001000100DE0E00000000000037010000A00E00000000000010020080010000001102008007000000120200801D000000140200802900000016020080350000001802008042000000190200804F0000001A0200805C0000001B020080690000001C020080760000001D020080830000001E020080900000001F0200809D00000020020080AA00000021020080B700000022020080C400000023020080D100000024020080DE00000025020080EB00000026020080F800000027020080050100002802008012010000290200801F0100002A0200802C0100002B020080390100002C020080460100002D020080530100002E020080600100002F0200806D010000300200807A0100003102008087010000320200809401000033020080A101000034020080AE01000035020080BB01000036020080C801000037020080D501000038020080E201000039020080EF0100003A020080FC0100003B020080090200003C020080160200003D020080230200003E020080300200003F0200803D020000400200804A020000410200805702000042020080640200004302008071020000440200807E020000450200808B020000460200809802000047020080A502000048020080B202000049020080BF0200004A020080CC0200004B020080D90200004C020080E60200004D020080F30200004E020080000300004F0200800D030000500200801A030000510200802703000052020080340300005302008041030000540200804E030000550200805B030000560200806803000057020080750300005802008082030000590200808F0300005A0200809C0300005B020080A90300005C020080B60300005D020080C30300005E020080D00300005F020080DD03000060020080EA03000061020080F703000062020080040400006302008011040000640200801E040000650200802B040000660200803804000067020080450400006802008052040000690200805F0400006A0200806C0400006B020080790400006C020080860400006D020080930400006E020080A00400006F020080AD04000070020080BA04000071020080C704000072020080D404000073020080E104000074020080EE04000075020080FB040000760200800805000077020080150500007802008022050000790200802F0500007A0200803C0500007C020080490500007D020080560500007E020080630500007F02008070050000800200807D050000810200808A050000820200809705000083020080A405000084020080B105000085020080BE05000086020080CB05000087020080D805000088020080E505000089020080F20500008A020080FF0500008B0200800C0600008C020080190600008D020080260600008E020080330600008F02008040060000900200804D060000910200805A060000920200806706000093020080740600009402008081060000950200808E060000960200809B06000097020080A806000098020080B506000099020080C20600009A020080D60600009B020080E30600009C020080F00600009D020080FD0600009E0200800A0700009F02008017070000A002008024070000A102008031070000A20200803E070000A30200804B070000A402008058070000A502008065070000A602008072070000A70200807F070000A80200808C070000A902008099070000AA020080A6070000AB020080B3070000AC020080C0070000AD020080CD070000AE020080DA070000AF020080E7070000B0020080F4070000B102008003080000B202008012080000B30200801F080000B40200802C080000B502008039080000B602008046080000B702008053080000B802008060080000B90200806D080000BA0200807A080000BB02008087080000BC02008094080000BD020080A1080000BE020080AE080000BF020080BB080000C2020080C3080000C3020080CB080000C4020080D3080000C5020080DC080000C6020080E6080000C7020080F0080000C8020080FA080000C902008004090000CA0200800E090000CB02008018090000CC02008022090000CD0200802C090000CE02008036090000CF02008040090000D00200804A090000D102008054090000D20200805E090000D302008068090000D402008072090000D50200807C090000D602008086090000D702008090090000D80200809A090000D9020080A4090000DA020080AE090000DB020080B8090000DC020080C2090000DD020080CC090000DE020080D6090000DF020080E0090000E0020080EA090000E1020080F4090000E2020080FE090000E3020080080A0000E4020080120A0000E50200801C0A0000E6020080260A0000E7020080300A0000E80200803A0A0000E9020080440A0000EA0200804E0A0000EB020080580A0000EC020080620A0000ED0200806C0A0000EE020080760A0000EF020080800A0000F00200808A0A0000F1020080940A0000F20200809E0A0000F3020080A80A0000F4020080B20A0000F5020080BC0A0000F6020080C60A0000F7020080D00A0000F8020080DA0A0000F9020080E40A0000FA020080EE0A0000FB020080F80A0000FC020080020B0000FD0200800C0B0000FE020080160B0000FF020080200B0000000300802A0B000001030080340B0000020300803E0B000003030080480B000004030080520B0000050300805C0B000006030080660B000007030080700B0000080300807A0B000009030080840B00000A0300808E0B00000B030080980B00000C030080A20B00000D030080AC0B00000E030080B60B000011030080C90B000012030080CA0B000012030080D10B0000EEEFFE80D60B000012030080DD0B000013030080DE0B000014030080F20B000015030080FF0B0000160300800F0C0000EEEFFE80130C000016030080140C000016030080890C0000160300808A0C0000EEEFFE808F0C000017030080900C000018030080A00C0000EEEFFE80A40C000018030080A50C0000180300801A0D0000180300801B0D0000EEEFFE801D0D0000190300801E0D000019030080820D000019030080830D00001A030080840D00001B0300808E0D00001C0300808F0D0000EEEFFE80950D000012030080A00D00001E030080AA0D00001F030080B40D000020030080BE0D000021030080C80D000022030080D20D000023030080DC0D000024030080E60D000025030080F00D000026030080FA0D000027030080040E0000280300800E0E000029030080180E00002A030080220E00002B0300802C0E00002C030080360E00002D030080400E00002E0300804A0E00002F030080540E0000300300805E0E000031030080680E000032030080720E0000330300807C0E000034030080860E000035030080900E0000360300809A0E000038030080A40E00003A030080AB0E00003B030080B90E00003C030080C20E00003D030080CC0E00003E030080D50E00003F030080DD0E00004003008009000A000D0034000D0051000D004C000D0063000D0041000D0039000D0043000D0041000D0045000D0041000D004B000D0049000D004B000D004C000D004C000D0046000D0046000D0046000D003F000D0040000D004A000D0041000D003F000D0047000D004B000D003F000D004D000D0049000D0045000D0043000D0043000D0048000D003F000D004B000D0047000D003F000D0045000D0043000D004D000D0061000D004B000D0046000D0041000D0042000D0041000D0059000D004F000D0063000D004B000D004B000D0053000D0053000D0041000D0055000D0055000D005B000D004F000D005D000D005F000D004C000D0055000D0047000D0049000D0053000D0059000D0049000D005B000D005F000D0063000D0051000D0049000D004A000D0043000D0047000D0057000D0053000D0045000D0055000D003D000D0043000D004D000D004D000D004D000D0049000D0067000D004F000D005B000D004D000D004F000D0045000D0051000D0043000D004C000D0042000D0045000D004B000D004D000D0053000D0043000D0045000D0057000D0049000D003F000D002A000D0036000D002E000D0035000D003A000D003B000D002B000D0028000D0028000D0031000D0033000D002E000D002F000D002A000D002F000D0031000D0028000D0029000D0028000D002F000D003A000D002F000D0065000D0066000D002A000D0032000D002C000D003A000D002F000D002E000D0052000D0033000D002A000D0034000D002F000D0037000D002B000D0028000D002B000D0030000D003B000D0038000D002E000D003D000D0031000D0037000D0030000D0031000D002C000D0032000D002B000D0030000D0033000D003C000D0037000D0028000D0039000D0030000D0034000D002D000D002E000D0033000D002E000D0039000D003B000D0036000D0032000D002A000D0029000D002A000D003D000D002C000D0028000D0029000D002D000D002A000D0028000D002D000D0030000D0035000D0036000D0033000D002F000D0035000D002C000D002B000D002E000D0030000D002B000D0034000D0031000D002C000D003A000D0048000D002D000D003F000D0036000D0035000D0031000D0031000D003A000D003A000D0037000D003B000D003D000D0040000D003C000D0040000D0049000D0034000D0037000D003E000D003C000D0032000D0031000D0031000D002F000D0035000D0033000D0030000D0031000D0030000D0033000D0031000D002E000D0031000D0030000D0035000D0042000D0034000D0030000D0034000D0037000D003C000D003C000D003C000D003A000D0049000D003D000D0043000D003C000D003D000D0038000D003E000D0037000D0042000D0014002C003F0000000000160028000D000E0011003D0011004100110033000000000034003500360002010301040100000000160017001500370000000000380039003A00060107010801000000001A001B001C00D500D500D60011001200110038000D000E000000000029002B000D003C000D0037000D0037000D0032000D0036000D0042000D003D000D0047000D003B000D003B000D003F000D003F000D0036000D0040000D0040000D0043000D003D000D0037000D003A000D0037000D003B000D0034000D0035000D003A000D002A000D002D000D0042000D0039000D0024000D004D000D0021000D001C0009000A00F40000000800000012010000000000002800000020020000340200004C0200007002000088020000AC020000C4020000F00200000803000034030000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000FFFFFFFF1A092FF1F000000078020000610100000100000039000000010000004D020000010000009D01000001000000F100000001000000F102000001000000B50100000100000021020000010000002901000001000000C502000001000000C10000000100000035030000010000000902000001000000AD0200000100000021000000010000007100000001000000D901000001000000350200000100000071020000010000004101000001000000A1000000010000000100000001000000D900000001000000F101000001000000590000000100000089000000010000008902000001000000790100000100000009030000010000000901000001000000010000008000000000000000100000000000000000000000000000000000000001040000000000000000000000000000000000000000000000000000000000000000000002000000000000000000004000020000000000000000000000000000050400000200000000000000000000000000000000000000000000000000000001040000000000000000000000000000000000000000000000000000000000000100000000000000000000000000080000000000000000000000000000000000010400000000000000000000000000000000000000000000000000000000000000040000000000000000000000000000000000000000000000000000000001000020000000000000000000000000000000004000000000000000000000000000000000000000000000000000000400000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000040000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000010000000000000000000000C0000001800000024000000300000003C0000004800000054000000600000006C0000007800000084000000900000009C000000A8000000B4000000C0000000CC000000D8000000E4000000F0000000FC00000008010000200100002C0100003801000044010000500100005C010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001E00251100000000040000000200436F6D6D7661756C745F4C6F67696E0000001600291100000000040000000200303630303030303700001E00251100000000D40100000200436F6D6D7661756C745F4C6F676F757400001600291100000000D40100000200303630303030303800001600251100000000B00200000200457869737473000000001600291100000000B00200000200303630303030303900001E002511000000002003000002005665726966795369676E61747572650000001600291100000000200300000200303630303030306100001600251100000000D803000002002E6363746F72000000001600291100000000D80300000200303630303030306300001E00251100000000040000000100436F6D6D7661756C745F4261636B757000001600291100000000040000000100303630303030303100001E00251100000000F00300000100436F6D6D7661756C745F526573746F7265001600291100000000F003000001003036303030303032000022002511000000009C0600000100436F6D6D7661756C745F4A6F625F537461747573000016002911000000009C0600000100303630303030303300002200251100000000A80700000100436F6D6D7661756C745F4A6F625F4B696C6C000000001600291100000000A807000001003036303030303034000016002511000000008408000001002E6310000000000000000000000000000000000000000000000000000000FFFFFFFF1A092FF1000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000063746F720000000016002911000000008408000001003036303030303036000012002511000000000400000003002E63746F72001600291100000000040000000300303630303030306400002200251100000000D800000003004372656174654261636B757054656D706C61746500001600291100000000D800000003003036303030303065000022002511000000004C0100000300437265617465526573746F726554656D706C6174650016002911000000004C0100000300303630303030306600002A00251100000000C00100000300437265617465526573746F7265576974684D6F766554656D706C617465001600291100000000C00100000300303630303030313000002A00251100000000081300000300437265617465526573746F7265546F46696C6554656D706C617465000000160029110000000008130000030030363030303031310000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000FFFFFFFF770931010100000014001E8E1500F0771600000000020000A80100002C000000A0010000000000000000000016000000190000000000EEC00000000000000000FFFF000000000000FFFFFFFF00000000FFFF0000000000000000000000001100E8080000000000003C0E000001000000000000000000000000000000444241436F6D6D7661756C7400313737424644313700000000000000FFFF000000000000FFFFFFFF00000000FFFF00000000000000000000000010003C040000000000009404000001000000000000000000000000000000444241436F6D6D7661756C744261736500303945323543343400000000000000FFFF000000000000FFFFFFFF00000000FFFF00000000000000000000000013004C24000000000000041F0000010000000000000000000000000000004442412E436F6D6D7661756C742E584D4C54656D706C6174654D616E6167657200323641383232433500000000000000FFFF000000000000FFFFFFFF00000000FFFF00000000000000000000000009005C0000000000000000000000000000000000000000000000000000002A20436F6D70696C6572496E666F202A00383646353230373900000000000000FFFF000000000000FFFFFFFF00000000FFFF0000000000000000000000001200040000000000000018000000020000000000000000000000000000003C44616E676C696E67446F63756D656E74732A32323333343362642D613835392D343161332D393063302D3964666131303166316139353E0037464244413244320000002DBA2EF10100000000000000960400000000000000000000000000000000000001000000960400009804000000000000000000000000000000000000010000002E090000F80100000000000000000000000000000000000001000000260B00003501000000000000000000000000000000000000010000005B0C00000B0000000000000000000000000000000000000001000000660C0000E801000000000000010000000000000000000000010000004E0E0000F70000000000000001000000000000000000000001000000450F00004700000000000000010000000000000000000000010000008C0F00002E0000000000000001000000000000000000000001000000BA0F00001E0000000000000001000000000000000000000001000000D80F00000A0000000000000002000000000000000000000001000000E20F00000E0000000000000002000000000000000000000001000000F00F00000E0000000000000002000000000000000000000001000000FE0F0000890F00000000000002000000000000000000000001000000871F0000DE0E000000000000020000000000000000000000020002000D01000000000100FFFFFFFF00000000652E00000802000000000000FFFFFFFF00000000FFFFFFFF05000500000001000200030003000100010001000000020046000000000000002901000088000000D5000000433A5C6465765C7265706F735C7466735F4442412E546F6F6C735C4D61696E5C434C525C4442412E436F6D6D7661756C745C444241436F6D6D7661756C74426173652E637300433A5C6465765C7265706F735C7466735F4442412E546F6F6C735C4D61696E5C434C525C4442412E436F6D6D7661756C745C444241436F6D6D7661756C742E637300433A5C6465765C7265706F735C7466735F4442412E546F6F6C735C4D61696E5C434C525C4442412E436F6D6D7661756C745C50726F706572746965735C417373656D626C79496E666F2E637300433A5C55736572735C75703230383730305C417070446174615C4C6F63616C5C54656D705C2E4E45544672616D65776F726B2C56657273696F6E3D76342E382E53716C436C72417474726962757465732E637300433A5C6465765C7265706F735C7466735F4442412E546F6F6C735C4D61696E5C434C525C4442412E436F6D6D7661756C745C584D4C54656D706C6174654D616E616765722E637300000000FEEFFEEF010000000100000000010000000000000000000000FFFFFFFFFFFFFFFFFFFF0F00FFFFFFFFFFFFFFFFFFFF0000000000000000000000000000000000000000000000000000000000942E3101918EAE6401000000E519C7734F9AB9488C65CC7EA866AB8CD30100002F4C696E6B496E666F002F544D4361636865002F6E616D6573002F7372632F686561646572626C6F636B002F7372632F66696C65732F633A5C6465765C7265706F735C7466735F6462612E746F6F6C735C6D61696E5C636C725C6462612E636F6D6D7661756C745C646261636F6D6D7661756C742E6373002F7372632F66696C65732F633A5C6465765C7265706F735C7466735F6462612E746F6F6C735C6D61696E5C636C725C6462612E636F6D6D7661756C745C646261636F6D6D7661756C74626173652E6373002F7372632F66696C65732F633A5C6465765C7265706F735C7466735F6462612E746F6F6C735C6D61696E5C636C725C6462612E636F6D6D7661756C745C786D6C74656D706C6174656D616E616765722E6373002F7372632F66696C65732F633A5C6465765C7265706F735C7466735F6462612E746F6F6C735C6D61696E5C636C725C6462612E636F6D6D7661756C745C70726F706572746965735C617373656D626C79696E666F2E6373002F7372632F66696C65732F633A5C75736572735C75703230383730305C617070646174615C6C6F63616C5C74656D705C2E6E65746672616D65776F726B2C76657273696F6E3D76342E382E73716C636C72617474726962757465732E637300090000000E00000001000000EA0F000000000000780000000B000000C90000000C0000001300000007000000740100000E00000000000000050000000A000000060000001A000000080000001C0100000D0000002B0000000A00000000000000DC513301000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000017000000280000005702000038000000E30500003800000000000000000000003C0300003001000060000000680000006800000068000000680000006800000028000000FC08000050170000200000007C430000780300002C0000004C030000070000004F00000050000000030000004C0000004D0000004E00000004000000100000001100000012000000090000000A0000000B0000000C0000000D0000000E0000000F000000130000001400000015000000160000001700000018000000190000001A0000001B0000001C0000001D0000001E0000001F000000200000002100000022000000230000002400000025000000260000002700000028000000290000002A0000002B0000002C0000002D0000002E0000002F000000300000003100000032000000330000003400000035000000360000003700000038000000390000003A0000003B0000003C0000003D0000003E0000003F0000004000000041000000420000004300000044000000450000004600000047000000480000004A000000490000004B00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000005100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 AS N'DBA.Commvault.pdb'; + +GO +PRINT N'Creating Function [dba].[Commvault_Backup]...'; + + +GO +CREATE FUNCTION [dba].[Commvault_Backup] (@clientName NVARCHAR(MAX), + @instanceName NVARCHAR(MAX), + @subclientName NVARCHAR(MAX), + @backupLevel NVARCHAR(MAX), + @databasetobackup NVARCHAR(MAX), + @tokenstring NVARCHAR(MAX)) +RETURNS NVARCHAR(MAX) +AS +EXTERNAL NAME [DBA.Commvault].[DBACommvault].[Commvault_Backup]; + + +GO +PRINT N'Creating Function [dba].[Commvault_Restore]...'; + + +GO +CREATE FUNCTION [dba].[Commvault_Restore] (@clientName NVARCHAR(MAX), + @instanceName NVARCHAR(MAX), + @toTimeValue NVARCHAR(MAX), + @restoreSource NVARCHAR(MAX), + @newDatabaseName NVARCHAR(MAX), + @destinationInstance_clientName NVARCHAR(MAX), + @destinationInstance_instanceName NVARCHAR(MAX), + @dbFileinfo NVARCHAR(MAX), + @in_targetMDFPath NVARCHAR(MAX), + @in_targetLDFPath NVARCHAR(MAX), + @in_targetFileStreamPath NVARCHAR(MAX), + @in_fileRestore BIT, + @in_databaseRestore BIT, + @tokenstring NVARCHAR(MAX)) +RETURNS NVARCHAR(MAX) +AS +EXTERNAL NAME [DBA.Commvault].[DBACommvault].[Commvault_Restore]; + + +GO +PRINT N'Creating Function [dba].[Commvault_Job_Status]...'; + + +GO +CREATE FUNCTION [dba].[Commvault_Job_Status] (@jobID NVARCHAR(MAX), + @colfilter NVARCHAR(MAX), + @tokenstring NVARCHAR(MAX)) +RETURNS NVARCHAR(MAX) +AS +EXTERNAL NAME [DBA.Commvault].[DBACommvault].[Commvault_Job_Status]; + + +GO +PRINT N'Creating Function [dba].[Commvault_Job_Kill]...'; + + +GO +CREATE FUNCTION [dba].[Commvault_Job_Kill] (@jobID NVARCHAR(MAX), + @tokenstring NVARCHAR(MAX)) +RETURNS INT +AS +EXTERNAL NAME [DBA.Commvault].[DBACommvault].[Commvault_Job_Kill]; + + +GO +PRINT N'Creating Function [dba].[Commvault_Login]...'; + + +GO +CREATE FUNCTION [dba].[Commvault_Login] (@login NVARCHAR(MAX), + @password NVARCHAR(MAX)) +RETURNS NVARCHAR(MAX) +AS +EXTERNAL NAME [DBA.Commvault].[DBACommvaultBase].[Commvault_Login]; + + +GO +PRINT N'Creating Function [dba].[Commvault_Logout]...'; + + +GO +CREATE FUNCTION [dba].[Commvault_Logout] (@tokenstring NVARCHAR(MAX)) +RETURNS INT +AS +EXTERNAL NAME [DBA.Commvault].[DBACommvaultBase].[Commvault_Logout]; + + +GO +PRINT N'Creating Function [dba].[Commvault_File_Exists]...'; + + +GO +CREATE FUNCTION [dba].[Commvault_File_Exists] (@path NVARCHAR(MAX)) +RETURNS BIT +AS +EXTERNAL NAME [DBA.Commvault].[DBACommvaultBase].[Exists]; + +GO + +/* CREATE SP Commvault_Operation */ + +IF EXISTS ( SELECT * + FROM sys.objects o + JOIN sys.schemas s + ON o.schema_id = s.schema_id + WHERE o.name = 'Commvault_Operation' + AND OBJECTPROPERTY(object_id, N'IsProcedure') = 1 + AND s.name = 'dba') + DROP PROCEDURE [dba].[Commvault_Operation]; +GO + +SET ANSI_NULLS ON; +GO + +SET QUOTED_IDENTIFIER ON; +GO + +CREATE PROCEDURE [dba].[Commvault_Operation] + @in_type VARCHAR(7), + @in_username VARCHAR(20), + @in_password VARCHAR(255), + @in_callerApp VARCHAR(255), + @in_subclientName VARCHAR(20) = NULL, + @in_backupLevel VARCHAR(20) = 'Full', + @in_databasetobackup VARCHAR(MAX) = NULL, + @in_toTimeValue VARCHAR(20) = NULL, + @in_restoreSource VARCHAR(50) = NULL, + @in_newDatabaseName VARCHAR(50) = NULL, + @in_destinationInstance_clientName VARCHAR(50) = NULL, + @in_destinationInstance_instanceName VARCHAR(50) = NULL, + @in_targetMDFPath VARCHAR(MAX) = NULL, + @in_targetLDFPath VARCHAR(MAX) = NULL, + @in_targetFileStreamPath VARCHAR(MAX) = NULL, + @in_fileRestore BIT = NULL, + @in_databaseRestore BIT = NULL, + @in_maxRuntime int = 480, + @in_checkInterval int = 60 +WITH ENCRYPTION +AS +/*============================================================================= + + Explication du traitement realise par la SP + ------------------------------------------- + Cette SP est utilisee pour effectuer des operations dans Commvault (backup/restore). + La CLR dba_CLR_Commvault dans HCITools est un prerequis! + + Parametres + ---------- + + @in_type = Indiquer Backup ou Restore selon le type souhaite. Parametre requis + @in_username = Le nom d'utilisateur qui sera utilise lors des connexions a Commvault. Parametre requis + @in_callerApp = Le nom du programme appelant (par ex: TriaPharmMSI) + @in_password = Le password qui sera utilise lors des connexions a Commvault. Parametre requis + @in_subclientName = Le subclient souhaite lors des operations de backups dans Commvault (pas besoin d'indiquer pour le subclient default) + @in_backupLevel = Le niveau de backup souhaite (Full par default si rien indique) + @in_databasetobackup = La liste des base a sauvegarder selon une liste separee par des , + @in_toTimeValue = La date et l'heure souhaitee lors d'une operation de restore. Parametre requis + @in_restoreSource = Nom de la base de donnees a restorer. Parametre requis si type = Restore + @in_newDatabaseName = Nom de la nouvelle base de donnees si le restore doit etre fait avec un move (autre serveur ou/et autre nom de base) + @in_destinationInstance_clientName = Nom du client officiel de Commvault pour la machine ou le restore doit etre effectue (ex: SCVNB502VM01) + @in_destinationInstance_instanceName = Nom de l'instance SQL ou le restore doit etre effectue (ex: SCVNB502VM01\APSSQL) + @in_targetMDFPath = Path ou les fichiers MDF/NDF seront restore + @in_targetLDFPath = Path ou les fichiers LDF seront restore + @in_targetFileStreamPath = Path ou definir le filestream + @in_fileRestore = Activation du mode restore to file (1 = actif) Parametre requis si restore en mode fichier + @in_databaseRestore = Activation du mode restore to a SQL database (1 = actif) Parametre requis si restore en mode SQL + @in_maxRuntime = Total en minutes du temps alloue pour une operation + @in_checkInterval = Nombre de secondes entre les verifications du traitement en cours sur le serveur Commvault + + Creation : 04.01.2022 / SPE + + Modifications : 31.10.2022 / SPE - OCTPDBA-356: Add Restore to file procedure in DBA Commvault CLR + 20.04.2023 / SPE - OCTPDBA-567: Modify Commvault SP to remove the timeout and the kill session + 11.07.2023 / TSC - OCTPDBA-699: returning a lower case version of the path to the files + +=============================================================================*/ + +SET NOCOUNT ON; + +/*------------------- Declaration des variables --------------------*/ +DECLARE @token VARCHAR(MAX), + @dbFileinfo VARCHAR(MAX) = '', + @databasetobackup VARCHAR(MAX), + @jobERRORMessage VARCHAR(MAX), + @warningMessage VARCHAR(MAX), + @ErrorMessage NVARCHAR(4000), + @dbFile VARCHAR(255), + @jobSTATUS VARCHAR(255), + @databaseName VARCHAR(255), + @jobID VARCHAR(50), + @clientName VARCHAR(50), + @instanceName VARCHAR(50), + @endstatus VARCHAR(12), + @interval CHAR(8), + @endtime DATETIME2(0), + @dateend DATETIME2(0), + @errno INT, + @ErrorState INT, + @ErrorSeverity INT, + @pos INT, + @len INT, + @returnCode TINYINT, + @logoutcode TINYINT, + @killStatus TINYINT; + + + + +/*-------------------------- Verifications des variables d'entree ---------------------------*/ +IF @in_type IS NULL +BEGIN + SET @errno = 1; + SET @ErrorMessage = N'You must provide Backup or Restore in parameter @in_type!'; + RAISERROR(@ErrorMessage, 16, 1); + RETURN (@errno); +END; + +IF ((@in_type <> 'Backup') AND (@in_type <> 'Restore')) +BEGIN + SET @errno = 2; + SET @ErrorMessage = N'You must provide Backup or Restore in parameter @in_type!'; + RAISERROR(@ErrorMessage, 16, 1); + RETURN (@errno); +END; + +IF @in_username IS NULL +BEGIN + SET @errno = 3; + SET @ErrorMessage = N'You must provide the Commvault username in parameter @in_username!'; + RAISERROR(@ErrorMessage, 16, 1); + RETURN (@errno); +END; + +IF @in_password IS NULL +BEGIN + SET @errno = 4; + SET @ErrorMessage = N'You must provide the Commvault password in parameter @in_password!'; + RAISERROR(@ErrorMessage, 16, 1); + RETURN (@errno); +END; + +IF @in_callerApp IS NULL +BEGIN + SET @errno = 5; + SET @ErrorMessage = N'You must provide the application who call this SP in parameter @in_callerApp!'; + RAISERROR(@ErrorMessage, 16, 1); + RETURN (@errno); +END; + +IF @in_type = 'Restore' +AND @in_toTimeValue IS NULL +AND @in_callerApp IS NULL +BEGIN + SET @errno = 6; + SET @ErrorMessage + = N'You must provide time for the restore in parameter @in_toTimeValue or specify the caller application in @in_callerApp!'; + RAISERROR(@ErrorMessage, 16, 1); + RETURN (@errno); +END; + +IF @in_type = 'Restore' +AND NOT EXISTS ( SELECT * + FROM sys.databases + WHERE name = @in_restoreSource) +BEGIN + SET @errno = 7; + SET @ErrorMessage = N'You must provide an existing database name for the restore in parameter @in_restoreSource!'; + RAISERROR(@ErrorMessage, 16, 1); + RETURN (@errno); +END; + + + + +/*------------ Affectation des parametres aux variables ------------*/ + +SELECT @instanceName = CONVERT(sysname, SERVERPROPERTY('ServerName')); +SELECT @clientName = CONVERT(sysname, SERVERPROPERTY('MachineName')); +SET @pos = 0; +SET @len = 0; +SET @endstatus = 'successfully'; +SET @returnCode = 0; +SET @warningMessage = ''; +SET @jobERRORMessage = ''; + + +/*-------------------------- Traitement ---------------------------*/ + + +/* Check if Commvault_last_app_backup exist in HCITools */ +IF NOT EXISTS ( SELECT 1 + FROM sys.tables t + JOIN sys.schemas s + ON s.schema_id = t.schema_id + WHERE t.name = 'Commvault_last_app_backup' + AND s.name = 'dba') +BEGIN + SET @errno = 8; + SET @ErrorMessage = N'Table Commvault_last_app_backup not exists on HCITools!'; + RAISERROR(@ErrorMessage, 16, 1); + RETURN (@errno); +END; + +/* COMMVAULT LOGIN */ +BEGIN TRY + SELECT @token = [dba].[Commvault_Login](@in_username, @in_password); + PRINT 'LOGIN Success'; +END TRY +BEGIN CATCH + SELECT @ErrorMessage = ERROR_MESSAGE(), + @ErrorSeverity = ERROR_SEVERITY(), + @ErrorState = ERROR_STATE(); + RAISERROR(@ErrorMessage, @ErrorSeverity, @ErrorState); + RETURN; +END CATCH; + + +BEGIN TRY + + IF @in_type = 'Backup' + BEGIN + + /* Check list of database to backup and set warning if db missing */ + SET @databasetobackup = @in_databasetobackup + ','; + + WHILE CHARINDEX(',', @databasetobackup, @pos + 1) > 0 + BEGIN + SET @len = CHARINDEX(',', @databasetobackup, @pos + 1) - @pos; + SET @databaseName = SUBSTRING(@databasetobackup, @pos, @len); + + IF NOT EXISTS (SELECT 1 FROM sys.databases WHERE name = @databaseName) + BEGIN + SET @endstatus = 'with WARNING'; + SET @returnCode = 1; + PRINT 'WARNING: The database ' + @databaseName + ' not exists on this SQL instance!'; + IF @warningMessage = '' + BEGIN + SET @warningMessage = 'The database ' + @databaseName + ' not exists on this SQL instance!'; + END; + ELSE + BEGIN + SET @warningMessage + = @warningMessage + ' | The database ' + @databaseName + ' not exists on this SQL instance!'; + END; + END; + + SET @pos = CHARINDEX(',', @databasetobackup, @pos + @len) + 1; + END; + + /* COMMVAULT BACKUP */ + SELECT @jobID + = [dba].[Commvault_Backup]( + @clientName, + @instanceName, + ISNULL(@in_subclientName, ''), + ISNULL(@in_backupLevel, ''), + ISNULL(@in_databasetobackup, ''), + @token); + PRINT 'Job ID: ' + @jobID; + + END; + + IF @in_type = 'Restore' + BEGIN + IF @in_toTimeValue IS NULL + BEGIN + SELECT @in_toTimeValue = CLAB_lastBackupTime + FROM dba.Commvault_last_app_backup + WHERE CLAB_name = @in_callerApp; + END; + + IF @in_toTimeValue IS NULL + BEGIN + SET @errno = 9; + SET @ErrorMessage = N'Impossible to get the last backup time!'; + RAISERROR(@ErrorMessage, 16, 1); + RETURN (@errno); + END; + + DECLARE c_device CURSOR LOCAL FORWARD_ONLY STATIC FOR + SELECT mf.[name] + ',' + mf.[physical_name] + FROM sys.master_files mf + JOIN sys.databases d + ON d.database_id = mf.database_id + WHERE d.name = @in_restoreSource; + OPEN c_device; + FETCH NEXT FROM c_device + INTO @dbFile; + + WHILE @@fetch_status <> -1 + BEGIN + SET @dbFileinfo = @dbFileinfo + @dbFile + '|'; + FETCH NEXT FROM c_device + INTO @dbFile; + END; + + CLOSE c_device; + DEALLOCATE c_device; + + SELECT @dbFileinfo = LOWER(LEFT(@dbFileinfo, NULLIF(LEN(@dbFileinfo) - 1, -1))); + + /* COMMVAULT RESTORE */ + SELECT @jobID + = [dba].[Commvault_Restore]( + @clientName, + @instanceName, + @in_toTimeValue, + @in_restoreSource, + ISNULL(@in_newDatabaseName, @in_restoreSource), + ISNULL(@in_destinationInstance_clientName, ''), + ISNULL(@in_destinationInstance_instanceName, ''), + ISNULL(@dbFileinfo, ''), + ISNULL(@in_targetMDFPath, ''), + ISNULL(@in_targetLDFPath, ''), + ISNULL(@in_targetFileStreamPath, ''), + ISNULL(@in_fileRestore, 0), + ISNULL(@in_databaseRestore, 1), + @token); + PRINT 'Job ID: ' + @jobID; + + END; + + /* CHECK JOB STATUS */ + SELECT @jobSTATUS = [dba].[Commvault_Job_Status](@jobID, 's', @token); + SET @dateend = DATEADD(MINUTE,@in_maxRuntime,GETDATE()) + SET @interval = CONVERT(CHAR(8), DATEADD(second,@in_checkInterval,0),108) + + WHILE @jobSTATUS <> 'Completed' + BEGIN + + IF getdate() > @dateend /* MAX DURATION */ + BEGIN + SET @endstatus = 'with ERROR'; + SET @returnCode = 2; + SELECT '!!! Max runtime reached for this task, KILL jobID on Commvault Server !!!'; + /* KILL */ + SELECT @killStatus = [dba].[Commvault_Job_Kill](@jobID, @token); + + IF @killStatus = 0 + BEGIN + PRINT 'KILL Success'; + END; + ELSE + BEGIN + PRINT 'ERROR ON JOB KILL!'; + END; + + BREAK; + END; + + /* WAIT interval */ + WAITFOR DELAY @interval; + + SELECT @jobSTATUS = [dba].[Commvault_Job_Status](@jobID, 's', @token); + + /* ERROR */ + IF @jobSTATUS IN ( 'Completed w/ one or more errors', 'Failed', 'Failed to Start' ) + BEGIN + SET @endstatus = 'with ERROR'; + SET @returnCode = 2; + /* GET MESSAGE */ + IF @jobERRORMessage = '' + BEGIN + SELECT @jobERRORMessage = [dba].[Commvault_Job_Status](@jobID, 'r', @token); + END; + ELSE + BEGIN + SELECT @jobERRORMessage = @jobERRORMessage + ' | ' + [dba].[Commvault_Job_Status](@jobID, 'r', @token); + END; + + PRINT 'ERROR returned from Commvault: ' + @jobERRORMessage; + BREAK; + END; + + IF @jobSTATUS = 'Pending' + BEGIN + SET @endstatus = 'with ERROR'; + SET @returnCode = 2; + /* GET MESSAGE */ + IF @jobERRORMessage = '' + BEGIN + SELECT @jobERRORMessage = [dba].[Commvault_Job_Status](@jobID, 'r', @token); + END; + ELSE + BEGIN + SELECT @jobERRORMessage = @jobERRORMessage + ' | ' + [dba].[Commvault_Job_Status](@jobID, 'r', @token); + END; + PRINT 'ERROR returned from Commvault: ' + @jobERRORMessage; + + /* KILL */ + SELECT @killStatus = [dba].[Commvault_Job_Kill](@jobID, @token); + + IF @killStatus = 0 + BEGIN + PRINT 'KILL Success'; + END; + ELSE + BEGIN + PRINT 'ERROR ON JOB KILL!'; + END; + + BREAK; + END; + + END; + + /* COMMVAULT LOGOFF */ + SELECT @logoutcode = [dba].[Commvault_Logout](@token); + IF @logoutcode = 0 + BEGIN + PRINT 'LOGOUT Success'; + END; + ELSE + BEGIN + PRINT 'ERROR ON LOGOUT!'; + END; + + IF @endstatus = 'successfully' + BEGIN + SET @endtime = GETDATE(); + END; + + /* RETURN */ + /* IN SQL TABLE */ + IF @returnCode = 0 + BEGIN + IF @in_type = 'Backup' + BEGIN + IF EXISTS ( SELECT 1 + FROM [dba].[Commvault_last_app_backup] + WHERE CLAB_name = @in_callerApp) + BEGIN + UPDATE [dba].[Commvault_last_app_backup] + SET CLAB_lastBackupTime = @endtime + WHERE CLAB_name = @in_callerApp; + END; + ELSE + BEGIN + INSERT INTO [dba].[Commvault_last_app_backup] (CLAB_name, + CLAB_lastBackupTime) + VALUES (@in_callerApp, @endtime); + END; + END; + END; + + /* IN CONSOLE */ + SELECT @in_type AS jobType, + @returnCode AS returnCode, + 'JOB Completed ' + @endstatus AS jobStatus, + @jobID AS jobID, + @endtime AS EndTime, + @jobERRORMessage AS errorText, + @warningMessage AS warningMessage; + +END TRY +BEGIN CATCH + + /* COMMVAULT LOGOFF */ + SELECT @logoutcode = [dba].[Commvault_Logout](@token); + IF @logoutcode = 0 + BEGIN + PRINT 'LOGOUT Success'; + END; + ELSE + BEGIN + PRINT 'ERROR ON LOGOUT!'; + END; + + SELECT @ErrorMessage = ERROR_MESSAGE(), + @ErrorSeverity = ERROR_SEVERITY(), + @ErrorState = ERROR_STATE(); + RAISERROR(@ErrorMessage, @ErrorSeverity, @ErrorState); + +END CATCH; + + + + +/*------------------ Retour au programme appelant -----------------*/ + +RETURN (@@error); +GO + + + + + + + + +/* CREATE SP Commvault_RestoreToFile */ + +IF EXISTS ( SELECT * + FROM sys.objects o + JOIN sys.schemas s + ON o.schema_id = s.schema_id + WHERE o.name = 'Commvault_RestoreToFile' + AND OBJECTPROPERTY(object_id, N'IsProcedure') = 1 + AND s.name = 'dba') + DROP PROCEDURE [dba].[Commvault_RestoreToFile]; +GO + +SET ANSI_NULLS ON; +GO + +SET QUOTED_IDENTIFIER ON; +GO + +IF EXISTS ( SELECT 1 + FROM [master].[cfg].[InstanceContext] + WHERE Business IN ( 'TPUCEN', 'TPCENT', 'TPPHAR' )) +BEGIN + EXEC ('CREATE PROCEDURE [dba].[Commvault_RestoreToFile] + @in_type VARCHAR(7) = ''Restore'', + @in_username VARCHAR(20), + @in_password VARCHAR(255), + @in_callerApp VARCHAR(255) = ''RestoreToFile'', + @in_toTimeValue VARCHAR(20) = NULL, + @in_restoreSource VARCHAR(50) = NULL, + @in_fileRestore BIT = 1, + @in_databaseRestore BIT = 0, + @in_maxRuntime int = 480, + @in_checkInterval int = 60 +WITH ENCRYPTION +AS +/*============================================================================= + + Explication du traitement realise par la SP + ------------------------------------------- + Cette SP est utilisee pour effectuer des operations dans Commvault de restore en mode fichier uniquement! + La CLR dba_CLR_Commvault dans HCITools est un prerequis! + + Parametres + ---------- + + @in_type = Restore mis par defaut + @in_username = Le nom d''utilisateur qui sera utilise lors des connexions a Commvault. Parametre requis + @in_password = Le password qui sera utilise lors des connexions a Commvault. Parametre requis + @in_callerApp = Le nom du programme appelant (RestoreToFile force dans cette SP) + @in_toTimeValue = La date et l''heure souhaitee lors d''une operation de restore + @in_restoreSource = Nom de la base de donnees a restorer. Parametre requis + @in_fileRestore = Activation du mode restore to file (1 = actif par defaut) + @in_databaseRestore = Activation du mode restore to a SQL database (0 = actif par defaut) + @in_maxRuntime = Total en minutes du temps alloue pour une operation + @in_checkInterval = Nombre de secondes entre les verifications du traitement en cours sur le serveur Commvault + + Creation : 01.11.2022 / SPE + + Modifications : 20.04.2023 / SPE - OCTPDBA-567: Modify Commvault SP to remove the timeout and the kill session + + +=============================================================================*/ + +SET NOCOUNT ON; + +/*------------------- Declaration des variables --------------------*/ +DECLARE @token VARCHAR(MAX), + @dbFileinfo VARCHAR(MAX) = '''', + @databasetobackup VARCHAR(MAX), + @jobERRORMessage VARCHAR(MAX), + @warningMessage VARCHAR(MAX), + @ErrorMessage NVARCHAR(4000), + @dbFile VARCHAR(255), + @jobSTATUS VARCHAR(255), + @databaseName VARCHAR(255), + @jobID VARCHAR(50), + @clientName VARCHAR(50), + @instanceName VARCHAR(50), + @endstatus VARCHAR(12), + @interval CHAR(8), + @endtime DATETIME2(0), + @dateend DATETIME2(0), + @errno INT, + @ErrorState INT, + @ErrorSeverity INT, + @pos INT, + @len INT, + @returnCode TINYINT, + @logoutcode TINYINT, + @killStatus TINYINT, + @in_newDatabaseName VARCHAR(50) = NULL, + @in_destinationInstance_clientName VARCHAR(50) = NULL, + @in_destinationInstance_instanceName VARCHAR(50) = NULL, + @in_targetMDFPath VARCHAR(MAX) = NULL, + @in_targetLDFPath VARCHAR(MAX) = NULL, + @in_targetFileStreamPath VARCHAR(MAX) = NULL; + + + + +/*-------------------------- Verifications des variables d''entree ---------------------------*/ +IF @in_username IS NULL +BEGIN + SET @errno = 3; + SET @ErrorMessage = N''You must provide the Commvault username in parameter @in_username!''; + RAISERROR(@ErrorMessage, 16, 1); + RETURN (@errno); +END; + +IF @in_password IS NULL +BEGIN + SET @errno = 4; + SET @ErrorMessage = N''You must provide the Commvault password in parameter @in_password!''; + RAISERROR(@ErrorMessage, 16, 1); + RETURN (@errno); +END; + +IF NOT EXISTS (SELECT * FROM sys.databases WHERE name = @in_restoreSource) +BEGIN + SET @errno = 7; + SET @ErrorMessage = N''You must provide an existing database name for the restore in parameter @in_restoreSource!''; + RAISERROR(@ErrorMessage, 16, 1); + RETURN (@errno); +END; + + + + +/*------------ Affectation des parametres aux variables ------------*/ + +SELECT @instanceName = CONVERT(sysname, SERVERPROPERTY(''ServerName'')); +SELECT @clientName = CONVERT(sysname, SERVERPROPERTY(''MachineName'')); +SET @endstatus = ''successfully''; +SET @returnCode = 0; +SET @warningMessage = ''''; +SET @jobERRORMessage = ''''; +SET @in_callerApp = ''RestoreToFile'' + + +/*-------------------------- Traitement ---------------------------*/ + +/* COMMVAULT LOGIN */ +BEGIN TRY + SELECT @token = [dba].[Commvault_Login](@in_username, @in_password); + PRINT ''LOGIN Success''; +END TRY +BEGIN CATCH + SELECT @ErrorMessage = ERROR_MESSAGE(), + @ErrorSeverity = ERROR_SEVERITY(), + @ErrorState = ERROR_STATE(); + RAISERROR(@ErrorMessage, @ErrorSeverity, @ErrorState); + RETURN; +END CATCH; + + +BEGIN TRY + + DECLARE c_device CURSOR LOCAL FORWARD_ONLY STATIC FOR + SELECT mf.[name] + '','' + mf.[physical_name] + FROM sys.master_files mf + JOIN sys.databases d + ON d.database_id = mf.database_id + WHERE d.name = @in_restoreSource; + OPEN c_device; + FETCH NEXT FROM c_device + INTO @dbFile; + + WHILE @@fetch_status <> -1 + BEGIN + SET @dbFileinfo = @dbFileinfo + @dbFile + ''|''; + FETCH NEXT FROM c_device + INTO @dbFile; + END; + + CLOSE c_device; + DEALLOCATE c_device; + + SELECT @dbFileinfo = LEFT(@dbFileinfo, NULLIF(LEN(@dbFileinfo) - 1, -1)); + + IF @in_toTimeValue is NULL + SET @in_toTimeValue = GETDATE() + + /* COMMVAULT RESTORE */ + SELECT @jobID + = [dba].[Commvault_Restore]( + @clientName, + @instanceName, + @in_toTimeValue, + @in_restoreSource, + ISNULL(@in_newDatabaseName, @in_restoreSource), + ISNULL(@in_destinationInstance_clientName, ''''), + ISNULL(@in_destinationInstance_instanceName, ''''), + ISNULL(@dbFileinfo, ''''), + ISNULL(@in_targetMDFPath, ''''), + ISNULL(@in_targetLDFPath, ''''), + ISNULL(@in_targetFileStreamPath, ''''), + ISNULL(@in_fileRestore, 1), + ISNULL(@in_databaseRestore, 0), + @token); + PRINT ''Job ID: '' + @jobID; + + + + /* CHECK JOB STATUS */ + SELECT @jobSTATUS = [dba].[Commvault_Job_Status](@jobID, ''s'', @token); + SET @dateend = DATEADD(MINUTE,@in_maxRuntime,GETDATE()) + SET @interval = CONVERT(CHAR(8), DATEADD(second,@in_checkInterval,0),108) + + WHILE @jobSTATUS <> ''Completed'' + BEGIN + + IF getdate() > @dateend /* MAX DURATION */ + BEGIN + SET @endstatus = ''with ERROR''; + SET @returnCode = 2; + SELECT ''!!! Max runtime reached for this task, KILL jobID on Commvault Server !!!''; + /* KILL */ + SELECT @killStatus = [dba].[Commvault_Job_Kill](@jobID, @token); + + IF @killStatus = 0 + BEGIN + PRINT ''KILL Success''; + END; + ELSE + BEGIN + PRINT ''ERROR ON JOB KILL!''; + END; + + BREAK; + END; + + /* WAIT interval */ + WAITFOR DELAY @interval; + + SELECT @jobSTATUS = [dba].[Commvault_Job_Status](@jobID, ''s'', @token); + + /* ERROR */ + IF @jobSTATUS IN ( ''Completed w/ one or more errors'', ''Failed'', ''Failed to Start'' ) + BEGIN + SET @endstatus = ''with ERROR''; + SET @returnCode = 2; + /* GET MESSAGE */ + IF @jobERRORMessage = '''' + BEGIN + SELECT @jobERRORMessage = [dba].[Commvault_Job_Status](@jobID, ''r'', @token); + END; + ELSE + BEGIN + SELECT @jobERRORMessage = @jobERRORMessage + '' | '' + [dba].[Commvault_Job_Status](@jobID, ''r'', @token); + END; + + PRINT ''ERROR returned from Commvault: '' + @jobERRORMessage; + BREAK; + END; + + IF @jobSTATUS = ''Pending'' + BEGIN + SET @endstatus = ''with ERROR''; + SET @returnCode = 2; + /* GET MESSAGE */ + IF @jobERRORMessage = '''' + BEGIN + SELECT @jobERRORMessage = [dba].[Commvault_Job_Status](@jobID, ''r'', @token); + END; + ELSE + BEGIN + SELECT @jobERRORMessage = @jobERRORMessage + '' | '' + [dba].[Commvault_Job_Status](@jobID, ''r'', @token); + END; + PRINT ''ERROR returned from Commvault: '' + @jobERRORMessage; + + /* KILL */ + SELECT @killStatus = [dba].[Commvault_Job_Kill](@jobID, @token); + + IF @killStatus = 0 + BEGIN + PRINT ''KILL Success''; + END; + ELSE + BEGIN + PRINT ''ERROR ON JOB KILL!''; + END; + + BREAK; + END; + + END; + + /* COMMVAULT LOGOFF */ + SELECT @logoutcode = [dba].[Commvault_Logout](@token); + IF @logoutcode = 0 + BEGIN + PRINT ''LOGOUT Success''; + END; + ELSE + BEGIN + PRINT ''ERROR ON LOGOUT!''; + END; + + IF @endstatus = ''successfully'' + BEGIN + SET @endtime = GETDATE(); + END; + + /* RETURN */ + SELECT @in_type AS jobType, + @returnCode AS returnCode, + ''JOB Completed '' + @endstatus AS jobStatus, + @jobID AS jobID, + @endtime AS EndTime, + @jobERRORMessage AS errorText, + @warningMessage AS warningMessage; + +END TRY +BEGIN CATCH + + /* COMMVAULT LOGOFF */ + SELECT @logoutcode = [dba].[Commvault_Logout](@token); + IF @logoutcode = 0 + BEGIN + PRINT ''LOGOUT Success''; + END; + ELSE + BEGIN + PRINT ''ERROR ON LOGOUT!''; + END; + + SELECT @ErrorMessage = ERROR_MESSAGE(), + @ErrorSeverity = ERROR_SEVERITY(), + @ErrorState = ERROR_STATE(); + RAISERROR(@ErrorMessage, @ErrorSeverity, @ErrorState); + +END CATCH; + + + + +/*------------------ Retour au programme appelant -----------------*/ + +RETURN (@@error);'); +END; +GO + + +/* CREATE TABLE Commvault_last_app_backup */ + +IF NOT EXISTS ( SELECT 1 + FROM sys.objects o WITH (NOLOCK) + JOIN sys.schemas s WITH (NOLOCK) + ON o.schema_id = s.schema_id + WHERE o.name = 'Commvault_last_app_backup' + AND o.type IN ( N'U' ) + AND s.name = 'dba') +BEGIN + + PRINT 'Create new table [Commvault_last_app_backup]'; + CREATE TABLE [dba].[Commvault_last_app_backup] ([CLAB_ID] INT IDENTITY(1, 1) NOT NULL, + [CLAB_name] VARCHAR(255) NOT NULL, + [CLAB_lastBackupTime] DATETIME2(0) NOT NULL + CONSTRAINT [PK_Commvault_last_app_backup] + PRIMARY KEY CLUSTERED ([CLAB_ID] ASC) + WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, + IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, + ALLOW_PAGE_LOCKS = ON, FILLFACTOR = 100) ON [PRIMARY]) ON [PRIMARY]; + +END; +GO diff --git a/TPDT-268 - ACP in task sequence/dba_packages/deployMonitorWaitStats.sql b/TPDT-268 - ACP in task sequence/dba_packages/deployMonitorWaitStats.sql new file mode 100644 index 0000000..d8ceef4 --- /dev/null +++ b/TPDT-268 - ACP in task sequence/dba_packages/deployMonitorWaitStats.sql @@ -0,0 +1,571 @@ +USE [HCITools]; +GO + +/*============================================================================= + + Collect les stats des wait sur l'instance locale et les stocks en db + + ----------------------------------------------- + Afin de surveiller l'évolution des wait stats, cette proc collecte les infos des wait stats dans la table hciTools.dbo.[Monitor_wait_stats] + depuis le démarrage du serveur ou le dernier effacement des stats. + + + Contexte d'utilisation + ---------------------- + Sur toute instance triapharm sauf les POS + + Création : 11.10.2022 / TSC +=============================================================================*/ +GO + +SET ANSI_NULLS ON; +SET QUOTED_IDENTIFIER ON; +GO + +/* Creation de la table, si nécessaire*/ +IF OBJECT_ID('dbo.Monitor_wait_stats') IS NULL +BEGIN + CREATE TABLE [dbo].[Monitor_wait_stats] + ( + [Monitor_wait_stats_ID] [BIGINT] IDENTITY(1, 1) NOT NULL, + [MWS_wait_type] [NVARCHAR](60) NOT NULL, + [MWS_wait_time_s] [DECIMAL](14, 2) NOT NULL, + [MWS_resource_time_s] [DECIMAL](14, 2) NOT NULL, + [MWS_signal_time_s] [DECIMAL](14, 2) NOT NULL, + [MWS_wait_count] [BIGINT] NOT NULL, + [MWS_percentage] [DECIMAL](5, 2) NOT NULL, + [MWS_avg_wait_time_sec] [DECIMAL](14, 4) NOT NULL, + [MWS_avg_resource_time_s] [DECIMAL](14, 4) NOT NULL, + [MWS_avg_signal_time_s] [DECIMAL](14, 4) NOT NULL, + [MWS_sql_server_name] [NVARCHAR](128) NOT NULL, + [MWS_sql_server_start_date] [DATETIME] NOT NULL, + [MWS_value_date] [DATETIME] NOT NULL, + [MWS_remark] [VARCHAR](MAX) NULL + ) ON [PRIMARY] TEXTIMAGE_ON [PRIMARY]; + + ALTER TABLE [dbo].[Monitor_wait_stats] + ADD + DEFAULT (GETDATE()) FOR [MWS_value_date]; +END; + +/* adaptation de la table pour permettre l'enregistrement de 100 % */ +IF EXISTS(SELECT * FROM INFORMATION_SCHEMA.COLUMNS WHERE TABLE_NAME = 'Monitor_wait_stats' AND COLUMN_NAME = 'MWS_percentage' AND [NUMERIC_PRECISION] = 4) +BEGIN + ALTER TABLE [dbo].[Monitor_wait_stats] ALTER COLUMN [MWS_percentage] [DECIMAL](5, 2) NOT NULL; +END + +/*proc mon_collect_wait_stats*/ +IF OBJECT_ID('dbo.mon_collect_wait_stats') IS NOT NULL +BEGIN + DROP PROCEDURE dbo.mon_collect_wait_stats; +END; +GO +/*============================================================================= + + Collect wait stats + + ----------------------------------------------- + US OCTPDBA-336 + Collect and store wait stats into hciTools.dbo.Monitor_wait_stats + Derived from http://www.sqlskills.com/blogs/paul/wait-statistics-or-please-tell-me-where-it-hurts/ + + Contexte d'utilisation + ---------------------- + Job : [D92060 - Monitor Wait Stats] + + Création : 11.10.2022 / TSC + +=============================================================================*/ +CREATE PROCEDURE dbo.mon_collect_wait_stats +AS +BEGIN + SET XACT_ABORT OFF; + SET NOCOUNT ON; + + WITH [Waits] + AS (SELECT + [wait_type], + [wait_time_ms] / 1000.0 AS [WaitS], + ([wait_time_ms] - [signal_wait_time_ms]) / 1000.0 AS [ResourceS], + [signal_wait_time_ms] / 1000.0 AS [SignalS], + [waiting_tasks_count] AS [WaitCount], + 100.0 * [wait_time_ms] / SUM([wait_time_ms]) OVER () AS [Percentage], + ROW_NUMBER() OVER (ORDER BY [wait_time_ms] DESC) AS [RowNum] + FROM sys.dm_os_wait_stats + WHERE [wait_type] NOT IN ( N'BROKER_EVENTHANDLER', N'BROKER_RECEIVE_WAITFOR', N'BROKER_TASK_STOP', + N'BROKER_TO_FLUSH', N'BROKER_TRANSMITTER', N'CHECKPOINT_QUEUE', N'CHKPT', + N'CLR_AUTO_EVENT', N'CLR_MANUAL_EVENT', N'CLR_SEMAPHORE', N'DBMIRROR_DBM_EVENT', + N'DBMIRROR_EVENTS_QUEUE', N'DBMIRROR_WORKER_QUEUE', N'DBMIRRORING_CMD', + N'DIRTY_PAGE_POLL', N'DISPATCHER_QUEUE_SEMAPHORE', N'EXECSYNC', N'FSAGENT', + N'FT_IFTS_SCHEDULER_IDLE_WAIT', N'FT_IFTSHC_MUTEX', N'HADR_CLUSAPI_CALL', + N'HADR_FILESTREAM_IOMGR_IOCOMPLETION', N'HADR_LOGCAPTURE_WAIT', + N'HADR_NOTIFICATION_DEQUEUE', N'HADR_TIMER_TASK', N'HADR_WORK_QUEUE', + N'KSOURCE_WAKEUP', N'LAZYWRITER_SLEEP', N'LOGMGR_QUEUE', N'ONDEMAND_TASK_QUEUE', + N'PWAIT_ALL_COMPONENTS_INITIALIZED', N'QDS_PERSIST_TASK_MAIN_LOOP_SLEEP', + N'QDS_CLEANUP_STALE_QUERIES_TASK_MAIN_LOOP_SLEEP', N'REQUEST_FOR_DEADLOCK_SEARCH', + N'RESOURCE_QUEUE', N'SERVER_IDLE_CHECK', N'SLEEP_BPOOL_FLUSH', N'SLEEP_DBSTARTUP', + N'SLEEP_DCOMSTARTUP', N'SLEEP_MASTERDBREADY', N'SLEEP_MASTERMDREADY', + N'SLEEP_MASTERUPGRADED', N'SLEEP_MSDBSTARTUP', N'SLEEP_SYSTEMTASK', N'SLEEP_TASK', + N'SLEEP_TEMPDBSTARTUP', N'SNI_HTTP_ACCEPT', N'SP_SERVER_DIAGNOSTICS_SLEEP', + N'SQLTRACE_BUFFER_FLUSH', N'SQLTRACE_INCREMENTAL_FLUSH_SLEEP', + N'SQLTRACE_WAIT_ENTRIES', N'WAIT_FOR_RESULTS', N'WAITFOR', N'WAITFOR_TASKSHUTDOWN', + N'WAIT_XTP_HOST_WAIT', N'WAIT_XTP_OFFLINE_CKPT_NEW_LOG', N'WAIT_XTP_CKPT_CLOSE', + N'XE_DISPATCHER_JOIN', N'XE_DISPATCHER_WAIT', N'XE_TIMER_EVENT' + ) + AND [waiting_tasks_count] > 0) + + INSERT INTO [HCITools].[dbo].[Monitor_wait_stats] + ( + [MWS_wait_type], + [MWS_wait_time_s], + [MWS_resource_time_s], + [MWS_signal_time_s], + [MWS_wait_count], + [MWS_percentage], + [MWS_avg_wait_time_sec], + [MWS_avg_resource_time_s], + [MWS_avg_signal_time_s], + [MWS_sql_server_name], + [MWS_sql_server_start_date], + [MWS_value_date] + ) + SELECT + MAX([W1].[wait_type]) AS MWS_wait_type, + CAST(MAX([W1].[WaitS]) AS DECIMAL(14, 2)) AS MWS_wait_time_s, + CAST(MAX([W1].[ResourceS]) AS DECIMAL(14, 2)) AS MWS_resource_time_s, + CAST(MAX([W1].[SignalS]) AS DECIMAL(14, 2)) AS MWS_signal_time_s, + MAX([W1].[WaitCount]) AS MWS_wait_count, + CAST(MAX([W1].[Percentage]) AS DECIMAL(5, 2)) AS MWS_percentage, + CAST(MAX([W1].[WaitS]) / ISNULL(NULLIF(MAX([W1].[WaitCount]), 0),1) AS DECIMAL(14, 4)) AS MWS_avg_wait_time_sec, + CAST(MAX([W1].[ResourceS]) / ISNULL(NULLIF(MAX([W1].[WaitCount]), 0),1) AS DECIMAL(14, 4)) AS MWS_avg_resource_time_s, + CAST(MAX([W1].[SignalS]) / ISNULL(NULLIF(MAX([W1].[WaitCount]), 0),1) AS DECIMAL(14, 4)) AS MWS_avg_signal_time_s, + @@SERVERNAME AS MWS_sql_server_name, + (SELECT sqlserver_start_time FROM sys.dm_os_sys_info) AS MWS_sql_server_start_date, + GETDATE() AS MWS_value_date + FROM [Waits] AS [W1] + INNER JOIN [Waits] AS [W2] + ON [W2].[RowNum] <= [W1].[RowNum] + GROUP BY [W1].[RowNum] + HAVING SUM([W2].[Percentage]) - MAX([W1].[Percentage]) < 99; --percentage threshold + +END +GO + +/*proc mon_clear_wait_stats*/ +IF OBJECT_ID('dbo.mon_clear_wait_stats') IS NOT NULL +BEGIN + DROP PROCEDURE dbo.mon_clear_wait_stats +END + +GO +/*============================================================================= + + Clear wait stats + + ----------------------------------------------- + US OCTPDBA-336 + Clear the current wait stats from the local instance + + Contexte d'utilisation + ---------------------- + Job : [D92060 - Monitor Wait Stats] + + Création : 11.10.2022 / TSC + +=============================================================================*/ +CREATE PROCEDURE dbo.mon_clear_wait_stats +AS +BEGIN + SET XACT_ABORT OFF; + SET NOCOUNT ON; + + DBCC SQLPERF('sys.dm_os_wait_stats',CLEAR) +END +GO + +/*proc mon_purge_recorded_wait_stats*/ +IF OBJECT_ID('dbo.mon_purge_recorded_wait_stats') IS NOT NULL +BEGIN + DROP PROCEDURE dbo.mon_purge_recorded_wait_stats +END + +GO +/*============================================================================= + + Purge recorded wait stats from [HCITools].[dbo].[Monitor_wait_stats] + + ----------------------------------------------- + US OCTPDBA-336 + Purge the recorded wait stats from [HCITools].[dbo].[Monitor_wait_stats] + + Contexte d'utilisation + ---------------------- + Job : [D92060 - Monitor Wait Stats] + + Création : 11.10.2022 / TSC + +=============================================================================*/ +CREATE PROCEDURE dbo.mon_purge_recorded_wait_stats + @in_days_to_keep INT = 90 --how many days of history should be kept. default to 90 days (3 months) +AS +BEGIN + SET XACT_ABORT OFF; + SET NOCOUNT ON; + + DECLARE @countDeletes INT = 1; + WHILE ISNULL(@countDeletes, 0) > 0 + BEGIN + DELETE TOP(10000) FROM [HCITools].[dbo].[Monitor_wait_stats] + WHERE [MWS_value_date] <= DATEADD(DAY, @in_days_to_keep * -1, CURRENT_TIMESTAMP); + + SET @countDeletes = @@ROWCOUNT; + END +END +GO + +/* cleanup of previously defined jobs */ +--SET XACT_ABORT ON; +--SET NOCOUNT ON; + +--DECLARE @found_jobs_names TABLE (job_name VARCHAR(500) NOT NULL); + +--INSERT INTO @found_jobs_names ([job_name]) +--VALUES ('DR92060 - Monitor Wait Stats - Central'), +-- ('ZZ-LPE-Monitor Wait Stats'), +-- ('ZZ-LPE-Monitor Wait Stats - AMAREP'), +-- ('ZZ-LPE-Monitor Wait Stats - AMA051'), +-- ('ZZ-LPE-Monitor Wait Stats - AMA562'), +-- ('ZZ-LPE-Monitor Wait Stats - AMA603'); + +--/* declare variables */ +--DECLARE @job_name VARCHAR(500); + +--DECLARE clean_jobs CURSOR FAST_FORWARD READ_ONLY READ_ONLY FOR +--SELECT job_name +-- FROM @found_jobs_names; + +--OPEN clean_jobs; + +--FETCH NEXT FROM clean_jobs +-- INTO @job_name; + +--WHILE @@FETCH_STATUS = 0 +--BEGIN + +-- IF EXISTS ( SELECT 1 +-- FROM msdb.dbo.sysjobs sj +-- WHERE LOWER(sj.[name]) = LOWER(@job_name)) +-- BEGIN +-- RAISERROR( +-- 'found job "%s". Dropping', +-- 1, +-- 1, +-- @job_name) WITH NOWAIT; + +-- EXEC msdb.dbo.sp_delete_job @job_name = @job_name, +-- @delete_unused_schedule = 1; + +-- END; +-- FETCH NEXT FROM clean_jobs +-- INTO @job_name; +--END; + +--CLOSE clean_jobs; +--DEALLOCATE clean_jobs; + +--GO + + + +/*job et schedule*/ + +---- Drop _D... job and schedule, the job was renamed + +/* Drop existing standard schedule for job */ +DECLARE @schedule_id INT +DECLARE c_schedules CURSOR LOCAL FORWARD_ONLY STATIC READ_ONLY FOR + SELECT ss.schedule_id + FROM msdb.dbo.sysjobschedules sjs +INNER JOIN msdb.dbo.sysschedules ss + ON sjs.schedule_id = ss.schedule_id + AND ss.name NOT LIKE '%#SPEC#' +INNER JOIN msdb.dbo.sysjobs sj + ON sjs.job_id = sj.job_id + WHERE sj.name = N'_D92060 - Monitor Wait Stats' + +OPEN c_schedules + +FETCH NEXT FROM c_schedules INTO @schedule_id +WHILE @@fetch_status = 0 +BEGIN + IF ((SELECT COUNT(*) FROM msdb.dbo.sysjobschedules WHERE schedule_id=@schedule_id) = 1) + EXEC msdb.dbo.sp_delete_schedule @schedule_id=@schedule_id, @force_delete = 1 +FETCH NEXT FROM c_schedules INTO @schedule_id +END + +CLOSE c_schedules + +DEALLOCATE c_schedules + +IF EXISTS (SELECT job_id FROM msdb.dbo.sysjobs_view WHERE name = N'_D92060 - Monitor Wait Stats') +EXEC msdb.dbo.sp_delete_job @job_name = N'_D92060 - Monitor Wait Stats', @delete_unused_schedule=0 +GO + + + + +---Actual job is scripted starting here + +declare @schedule_id int +declare c_schedules cursor local forward_only static READ_ONLY FOR + select ss.schedule_id + from msdb.dbo.sysjobschedules sjs +INNER JOIN msdb.dbo.sysschedules ss + ON sjs.schedule_id = ss.schedule_id + AND ss.name NOT LIKE '%#SPEC#' +INNER JOIN msdb.dbo.sysjobs sj + ON sjs.job_id = sj.job_id + WHERE sj.name = N'D92060 - Monitor Wait Stats' + +open c_schedules + +FETCH NEXT FROM c_schedules into @schedule_id +while @@fetch_status = 0 +begin + IF ((select COUNT(*) from msdb.dbo.sysjobschedules where schedule_id=@schedule_id) = 1) + EXEC msdb.dbo.sp_delete_schedule @schedule_id=@schedule_id, @force_delete = 1 +FETCH NEXT FROM c_schedules into @schedule_id +end + +close c_schedules + +deallocate c_schedules + +IF EXISTS (SELECT job_id FROM msdb.dbo.sysjobs_view WHERE name = N'D92060 - Monitor Wait Stats') +EXEC msdb.dbo.sp_delete_job @job_name = N'D92060 - Monitor Wait Stats', @delete_unused_schedule=0 +GO + +/* Creation Job and Steps*/ +BEGIN TRANSACTION +DECLARE @ReturnCode INT +SELECT @ReturnCode = 0 + +IF NOT EXISTS (SELECT name FROM msdb.dbo.syscategories WHERE name=N'[Uncategorized (Local)]' AND category_class=1) +BEGIN +EXEC @ReturnCode = msdb.dbo.sp_add_category @class=N'JOB', @type=N'LOCAL', @name=N'[Uncategorized (Local)]' +IF (@@ERROR <> 0 OR @ReturnCode <> 0) GOTO QuitWithRollback + +END + +/* Add Job */ +DECLARE @jobId BINARY(16) +EXEC @ReturnCode = msdb.dbo.sp_add_job @job_name=N'D92060 - Monitor Wait Stats', + @enabled=0, + @notify_level_eventlog=0, + @notify_level_email=0, + @notify_level_netsend=0, + @notify_level_page=0, + @delete_level=0, + @description=N'Collect les stats des wait sur l''instance locale et les stocks en db + + ----------------------------------------------- + Afin de surveiller l''évolution des wait stats, cette proc collecte les infos des wait stats dans la table hciTools.dbo.[Monitor_wait_stats] + depuis le démarrage du serveur ou le dernier effacement des stats. + + + Contexte d''utilisation + ---------------------- + Sur toute instance triapharm sauf les POS + + Création : 11.10.2022 / TSC', + @category_name=N'[Uncategorized (Local)]', + @start_step_id=1, + @owner_login_name=N'sa', @job_id = @jobId OUTPUT +IF (@@ERROR <> 0 OR @ReturnCode <> 0) GOTO QuitWithRollback + +/* Add Step */ +EXEC @ReturnCode = msdb.dbo.sp_add_jobstep @job_id=@jobId, @step_name=N'empty step', + @step_id=1, + @cmdexec_success_code=0, + @on_success_action=3, + @on_success_step_id=0, + @on_fail_action=3, + @on_fail_step_id=0, + @retry_attempts=0, + @retry_interval=0, + @os_run_priority=0, @subsystem=N'TSQL', + @command=N'/* empty step */', + @database_name=N'master', + @output_file_name=NULL, + @flags=0, + @database_user_name=NULL, + @server=NULL, + @additional_parameters=NULL, + @proxy_id=NULL, + @proxy_name=NULL +IF (@@ERROR <> 0 OR @ReturnCode <> 0) GOTO QuitWithRollback +/* Add Step */ +EXEC @ReturnCode = msdb.dbo.sp_add_jobstep @job_id=@jobId, @step_name=N'Collect wait stats', + @step_id=2, + @cmdexec_success_code=0, + @on_success_action=3, + @on_success_step_id=0, + @on_fail_action=4, + @on_fail_step_id=6, + @retry_attempts=0, + @retry_interval=0, + @os_run_priority=0, @subsystem=N'TSQL', + @command=N'exec dbo.mon_collect_wait_stats', + @database_name=N'HCITools', + @output_file_name=NULL, + @flags=0, + @database_user_name=NULL, + @server=NULL, + @additional_parameters=NULL, + @proxy_id=NULL, + @proxy_name=NULL +IF (@@ERROR <> 0 OR @ReturnCode <> 0) GOTO QuitWithRollback +/* Add Step */ +EXEC @ReturnCode = msdb.dbo.sp_add_jobstep @job_id=@jobId, @step_name=N'Clear wait stats', + @step_id=3, + @cmdexec_success_code=0, + @on_success_action=3, + @on_success_step_id=0, + @on_fail_action=4, + @on_fail_step_id=6, + @retry_attempts=0, + @retry_interval=0, + @os_run_priority=0, @subsystem=N'TSQL', + @command=N'exec dbo.mon_clear_wait_stats', + @database_name=N'HCITools', + @output_file_name=NULL, + @flags=0, + @database_user_name=NULL, + @server=NULL, + @additional_parameters=NULL, + @proxy_id=NULL, + @proxy_name=NULL +IF (@@ERROR <> 0 OR @ReturnCode <> 0) GOTO QuitWithRollback +/* Add Step */ +EXEC @ReturnCode = msdb.dbo.sp_add_jobstep @job_id=@jobId, @step_name=N'Clean Wait Statistics history', + @step_id=4, + @cmdexec_success_code=0, + @on_success_action=3, + @on_success_step_id=0, + @on_fail_action=4, + @on_fail_step_id=6, + @retry_attempts=0, + @retry_interval=0, + @os_run_priority=0, @subsystem=N'TSQL', + @command=N'exec dbo.mon_purge_recorded_wait_stats @in_days_to_keep = 90;', + @database_name=N'HCITools', + @output_file_name=NULL, + @flags=0, + @database_user_name=NULL, + @server=NULL, + @additional_parameters=NULL, + @proxy_id=NULL, + @proxy_name=NULL +IF (@@ERROR <> 0 OR @ReturnCode <> 0) GOTO QuitWithRollback +/* Add Step */ +EXEC @ReturnCode = msdb.dbo.sp_add_jobstep @job_id=@jobId, @step_name=N'empty step for success', + @step_id=5, + @cmdexec_success_code=0, + @on_success_action=1, + @on_success_step_id=0, + @on_fail_action=4, + @on_fail_step_id=6, + @retry_attempts=0, + @retry_interval=0, + @os_run_priority=0, @subsystem=N'TSQL', + @command=N'exec dbo.Get_Job_Error_Info @in_JobName = ''D92060 - Monitor Wait Stats'', @in_Recipients = ''DBA_operator'' +', + @database_name=N'HCITools', + @output_file_name=NULL, + @flags=0, + @database_user_name=NULL, + @server=NULL, + @additional_parameters=NULL, + @proxy_id=NULL, + @proxy_name=NULL +IF (@@ERROR <> 0 OR @ReturnCode <> 0) GOTO QuitWithRollback +/* Add Step */ +EXEC @ReturnCode = msdb.dbo.sp_add_jobstep @job_id=@jobId, @step_name=N'send email ko', + @step_id=6, + @cmdexec_success_code=0, + @on_success_action=2, + @on_success_step_id=0, + @on_fail_action=2, + @on_fail_step_id=0, + @retry_attempts=0, + @retry_interval=0, + @os_run_priority=0, @subsystem=N'TSQL', + @command=N'exec aps_Send_Mail_with_template + @in_param_varchar_2 = ''DBA_operator'' + +exec dbo.Get_Job_Error_Info @in_JobName = ''D92060 - Monitor Wait Stats'', @in_Recipients = ''DBA_operator''', + @database_name=N'HCITools', + @output_file_name=NULL, + @flags=0, + @database_user_name=NULL, + @server=NULL, + @additional_parameters=NULL, + @proxy_id=NULL, + @proxy_name=NULL +IF (@@ERROR <> 0 OR @ReturnCode <> 0) GOTO QuitWithRollback +EXEC @ReturnCode = msdb.dbo.sp_update_job @job_id = @jobId, @start_step_id = 1 +IF (@@ERROR <> 0 OR @ReturnCode <> 0) GOTO QuitWithRollback + +/* Add Standard Schedule */ +EXEC @ReturnCode = msdb.dbo.sp_add_jobschedule @job_id=@jobId, @name=N'D92060-D', + @enabled=1, + @freq_type=4, + @freq_interval=1, + @freq_subday_type=4, + @freq_subday_interval=5, + @freq_relative_interval=0, + @freq_recurrence_factor=0, + @active_start_date=20221012, + @active_end_date=99991231, + @active_start_time=0, + @active_end_time=235959 +IF (@@ERROR <> 0 OR @ReturnCode <> 0) GOTO QuitWithRollback + +/* Attach existing specific schedule for job */ +declare @enabled_schedule int, + @schedule_name nvarchar(50) +declare c_schedules cursor local forward_only static for +select enabled, name + from msdb.dbo.sysschedules + where name LIKE 'D92060%' + and name LIKE '%#SPEC#' + +open c_schedules + +FETCH NEXT FROM c_schedules into @enabled_schedule, @schedule_name +while @@fetch_status = 0 +begin + EXEC @ReturnCode = msdb.dbo.sp_attach_schedule @job_id = @jobId, @schedule_name=@schedule_name + IF(@enabled_schedule = 1) + begin + SET @schedule_name = SUBSTRING(@schedule_name,0,LEN(@schedule_name)-5) + IF EXISTS (select name from msdb.dbo.sysschedules where name = @schedule_name) + EXEC @ReturnCode = msdb.dbo.sp_update_schedule @name=@schedule_name, @enabled=0 + end + IF (@@ERROR <> 0 OR @ReturnCode <> 0) GOTO QuitWithRollback +FETCH NEXT FROM c_schedules into @enabled_schedule, @schedule_name +end + +close c_schedules + +deallocate c_schedules + +EXEC @ReturnCode = msdb.dbo.sp_add_jobserver @job_id = @jobId, @server_name = N'(local)' +IF (@@ERROR <> 0 OR @ReturnCode <> 0) GOTO QuitWithRollback +COMMIT TRANSACTION +GOTO EndSave +QuitWithRollback: + IF (@@TRANCOUNT > 0) ROLLBACK TRANSACTION +EndSave: + +GO diff --git a/TPDT-268 - ACP in task sequence/dba_storedProcedures/AMR_Check.sql b/TPDT-268 - ACP in task sequence/dba_storedProcedures/AMR_Check.sql new file mode 100644 index 0000000..651dfcb --- /dev/null +++ b/TPDT-268 - ACP in task sequence/dba_storedProcedures/AMR_Check.sql @@ -0,0 +1,188 @@ +USE [HCITools] +GO + +IF EXISTS (SELECT * FROM sys.objects WHERE object_id = OBJECT_ID(N'[dbo].[AMR_Check]') AND type in (N'P', N'PC')) +DROP PROCEDURE [dbo].[AMR_Check] +GO + +USE [HCITools] +GO + + +SET ANSI_NULLS ON +GO + +SET QUOTED_IDENTIFIER ON +GO + + + + +CREATE PROCEDURE [dbo].[AMR_Check] + @in_debug int = null, + @in_CheckType smallint +AS +/*============================================================================= + + Explication du traitement realise par la SP + ------------------------------------------- + Cette SP sert à controler le nombre d'AMR générés et traités par la connectique + + Contexte d'utilisation + ---------------------- + Cette SP est appelée par le job DR92130 - Monitoring AMR + + Parametres + ---------- + @in_debug : non utilisé + @in_CheckType : 1 = Sauvegarde du nombre d'AMR générés et traités + 2 = Check si nombre d'AMR important (>= 50 0000) + + + Creation : 24.05.18 / FLA + + Modification : + 03.07.19 / SPE - TFS53431 - Optimize MonitoringAMR into HCITools + 08.04.21 / SPE - Add (NOLOCK) in select AMR table + 17.03.22 / FLA : Change DBA mail + 12.02.24 / FLA : Remove ArizonaCASH +=============================================================================*/ + +set nocount on; + +declare @result_sp int, + @errno int, + @errmsg varchar(255) + +/*------------------- Declaration des variables --------------------*/ +declare @Message varchar(8000), + @OutParam varchar(255), + @DatabaseName varchar(255), + @ConnecticUser varchar(255), + @LatestReplicatedNonPriorizedMonitorRowId int, + @LatestReplicatedNonPriorizedMonitorRowIdCASH int, + @LatestReplicatedPriorizedMonitorRowId int, + @LatestReplicatedPriorizedMonitorRowIdCASH int, + @MaxDate DateTime, + @Threshold int, + @Table sysname, + @RowsPrioToDo int, + @RowsToDo int, + @Hour tinyint, + @Minutes tinyint, + @dateRef Datetime + + +/*------------ Affectation des parametres aux variables ------------*/ +SET @message = '' +SET @DatabaseName = 'Arizona' +EXEC Arizona.dbo.sp_bmc_Bmc_Applic_Default @in_job_type = 3, @in_param_int_1 = NULL, @in_param_int_2 = NULL, @in_param_varchar_1 = 'cvConnecticAMRUser', @out_default_value = @OutParam OUTPUT, @out_param_int_1 = NULL +SET @ConnecticUser = @OutParam +SET @dateRef = dateadd(minute,-16,GETDATE()) + +SELECT @LatestReplicatedNonPriorizedMonitorRowId = ActiveSystemServer.amr.GetLatestReplicatedMonitorRowId(@DatabaseName,0) +SELECT @LatestReplicatedPriorizedMonitorRowId = ActiveSystemServer.amr.GetLatestReplicatedMonitorRowId(@DatabaseName,1) + +/*-------------------------- Traitement ---------------------------*/ +BEGIN TRY + + IF (@in_CheckType = 1) + BEGIN + + INSERT INTO HCITools.dbo.[MonitoringAMR] + SELECT GETDATE(), + @DatabaseName [Database], + amt.AMT_table_name [Table], + SUM(CASE WHEN (amr.AMR_user = @ConnecticUser) and (amr.APS_monitor_row_id > @LatestReplicatedPriorizedMonitorRowId) THEN 1 ELSE 0 END), -- AMR priorisés non traités + SUM(CASE WHEN (amr.AMR_user = @ConnecticUser) and (amr.APS_monitor_row_id <= @LatestReplicatedPriorizedMonitorRowId) THEN 1 ELSE 0 END), -- AMR priorisés traités + SUM(CASE WHEN (ISNULL(amr.AMR_user, '') <> @ConnecticUser) and (amr.APS_monitor_row_id > @LatestReplicatedNonPriorizedMonitorRowId) THEN 1 ELSE 0 END), + SUM(CASE WHEN (ISNULL(amr.AMR_user, '') <> @ConnecticUser) and (amr.APS_monitor_row_id <= @LatestReplicatedNonPriorizedMonitorRowId) THEN 1 ELSE 0 END) + FROM Arizona.dbo.APS_monitor_row amr (nolock) + INNER JOIN Arizona.dbo.APS_monitor_table amt (nolock) + ON amr.AMR_APS_monitor_table = amt.APS_monitor_table_id + WHERE amr.AMR_row_GUID IS NOT NULL + -- Remove non transactional and not committed records. + AND NOT (amt.AMT_wait_for_commit = 1 AND amr.AMR_user = @ConnecticUser AND amr.AMR_type_of_change <> 6) + AND amt.AMT_used_by_connectic = 1 + AND AMR_APS_TS >= @dateRef + GROUP BY amt.AMT_table_name + + END + ELSE IF (@in_CheckType = 2) + BEGIN + + select @Hour = DATEPART(HOUR,GETDATE()) + select @Minutes = DATEPART(MINUTE,GETDATE()) + + IF (@Hour in (8,12,16) AND @Minutes < 15) + BEGIN + select @MaxDate = MAX(MA_Date) + from [dbo].[MonitoringAMR] + + SELECT @Threshold = SUM(MA_RowsPrioToDo+MA_RowsToDo) + FROM [dbo].[MonitoringAMR] + WHERE MA_Date = @MaxDate + + IF @Threshold >= 50000 + BEGIN + + SET @message = @message +'AMR to process in pharmacy :'+CHAR(13)+CHAR(10)+CHAR(13)+CHAR(10) + +'Database'+CHAR(9)+CHAR(9) + +'Table'+CHAR(9)+CHAR(9)+CHAR(9)+CHAR(9) + +'Prioritized AMR'+CHAR(9)+CHAR(9)+CHAR(9) + +'Not prioritized AMR'+CHAR(13)+CHAR(10) + + declare c_AMR cursor local forward_only static for + SELECT MA_Database,MA_Table,MA_RowsPrioToDo,MA_RowsToDo + FROM [dbo].[MonitoringAMR] + WHERE MA_Date = @MaxDate + AND (MA_RowsPrioToDo+MA_RowsToDo) > 0 + ORDER BY MA_Database,MA_Table + + open c_AMR + + FETCH NEXT FROM c_AMR + into @DatabaseName, @Table, @RowsPrioToDo, @RowsToDo + + while @@fetch_status <> -1 + begin + + SET @message = @message + @DatabaseName +CHAR(9)+CHAR(9)+CHAR(9) + + @Table +CHAR(9)+CHAR(9)+CHAR(9)+CHAR(9) + + CAST(@RowsPrioToDo AS VARCHAR(50)) +CHAR(9)+CHAR(9)+CHAR(9)+CHAR(9) + + CAST(@RowsToDo AS VARCHAR(50))+CHAR(13)+CHAR(10) + + FETCH NEXT FROM c_AMR + into @DatabaseName, @Table, @RowsPrioToDo, @RowsToDo + END + + close c_AMR + deallocate c_AMR + + END + + IF @message <> '' + BEGIN + exec aps_Send_Mail_with_template + @in_param_varchar_2 = 'DBA_operator;', + @in_job_type = 3, /* 3 = warning */ + @in_param_varchar_3 = @Message + END + END + END + ELSE IF (@in_CheckType = 3) /* Purge history < 3 Months */ + BEGIN + DELETE [dbo].[MonitoringAMR] + WHERE MA_Date < DATEADD(MONTH, -3, GETDATE()) + END + +/*---------------------- Traitement des erreurs ----------------------*/ +END TRY +BEGIN CATCH + + /* Traitement des erreurs (avec RaiseError) */ + EXEC dbo.get_Error_Info @in_RaiseError = 1 + +END CATCH + +GO diff --git a/TPDT-268 - ACP in task sequence/dba_storedProcedures/Backup_Simple_Databases.sql b/TPDT-268 - ACP in task sequence/dba_storedProcedures/Backup_Simple_Databases.sql new file mode 100644 index 0000000..9685c99 --- /dev/null +++ b/TPDT-268 - ACP in task sequence/dba_storedProcedures/Backup_Simple_Databases.sql @@ -0,0 +1,56 @@ +USE [HCITools]; +GO + +IF EXISTS (SELECT * FROM sys.objects WHERE object_id = OBJECT_ID(N'[dbo].[Backup_Simple_Databases]') AND type in (N'P', N'PC')) +DROP PROCEDURE [dbo].[Backup_Simple_Databases] +GO + +USE [HCITools] +GO + +SET ANSI_NULLS ON; +GO + +SET QUOTED_IDENTIFIER ON; +GO + +CREATE PROCEDURE [dbo].[Backup_Simple_Databases] +WITH ENCRYPTION +AS +/*=================================================================================== + Procedure to backup all database in simple recovery mode + + Backkup only if database update occurs during last 24h + + Creation : 10.01.2023 / RTC + =====================================================================================*/ +IF EXISTS ( SELECT 1 + FROM ActivePos_read.[upd].[DatabaseHistory] + WHERE VersionDate > DATEADD(hh, -24, GETDATE())) +BEGIN + + /* select only databases in simple recovery mode */ + DECLARE @database_list VARCHAR(4000); + SELECT @database_list = ''; + + SELECT @database_list = @database_list + name + ',' --,name, * + FROM master.sys.databases + WHERE recovery_model_desc = 'SIMPLE' + AND name NOT IN ( 'tempdb' ); + + SET @database_list = SUBSTRING(@database_list, 1, (LEN(@database_list) - 1)); + + DECLARE @password VARCHAR(255); + + SET @password + = HCITools.dbo.fn_Decrypt( + 0x01000000C2811DD6D0339FF2EFE6AE1181B3469D18798020836E3E0A1E4BC96D548B4FCDFFB77F264E1A4F42AD91F785284A6F5D4F3E533B0355E88F91A61E7E671472D3F580FC36CCF0AE48858099190C1B7E3A1A2A292A3E8809B40EAB6EAECF3C0FF6871CAF54A3928615C21830602BCB12F1F973E4B4B1F34A613B342C397372596025DB62CB426319AE916D0DC5CCAED8A62675D7602D592A92); + + /* BACKUP TARGET DATABASES */ + EXEC HCITools.[dba].[Commvault_Operation] @in_type = 'Backup', + @in_username = 'CLI_SQL_Backup', + @in_password = @password, + @in_subclientName = 'OnDemand', + @in_databasetobackup = @database_list, + @in_callerApp = 'DBA backup'; +END; \ No newline at end of file diff --git a/TPDT-268 - ACP in task sequence/dba_storedProcedures/Backup_all_principal_permission.sql b/TPDT-268 - ACP in task sequence/dba_storedProcedures/Backup_all_principal_permission.sql new file mode 100644 index 0000000..41ae717 Binary files /dev/null and b/TPDT-268 - ACP in task sequence/dba_storedProcedures/Backup_all_principal_permission.sql differ diff --git a/TPDT-268 - ACP in task sequence/dba_storedProcedures/Backup_principal_permission.sql b/TPDT-268 - ACP in task sequence/dba_storedProcedures/Backup_principal_permission.sql new file mode 100644 index 0000000..b14f5f7 --- /dev/null +++ b/TPDT-268 - ACP in task sequence/dba_storedProcedures/Backup_principal_permission.sql @@ -0,0 +1,138 @@ +USE [HCITools] +GO + +IF EXISTS (SELECT * FROM sys.objects WHERE object_id = OBJECT_ID(N'[dba].[Backup_principal_permission]') AND type in (N'P', N'PC')) + DROP PROCEDURE [dba].[Backup_principal_permission] +GO + +USE [HCITools] +GO + +SET ANSI_NULLS ON +GO + +SET QUOTED_IDENTIFIER ON +GO + +CREATE PROCEDURE [dba].[Backup_principal_permission] + @in_param_database_name varchar (255) = null, + @in_param_label datetime, + @in_debug int = null +AS +/*============================================================================= + + Explication du traitement realise par la SP + ------------------------------------------- + Cette Sp sert a créer une copie de sauvegarde des droits la base Arizona, + et sécurités pour une base donnée. + + Contexte d'utilisation + ---------------------- + Cette Sp est utilisée lors de la mise à jour des environnements afin de , + restaurer les droits à la fin de la mise à jour. + + Parametres + ---------- + @in_database_name = nom de la base + @@in_label = Label de l'extraction + + Creation : 15.11.16 / rtc + Dossier : #35262# + Security - Backup and restore SQL objects security + + Modifications : + DD.MM.YY / xxx : +=============================================================================*/ + +set nocount on; +declare @result_sp int, + @errno int, + @errmsg varchar(255); + +/*------------------------ Test des parametres input ------------------------*/ + +if (@in_param_database_name is null) +begin + select @errno = 70003, + @errmsg = '(APS) Invalid input parameter database name !' + goto error_99 +end + +/*------------------- Declaration des variables --------------------*/ +declare @cmd varchar (8000); +declare @label varchar(255), + @database_name varchar (255), + @database_id int; + +/*------------ Affectation des parametres aux variables ------------*/ + +select @label = CONVERT(varchar(255),@in_param_label,121); +select @database_name = @in_param_database_name, + @label = isnull (@label, CONVERT(varchar(255),GETDATE(),121)) +select top 1 @database_id = database_id + from sys.databases + where name = @database_name + +/*-------------------------- Traitement ---------------------------*/ +begin try + select @cmd = ' + INSERT INTO HCITools.dba.[Principal_Permission] + SELECT ' + '''' + @database_name + '''' + ' [PP_database_name], + QUOTENAME(OBJECT_SCHEMA_NAME(ob.object_id,'+ CONVERT(varchar(100),@database_id)+')) [PP_schema], + ob.name [PP_object], + QUOTENAME(dpr.name) PP_user_name, + dp.type PP_permission_type, + dp.permission_name PP_permission_name, + dp.state PP_permission_state, + dp.state_desc PP_state_desc, + CASE WHEN state <> ''W'' + THEN state_desc + ELSE ''GRANT'' + END + + '' '' + permission_name + '' ON ''+ QUOTENAME(OBJECT_SCHEMA_NAME(ob.object_id,' + + CONVERT(varchar(100),@database_id)+')) + ''.'' + QUOTENAME(ob.name) + + CASE WHEN sc.column_id IS NULL + THEN SPACE(0) + ELSE '' (''+ QUOTENAME(sc.name) +'')'' + END + + '' TO'' + SPACE(1) + QUOTENAME(dpr.name) COLLATE database_default + + CASE WHEN dp.state <> ''W'' THEN '''' + ELSE + '' WITH GRANT OPTION'' + END [PP_apply_permission_command], + CONVERT(datetime, '+ ''''+@label +''''+',121) [PP_timestamp] + + FROM ' + @database_name + '.sys.database_permissions dp + JOIN '+ @database_name +' .sys.objects ob + ON dp.major_id = ob.object_id + JOIN '+ @database_name +'.sys.database_principals dpr + ON dp.grantee_principal_id = dpr.principal_id + LEFT JOIN '+ @database_name +'.sys.columns sc + ON sc.column_id = dp.minor_id + AND dp.major_id = sc.object_id + ORDER BY 1, 2, 3, 5' + + if (@in_Debug = 1) + print @cmd + else + exec (@cmd) + +end try + +begin catch + select @errno = 70000, + @errmsg = 'Error during backup principals !! ' + ERROR_MESSAGE() + ; + goto error_99 + +end catch + +/*------------------ Retour au programme appelant -----------------*/ + +return(@@error); + +/*---------------------- Traitement des erreurs ----------------------*/ +error_99: + raiserror(@errmsg, 14, 1) + return(@errno) +; + +go \ No newline at end of file diff --git a/TPDT-268 - ACP in task sequence/dba_storedProcedures/CheckMaintenanceWindow.sql b/TPDT-268 - ACP in task sequence/dba_storedProcedures/CheckMaintenanceWindow.sql new file mode 100644 index 0000000..cea205e --- /dev/null +++ b/TPDT-268 - ACP in task sequence/dba_storedProcedures/CheckMaintenanceWindow.sql @@ -0,0 +1,76 @@ +USE [HCITools] +GO + +IF EXISTS (SELECT * FROM sys.objects WHERE object_id = OBJECT_ID(N'[dbo].[CheckMaintenanceWindow]') AND type in (N'P', N'PC')) +DROP PROCEDURE [dbo].[CheckMaintenanceWindow] +GO + +SET ANSI_NULLS ON +GO + +SET QUOTED_IDENTIFIER ON +GO + +IF NOT EXISTS (SELECT * FROM sys.objects WHERE object_id = OBJECT_ID(N'[dbo].[CheckMaintenanceWindow]') AND type in (N'P', N'PC')) +BEGIN +EXEC dbo.sp_executesql @statement = N'CREATE PROCEDURE [dbo].[CheckMaintenanceWindow] AS' +END +GO + +ALTER PROCEDURE [dbo].[CheckMaintenanceWindow] + @in_debug int = null, + @in_JobName sysname + +AS +/*============================================================================= + + Explication du traitement realise par la SP + ------------------------------------------- + Cette SP sert à savoir si le job appelant peut s'executer ou s'il est dans la plage de maintenance + + Contexte d'utilisation + ---------------------- + Cette SP est appelée via les jobs [D91040 - Backup of simple databases] et [D91050 - Backup of full databases] + + Parametres + ---------- + @in_debug : non utilisé + + Creation : 16.12.20 / FLA + + Modifications : 04.05.21 / FLA : changement du comportement par défaut si la centrale n'est pas joignable + 18.01.22 / SPE : OCTPDBA-92 : Adapt [HCITools].[dbo].[CheckMaintenanceWindow] stored procedure to get information from the new S10 maintenance windows + +=============================================================================*/ + +set nocount on; + + +/*------------------- Declaration des variables --------------------*/ +declare @DateFROM datetime = '', + @DateTO datetime = '' + +/*-------------------------- Traitement ---------------------------*/ +BEGIN TRY + + SELECT @DateFROM = convert(datetime,[ITCS_value]) FROM [Arizona].[dbo].[IT_config_setting] WHERE [ITCS_key] = 'SCCMMWStart' + SELECT @DateTO = convert(datetime,[ITCS_value]) FROM [Arizona].[dbo].[IT_config_setting] WHERE [ITCS_key] = 'SCCMMWEnd' + + IF @DateFROM is not null and @DateTO is not null + BEGIN + IF (GETDATE() BETWEEN convert(datetime,@DateFROM) AND convert(datetime,@DateTO)) + BEGIN + EXEC msdb.dbo.sp_stop_job @job_name = @in_JobName + RAISERROR('This server is actually in a SCCM Maintenance window, execution of this job is cancelled!',16,1) + END + END + +/*---------------------- Traitement des erreurs ----------------------*/ +END TRY +BEGIN CATCH + + /* Traitement des erreurs (avec RaiseError) */ + EXEC dbo.get_Error_Info @in_RaiseError = 1 + +END CATCH +GO diff --git a/TPDT-268 - ACP in task sequence/dba_storedProcedures/Check_Critical_Job.sql b/TPDT-268 - ACP in task sequence/dba_storedProcedures/Check_Critical_Job.sql new file mode 100644 index 0000000..722c21b --- /dev/null +++ b/TPDT-268 - ACP in task sequence/dba_storedProcedures/Check_Critical_Job.sql @@ -0,0 +1,373 @@ +USE [HCITools] +GO + +IF EXISTS (SELECT * FROM sys.objects WHERE object_id = OBJECT_ID(N'[mon].[Check_Critical_Job]') AND type in (N'P', N'PC')) +DROP PROCEDURE [mon].[Check_Critical_Job] +GO + +SET ANSI_NULLS ON +GO +SET QUOTED_IDENTIFIER ON +GO + +CREATE PROCEDURE [mon].[Check_Critical_Job] +AS +/*============================================================================= + + Explication du traitement realise par la SP + ------------------------------------------- + La SP va vérifier la bonne execution des jobs critiques et envoyer un SMS de rapport aux personnes de piquet + + Contexte d'utilisation + ---------------------- + Appelé depuis le job D92210 - Check Critical Jobs + + Creation : 26.02.19 / FLA + + Modifications : 13.03.19 / FLA : utilisation de la table DBA_Mailing_list plutôt que SMSOperator + changement du schema des objets dans [mon] + 15.03.19 / FLA : changement du format d'envoi de mail + 18.03.19 / FLA : centralisation du calendrier + mailing list opérateur de piquet + ajout du type de calendrier (1=Critical Jobs) + 24.05.19 / FLA : add WITH (NOLOCK) to avoid locking system table + 27.06.19 / FLA : deplacement du status dans l'object du mail + 02.09.19 / FLA : ajout check état des steps du job même si job success + 12.09.19 / FLA : correction bug check état des steps du job + 10.02.20 / SPE : Modification du compte sqlMonDBACalendar + 03.03.20 / RTC : correction bug, rajout check session + 23.06.20 / SPE : Ajout du monitoring dans DBA_monitoring_alerts_history + 06.08.20 / SPE : Mise a jour de la SP complete bug60296 + 06.10.20 / SPE : Critical job not always send a status bug60296 + 27.10.20 / RTC : Migrate DBACC to HCIMON + 16.08.21 / SPE : Replace hardcoded password in sp and scripts + 17.03.22 / FLA : Change DBA mail +=============================================================================*/ + +SET NOCOUNT ON; + +/*------------------- Declaration des variables --------------------*/ +DECLARE @cmd nvarchar(max), + @Message varchar(500), + @Operator varchar(500), + @JobName varchar(100), + @JobDescription varchar(100), + @JobStatus varchar(20), + @Format varchar(4), + @BouquetID uniqueidentifier, + @StepID tinyint, + @EndJobExecution tinyint, + @LastStepID tinyint, + @NbStepFailed tinyint, + @EndBouquetExecution tinyint, + @StartBouquetExecution datetime + +/*------------ Affectation des parametres aux variables ------------*/ + +SET @Operator = 'DBA_operator' +SET @JobDescription = '' +SET @JobStatus = '' +SET @Message = '' +SET @EndJobExecution = 0 +SET @EndBouquetExecution = 0 +SET @LastStepID = 0 +SET @NbStepFailed = 0 +SET @StartBouquetExecution = NULL + +/*-------------------------- Traitement ---------------------------*/ + +/* Get operator if SMS is needed */ +BEGIN TRY + SELECT @Operator = @Operator /*+';'+ORS.DML_Recipients + FROM OPENROWSET('SQLNCLI', 'DRIVER={SQL Server};SERVER=hcimon.centralinfra.net;UID=sqlMonDBACalendar;PWD=', + 'SELECT DML.DML_Recipients + FROM HCITools.[mon].[SMSCalendar] SC + INNER JOIN HCITools.[mon].[SMSCalendarDBAMailingListLink] SCDMLL + ON SC.SMSCalendarID = SCDMLL.SCDMLLCalendarID + AND SC.SCType = 1 -- Critical jobs type + INNER JOIN HCITools.dbo.DBA_Mailing_list DML + ON DML.DBA_Mailing_list_ID = SCDMLL.SCDMLLDBAMailingListID + WHERE GETDATE() BETWEEN SC.SCStartDate AND SC.SCEndDate') as ORS */ +END TRY +BEGIN CATCH + PRINT('ERROR during openrowset on DBACC, skip this') +END CATCH + +BEGIN TRY + + DECLARE c_Jobs CURSOR LOCAL FORWARD_ONLY STATIC FOR + SELECT sjs.step_id,sjc.SJCFormat,sjc.SJCJobName,sjc.SJCJobDescription,sj.job_id + FROM HCITools.[mon].SMSJobCheck sjc + LEFT JOIN msdb.dbo.sysjobsteps sjs WITH (NOLOCK) + ON sjs.step_name like '%Start job %'+ sjc.SJCJobName +'%' + INNER JOIN msdb.dbo.sysjobs sj WITH (NOLOCK) + ON sjs.job_id = sj.job_id + ORDER BY sjc.SJCNextExecution, step_id + + OPEN c_Jobs + + FETCH NEXT FROM c_Jobs + INTO @StepID,@Format,@JobName,@JobDescription,@BouquetID + + WHILE @@fetch_status = 0 + BEGIN + + IF @StepID IS NOT NULL + BEGIN + WHILE (isnull(@LastStepID,0) < @StepID AND @EndBouquetExecution = 0) + BEGIN + + SELECT @StartBouquetExecution = sja.start_execution_date, + @EndBouquetExecution = CASE WHEN sja.stop_execution_date IS NULL THEN 0 ELSE 1 END, + @LastStepID = sja.last_executed_step_id + FROM msdb.dbo.sysjobactivity sja WITH (NOLOCK) + INNER JOIN HCITools.[mon].SMSJobCheck sjc + ON sja.job_id = @BouquetID + AND sjc.SJCJobName = @JobName + AND sjc.SJCNextExecution <= sja.start_execution_date + + WAITFOR DELAY '00:01:00' + + END -- WHILE (@EndJobExecution = 0 AND @EndBouquetExecution = 0) + + IF (@LastStepID >= @StepID) + BEGIN + + IF EXISTS (SELECT 1 + FROM msdb.dbo.sysjobhistory sjh WITH (NOLOCK) + WHERE sjh.job_id = @BouquetID + AND sjh.step_id = @StepID + AND msdb.dbo.agent_datetime(sjh.run_date,sjh.run_time)>=@StartBouquetExecution) + BEGIN + WHILE @EndJobExecution = 0 + BEGIN + IF @Format IN ('SUN','AMA','AAI','RUEG') + BEGIN + SELECT @JobStatus = CASE WHEN sjh.run_status = 1 THEN 'OK' ELSE 'FAILED' END, + @EndJobExecution = CASE WHEN sja.stop_execution_date IS NULL THEN 0 ELSE 1 END + FROM msdb.dbo.sysjobs sj WITH (NOLOCK) + INNER JOIN msdb.dbo.sysjobactivity sja WITH (NOLOCK) + ON sj.name = @JobName + AND sj.job_id = sja.job_id + AND sja.start_execution_date >= @StartBouquetExecution + INNER JOIN msdb.dbo.sysjobhistory sjh WITH (NOLOCK) + ON sja.job_history_id = sjh.instance_id + + IF @JobStatus = 'OK' AND @EndJobExecution = 1 /* Check step even if @jobstatus = OK */ + BEGIN + SELECT @NbStepFailed = @NbStepFailed + COUNT(*) + FROM msdb.dbo.sysjobhistory jh WITH (NOLOCK) + INNER JOIN msdb.dbo.sysjobactivity ja WITH (NOLOCK) + ON ja.job_id = jh.job_id + INNER JOIN msdb.dbo.sysjobs j WITH (NOLOCK) + ON j.job_id = ja.job_id + WHERE j.name = @JobName + AND run_status = 0 --and ja.stop_execution_date is null-- + AND ja.session_id = (SELECT TOP 1 session_id FROM msdb.dbo.syssessions WITH (NOLOCK) ORDER BY agent_start_date DESC) + AND start_execution_date is not null + AND stop_execution_date is not null + AND msdb.dbo.agent_datetime(run_date, run_time) >= start_execution_date + + /* Gestion des Query Timeout Error */ + SELECT @NbStepFailed = @NbStepFailed + COUNT(*) + FROM msdb.dbo.sysjobhistory jh WITH (NOLOCK) + INNER JOIN msdb.dbo.sysjobactivity ja WITH (NOLOCK) + ON ja.job_id = jh.job_id + INNER JOIN msdb.dbo.sysjobs j WITH (NOLOCK) + ON j.job_id = ja.job_id + WHERE j.name = @JobName + AND run_status = 1 --and ja.stop_execution_date is null-- + AND ja.session_id = (SELECT TOP 1 session_id FROM msdb.dbo.syssessions WITH (NOLOCK) ORDER BY agent_start_date DESC) + AND start_execution_date is not null + AND stop_execution_date is not null + AND jh.sql_message_id = 7412 + AND msdb.dbo.agent_datetime(run_date, run_time) >= start_execution_date + + IF @NbStepFailed > 0 + BEGIN + SET @JobStatus = 'FAILED' + END + END + END + ELSE IF @Format = 'AMAR' + BEGIN + SET @cmd = 'SELECT @JobStatus = CASE WHEN sjh.run_status = 1 THEN ''OK'' ELSE ''FAILED'' END, + @EndJobExecution = CASE WHEN sja.stop_execution_date IS NULL THEN 0 ELSE 1 END + FROM AMAVITALIVEAPS.msdb.dbo.sysjobs sj WITH (NOLOCK) + INNER JOIN AMAVITALIVEAPS.msdb.dbo.sysjobactivity sja WITH (NOLOCK) + ON sj.name = @JobName + AND sj.job_id = sja.job_id + AND sja.start_execution_date >= @StartBouquetExecution + INNER JOIN AMAVITALIVEAPS.msdb.dbo.sysjobhistory sjh WITH (NOLOCK) + ON sja.job_history_id = sjh.instance_id + +IF @JobStatus = ''OK'' AND @EndJobExecution = 1 /* Check step even if @jobstatus = OK */ +BEGIN + SELECT @NbStepFailed = @NbStepFailed + COUNT(*) + FROM AMAVITALIVEAPS.msdb.dbo.sysjobhistory jh WITH (NOLOCK) + INNER JOIN AMAVITALIVEAPS.msdb.dbo.sysjobactivity ja WITH (NOLOCK) + ON ja.job_id = jh.job_id + INNER JOIN AMAVITALIVEAPS.msdb.dbo.sysjobs j WITH (NOLOCK) + ON j.job_id = ja.job_id + WHERE j.name = @JobName + AND run_status = 0 --and ja.stop_execution_date is null-- + AND ja.session_id = (SELECT TOP 1 session_id FROM AMAVITALIVEAPS.msdb.dbo.syssessions WITH (NOLOCK) ORDER BY agent_start_date DESC) + AND start_execution_date is not null + AND stop_execution_date is not null + AND msdb.dbo.agent_datetime(run_date, run_time) >= start_execution_date + + /* Gestion des Query Timeout Error */ + SELECT @NbStepFailed = @NbStepFailed + COUNT(*) + FROM AMAVITALIVEAPS.msdb.dbo.sysjobhistory jh WITH (NOLOCK) + INNER JOIN AMAVITALIVEAPS.msdb.dbo.sysjobactivity ja WITH (NOLOCK) + ON ja.job_id = jh.job_id + INNER JOIN AMAVITALIVEAPS.msdb.dbo.sysjobs j WITH (NOLOCK) + ON j.job_id = ja.job_id + WHERE j.name = @JobName AND run_status = 1 --and ja.stop_execution_date is null-- + AND ja.session_id = (SELECT TOP 1 session_id FROM AMAVITALIVEAPS.msdb.dbo.syssessions WITH (NOLOCK) ORDER BY agent_start_date DESC) + AND start_execution_date is not null + AND stop_execution_date is not null + AND jh.sql_message_id = 7412 + AND msdb.dbo.agent_datetime(run_date, run_time) >= start_execution_date + + IF @NbStepFailed > 0 + BEGIN + SET @JobStatus = ''FAILED'' + END + END +' + + EXEC sp_executesql @cmd, N'@EndJobExecution tinyint OUTPUT,@JobStatus varchar(20) OUTPUT, @JobName varchar(100), @StartBouquetExecution datetime, @NbStepFailed tinyint', @JobStatus=@JobStatus OUTPUT, @EndJobExecution=@EndJobExecution OUTPUT, @JobName=@JobName, @StartBouquetExecution=@StartBouquetExecution, @NbStepFailed=@NbStepFailed + + END + + WAITFOR DELAY '00:01:00' + + END -- WHILE @EndJobExecution IS NULL + END -- IF EXISTS + ELSE + BEGIN + SET @JobStatus = 'NO EXECUTION' + END + + SET @Message = isnull(@JobDescription,'no job description') + ' : ' + isnull(@JobStatus,'no job status') + END -- IF (@LastStepID >= @StepID) + END -- IF @StepID IS NOT NULL + ELSE + BEGIN + SET @Message = isnull(@JobDescription,'no job description') + ' : Le job a changé de nom' + END + + IF @Message <> '' + BEGIN + + DECLARE @machine VARCHAR(255) + SET @machine = '' + + BEGIN TRY + EXEC arizona.dbo.aps_Retrieve_info_of_current_system @out_current_system = @machine OUTPUT + END TRY + BEGIN CATCH + SET @machine = '' + END CATCH + + SET @Message = isnull(@machine,'no machine name') + ' - ' + isnull(@Message,'no message') + + BEGIN TRY + + DECLARE @AlertID int + + IF CHARINDEX('Interbase',@JobDescription, 0) > 0 + BEGIN + SELECT @AlertID = DBA_monitoring_alerts_ID FROM [HCITools].[mon].[DBA_monitoring_alerts] WHERE DBAMA_key = 'SyncI' + END + + IF CHARINDEX('Synchro H',@JobDescription, 0) > 0 + BEGIN + SELECT @AlertID = DBA_monitoring_alerts_ID FROM [HCITools].[mon].[DBA_monitoring_alerts] WHERE DBAMA_key = 'SyncH' + END + + IF CHARINDEX('Synchro V',@JobDescription, 0) > 0 + BEGIN + SELECT @AlertID = DBA_monitoring_alerts_ID FROM [HCITools].[mon].[DBA_monitoring_alerts] WHERE DBAMA_key = 'SyncVExtract' + END + + IF CHARINDEX('PharmIndex',@JobDescription, 0) > 0 + BEGIN + SELECT @AlertID = DBA_monitoring_alerts_ID FROM [HCITools].[mon].[DBA_monitoring_alerts] WHERE DBAMA_key = 'PHIDX' + END + + IF RIGHT(@Message,2) = 'OK' + BEGIN + INSERT INTO [HCITools].[mon].[DBA_monitoring_alerts_history] (DBAMAH_monitoring_alerts, DBAMAH_criticity_level, DBAMAH_event_date, DBAMAH_long_message) + VALUES (@AlertID, 0, getdate(), @message) + END + ELSE + BEGIN + INSERT INTO [HCITools].[mon].[DBA_monitoring_alerts_history] (DBAMAH_monitoring_alerts, DBAMAH_criticity_level, DBAMAH_event_date, DBAMAH_long_message) + VALUES (@AlertID, 2, getdate(), @message) + END + + END TRY + BEGIN CATCH + EXEC aps_Send_Mail_with_template @in_param_varchar_2 = @Operator, @in_param_subject = 'Problème avec le check du monitoring', @in_job_type = 4; + END CATCH + + EXEC aps_Send_Mail_with_template @in_param_varchar_2 = @Operator, @in_param_subject = @message, @in_job_type = 4; + + END + + FETCH NEXT FROM c_Jobs + INTO @StepID,@Format,@JobName,@JobDescription,@BouquetID + + SET @EndJobExecution = 0 + SET @Message = '' + SET @NbStepFailed = 0 + END -- while @@fetch_status = 0 + + CLOSE c_Jobs + DEALLOCATE c_Jobs + + SET @EndBouquetExecution = 1 + + WHILE @EndBouquetExecution <> 0 + BEGIN + SELECT @EndBouquetExecution = SUM(CASE WHEN sja.stop_execution_date IS NULL THEN 1 ELSE 0 END) + FROM HCITools.[mon].SMSJobCheck sjc + INNER JOIN msdb.dbo.sysjobsteps sjs WITH (NOLOCK) + ON sjs.step_name like '%Start job %'+ sjc.SJCJobName +'%' + INNER JOIN msdb.dbo.sysjobs sj WITH (NOLOCK) + ON sjs.job_id = sj.job_id + INNER JOIN msdb.dbo.sysjobactivity sja WITH (NOLOCK) + ON sja.job_id = sj.job_id + INNER JOIN msdb.dbo.syssessions AS sse + ON sja.session_id = sse.session_id + INNER JOIN (SELECT MAX(agent_start_date) as agent_start_date FROM msdb.dbo.syssessions) AS mss + ON sse.agent_start_date = mss.agent_start_date + WHERE sja.start_execution_date >= SJCNextExecution + + WAITFOR DELAY '00:02:00' + END + + UPDATE sjc SET SJCNextExecution = sja.next_scheduled_run_date + FROM HCITools.[mon].SMSJobCheck sjc + INNER JOIN msdb.dbo.sysjobsteps sjs WITH (NOLOCK) + ON sjs.step_name like '%Start job %'+ sjc.SJCJobName +'%' + INNER JOIN msdb.dbo.sysjobs sj WITH (NOLOCK) + ON sjs.job_id = sj.job_id + INNER JOIN msdb.dbo.sysjobactivity sja WITH (NOLOCK) + ON sja.job_id = sj.job_id + INNER JOIN msdb.dbo.syssessions AS sse + ON sja.session_id = sse.session_id + INNER JOIN (SELECT MAX(agent_start_date) as agent_start_date FROM msdb.dbo.syssessions) AS mss + ON sse.agent_start_date = mss.agent_start_date + WHERE sja.start_execution_date >= ISNULL(SJCNextExecution,GETDATE()-1) + +/*---------------------- Traitement des erreurs ----------------------*/ +END TRY +BEGIN CATCH + + /* Traitement des erreurs (avec RaiseError) */ + EXEC dbo.get_Error_Info @in_RaiseError = 1 + +END CATCH +GO diff --git a/TPDT-268 - ACP in task sequence/dba_storedProcedures/Check_SQL_Dumps.sql b/TPDT-268 - ACP in task sequence/dba_storedProcedures/Check_SQL_Dumps.sql new file mode 100644 index 0000000..adb644e --- /dev/null +++ b/TPDT-268 - ACP in task sequence/dba_storedProcedures/Check_SQL_Dumps.sql @@ -0,0 +1,96 @@ +USE [HCITools] +GO + +IF EXISTS (SELECT * FROM sys.objects WHERE object_id = OBJECT_ID(N'[dbo].[Check_SQL_Dumps]') AND type in (N'P', N'PC')) + DROP PROCEDURE [dbo].[Check_SQL_Dumps] +GO + +/****** Object: StoredProcedure [dbo].[Check_SQL_Dumps] Script Date: 12/14/2018 13:07:58 ******/ +SET ANSI_NULLS ON +GO + +SET QUOTED_IDENTIFIER ON +GO + + + + +CREATE PROCEDURE [dbo].[Check_SQL_Dumps] + @in_debug int = null +AS +/*============================================================================= + + Explication du traitement realise par la SP + ------------------------------------------- + Cette SP vérifie le log SQL des 2 dernières heures et envoie une alerte par mail si des dumps SQL ont été générés. + + + Contexte d'utilisation + ---------------------- + Cette SP est appelée par le job SQL DR92120 - Check Stack Dump + + + Parametres + ---------- + @in_debug : Si 1 alors on fait un print des commandes + + Creation : 14.12.18 / SPE + + Modifications : 17.03.2022 - FLA : Change DBA mail + +=============================================================================*/ + +set nocount on; + +declare @result_sp int, + @errno int, + @errmsg varchar(255) + +/*------------------- Declaration des variables --------------------*/ + +DECLARE @dateFrom datetime, + @dateTo datetime, + @totDumps int, + @msg varchar(8000) + +/*------------ Affectation des parametres aux variables ------------*/ + +SET @dateFrom = DATEADD(minute, -120, GETDATE()) +SET @dateTo = GETDATE() +SET @msg = '' + +/*-------------------------- Traitement ---------------------------*/ +BEGIN TRY + +CREATE TABLE #t_totDumps(LogDate datetime, ProcessInfo varchar(20), Textlog varchar(20) ); + +INSERT INTO #t_totDumps(LogDate,ProcessInfo,Textlog) + EXEC sys.xp_readerrorlog 0, 1, '* BEGIN STACK DUMP:', NULL, @dateFrom, @dateTo, N'desc' + +SELECT @totDumps = COUNT(*) FROM #t_totDumps +DROP TABLE #t_totDumps; + +IF @totDumps <> 0 +BEGIN + SET @msg = 'WARNING: ' + convert(varchar,@totDumps) + ' SQL crash dumps found during the last 2 hours!'; + + EXEC hcitools.dbo.aps_Send_Mail_with_template + @in_param_varchar_2 = 'DBA_operator;', + @in_job_type = 3, /* 3 = warning */ + @in_param_varchar_3 = @msg +END + +/*---------------------- Traitement des erreurs ----------------------*/ +END TRY +BEGIN CATCH + + /* Traitement des erreurs (avec RaiseError) */ + EXEC dbo.get_Error_Info @in_RaiseError = 1 + +END CATCH + + +GO + + + diff --git a/TPDT-268 - ACP in task sequence/dba_storedProcedures/CleanUp_History.sql b/TPDT-268 - ACP in task sequence/dba_storedProcedures/CleanUp_History.sql new file mode 100644 index 0000000..a8a8937 --- /dev/null +++ b/TPDT-268 - ACP in task sequence/dba_storedProcedures/CleanUp_History.sql @@ -0,0 +1,118 @@ +USE [HCITools] +GO + +IF EXISTS(SELECT 1 FROM sys.objects WHERE object_id = OBJECT_ID(N'[dbo].[CleanUp_History]') AND type in (N'P', N'PC')) +DROP PROCEDURE [dbo].[CleanUp_History] +GO + +SET ANSI_NULLS ON +GO + +SET QUOTED_IDENTIFIER ON +GO + +CREATE PROCEDURE [dbo].[CleanUp_History] +AS +/*============================================================================= + + Explication du traitement realise par la SP + ------------------------------------------- + La SP va purger l'historique des jobs plus ancien de 3 mois + + Contexte d'utilisation + ---------------------- + Appelé depuis le job D93010 - Daily clean-up + + Parametres + ---------- + + Creation : 28.10.16 / FLA + + Modifications : 08.03.2018 / RTC Reduce history for Repl-Distribution category jobs + 09.02.2021 / SPE #TFS63542# - Adapt purge DR jobs daily treatment + 18.02.2021 / SPE #TFS63542# - Adapt purge DR jobs daily treatment - Resolve bug Oldest_date at the top of cursor + +=============================================================================*/ + +SET NOCOUNT ON + +DECLARE @job_id UNIQUEIDENTIFIER, + @Oldest_date DATETIME, + @tot INT, + @daycount SMALLINT + +BEGIN TRY + + /* PURGE MORE THAN 3 MONTHS */ + SET @Oldest_date = dateadd(mm,-3,GETDATE()) + EXEC msdb..sp_delete_backuphistory @oldest_date=@Oldest_date + EXEC msdb..sp_maintplan_delete_log @oldest_time=@Oldest_date + EXEC msdb..sysmail_delete_mailitems_sp @sent_before=@Oldest_date + + DECLARE c_jobs CURSOR LOCAL FORWARD_ONLY STATIC FOR + SELECT jobs.job_id + FROM msdb..sysjobs jobs + + OPEN c_jobs + + FETCH NEXT FROM c_jobs + INTO @job_id + + WHILE @@fetch_status <> -1 + BEGIN + IF @@fetch_status <> -2 + BEGIN + + SET @Oldest_date = dateadd(mm,-3,GETDATE()) + + /* PURGE MORE THAN 3 MONTHS JOB BY JOB */ + EXEC msdb.dbo.sp_purge_jobhistory + @job_id = @job_id, + @oldest_date = @Oldest_date + + /* PURGE ALL IF MORE THAN 2000 HISTORY DAY BY DAY */ + SELECT @tot = count(*) + FROM msdb.dbo.sysjobhistory h with (nolock) + JOIN msdb.dbo.sysjobs j with (nolock) + ON j.job_id = h.job_id + WHERE j.job_id = @job_id + + SET @daycount = -90 + + WHILE (@tot > 2000) + BEGIN + SET @Oldest_date = dateadd(dd,@daycount,GETDATE()) + + EXEC msdb.dbo.sp_purge_jobhistory + @job_id = @job_id, + @oldest_date = @Oldest_date + + SET @daycount = @daycount + 1 + + SELECT @tot = count(*) + FROM msdb.dbo.sysjobhistory h with (nolock) + JOIN msdb.dbo.sysjobs j with (nolock) + ON j.job_id = h.job_id + WHERE j.job_id = @job_id + + END + END + + FETCH NEXT FROM c_jobs + INTO @job_id + + END + + CLOSE c_jobs + DEALLOCATE c_jobs + +/*---------------------- Traitement des erreurs ----------------------*/ +END TRY +BEGIN CATCH + + /* Traitement des erreurs (avec RaiseError) */ + EXEC dbo.get_Error_Info @in_RaiseError = 1 + +END CATCH + +GO diff --git a/TPDT-268 - ACP in task sequence/dba_storedProcedures/CleanUp_Objects_Security_History.sql b/TPDT-268 - ACP in task sequence/dba_storedProcedures/CleanUp_Objects_Security_History.sql new file mode 100644 index 0000000..2a10b4a --- /dev/null +++ b/TPDT-268 - ACP in task sequence/dba_storedProcedures/CleanUp_Objects_Security_History.sql @@ -0,0 +1,66 @@ +USE [HCITools] +GO + +IF EXISTS (SELECT * FROM sys.objects WHERE object_id = OBJECT_ID(N'[dbo].[CleanUp_Objects_Security_History]') AND type in (N'P', N'PC')) +DROP PROCEDURE [dbo].[CleanUp_Objects_Security_History] +GO + +USE [HCITools] +GO + +SET ANSI_NULLS ON +GO + +SET QUOTED_IDENTIFIER ON +GO + + +CREATE PROCEDURE [dbo].[CleanUp_Objects_Security_History] + @in_debug tinyint = 0 +AS +/*============================================================================= + + Explication du traitement realise par la SP + ------------------------------------------- + This SP will delete objects security history according to type of environnement. + + Context + ---------------------- + Call by job W93140 - Backup objects security + + Parameters + ---------- + @in_debug : not used + + Create date : 05.10.2018 / RTC + +=============================================================================*/ + +set nocount on; + +/*------------------- Declaration des variables --------------------*/ + +declare @Oldest_date datetime + +BEGIN TRY + + IF EXISTS ( SELECT * + FROM [master].[cfg].[InstanceContext] + WHERE Type in ( 'VALI', 'DEV' )) + SELECT @Oldest_date = dateadd(m, -3, getdate()) + ELSE + SELECT @Oldest_date = dateadd(m, -6, getdate()) + + DELETE FROM [HCITools].[dba].[Principal_Permission] + WHERE [PP_timestamp] < @Oldest_date + +/*---------------------- Traitement des erreurs ----------------------*/ +END TRY +BEGIN CATCH + + /* Error management with RaiseError */ + EXEC dbo.get_Error_Info @in_RaiseError = 1 + +END CATCH + +GO diff --git a/TPDT-268 - ACP in task sequence/dba_storedProcedures/DBA_Check.sql b/TPDT-268 - ACP in task sequence/dba_storedProcedures/DBA_Check.sql new file mode 100644 index 0000000..49d3496 --- /dev/null +++ b/TPDT-268 - ACP in task sequence/dba_storedProcedures/DBA_Check.sql @@ -0,0 +1,363 @@ +USE [HCITools] +GO + +IF EXISTS (SELECT * FROM sys.objects WHERE object_id = OBJECT_ID(N'[dbo].[DBA_Check]') AND type in (N'P', N'PC')) +DROP PROCEDURE [dbo].[DBA_Check] +GO + +USE [HCITools] +GO + +SET ANSI_NULLS ON +GO + +SET QUOTED_IDENTIFIER ON +GO + + + + +CREATE PROCEDURE [dbo].[DBA_Check] + @in_debug int = null, + @in_CheckType smallint +AS +/*============================================================================= + + Explication du traitement realise par la SP + ------------------------------------------- + Cette SP sert à vérifier un ensemble de points critiques sur une instance SQL Server + + Contexte d'utilisation + ---------------------- + Cette SP est appelée par le job D92100 - DBA Check + + Parametres + ---------- + @in_debug : non utilisé + @in_CheckType : 1 = Check du recovery mode des bases de données + 2 = Check de l'existance d'un backup (De base et/ou de log) en fonction du recovery mode de la base de données + 3 = Check d'évenements relatifs aux serveurs liés la veille + 4 = Check des triggers d'AMR manquants + + Creation : 30.03.16 / FLA + + Modifications : 30.01.18 - FLA - Ajout d'un check d'événements relatifs aux serveurs liés + 20.06.16 - FLA - Bug sur test de la version SQL, suppression du test car inutile + 05.10.10 - FLA - Ajout de la gestion des environnements pour le test du recovery mode + 01.10.20 - FLA - Ajout du check des triggers d'AMR + 06.10.20 - FLA - Suppresion du raiseerror + 10.11.20 - FLA - Check if Arizona exist for check 4 + 23.11.20 - SPE - Monitor Scanned Documents + 23.11.20 - SPE - Add check log level of services (trace, debug, info) + 25.02.21 - RTC - Remove check 5 for pending Scan : ask by CCA + 05.08.21 - SPE - Remove check linkedservers if ActivePharmacyReplicationPlugin + 16.08.21 - SPE - Add check activepos_read size + 17.03.22 - FLA : Change DBA mail + 20.06.23 - RTC : Update Backup check to allign to Commvault random schedule + +=============================================================================*/ + +set nocount on; + +declare @result_sp int, + @errno int, + @errmsg varchar(255) + +/*------------------- Declaration des variables --------------------*/ +declare @DatabaseName sysname, + @Message varchar(8000), + @xml XML, + @delimiter VARCHAR(1), + @param_group_counter_list NVARCHAR(3000), + @LastBackUpTime datetime, + @RecoveryMode varchar(10), + @Type varchar(10), + @Event varchar(400), + @TableName sysname, + @totImages int, + @ModeUsed varchar(255) + + + +/*------------ Affectation des parametres aux variables ------------*/ +SET @Message = '' +SET @totImages = 0 +SET @ModeUsed = '' +SELECT @param_group_counter_list = HCIP_value FROM dbo.HCI_PARAMS WHERE HCIP_key = 'BKP_NOT_DB' +SET @delimiter = ',' +SET @xml = CAST((''+REPLACE(@param_group_counter_list, @delimiter, '')+'') AS XML) + +/*-------------------------- Traitement ---------------------------*/ +BEGIN TRY + + IF @in_CheckType = 1 + BEGIN + IF EXISTS (SELECT type FROM master.cfg.InstanceContext WHERE type = 'PROD') + BEGIN + declare c_backup cursor local forward_only static for + select name + from sys.databases + where name in ('Arizona','ArizonaCash') /* On vérifie que Arizona et ArizonaCash ne sont pas en mode SIMPLE */ + AND recovery_model_desc = 'SIMPLE' + + open c_backup + + FETCH NEXT FROM c_backup + into @DatabaseName + + while @@fetch_status = 0 + begin + + SET @Message = @Message + 'La base '+@DatabaseName+' est en recovery SIMPLE ' + CHAR(13) + + FETCH NEXT FROM c_backup + into @DatabaseName + end + + close c_backup + deallocate c_backup + END + END + ELSE IF @in_CheckType = 2 + BEGIN + + declare c_backup cursor local forward_only static for + select DatabaseName, LastBackUpTime,recovery_model_desc,type + FROM + (SELECT sdb.Name AS DatabaseName,sdb.recovery_model_desc,sdb.type,MAX(bus.backup_finish_date) AS LastBackUpTime + FROM + (select sd.name,sd.recovery_model_desc, a.type + FROM sys.databases sd WITH (NOLOCK) + LEFT OUTER JOIN + (SELECT 'FULL' as recovery_model_desc,'D' as type + UNION + SELECT 'FULL','L' + UNION + SELECT 'SIMPLE','D') a + ON a.recovery_model_desc = sd.recovery_model_desc + where name <> 'model') sdb + LEFT OUTER JOIN msdb.dbo.backupset bus WITH (NOLOCK) + ON bus.database_name = sdb.name + AND (bus.type = 'D' OR bus.type = 'L') + AND bus.type = sdb.type + AND is_snapshot = 0 + GROUP BY sdb.name,sdb.recovery_model_desc,sdb.type) b + WHERE (DATEDIFF(HOUR, CAST(b.LastBackUpTime as DATETIME), CAST(GETDATE() as DATETIME )) > 20 OR b.LastBackUpTime is null) + AND LOWER(DatabaseName) not in (SELECT C.value('.', 'varchar(3000)') AS value FROM @xml.nodes('X') AS X(C)) + + open c_backup + + FETCH NEXT FROM c_backup + into @DatabaseName, @LastBackUpTime, @RecoveryMode, @Type + + while @@fetch_status = 0 + begin + + SET @Message = @Message + 'Il n''y a pas eu de backup de '+REPLACE(REPLACE(@Type,'D','Database'),'L','Log')+' sur la base '+@DatabaseName+' en recovery mode '+@RecoveryMode+' depuis '+ isnull(CONVERT(varchar(50),@LastBackUpTime,121),'toujours') + CHAR(13) + + FETCH NEXT FROM c_backup + into @DatabaseName, @LastBackUpTime, @RecoveryMode, @Type + end + + close c_backup + deallocate c_backup + END + ELSE IF @in_CheckType = 3 + BEGIN + + IF EXISTS (SELECT * + FROM [master].sys.objects o WITH (NOLOCK) + WHERE o.name = 'DDL_audit' + AND o.type IN (N'U')) + BEGIN + declare c_lksrv cursor local forward_only static for + SELECT 'Linked Server Event :'+CHAR(13)+CHAR(10)+ + 'Login : '+DA_Event_Xml.value('(./EVENT_INSTANCE/LoginName)[1]','VARCHAR(50)')+CHAR(13)+CHAR(10)+ + 'Name : '+DA_Event_Xml.value('(./EVENT_INSTANCE/ObjectName)[1]','VARCHAR(50)')+CHAR(13)+CHAR(10)+ + 'Event : '+DA_Event_Xml.value('(./EVENT_INSTANCE/EventType)[1]','VARCHAR(50)')+CHAR(13)+CHAR(10)+ + 'With : '+[DA_App_Name]+CHAR(13)+CHAR(10)+ + 'From : '+[DA_Host_Name]+CHAR(13)+CHAR(10)+ + 'At : '+DA_Event_Xml.value('(./EVENT_INSTANCE/PostTime)[1]','VARCHAR(50)')+CHAR(13)+CHAR(10) as Mail + FROM [master].[dba].[DDL_audit] + where DA_App_Name <> 'ActivePharmacyReplicationPlugin' AND DA_Event_Xml.value('(./EVENT_INSTANCE/ObjectType)[1]','VARCHAR(50)') = 'LINKED SERVER' + AND DA_Event_Xml.value('(./EVENT_INSTANCE/PostTime)[1]','DATETIME') > GETDATE()-1 + AND NOT ((DA_Event_Xml.value('(./EVENT_INSTANCE/ObjectName)[1]','VARCHAR(50)') LIKE 'WA%' + OR DA_Event_Xml.value('(./EVENT_INSTANCE/ObjectName)[1]','VARCHAR(50)') LIKE 'WCV%' + OR DA_Event_Xml.value('(./EVENT_INSTANCE/ObjectName)[1]','VARCHAR(50)') LIKE 'WS%') + AND DA_Event_Xml.value('(./EVENT_INSTANCE/EventType)[1]','VARCHAR(50)') = 'ALTER_LINKED_SERVER' + AND ([DA_App_Name] = 'SQLCMD' OR [DA_App_Name] = 'Microsoft SQL Server' OR [DA_App_Name] = 'ActivePharmacy.ArizonaServerService')) + AND NOT (DA_Event_Xml.value('(./EVENT_INSTANCE/ObjectName)[1]','VARCHAR(50)') like 'AZLD_%' + AND [DA_App_Name] like 'SQLAgent%') + AND NOT (DA_Event_Xml.value('(./EVENT_INSTANCE/ObjectName)[1]','VARCHAR(50)') like 'DWH_%' + AND [DA_App_Name] like 'SQLAgent%') + + open c_lksrv + + FETCH NEXT FROM c_lksrv + into @Event + + while @@fetch_status = 0 + begin + + SET @Message = @Message + @Event + + FETCH NEXT FROM c_lksrv + into @Event + end + + close c_lksrv + deallocate c_lksrv + + END + END + ELSE IF @in_CheckType = 4 + BEGIN + IF EXISTS (SELECT 1 FROM sys.databases where name = 'Arizona') + BEGIN + declare c_MON_Triggers cursor local forward_only static for + SELECT AMT.AMT_table_name + FROM Arizona.dbo.aps_monitor_table AMT + LEFT JOIN Arizona.sys.triggers TR + ON TR.name like 'aps[_]tIUD[_]MON[_]%' + AND OBJECT_NAME(TR.parent_id,DB_ID('Arizona')) = AMT.AMT_table_name + WHERE AMT.AMT_monitoring_type > 1 + AND TR.name IS NULL + + + open c_MON_Triggers + + FETCH NEXT FROM c_MON_Triggers + into @TableName + + while @@fetch_status = 0 + begin + + SET @Message = @Message + 'Il manque le trigger de monitoring sur la table '+@TableName + CHAR(13) + + FETCH NEXT FROM c_MON_Triggers + into @TableName + end + + close c_MON_Triggers + deallocate c_MON_Triggers + END + END + ELSE IF @in_CheckType = 6 + BEGIN + IF EXISTS (SELECT 1 FROM sys.databases where name = 'ActivePos_server') + BEGIN + IF EXISTS(SELECT 1 FROM [ActivePos_server].[dbo].[Settings] where SettingId = 'Values.Diagnostics.MinLogLevel' and SettingValue <> 'Info') + BEGIN + + SELECT @ModeUsed = SettingValue FROM [ActivePos_server].[dbo].[Settings] where SettingId = 'Values.Diagnostics.MinLogLevel' and SettingValue <> 'Info' + IF (@ModeUsed = 'Error' OR @ModeUsed = 'Warn' OR @ModeUsed = 'Fatal') + BEGIN + SET @Message = @Message + 'The log level in ActivePos_server is: '+@ModeUsed +' we can skip some important log.' + CHAR(13) + END + ELSE IF (@ModeUsed = 'Debug' OR @ModeUsed = 'Trace') + BEGIN + SET @Message = @Message + 'The log level in ActivePos_server is: '+@ModeUsed +' this cause some performances issues.' + CHAR(13) + END + ELSE + BEGIN + SET @Message = @Message + 'The log level in ActivePos_server is: '+@ModeUsed +' This value is not supported.' + CHAR(13) + END + + END + END + IF EXISTS (SELECT 1 FROM sys.databases where name = 'ActivePos_write') + BEGIN + IF EXISTS(SELECT 1 FROM [ActivePos_write].[dbo].[Settings] where SettingId = 'Values.Diagnostics.MinLogLevel' and SettingValue <> 'Info') + BEGIN + + SELECT @ModeUsed = SettingValue FROM [ActivePos_write].[dbo].[Settings] where SettingId = 'Values.Diagnostics.MinLogLevel' and SettingValue <> 'Info' + IF (@ModeUsed = 'Error' OR @ModeUsed = 'Warn' OR @ModeUsed = 'Fatal') + BEGIN + SET @Message = @Message + 'The log level in ActivePos_write is: '+@ModeUsed +' we can skip some important log.' + CHAR(13) + END + ELSE IF (@ModeUsed = 'Debug' OR @ModeUsed = 'Trace') + BEGIN + SET @Message = @Message + 'The log level in ActivePos_write is: '+@ModeUsed +' this cause some performances issues.' + CHAR(13) + END + ELSE + BEGIN + SET @Message = @Message + 'The log level in ActivePos_write is: '+@ModeUsed +' This value is not supported.' + CHAR(13) + END + + END + END + IF EXISTS (SELECT 1 FROM sys.databases where name = 'ActiveSystemClient') + BEGIN + IF EXISTS(SELECT 1 FROM [ActiveSystemClient].[cfg].[Settings] where SettingId = 'Values.Diagnostics.MinLogLevel' and SettingValue <> 'Info') + BEGIN + + SELECT @ModeUsed = SettingValue FROM [ActiveSystemClient].[cfg].[Settings] where SettingId = 'Values.Diagnostics.MinLogLevel' and SettingValue <> 'Info' + IF (@ModeUsed = 'Error' OR @ModeUsed = 'Warn' OR @ModeUsed = 'Fatal') + BEGIN + SET @Message = @Message + 'The log level in ActiveSystemClient is: '+@ModeUsed +' we can skip some important log.' + CHAR(13) + END + ELSE IF (@ModeUsed = 'Debug' OR @ModeUsed = 'Trace') + BEGIN + SET @Message = @Message + 'The log level in ActiveSystemClient is: '+@ModeUsed +' this cause some performances issues.' + CHAR(13) + END + ELSE + BEGIN + SET @Message = @Message + 'The log level in ActiveSystemClient is: '+@ModeUsed +' This value is not supported.' + CHAR(13) + END + + END + END + IF EXISTS (SELECT 1 FROM sys.databases where name = 'ActiveSystemServer') + BEGIN + IF EXISTS(SELECT 1 FROM [ActiveSystemServer].[cfg].[Settings] where SettingId = 'Values.Diagnostics.MinLogLevel' and SettingValue <> 'Info') + BEGIN + + SELECT @ModeUsed = SettingValue FROM [ActiveSystemServer].[cfg].[Settings] where SettingId = 'Values.Diagnostics.MinLogLevel' and SettingValue <> 'Info' + IF (@ModeUsed = 'Error' OR @ModeUsed = 'Warn' OR @ModeUsed = 'Fatal') + BEGIN + SET @Message = @Message + 'The log level in ActiveSystemServer is: '+@ModeUsed +' we can skip some important log.' + CHAR(13) + END + ELSE IF (@ModeUsed = 'Debug' OR @ModeUsed = 'Trace') + BEGIN + SET @Message = @Message + 'The log level in ActiveSystemServer is: '+@ModeUsed +' this cause some performances issues.' + CHAR(13) + END + ELSE + BEGIN + SET @Message = @Message + 'The log level in ActiveSystemServer is: '+@ModeUsed +' This value is not supported.' + CHAR(13) + END + + END + END + END + ELSE IF @in_CheckType = 7 + BEGIN + IF EXISTS (SELECT 1 FROM sys.databases where name = 'ActivePos_read') + BEGIN + IF EXISTS(SELECT 1 FROM sys.master_files where name = 'activepos_read_Data' and size * 8/1024 > 8192) + BEGIN + DECLARE @aposreadsize int + SELECT @aposreadsize = size * 8/1024 FROM sys.master_files where name = 'activepos_read_Data' + SET @Message = @Message + 'La taille de la base activepos_read est plus grande que 8Go! Taille actuelle: '+convert(varchar(255),@aposreadsize) + CHAR(13) + END + END + END + + /* S'il y a une erreur, on envoie un mail aux DBA */ + IF @Message <> '' + BEGIN + exec aps_Send_Mail_with_template + @in_param_varchar_2 = 'DBA_operator;', + @in_job_type = 3, /* 3 = warning */ + @in_param_varchar_3 = @Message + END +/*---------------------- Traitement des erreurs ----------------------*/ +END TRY +BEGIN CATCH + + /* Traitement des erreurs (avec RaiseError) */ + EXEC dbo.get_Error_Info @in_RaiseError = 1 + +END CATCH + + +GO diff --git a/TPDT-268 - ACP in task sequence/dba_storedProcedures/DBA_Check_Backup_ActivePos_read_Job.sql b/TPDT-268 - ACP in task sequence/dba_storedProcedures/DBA_Check_Backup_ActivePos_read_Job.sql new file mode 100644 index 0000000..b4b252e --- /dev/null +++ b/TPDT-268 - ACP in task sequence/dba_storedProcedures/DBA_Check_Backup_ActivePos_read_Job.sql @@ -0,0 +1,100 @@ +USE [HCITools] +GO + +IF EXISTS (SELECT * FROM sys.objects WHERE object_id = OBJECT_ID(N'[dbo].[DBA_Check_Backup_ActivePos_read_Job]') AND type in (N'P', N'PC')) +DROP PROCEDURE [dbo].[DBA_Check_Backup_ActivePos_read_Job] +GO + +USE [HCITools] +GO + +SET ANSI_NULLS ON +GO + +SET QUOTED_IDENTIFIER ON +GO + + +CREATE PROCEDURE [dbo].[DBA_Check_Backup_ActivePos_read_Job] + @in_debug int = null +AS +/*============================================================================= + + Explication du traitement realise par la SP + ------------------------------------------- + Cette SP sert à vérifier si le job de backup de la base ActivePos_read est bien activé + + Contexte d'utilisation + ---------------------- + Cette SP est appelée par le job D92100 - DBA Check + + Parametres + ---------- + @in_debug : non utilisé + + Creation : 16.04.21 / RTC + + Modifications : 17.03.2022 - FLA : Change DBA mail + +=============================================================================*/ + +set nocount on; + +declare @result_sp int, + @errno int, + @errmsg varchar(255) + +/*------------------- Declaration des variables --------------------*/ +declare @DatabaseName sysname, + @Message varchar(8000), + @LastUpdate datetime + + + +/*------------ Affectation des parametres aux variables ------------*/ +SET @Message = '' + +/*-------------------------- Traitement ---------------------------*/ +BEGIN TRY + /* Runs on pharmacy servers */ + IF EXISTS (SELECT 1 FROM sys.databases where name = 'ActivePos_read') + BEGIN + /* Check only if there are active POS for this pharmacy */ + IF EXISTS(SELECT 1 from arizona.dbo.point_of_sale + inner join arizona.dbo.organizational_unit + on Organizational_unit_ID = POS_organizational_unit + where pos_type IN (1,2) + and pos_active = 1 + and pos_name not like '%99') + BEGIN + /* Check if job is not enable */ + IF EXISTS (SELECT 1 FROM msdb.dbo.sysjobs WHERE name = 'D91030 - Backup ActivePos_Read' AND ENABLED = 0) + BEGIN + /* Check if last update > 24h : anormal situation */ + SELECT TOP 1 @LastUpdate = [VersionDate] FROM [ActivePos_write].[upd].[DatabaseHistory] order by [VersionDate] desc + IF (DATEADD(dd,1,@lastUpdate) < GETDATE()) + SELECT @Message = 'ActivePos_read job was not enable : Apos Msi update date : ' + convert(varchar, @LastUpdate, 121) + EXEC msdb..sp_update_job @job_name = 'D91030 - Backup ActivePos_Read', @enabled = 1 + END + END + END + + /* S'il y a une erreur, on envoie un mail aux DBA */ + IF @Message <> '' + BEGIN + EXEC aps_Send_Mail_with_template + @in_param_varchar_2 = 'DBA_operator;', + @in_job_type = 3, /* 3 = warning */ + @in_param_varchar_3 = @Message + END +/*---------------------- Traitement des erreurs ----------------------*/ +END TRY +BEGIN CATCH + + /* Traitement des erreurs (avec RaiseError) */ + EXEC dbo.get_Error_Info @in_RaiseError = 1 + +END CATCH + + +GO diff --git a/TPDT-268 - ACP in task sequence/dba_storedProcedures/DROP_mon_Check_Locked_Sessions.sql b/TPDT-268 - ACP in task sequence/dba_storedProcedures/DROP_mon_Check_Locked_Sessions.sql new file mode 100644 index 0000000..477a590 --- /dev/null +++ b/TPDT-268 - ACP in task sequence/dba_storedProcedures/DROP_mon_Check_Locked_Sessions.sql @@ -0,0 +1,6 @@ +USE [HCITools] +GO + +IF EXISTS (SELECT * FROM sys.objects WHERE object_id = OBJECT_ID(N'[dbo].[mon_Check_Locked_Sessions]') AND type in (N'P', N'PC')) +DROP PROCEDURE [dbo].[mon_Check_Locked_Sessions] +GO diff --git a/TPDT-268 - ACP in task sequence/dba_storedProcedures/DROP_mon_Get_Locked_Sessions_Infos.sql b/TPDT-268 - ACP in task sequence/dba_storedProcedures/DROP_mon_Get_Locked_Sessions_Infos.sql new file mode 100644 index 0000000..da3636f --- /dev/null +++ b/TPDT-268 - ACP in task sequence/dba_storedProcedures/DROP_mon_Get_Locked_Sessions_Infos.sql @@ -0,0 +1,6 @@ +USE [HCITools] +GO + +IF EXISTS (SELECT * FROM sys.objects WHERE object_id = OBJECT_ID(N'[dbo].[mon_Get_Locked_Sessions_Infos]') AND type in (N'P', N'PC')) +DROP PROCEDURE [dbo].[mon_Get_Locked_Sessions_Infos] +GO diff --git a/TPDT-268 - ACP in task sequence/dba_storedProcedures/DROP_mon_Send_Warning_Mail.sql b/TPDT-268 - ACP in task sequence/dba_storedProcedures/DROP_mon_Send_Warning_Mail.sql new file mode 100644 index 0000000..502c149 --- /dev/null +++ b/TPDT-268 - ACP in task sequence/dba_storedProcedures/DROP_mon_Send_Warning_Mail.sql @@ -0,0 +1,7 @@ +USE [HCITools] +GO + +IF EXISTS (SELECT * FROM sys.objects WHERE object_id = OBJECT_ID(N'[dbo].[mon_Send_Warning_Mail]') AND type in (N'P', N'PC')) +DROP PROCEDURE [dbo].[mon_Send_Warning_Mail] +GO + diff --git a/TPDT-268 - ACP in task sequence/dba_storedProcedures/Medor.sql b/TPDT-268 - ACP in task sequence/dba_storedProcedures/Medor.sql new file mode 100644 index 0000000..af6cd6a --- /dev/null +++ b/TPDT-268 - ACP in task sequence/dba_storedProcedures/Medor.sql @@ -0,0 +1,254 @@ +USE [HCITools] +GO + +IF EXISTS (SELECT * FROM sys.objects WHERE object_id = OBJECT_ID(N'[dbo].[Medor]') AND type in (N'P', N'PC')) +DROP PROCEDURE [dbo].[Medor] +GO + +USE [HCITools] +GO + +SET ANSI_NULLS ON +GO + +SET QUOTED_IDENTIFIER ON +GO + + +CREATE PROCEDURE [dbo].[Medor] + @in_debug int = null, + @in_Search sysname, + @max_recursion int = 0 +AS +/*============================================================================= + + Explication du traitement realise par la SP + ------------------------------------------- + Cette SP sert à chercher dans l'ensemble des bases le texte passé en paramétre dans les SP, trigger etc... et les jobs + + Contexte d'utilisation + ---------------------- + Cette SP est appelée à la main + + Parametres + ---------- + @in_debug : non utilisé pour le moment + @in_Search : texte à chercher + @max_recursion : nombre maximum de récursion (défaut 0) + + Creation : 25.07.17 / FLA + + Modifications : + +=============================================================================*/ + +set nocount on; + +declare @result_sp int, + @errno int, + @errmsg varchar(255) + +/*------------------- Declaration des variables --------------------*/ +declare @cmd varchar(max), + @name sysname + + +/*------------ Affectation des parametres aux variables ------------*/ + + +/*-------------------------- Traitement ---------------------------*/ +create table #ObjectLink +( + OL_guid uniqueidentifier default newid(), + OL_Database sysname, + OL_schema sysname, + OL_sysobject_name sysname, + OL_contained_piece sysname, + OL_TexteAround varchar(110), + OL_recursion_level int, + OL_sysobject_id int, + OL_sysobject_xtype char (2) +) +; +CREATE NONCLUSTERED INDEX Ix_ObjectLink_OL_sysobject_name ON #ObjectLink(OL_sysobject_name) +; +CREATE NONCLUSTERED INDEX Ix_ObjectLink_OL_contained_piece ON #ObjectLink(OL_contained_piece) +; + +declare c_databases cursor local forward_only static for + SELECT name + FROM sys.databases + ORDER BY name + +open c_databases +; +FETCH NEXT FROM c_databases + into @name + +while @@fetch_status = 0 +begin + +select @cmd = 'insert into #ObjectLink + (OL_Database,OL_schema,OL_sysobject_name, OL_contained_piece, OL_TexteAround, OL_recursion_level, OL_sysobject_id, OL_sysobject_xtype) + ( + select distinct '''+@name+''',OBJECT_SCHEMA_NAME (so.id,DB_ID('''+@name+''')), so.name, '''+@in_Search+''' ''contained_piece'', SUBSTRING(sc.text,CHARINDEX('''+@in_Search+''',sc.text,0)-50,100) ''Texte around'', 0 ''recursion_level'', so.id, so.xtype + from '+@name+'..syscomments sc with (nolock) + join '+@name+'..sysobjects so with (nolock) + on so.id = sc.id + and so.name not like ''dt[_]%'' + where sc.text like ''%'+@in_Search+'%'' + and so.name <> '''+@in_Search+''' + ) + ; + + insert into #ObjectLink + (OL_Database,OL_schema,OL_sysobject_name, OL_contained_piece, OL_TexteAround, OL_recursion_level, OL_sysobject_id, OL_sysobject_xtype) + ( + select distinct '''+@name+''',OBJECT_SCHEMA_NAME (so.id,DB_ID('''+@name+''')), so.name, '''+@in_Search+''' ''contained_piece'', NULL ''Texte around'', 0 ''recursion_level'', so.id, so.xtype + from '+@name+'..sysobjects so with (nolock) + where so.name not like ''dt[_]%'' + and so.name = '''+@in_Search+''' + ) + ; + + declare @ObjectLinkCount_before int, + @ObjectLinkCount_after int, + @recursion int + ; + select @ObjectLinkCount_before = 0 + ; + select @ObjectLinkCount_after = count (*) from #ObjectLink + ; + select @recursion = 0 + ; + while @recursion < '+CAST(@max_recursion as varchar(2))+' + and @ObjectLinkCount_after > @ObjectLinkCount_before + begin + select @recursion = @recursion + 1 + ; + select @ObjectLinkCount_before = @ObjectLinkCount_after + ; + insert into #ObjectLink + (OL_Database,OL_schema,OL_sysobject_name, OL_contained_piece, OL_TexteAround, OL_recursion_level, OL_sysobject_id, OL_sysobject_xtype) + ( + select distinct '''+@name+''',OBJECT_SCHEMA_NAME (so.id,DB_ID('''+@name+''')), so.name, ol.OL_sysobject_name ''contained_piece'',SUBSTRING(sc.text,CHARINDEX('''+@in_Search+''',sc.text,0)-50,100) ''Texte around'', @recursion ''recursion_level'', so.id, so.xtype + from '+@name+'..syscomments sc with (nolock) + join '+@name+'..sysobjects so with (nolock) + on so.id = sc.id + and so.name not like ''dt[_]%'' + join #ObjectLink ol + on sc.text like ''%'' + ol.OL_sysobject_name + ''%'' + and so.name not in (select OL_sysobject_name from #ObjectLink union all select OL_contained_piece from #ObjectLink ) + and ol.OL_recursion_level = @recursion-1 + ) + ; + select @ObjectLinkCount_after = count (*) from #ObjectLink + ; + end /* end while */ + ;' + +--select @cmd +exec (@cmd) + + FETCH NEXT FROM c_databases + into @name + ; +end +; +close c_databases +; +deallocate c_databases + +select OL_recursion_level, + OL_sysobject_xtype, + case OL_sysobject_xtype + when 'F' then 'Aggregate function (CLR)' + when 'C ' then 'CHECK constraint' + when 'D ' then 'Default or DEFAULT constraint' + when 'F ' then 'FOREIGN KEY constraint' + when 'L ' then 'Log' + when 'FN ' then 'Scalar function' + when 'FS ' then 'Assembly (CLR) scalar-function' + when 'FT ' then 'Assembly (CLR) table-valued function' + when 'IF ' then 'In-lined table-function' + when 'IT ' then 'Internal table' + when 'P ' then 'Stored procedure' + when 'PC ' then 'Assembly (CLR) stored-procedure' + when 'PK ' then 'PRIMARY KEY constraint (type is K)' + when 'RF ' then 'Replication filter stored procedure' + when 'S ' then 'System table' + when 'SN ' then 'Synonym' + when 'SQ ' then 'Service queue' + when 'TA ' then 'Assembly (CLR) DML trigger' + when 'TF ' then 'Table function' + when 'TR ' then 'SQL DML Trigger' + when 'TT ' then 'Table type' + when 'U ' then 'User table' + when 'UQ ' then 'UNIQUE constraint (type is K)' + when 'V ' then 'View' + when 'X ' then 'Extended stored procedure' + else 'unknown xtype' + end 'xtype_text', + OL_schema, OL_Database, OL_sysobject_name, OL_contained_piece, OL_TexteAround + from #ObjectLink ol + order by OL_recursion_level, OL_sysobject_xtype,OL_Database,OL_schema, OL_sysobject_name, OL_contained_piece +; +/*------------------------------------------------------------------------------------------------ + Retourne les jobs qui appellent le bout de texte cherché +------------------------------------------------------------------------------------------------*/ +select distinct * +from +( + select sj.name 'job_name', + sjs.step_id, + sjs.step_name, + @in_Search 'contained_piece', + SUBSTRING(sjs.command,CHARINDEX(''+@in_Search+'',sjs.command,0)-50,100) 'Texte around' + from msdb.dbo.sysjobs sj with (nolock) + join msdb.dbo.sysjobsteps sjs with (nolock) + on sjs.job_id = sj.job_id + where sjs.command like '%' + @in_Search + '%' +union + select sj.name 'job_name', + sjs.step_id, + sjs.step_name, + ol.OL_contained_piece 'contained_piece', + SUBSTRING(sjs.command,CHARINDEX(''+ol.OL_contained_piece+'',sjs.command,0)-50,100) 'Texte around' + from msdb.dbo.sysjobs sj with (nolock) + join msdb.dbo.sysjobsteps sjs with (nolock) + on sjs.job_id = sj.job_id + join #ObjectLink ol + on sjs.command like '%' + ol.OL_contained_piece + '%' + WHERE ol.OL_contained_piece <> @in_Search +union + select sj.name 'job_name', + sjs.step_id, + sjs.step_name, + ol.OL_sysobject_name 'contained_piece', + SUBSTRING(sjs.command,CHARINDEX(''+ol.OL_sysobject_name+'',sjs.command,0)-50,100) 'Texte around' + from msdb.dbo.sysjobs sj with (nolock) + join msdb.dbo.sysjobsteps sjs with (nolock) + on sjs.job_id = sj.job_id + join #ObjectLink ol + on sjs.command like '%' + ol.OL_sysobject_name + '%' + WHERE ol.OL_sysobject_name <> @in_Search +) vJobs + order by vJobs.job_name, vJobs.step_id, vJobs.contained_piece +; +DROP TABLE #ObjectLink + +/*------------------ Retour au programme appelant -----------------*/ + +return(@@error); + +/*---------------------- Traitement des erreurs ----------------------*/ +error_99: + raiserror (@errmsg, 16, 1); + return(@errno); + + + + +GO + + diff --git a/TPDT-268 - ACP in task sequence/dba_storedProcedures/Purge_Monitoring_History.sql b/TPDT-268 - ACP in task sequence/dba_storedProcedures/Purge_Monitoring_History.sql new file mode 100644 index 0000000..084bc82 --- /dev/null +++ b/TPDT-268 - ACP in task sequence/dba_storedProcedures/Purge_Monitoring_History.sql @@ -0,0 +1,110 @@ + +USE [HCITools] +GO + +IF EXISTS (SELECT * FROM sys.objects WHERE object_id = OBJECT_ID(N'[dbo].[Purge_Monitoring_History]') AND type in (N'P', N'PC')) +DROP PROCEDURE [dbo].[Purge_Monitoring_History] +GO + +USE [HCITools] +GO + +SET ANSI_NULLS ON +GO + +SET QUOTED_IDENTIFIER ON +GO + + +CREATE PROCEDURE [dbo].[Purge_Monitoring_History] + @in_debug int = null +AS +/*============================================================================= + + Explication du traitement realise par la SP + ------------------------------------------- + Cette SP sert à purger l'historique des enregistrements de monitoring + + Contexte d'utilisation + ---------------------- + Cette SP est appelée par le job W93040 - Clean-up monitoring history + + Parametres + ---------- + @in_debug : + + Creation : 05.11.21 / RTC 66785 Standardize and extend job W93040 - Clean-up monitoring history + +=============================================================================*/ + +SET NOCOUNT ON; + +/*-------------------------- Traitement ---------------------------*/ +BEGIN TRY + +/* Purge tables related to performance monitoring : retention 6 months */ + IF EXISTS (SELECT * + FROM [HCITools].sys.objects o WITH (NOLOCK) + WHERE o.name = 'Monitoring_history' + AND o.type IN (N'U')) +BEGIN + DELETE + FROM HCITools.dbo.Monitoring_history + WHERE MH_datetime < DATEADD(MM,-6,getdate()) +END + +IF EXISTS (SELECT * + FROM [HCITools].sys.objects o WITH (NOLOCK) + WHERE o.name = 'Monitor_wait_stats' + AND o.type IN (N'U')) +BEGIN + DELETE + FROM HCITools.dbo.Monitor_wait_stats + WHERE MWS_value_date < DATEADD(MM,-6,getdate()) +END + +IF EXISTS (SELECT * + FROM [HCITools].sys.objects o WITH (NOLOCK) + WHERE o.name = 'Monitor_disk_latency' + AND o.type IN (N'U')) +BEGIN + DELETE + FROM HCITools.dbo.Monitor_disk_latency + WHERE collection_date < DATEADD(MM,-6,getdate()) +END + +/* Purge tables related to blocking session : retention 1 month */ +IF EXISTS (SELECT * + FROM [HCITools].sys.objects o WITH (NOLOCK) + WHERE o.name = 'BlockingSessionInfo' + AND o.type IN (N'U')) +BEGIN + DELETE + FROM HCITools.dbo.BlockingSessionInfo + WHERE AlertTime < DATEADD(MM,-1,getdate()) +END + +/*Purge tables related to monitoring alerts : retention 1 month*/ +IF EXISTS (SELECT 1 + FROM sys.objects o WITH (NOLOCK) + JOIN sys.schemas s WITH (NOLOCK) ON o.schema_id = s.schema_id + WHERE o.name = 'DBA_monitoring_alerts_history' + AND o.type IN (N'U') + AND s.name = 'mon') +BEGIN + DELETE + FROM HCITools.mon.DBA_monitoring_alerts_history + WHERE DBAMAH_event_date < DATEADD(MM,-1,getdate()) +END + +/*---------------------- Traitement des erreurs ----------------------*/ +END TRY +BEGIN CATCH + + /* Traitement des erreurs (avec RaiseError) */ + EXEC dbo.get_Error_Info @in_RaiseError = 1 + +END CATCH + +GO + diff --git a/TPDT-268 - ACP in task sequence/dba_storedProcedures/Purge_Replication_Backup.sql b/TPDT-268 - ACP in task sequence/dba_storedProcedures/Purge_Replication_Backup.sql new file mode 100644 index 0000000..c080a08 --- /dev/null +++ b/TPDT-268 - ACP in task sequence/dba_storedProcedures/Purge_Replication_Backup.sql @@ -0,0 +1,119 @@ +USE [HCITools] +GO + +IF EXISTS (SELECT * FROM sys.objects WHERE object_id = OBJECT_ID(N'[dbo].[Purge_Replication_Backup]') AND type in (N'P', N'PC')) +DROP PROCEDURE [dbo].[Purge_Replication_Backup] +GO + +USE [HCITools] +GO + +SET ANSI_NULLS ON +GO + +SET QUOTED_IDENTIFIER ON +GO + + +CREATE PROCEDURE [dbo].[Purge_Replication_Backup] + @in_debug int = null +AS +/*============================================================================= + + Explication du traitement realise par la SP + ------------------------------------------- + Cette SP sert à conserver uniquement le dernier backup de replication et supprimer les autres + + Contexte d'utilisation + ---------------------- + Cette SP est appelée par le job D93120 - Purge Replication Backup + + Parametres + ---------- + @in_debug : affichage des fichiers à supprimer + + Creation : 19.04.17 / FLA + + Modifications : 21.09.20 / RTC TFS 61470 Adapt sp after shared file config changes + 19.02.21 / SPE #TFS63889# - Change job D93120 - Purge Replication Backup according to new settings + +=============================================================================*/ + +SET NOCOUNT ON; + +/*------------------- Declaration des variables --------------------*/ +DECLARE @FileName varchar(255), + @Path varchar(255), + @dbVersion varchar(20), + @FileToDelete varchar(350) + +/*------------ Affectation des parametres aux variables ------------*/ + +SET @dbVersion = ActivePos_write.upd.DatabaseVersion() +SET @FileName = 'ActivePos_read.' + @dbVersion + '.bak' + +/*-------------------------- Traitement ---------------------------*/ +BEGIN TRY + + /* Parcours de l'ensemble des dossiers d'ini */ + DECLARE c_Folders CURSOR LOCAL FORWARD_ONLY STATIC FOR + SELECT CONVERT(VARCHAR(400), SettingValue) + '\' as [path] + FROM ActiveSystemServer.cfg.Settings + WHERE SettingId like 'Values.Modules.Replication.DbInitializationBackupPath%' + AND len(SettingValue) > 1 + UNION ALL + SELECT CONVERT(VARCHAR(400), SettingValue) + '\' as [path] + FROM ActivePos_server.dbo.Settings + WHERE SettingId like 'Values.Pharmacy.DbInitializationBackupPath%' + AND len(SettingValue) > 1 + + OPEN c_Folders; + FETCH NEXT FROM c_Folders + INTO @Path + WHILE @@fetch_status = 0 + BEGIN + + /* Parcours de l'ensemble des fichiers de backup sauf le dernier en date */ + DECLARE c_FileNames CURSOR LOCAL FORWARD_ONLY STATIC FOR + SELECT Filename + FROM [dbo].[aps_Directory_Get_Files](@Path, '*.bak') + WHERE Filename <> @FileName + ORDER BY Filename + + OPEN c_FileNames; + + FETCH NEXT FROM c_FileNames + INTO @FileToDelete + + WHILE @@fetch_status = 0 + BEGIN + SET @FileToDelete = @Path + @FileToDelete + + IF @in_debug = 1 + PRINT @FileToDelete + ELSE + EXEC dbo.aps_File_Delete @path = @FileToDelete + + FETCH NEXT FROM c_FileNames + INTO @FileToDelete + END + + CLOSE c_FileNames + DEALLOCATE c_FileNames + + FETCH NEXT FROM c_Folders + INTO @Path + END + + CLOSE c_Folders + DEALLOCATE c_Folders + +/*---------------------- Traitement des erreurs ----------------------*/ +END TRY +BEGIN CATCH + + /* Traitement des erreurs (avec RaiseError) */ + EXEC dbo.get_Error_Info @in_RaiseError = 1 + +END CATCH +GO diff --git a/TPDT-268 - ACP in task sequence/dba_storedProcedures/Purge_Synchro_Label.sql b/TPDT-268 - ACP in task sequence/dba_storedProcedures/Purge_Synchro_Label.sql new file mode 100644 index 0000000..feed523 --- /dev/null +++ b/TPDT-268 - ACP in task sequence/dba_storedProcedures/Purge_Synchro_Label.sql @@ -0,0 +1,103 @@ +USE [HCITools] +GO + +IF EXISTS (SELECT * FROM sys.objects WHERE object_id = OBJECT_ID(N'[dbo].[Purge_Synchro_Label]') AND type in (N'P', N'PC')) +DROP PROCEDURE [dbo].[Purge_Synchro_Label] +GO + +USE [HCITools] +GO + +SET ANSI_NULLS ON +GO + +SET QUOTED_IDENTIFIER ON +GO + + +CREATE PROCEDURE [dbo].[Purge_Synchro_Label] + @in_debug int = null, + @in_NbMonths int = 3 +AS +/*============================================================================= + + Explication du traitement realise par la SP + ------------------------------------------- + Cette SP sert à supprimer les labels de plus de X jours + + Contexte d'utilisation + ---------------------- + Cette SP est appelée par le job D93100 - Purge Synchro Label + + Parametres + ---------- + @in_debug : non utilisé + @in_NbMonths : nombre de mois glissant à conserver (3 par défaut) + + + Creation : 28.10.16 / FLA + + Modifications : + +=============================================================================*/ + +set nocount on; + + +/*------------------- Declaration des variables --------------------*/ +declare @MaxDate bigint, + @Directory varchar (255), + @Path varchar(500), + @FullPath varchar(500) + +/*------------ Affectation des parametres aux variables ------------*/ + +SET @MaxDate = CAST(CONVERT(nvarchar(30), DateAdd(mm,-@in_NbMonths,getdate()), 112)+'000000000' as bigint) +SELECT @Path = HCIP_value FROM HCITools.dbo.HCI_PARAMS WHERE HCIP_key = 'LBLPATH' + +/*-------------------------- Traitement ---------------------------*/ +BEGIN TRY + + /* séléction de l'ensemble des répertoires commençant par 20, de format numérique et d'une taille de 17 */ + declare c_Directories cursor local forward_only static for + SELECT DirectoryName FROM [dbo].[aps_Directory_Get_Directories] (@Path,'20*') + where ISNUMERIC(DirectoryName) = 1 + AND LEN(DirectoryName) = 17 + + open c_Directories + ; + FETCH NEXT FROM c_Directories + into @Directory + + /* Parcour des répertoires */ + while @@fetch_status = 0 + begin + + /* Si le répertoire est un répertoire de plus de 3 mois alors on le supprime */ + IF CAST(@Directory as bigint) < @MaxDate + BEGIN + SET @FullPath = @Path + @Directory + exec dbo.aps_Directory_Delete @path = @FullPath, @recursive=1 + END + + FETCH NEXT FROM c_Directories + into @Directory + end + + close c_Directories + deallocate c_Directories + +/*---------------------- Traitement des erreurs ----------------------*/ +END TRY +BEGIN CATCH + + /* Traitement des erreurs (avec RaiseError) */ + EXEC dbo.get_Error_Info @in_RaiseError = 1 + +END CATCH + + + +GO + + diff --git a/TPDT-268 - ACP in task sequence/dba_storedProcedures/Replication_Check.sql b/TPDT-268 - ACP in task sequence/dba_storedProcedures/Replication_Check.sql new file mode 100644 index 0000000..d6f6639 --- /dev/null +++ b/TPDT-268 - ACP in task sequence/dba_storedProcedures/Replication_Check.sql @@ -0,0 +1,1753 @@ +USE [HCITools] +GO + +IF EXISTS (SELECT * FROM sys.objects WHERE object_id = OBJECT_ID(N'[dbo].[Replication_Check]') AND type in (N'P', N'PC')) +DROP PROCEDURE [dbo].[Replication_Check] +GO + +SET ANSI_NULLS ON +GO + +SET QUOTED_IDENTIFIER ON +GO + + + + +CREATE PROCEDURE [dbo].[Replication_Check] + @in_debug int = null, + @in_CheckType smallint = 0, + @in_Email smallint +AS +/*============================================================================= + + Explication du traitement realise par la SP + ------------------------------------------- + Cette SP sert à vérifier un ensemble de points critiques sur la réplication + + Contexte d'utilisation + ---------------------- + Cette SP est appelée par le job DR92160 - Replication Check + + Parametres + ---------- + @in_debug : non utilisé + @in_CheckType : 0 = Toutes les vérifications + 1 = Check des jobs de maintenance de la réplication + 2 = Check des articles présents dans la publication + 3 = Check des linked servers + 4 = Liste des postes non abonnées (manquants) + 5 = Check de la disponibilité du share + 6 = Check du mode d'authentification des souscriptions + 7 = Check de l'etat des souscriptions pour chaque poste + 8 = Check All Agents Status + 9 = Check jobs de réplication à double + 10 = Vérifications des commandes non distribuées + @in_Email : 1 = Envoie d'email à HCI_DBA + 2 = Pas d'email, uniquement enregisté dans la base de données + + Creation : 28.08.17 / FLA + + Modification : 12.07.17 / FLA Ajout de la gestion des environnements pour executer que sur N+1 et PROD + 24.04.18 / RTC Ajout du test des commandes non distribuées et mise à jour du schedule + 21.11.18 / SPE Ajout d'une vérification d'état des linked server des postes (job replication stoppé depuis plus de 2 minutes) + 20.04.20 / SPE Create alert for monitoring replication after MSI deployment + 19.05.20 / SPE Envoi de mail seulement si erreur critique + 04.09.20 / RTC Adapt sp after shared file config changes + 29.10.20 / FLA Manage agent error with more than one replication / manage others errors + 23.09.20 / RTC TFS : 62550 Update version check to avoid wrong error message. + 26.02.21 / SPE TFS : 63953 Adapt stored procedure [dbo].[CheckActivePosPublication] to new settings + 01.04.21 / SPE TFS : 60931 Remove undist commands fix after 2014 + 04.05.21 / RTC TFS : 64808 Update check D91030 - Backup ActivePos_Read + 04.05.21 / RTC TFS : 65443 Update check replication performance + 17.03.22 / FLA : Change DBA mail + 24.11.22 / TSC : OCTPDBA-412 Replace ArizonaCash.dbo.pr_point_of_sales with arizona.dbo.point_of_sale + 27.01.23 / SPE : OCTPDBA-478: Resolve SQL 2019 compatibility issue when getting SQL replication subscription info + 03.02.23 / RTC : OCTPDBA-485: Remove check for windows authentication in the replication monitoring + 03.06.29 / RTC : OCTPDBA-666: Update replication jobs check +=============================================================================*/ + +SET NOCOUNT ON; + +/*------------------- Declaration des variables --------------------*/ +DECLARE @result_sp int, + @CheckJob int, + @Status int, + @Rate int, + @AlertID int, + @errfound bit, + @isProd bit, + @countok tinyint, + @countko tinyint, + @counttot tinyint, + @percent tinyint, + @LksrvPos sysname, + @CheckDate datetime2(0), + @tsql nvarchar(max), + @Message varchar(max), + @query varchar(max), + @fileName varchar(400), + @errmsg varchar(255), + @JobName varchar(100), + @server varchar(100), + @Article varchar(50), + @POS varchar(50), + @dbVersion varchar(20), + @versionNumberSrv varchar(17), + @versionNumberPos varchar(17), + @ouCode varchar(15), + @distribution_db sysname, + @publication sysname, + @publisher_db sysname, + @subscriber sysname, + @Agent_type sysname, + @Agent_id int, + @EndTime datetime2(0), + @comments varchar(250), + @TableSys sysname, + @AlertKey varchar(20) + +/*------------ Affectation des parametres aux variables ------------*/ +SET @message = '' +SET @result_sp = 0 +SET @errfound = 0 +SET @CheckDate = getdate() + +SELECT @counttot = count(*) + FROM [Arizona].[dbo].[Bmc_application_key] [bak] WITH (NOLOCK) + JOIN [Arizona].[dbo].[Bmc_application_default] [bad] WITH (NOLOCK) + ON [bad].[BAPD_bmc_application_key] = [bak].[Bmc_application_key_ID] + JOIN [Arizona].[dbo].[Organizational_unit] OUA WITH (NOLOCK) + ON OUA.[Organizational_unit_ID] = [bad].[BAPD_value] + JOIN [Arizona].[dbo].[Organizational_unit] [ou] WITH(NOLOCK) + ON [ou].[OU_code] = [OUA].[OU_code] + JOIN [Arizona].[dbo].[Point_of_sale] [pos] + ON [ou].[Organizational_unit_ID] = [pos].[POS_organizational_unit] +WHERE [bak].[BAPK_key] = 'cvCurrentOrganizationalUnit' + AND [pos].[POS_active] = 1 + AND [pos].[POS_number] <= 39 + AND [pos].[POS_type] IN (1,2) /* 1=POS, 2=Backoffice, 3=SAFE */ + --AND OU.CROU_locally_used = 1 + +/*-------------------------- Traitement ---------------------------*/ +IF @in_Email NOT IN (0, 1) +BEGIN + SET @errmsg = 'Probleme avec le paramètre @in_Email'; + RAISERROR (@errmsg,16,1); +END + +/* Check replications only if POS are registred on this pharmacy */ +IF @counttot > 0 +BEGIN + + /* Exclude all N+2 */ + IF EXISTS (SELECT * + FROM [master].[cfg].[InstanceContext] + WHERE Type in ('VALI','ACCE','PROD') + AND Business in ('TPCENT','TPUCENT','TPPHAR') + AND Behavior = 'Enable') + BEGIN + + /* Alerts are critical or warning only if PROD pharmacie */ + IF EXISTS (SELECT 1 FROM [master].[cfg].[InstanceContext] WHERE Type = 'PROD') + BEGIN + SET @isProd = 1 + END + ELSE + BEGIN + SET @isProd = 0 + END + + CREATE TABLE #LinkedServerPb(posname varchar(255)) + + /*----------------------------------------------------------------------------------------------------------------------------------------------------------------*/ + /* 1: Check des jobs de maintenance de la réplication */ + /*----------------------------------------------------------------------------------------------------------------------------------------------------------------*/ + + BEGIN TRY + IF (@in_CheckType = 1 or @in_CheckType = 0) + BEGIN + + SET @message = '' + + SELECT @CheckJob = COUNT(*) from msdb.dbo.sysjobs with (nolock) where name = 'Agent history clean up: distribution' AND enabled = 1 + IF @CheckJob <> 1 + SET @message = @message + '- Agent history clean up: distribution'+CHAR(13)+CHAR(10) + + SELECT @CheckJob = COUNT(*) from msdb.dbo.sysjobs with (nolock) where name = 'Distribution clean up: distribution' AND enabled = 1 + IF @CheckJob <> 1 + SET @message = @message + '- Distribution clean up: distribution'+CHAR(13)+CHAR(10) + + SELECT @CheckJob = COUNT(*) from msdb.dbo.sysjobs with (nolock) where name = 'Expired subscription clean up' AND enabled = 1 + IF @CheckJob <> 1 + SET @message = @message + '- Expired subscription clean up'+CHAR(13)+CHAR(10) + + SELECT @CheckJob = COUNT(*) from msdb.dbo.sysjobs with (nolock) where name = 'Reinitialize subscriptions having data validation failures' AND enabled = 1 + IF @CheckJob <> 1 + SET @message = @message + '- Reinitialize subscriptions having data validation failures'+CHAR(13)+CHAR(10) + + SELECT @CheckJob = COUNT(*) from msdb.dbo.sysjobs with (nolock) where name = 'Replication agents checkup' AND enabled = 1 + IF @CheckJob <> 1 + SET @message = @message + '- Replication agents checkup'+CHAR(13)+CHAR(10) + + SELECT @CheckJob = COUNT(*) from msdb.dbo.sysjobs with (nolock) where name = 'D91030 - Backup ActivePos_Read' + IF @CheckJob <> 1 + SET @message = @message + '- D91030 - Backup ActivePos_Read'+CHAR(13)+CHAR(10) + + SELECT @CheckJob = COUNT(*) from msdb.dbo.sysjobs with (nolock) where name = 'D00480 - ActivePos_read Snapshot' AND enabled = 1 + IF @CheckJob <> 1 + SET @message = @message + '- D00480 - ActivePos_read Snapshot'+CHAR(13)+CHAR(10) + + SELECT @CheckJob = COUNT(*) from msdb.dbo.sysjobs with (nolock) where name = 'DR00470 - ActivePos_read Log reader' AND enabled = 1 + IF @CheckJob <> 1 + SET @message = @message + '- DR00470 - ActivePos_read Log reader'+CHAR(13)+CHAR(10) + + IF @message <> '' + BEGIN + SET @errfound = 1 + SET @message = 'Jobs de maintenance de la réplication manquants ou désactivés : '+CHAR(13)+CHAR(10)+@message + SELECT @AlertID = DBA_monitoring_alerts_ID FROM [HCITools].[mon].[DBA_monitoring_alerts] WHERE DBAMA_key = 'MaintJobs' + IF @isProd = 1 + BEGIN + INSERT INTO [HCITools].[mon].[DBA_monitoring_alerts_history] (DBAMAH_monitoring_alerts, DBAMAH_criticity_level, DBAMAH_event_date, DBAMAH_long_message) + VALUES (@AlertID, 1, @CheckDate, @message) + END + ELSE + BEGIN + INSERT INTO [HCITools].[mon].[DBA_monitoring_alerts_history] (DBAMAH_monitoring_alerts, DBAMAH_criticity_level, DBAMAH_event_date, DBAMAH_long_message) + VALUES (@AlertID, 0, @CheckDate, @message) + END + + /* S'il y a une erreur, on envoie un mail aux DBA */ + IF @in_Email = 1 + BEGIN + EXEC [dbo].[aps_Send_Mail_with_template] + @in_param_varchar_2 = 'DBA_operator;', + @in_job_type = 3, /* 3 = warning */ + @in_param_varchar_3 = @Message + END + END + END + END TRY + BEGIN CATCH + /* Traitement des erreurs (avec RaiseError) */ + EXEC dbo.get_Error_Info @in_RaiseError = 1 + END CATCH + + /*----------------------------------------------------------------------------------------------------------------------------------------------------------------*/ + /* 2: Check des articles présents dans la publication */ + /*----------------------------------------------------------------------------------------------------------------------------------------------------------------*/ + + BEGIN TRY + IF (@in_CheckType = 2 or @in_CheckType = 0) + BEGIN + + SET @message = '' + + DECLARE c_Articles CURSOR LOCAL FORWARD_ONLY STATIC FOR + SELECT NAME + FROM ActivePos_read.sys.objects AROT WITH (NOLOCK) + WHERE type = 'U' + AND is_ms_shipped = 0 + AND NOT EXISTS (SELECT name + FROM ActivePos_read.sys.objects AROA WITH (NOLOCK) + WHERE type = 'U' + AND is_published = 1 + AND is_ms_shipped = 0 + AND AROT.name = AROA.name) + + OPEN c_Articles + FETCH NEXT FROM c_Articles + INTO @Article + + WHILE @@fetch_status <> -1 + BEGIN + + SET @message = @message + '- '+@Article+CHAR(13)+CHAR(10) + + FETCH NEXT FROM c_Articles + INTO @Article + END + + IF @message <> '' + BEGIN + SET @errfound = 1 + SET @message = 'Liste des articles manquants dans la publication :'+CHAR(13)+CHAR(10)+@message + SELECT @AlertID = DBA_monitoring_alerts_ID FROM [HCITools].[mon].[DBA_monitoring_alerts] WHERE DBAMA_key = 'MissArt' + IF @isProd = 1 + BEGIN + INSERT INTO [HCITools].[mon].[DBA_monitoring_alerts_history] (DBAMAH_monitoring_alerts, DBAMAH_criticity_level, DBAMAH_event_date, DBAMAH_long_message) + VALUES (@AlertID, 2, @CheckDate, @message) + END + ELSE + BEGIN + INSERT INTO [HCITools].[mon].[DBA_monitoring_alerts_history] (DBAMAH_monitoring_alerts, DBAMAH_criticity_level, DBAMAH_event_date, DBAMAH_long_message) + VALUES (@AlertID, 0, @CheckDate, @message) + END + + /* S'il y a une erreur, on envoie un mail aux DBA */ + IF @in_Email = 1 + BEGIN + EXEC [dbo].[aps_Send_Mail_with_template] + @in_param_varchar_2 = 'DBA_operator;', + @in_job_type = 3, /* 3 = warning */ + @in_param_varchar_3 = @Message + END + END + + CLOSE c_Articles + DEALLOCATE c_Articles + + END + END TRY + BEGIN CATCH + /* Traitement des erreurs (avec RaiseError) */ + EXEC dbo.get_Error_Info @in_RaiseError = 1 + END CATCH + + /*----------------------------------------------------------------------------------------------------------------------------------------------------------------*/ + /* 3: Check des linked servers */ + /*----------------------------------------------------------------------------------------------------------------------------------------------------------------*/ + + BEGIN TRY + IF (@in_CheckType = 3 or @in_CheckType = 0) + BEGIN + + SET @message = '' + SET @countok = 0 + SET @countko = 0 + SET @percent = 0 + + IF EXISTS ( SELECT * + FROM distribution.sys.tables + WHERE name = 'msreplservers') + BEGIN + EXEC ('SELECT POS.[POS_hostname] + INTO ##POS + FROM arizona.dbo.bmc_application_key WITH (NOLOCK) + JOIN arizona.dbo.bmc_application_default WITH (NOLOCK) + ON BAPD_bmc_application_key = Bmc_application_key_ID + JOIN arizona.dbo.organizational_unit OUA WITH (NOLOCK) + ON [OUA].[Organizational_unit_ID] = bapd_value + JOIN [Arizona].[dbo].[Organizational_unit] [ou] WITH(NOLOCK) + ON [ou].[OU_code] = [OUA].[OU_code] + JOIN [Arizona].[dbo].[Point_of_sale] [pos] + ON [ou].[Organizational_unit_ID] = [pos].[POS_organizational_unit] + WHERE BAPK_key = ''cvCurrentOrganizationalUnit'' + AND [pos].[POS_active] = 1 + AND [pos].[POS_number] <= 39 + AND [pos].[POS_type] IN (1,2) /* 1=POS, 2=Backoffice, 3=SAFE */ + --AND OU.CROU_locally_used = 1 + AND EXISTS (select distinct [ss].[srvname] + FROM distribution.dbo.MSreplservers ss WITH (NOLOCK) + INNER JOIN distribution.dbo.MSsubscriptions ms WITH (NOLOCK) + ON [ss].[srvid] = [ms].[subscriber_id] + WHERE [ss].[srvname] = POS.[POS_hostname])'); + END; + ELSE + BEGIN + EXEC ('SELECT POS.[POS_hostname] + INTO ##POS + FROM arizona.dbo.bmc_application_key WITH (NOLOCK) + JOIN arizona.dbo.bmc_application_default WITH (NOLOCK) + ON BAPD_bmc_application_key = Bmc_application_key_ID + JOIN arizona.dbo.organizational_unit OUA WITH (NOLOCK) + ON [OUA].[Organizational_unit_ID] = bapd_value + JOIN [Arizona].[dbo].[Organizational_unit] [ou] WITH(NOLOCK) + ON [ou].[OU_code] = [OUA].[OU_code] + JOIN [Arizona].[dbo].[Point_of_sale] [pos] + ON [ou].[Organizational_unit_ID] = [pos].[POS_organizational_unit] + WHERE BAPK_key = ''cvCurrentOrganizationalUnit'' + AND [pos].[POS_active] = 1 + AND [pos].[POS_number] <= 39 + AND [pos].[POS_type] IN (1,2) /* 1=POS, 2=Backoffice, 3=SAFE */ + --AND OU.CROU_locally_used = 1 + AND EXISTS (select distinct [ss].[name] + FROM sys.servers ss WITH (NOLOCK) + INNER JOIN distribution.dbo.MSsubscriptions ms WITH (NOLOCK) + ON [ss].[server_id] = [ms].[subscriber_id] + WHERE [ss].[name] = POS.[POS_hostname])'); + END; + + DECLARE c_Subscriptions CURSOR LOCAL FORWARD_ONLY STATIC FOR + SELECT * + FROM ##POS + + SELECT TOP 1 @versionNumberSrv = [VersionNumber] FROM [ActivePos_read].[upd].[DatabaseHistory] ORDER BY [DatabaseHistoryId] DESC + + OPEN c_Subscriptions + + FETCH NEXT FROM c_Subscriptions + INTO @POS + + WHILE @@fetch_status <> -1 + BEGIN + + SET @LksrvPos = @POS; + BEGIN TRY + EXEC @result_sp = sys.sp_testlinkedserver @LksrvPos + END TRY + BEGIN CATCH + SET @result_sp = sign(@@error); + END CATCH; + + IF @result_sp <> 0 + BEGIN + SET @countko = @countko + 1 + SET @message = @message + '- '+@POS+ ' - Timeout' +CHAR(13)+CHAR(10) + INSERT INTO #LinkedServerPb(posname) + VALUES(@POS) + END + ELSE + BEGIN + SET @countok = @countok + 1 + END + + FETCH NEXT FROM c_Subscriptions + INTO @POS + END + + IF @message <> '' + BEGIN + + SET @errfound = 1 + SET @message = 'Liste des linked servers avec des problèmes de connexion:'+CHAR(13)+CHAR(10)+@message + + SET @countok = @counttot - @countko + + SELECT @percent = (@countko * 100 / (@counttot)) + SELECT @AlertID = DBA_monitoring_alerts_ID FROM [HCITools].[mon].[DBA_monitoring_alerts] WHERE DBAMA_key = 'POSLinked' + + IF @percent <= 29 + BEGIN + IF @isProd = 1 + BEGIN + INSERT INTO [HCITools].[mon].[DBA_monitoring_alerts_history] (DBAMAH_monitoring_alerts, DBAMAH_criticity_level, DBAMAH_event_date, DBAMAH_long_message) + VALUES (@AlertID, 1, @CheckDate, @message) + END + ELSE + BEGIN + INSERT INTO [HCITools].[mon].[DBA_monitoring_alerts_history] (DBAMAH_monitoring_alerts, DBAMAH_criticity_level, DBAMAH_event_date, DBAMAH_long_message) + VALUES (@AlertID, 0, @CheckDate, @message) + END + END + IF @percent >= 30 + BEGIN + IF @isProd = 1 + BEGIN + INSERT INTO [HCITools].[mon].[DBA_monitoring_alerts_history] (DBAMAH_monitoring_alerts, DBAMAH_criticity_level, DBAMAH_event_date, DBAMAH_long_message) + VALUES (@AlertID, 2, @CheckDate, @message) + END + ELSE + BEGIN + INSERT INTO [HCITools].[mon].[DBA_monitoring_alerts_history] (DBAMAH_monitoring_alerts, DBAMAH_criticity_level, DBAMAH_event_date, DBAMAH_long_message) + VALUES (@AlertID, 0, @CheckDate, @message) + END + END + + /* S'il y a une erreur, on envoie un mail aux DBA */ + IF @in_Email = 1 + BEGIN + IF @percent >= 30 /* Envoi de mail seulement si erreur critique */ + BEGIN + EXEC [dbo].[aps_Send_Mail_with_template] + @in_param_varchar_2 = 'DBA_operator;', + @in_job_type = 3, /* 3 = warning */ + @in_param_varchar_3 = @Message + END + END + END + + CLOSE c_Subscriptions + DEALLOCATE c_Subscriptions + + DROP TABLE ##POS; + + END + END TRY + BEGIN CATCH + /* Traitement des erreurs (avec RaiseError) */ + EXEC dbo.get_Error_Info @in_RaiseError = 1 + END CATCH + + /*----------------------------------------------------------------------------------------------------------------------------------------------------------------*/ + /* 4: Liste des postes non abonnées (manquants) */ + /*----------------------------------------------------------------------------------------------------------------------------------------------------------------*/ + + BEGIN TRY + IF (@in_CheckType = 4 or @in_CheckType = 0) + BEGIN + + SET @message = '' + SET @countok = 0 + SET @countko = 0 + + IF EXISTS ( SELECT * + FROM distribution.sys.tables + WHERE name = 'msreplservers') + BEGIN + EXEC ('SELECT POS.[POS_hostname] + INTO ##POS + FROM arizona.dbo.bmc_application_key WITH (NOLOCK) + JOIN arizona.dbo.bmc_application_default WITH (NOLOCK) + ON BAPD_bmc_application_key = Bmc_application_key_ID + JOIN arizona.dbo.organizational_unit OUA WITH (NOLOCK) + ON [OUA].[Organizational_unit_ID] = bapd_value + JOIN [Arizona].[dbo].[Organizational_unit] [ou] WITH(NOLOCK) + ON [ou].[OU_code] = [OUA].[OU_code] + JOIN [Arizona].[dbo].[Point_of_sale] [pos] + ON [ou].[Organizational_unit_ID] = [pos].[POS_organizational_unit] + WHERE BAPK_key = ''cvCurrentOrganizationalUnit'' + AND [pos].[POS_active] = 1 + AND [pos].[POS_number] <= 39 + AND [pos].[POS_type] IN (1,2) /* 1=POS, 2=Backoffice, 3=SAFE */ + --AND OU.CROU_locally_used = 1 + AND NOT EXISTS (select distinct [ss].[srvname] + FROM distribution.dbo.MSreplservers ss WITH (NOLOCK) + INNER JOIN distribution.dbo.MSsubscriptions ms WITH (NOLOCK) + ON [ss].[srvid] = [ms].[subscriber_id] + WHERE [ss].[srvname] = POS.[POS_hostname])'); + END; + ELSE + BEGIN + EXEC ('SELECT POS.[POS_hostname] + INTO ##POS + FROM arizona.dbo.bmc_application_key WITH (NOLOCK) + JOIN arizona.dbo.bmc_application_default WITH (NOLOCK) + ON BAPD_bmc_application_key = Bmc_application_key_ID + JOIN arizona.dbo.organizational_unit OUA WITH (NOLOCK) + ON [OUA].[Organizational_unit_ID] = bapd_value + JOIN [Arizona].[dbo].[Organizational_unit] [ou] WITH(NOLOCK) + ON [ou].[OU_code] = [OUA].[OU_code] + JOIN [Arizona].[dbo].[Point_of_sale] [pos] + ON [ou].[Organizational_unit_ID] = [pos].[POS_organizational_unit] + WHERE BAPK_key = ''cvCurrentOrganizationalUnit'' + AND [pos].[POS_active] = 1 + AND [pos].[POS_number] <= 39 + AND [pos].[POS_type] IN (1,2) /* 1=POS, 2=Backoffice, 3=SAFE */ + --AND OU.CROU_locally_used = 1 + AND NOT EXISTS (select distinct [ss].[name] + FROM sys.servers ss WITH (NOLOCK) + INNER JOIN distribution.dbo.MSsubscriptions ms WITH (NOLOCK) + ON [ss].[server_id] = [ms].[subscriber_id] + WHERE [ss].[name] = POS.[POS_hostname])'); + END; + + DECLARE c_Subscriptions CURSOR LOCAL FORWARD_ONLY STATIC FOR + SELECT * + FROM ##POS + + SELECT TOP 1 @versionNumberSrv = [VersionNumber] FROM [ActivePos_write].[upd].[DatabaseHistory] ORDER BY [DatabaseHistoryId] DESC + + OPEN c_Subscriptions + + FETCH NEXT FROM c_Subscriptions + INTO @POS + + WHILE @@fetch_status <> -1 + BEGIN + + SET @LksrvPos = @POS; + BEGIN TRY + IF EXISTS(SELECT 1 FROM #LinkedServerPb WHERE posname = @POS) + BEGIN + SET @result_sp = 1 + END + ELSE + BEGIN + EXEC @result_sp = sys.sp_testlinkedserver @LksrvPos + END + END TRY + BEGIN CATCH + SET @result_sp = sign(@@error); + END CATCH; + IF @result_sp = 0 + BEGIN + SET @tsql = N'SELECT TOP 1 @versionNumberPos = [VersionNumber] FROM [' + @POS + '].[ActivePos_write].[upd].[DatabaseHistory] order by [DatabaseHistoryId] desc' + EXEC [sys].[sp_executesql] @tsql, N'@versionNumberPos varchar(17) OUTPUT', @versionNumberPos OUTPUT + + IF @versionNumberSrv != @versionNumberPos + BEGIN + SET @message = @message + '- '+@POS+ ' Version missmatch: Pos ' +@versionNumberPos + '<> Server ' + @versionNumberSrv +CHAR(13)+CHAR(10) + SET @countko = @countko + 1 + END + ELSE + BEGIN + SET @message = @message + '- '+@POS+ ' Version OK' +CHAR(13)+CHAR(10) + SET @countok = @countok + 1 + END + END + + FETCH NEXT FROM c_Subscriptions + INTO @POS + END + + IF @message <> '' + BEGIN + + SET @errfound = 1 + SET @message = 'Liste des postes non abonnés à la publication :'+CHAR(13)+CHAR(10)+@message + + SELECT @percent = (@countko * 100 / (@counttot)) + SELECT @AlertID = DBA_monitoring_alerts_ID FROM [HCITools].[mon].[DBA_monitoring_alerts] WHERE DBAMA_key = 'SubMiss' + + + IF @percent <= 29 + BEGIN + IF @isProd = 1 + BEGIN + INSERT INTO [HCITools].[mon].[DBA_monitoring_alerts_history] (DBAMAH_monitoring_alerts, DBAMAH_criticity_level, DBAMAH_event_date, DBAMAH_long_message) + VALUES (@AlertID, 1, @CheckDate, @message) + END + ELSE + BEGIN + INSERT INTO [HCITools].[mon].[DBA_monitoring_alerts_history] (DBAMAH_monitoring_alerts, DBAMAH_criticity_level, DBAMAH_event_date, DBAMAH_long_message) + VALUES (@AlertID, 0, @CheckDate, @message) + END + END + IF @percent >= 30 + BEGIN + IF @isProd = 1 + BEGIN + INSERT INTO [HCITools].[mon].[DBA_monitoring_alerts_history] (DBAMAH_monitoring_alerts, DBAMAH_criticity_level, DBAMAH_event_date, DBAMAH_long_message) + VALUES (@AlertID, 2, @CheckDate, @message) + END + ELSE + BEGIN + INSERT INTO [HCITools].[mon].[DBA_monitoring_alerts_history] (DBAMAH_monitoring_alerts, DBAMAH_criticity_level, DBAMAH_event_date, DBAMAH_long_message) + VALUES (@AlertID, 0, @CheckDate, @message) + END + END + + /* S'il y a une erreur, on envoie un mail aux DBA */ + IF @in_Email = 1 + BEGIN + EXEC [dbo].[aps_Send_Mail_with_template] + @in_param_varchar_2 = 'DBA_operator;', + @in_job_type = 3, /* 3 = warning */ + @in_param_varchar_3 = @Message + END + END + + CLOSE c_Subscriptions + DEALLOCATE c_Subscriptions + + DROP TABLE ##POS; + + END + END TRY + BEGIN CATCH + /* Traitement des erreurs (avec RaiseError) */ + EXEC dbo.get_Error_Info @in_RaiseError = 1 + END CATCH + + /*----------------------------------------------------------------------------------------------------------------------------------------------------------------*/ + /* 5: Check de la disponibilité du share */ + /*----------------------------------------------------------------------------------------------------------------------------------------------------------------*/ + + BEGIN TRY + IF (@in_CheckType = 5 or @in_CheckType = 0) + BEGIN + + SET @message = '' + + SELECT @dbVersion = ActivePos_write.upd.DatabaseVersion() + + SELECT TOP 1 @ouCode = ou_code + FROM ActivePos_server.dbo.GetCurrentOU() + + SELECT @fileName = CONVERT(VARCHAR(400),SettingValue) + '\ActivePos_read.' + @dbVersion + '.bak' + FROM ActivePos_server.dbo.Settings WITH (NOLOCK) + WHERE SettingId = 'Values.Pharmacy.DbInitializationBackupPath' + + IF @fileName is null + BEGIN + SELECT @fileName = CONVERT(VARCHAR(400), SettingValue) + '\ActivePos_read.' + @dbVersion + '.bak' + FROM ActiveSystemServer.cfg.Settings WITH (NOLOCK) + WHERE SettingId = 'Values.Modules.Replication.DbInitializationBackupPath' + END + + SELECT @result_sp = HCITools.dbo.aps_File_Exists(@filename) + + IF @result_sp <> 1 + BEGIN + + SET @errfound = 1 + SET @message = 'Share Replinibackup injoignable pour la réplication SQL' + SELECT @AlertID = DBA_monitoring_alerts_ID FROM [HCITools].[mon].[DBA_monitoring_alerts] WHERE DBAMA_key = 'Replini' + IF @isProd = 1 + BEGIN + INSERT INTO [HCITools].[mon].[DBA_monitoring_alerts_history] (DBAMAH_monitoring_alerts, DBAMAH_criticity_level, DBAMAH_event_date, DBAMAH_long_message) + VALUES (@AlertID, 1, @CheckDate, @message) + END + ELSE + BEGIN + INSERT INTO [HCITools].[mon].[DBA_monitoring_alerts_history] (DBAMAH_monitoring_alerts, DBAMAH_criticity_level, DBAMAH_event_date, DBAMAH_long_message) + VALUES (@AlertID, 0, @CheckDate, @message) + END + + /* S'il y a une erreur, on envoie un mail aux DBA */ + IF @in_Email = 1 + BEGIN + EXEC [dbo].[aps_Send_Mail_with_template] + @in_param_varchar_2 = 'DBA_operator;', + @in_job_type = 3, /* 3 = warning */ + @in_param_varchar_3 = @Message + END + END + + END + END TRY + BEGIN CATCH + /* Traitement des erreurs (avec RaiseError) */ + EXEC dbo.get_Error_Info @in_RaiseError = 1 + END CATCH + + /*----------------------------------------------------------------------------------------------------------------------------------------------------------------*/ + /* 7: Check de l'etat des souscriptions pour chaque poste */ + /*----------------------------------------------------------------------------------------------------------------------------------------------------------------*/ + + BEGIN TRY + IF (@in_CheckType = 7 or @in_CheckType = 0) + BEGIN + + SET @message = '' + + SET @countok = 0 + SET @countko = 0 + SET @percent = 0 + + IF EXISTS ( SELECT * + FROM distribution.sys.tables + WHERE name = 'msreplservers') + BEGIN + EXEC ('SELECT DISTINCT [Sub].[srvname] INTO ##POS FROM distribution.dbo.MSSubscriptions s + JOIN distribution.dbo.MSreplservers Sub + ON [Sub].[srvid] = [s].[subscriber_id] + WHERE [s].[status] <> 2 + ORDER BY [Sub].[srvname]'); + END; + ELSE + BEGIN + EXEC ('SELECT DISTINCT [Sub].[name] INTO ##POS FROM distribution.dbo.MSSubscriptions s + JOIN master.sys.servers Sub + ON [Sub].[server_id] = [s].[subscriber_id] + WHERE [s].[status] <> 2 + ORDER BY [Sub].[name]'); + END; + + DECLARE c_Subscriptions3 CURSOR LOCAL FORWARD_ONLY STATIC FOR + SELECT * FROM ##POS + + SELECT TOP 1 @versionNumberSrv = [VersionNumber] FROM [ActivePos_read].[upd].[DatabaseHistory] ORDER BY [DatabaseHistoryId] DESC + + OPEN c_Subscriptions3 + + FETCH NEXT FROM c_Subscriptions3 + INTO @POS + + WHILE @@fetch_status <> -1 + BEGIN + + SET @LksrvPos = @POS; + BEGIN TRY + IF EXISTS(SELECT 1 FROM #LinkedServerPb WHERE posname = @POS) + BEGIN + SET @result_sp = 1 + END + ELSE + BEGIN + EXEC @result_sp = sys.sp_testlinkedserver @LksrvPos + END + END TRY + BEGIN CATCH + SET @result_sp = sign(@@error); + END CATCH; + IF @result_sp = 0 + BEGIN + SET @tsql = N'SELECT TOP 1 @versionNumberPos = [VersionNumber] FROM [' + @POS + '].[ActivePos_read].[upd].[DatabaseHistory] order by [DatabaseHistoryId] desc' + + EXEC [sys].[sp_executesql] @tsql, N'@versionNumberPos varchar(17) OUTPUT', @versionNumberPos OUTPUT + + IF @versionNumberSrv != @versionNumberPos + BEGIN + SET @message = @message + '- '+@POS+ ' Version missmatch' +CHAR(13)+CHAR(10) + SET @countko = @countko + 1 + END + ELSE + BEGIN + SET @message = @message + '- '+@POS+ ' Version OK' +CHAR(13)+CHAR(10) + SET @countok = @countok + 1 + END + END + + FETCH NEXT FROM c_Subscriptions3 + INTO @POS + END + + IF @message <> '' + BEGIN + + SET @errfound = 1 + SET @message = 'Liste des postes avec un problème de souscription :'+CHAR(13)+CHAR(10)+@message + + SELECT @percent = (@countko * 100 / (@counttot)) + SELECT @AlertID = DBA_monitoring_alerts_ID FROM [HCITools].[mon].[DBA_monitoring_alerts] WHERE DBAMA_key = 'SubCheck' + + IF @percent <= 29 + BEGIN + IF @isProd = 1 + BEGIN + INSERT INTO [HCITools].[mon].[DBA_monitoring_alerts_history] (DBAMAH_monitoring_alerts, DBAMAH_criticity_level, DBAMAH_event_date, DBAMAH_long_message) + VALUES (@AlertID, 1, @CheckDate, @message) + END + ELSE + BEGIN + INSERT INTO [HCITools].[mon].[DBA_monitoring_alerts_history] (DBAMAH_monitoring_alerts, DBAMAH_criticity_level, DBAMAH_event_date, DBAMAH_long_message) + VALUES (@AlertID, 0, @CheckDate, @message) + END + END + IF @percent >= 30 + BEGIN + IF @isProd = 1 + BEGIN + INSERT INTO [HCITools].[mon].[DBA_monitoring_alerts_history] (DBAMAH_monitoring_alerts, DBAMAH_criticity_level, DBAMAH_event_date, DBAMAH_long_message) + VALUES (@AlertID, 2, @CheckDate, @message) + END + ELSE + BEGIN + INSERT INTO [HCITools].[mon].[DBA_monitoring_alerts_history] (DBAMAH_monitoring_alerts, DBAMAH_criticity_level, DBAMAH_event_date, DBAMAH_long_message) + VALUES (@AlertID, 0, @CheckDate, @message) + END + END + + /* S'il y a une erreur, on envoie un mail aux DBA */ + IF @in_Email = 1 + BEGIN + EXEC [dbo].[aps_Send_Mail_with_template] + @in_param_varchar_2 = 'DBA_operator;', + @in_job_type = 3, /* 3 = warning */ + @in_param_varchar_3 = @Message + END + END + + CLOSE c_Subscriptions3 + DEALLOCATE c_Subscriptions3 + + DROP TABLE ##POS + + END + END TRY + BEGIN CATCH + /* Traitement des erreurs (avec RaiseError) */ + EXEC dbo.get_Error_Info @in_RaiseError = 1 + END CATCH + + /*----------------------------------------------------------------------------------------------------------------------------------------------------------------*/ + /* 8: Check All Agents Status */ + /*----------------------------------------------------------------------------------------------------------------------------------------------------------------*/ + + BEGIN TRY + IF (@in_CheckType = 8 or @in_CheckType = 0) + BEGIN + + SET @message = '' + + CREATE TABLE #ReplMonitorAgents + ( + agent sysname, + dbname sysname NULL, + name nvarchar(100) NULL, + status int NULL, + message nvarchar(255) NULL, + publisher sysname NULL, + publisher_db sysname NULL, + publication sysname NULL, + subscriber sysname NULL, + subscriber_db sysname NULL, + subscription_type int NULL, + start_time nvarchar(24) NULL, + time nvarchar(24) NULL, + duration int NULL, + comments nvarchar(255) NULL, + delivery_time int NULL, + delivered_transactions int NULL, + delivered_commands int NULL, + average_commands int NULL, + transactions_processed int NULL, + commands_processed int NULL, + download_inserts int NULL, + download_updates int NULL, + download_deletes int NULL, + publisher_conficts int NULL, + upload_inserts int NULL, + upload_updates int NULL, + upload_deletes int NULL, + subscriber_conficts int NULL, + delivery_rate float NULL, + delivery_latency int NULL, + error_id INT NULL, + job_id binary(16) NULL, + local_job bit NULL, + profile_id int NULL, + agent_id int NULL, + local_timestamp binary(8) NULL, + offload_enabled bit NULL, + offload_server sysname NULL, + subscriber_type tinyint NULL, + dynamic_filter_login sysname NULL, + dynamic_filter_hostname sysname NULL + + ) + + INSERT INTO #ReplMonitorAgents (agent, + dbname, + name, + status, + publisher , + publisher_db, + publication, + start_time, + time, + duration, + comments, + delivered_transactions, + delivered_commands, + delivery_rate, + error_id, + job_id, + local_job, + profile_id, + agent_id, + local_timestamp, + dynamic_filter_login, + dynamic_filter_hostname) + SELECT 'Snapshot', + dbname, + name, + status, + publisher , + publisher_db, + publication, + start_time, + time, + duration, + comments, + delivered_transactions, + delivered_commands, + delivery_rate, + error_id, + job_id, + local_job, + profile_id, + agent_id, + local_timestamp, + dynamic_filter_login, + dynamic_filter_hostname + FROM OPENROWSET ('SQLOLEDB','Server=(local);TRUSTED_CONNECTION=YES;','SET FMTONLY OFF EXEC sp_MSenum_replication_agents @type = 1 with result sets + (( + dbname sysname NULL, + name nvarchar(100) NULL, + status int NULL, + publisher sysname NULL, + publisher_db sysname NULL, + publication sysname NULL, + start_time nvarchar(24) NULL, + time nvarchar(24) NULL, + duration int NULL, + comments nvarchar(255) NULL, + delivered_transactions int NULL, + delivered_commands int NULL, + delivery_rate float NULL, + error_id INT NULL, + job_id binary(16) NULL, + local_job bit NULL, + profile_id int NULL, + agent_id int NULL, + local_timestamp binary(8) NULL, + dynamic_filter_login sysname NULL, + dynamic_filter_hostname sysname NULL + ))') + + + INSERT INTO #ReplMonitorAgents (agent, + dbname, + name, + status, + publisher , + publisher_db, + start_time, + time, + duration, + comments, + delivery_time, + delivered_transactions, + delivered_commands, + average_commands, + delivery_rate, + delivery_latency, + error_id, + job_id, + local_job, + profile_id, + agent_id, + local_timestamp) + SELECT 'Logreader', + dbname, + name, + status, + publisher , + publisher_db, + start_time, + time, + duration, + comments, + delivery_time, + delivered_transactions, + delivered_commands, + average_commands, + delivery_rate, + delivery_latency, + error_id, + job_id, + local_job, + profile_id, + agent_id, + local_timestamp + FROM OPENROWSET ('SQLOLEDB','Server=(local);TRUSTED_CONNECTION=YES;','SET FMTONLY OFF EXEC sp_MSenum_replication_agents @type = 2 with result sets + (( + dbname sysname NULL, + name nvarchar(100) NULL, + status int NULL, + publisher sysname NULL, + publisher_db sysname NULL, + start_time nvarchar(24) NULL, + time nvarchar(24) NULL, + duration int NULL, + comments nvarchar(255) NULL, + delivery_time int NULL, + delivered_transactions int NULL, + delivered_commands int NULL, + average_commands int NULL, + delivery_rate float NULL, + delivery_latency int NULL, + error_id INT NULL, + job_id binary(16) NULL, + local_job bit NULL, + profile_id int NULL, + agent_id int NULL, + local_timestamp binary(8) NULL + ))') + + + INSERT INTO #ReplMonitorAgents (agent, + dbname, + name, + status, + publisher , + publisher_db, + publication, + subscriber, + subscriber_db, + subscription_type, + start_time, + time, + duration, + comments, + delivery_time, + delivered_transactions, + delivered_commands, + average_commands, + delivery_rate, + delivery_latency, + error_id, + job_id, + local_job, + profile_id, + agent_id, + local_timestamp, + offload_enabled, + offload_server, + subscriber_type) + SELECT 'Distribution', + dbname, + name, + status, + publisher , + publisher_db, + publication, + subscriber, + subscriber_db, + subscription_type, + start_time, + time, + duration, + comments, + delivery_time, + delivered_transactions, + delivered_commands, + average_commands, + delivery_rate, + delivery_latency, + error_id, + job_id, + local_job, + profile_id, + agent_id, + local_timestamp, + offload_enabled, + offload_server, + subscriber_type + FROM OPENROWSET ('SQLOLEDB','Server=(local);TRUSTED_CONNECTION=YES;','SET FMTONLY OFF EXEC sp_MSenum_replication_agents @type = 3 with result sets + (( + dbname sysname NULL, + name nvarchar(100) NULL, + status int NULL, + publisher sysname NULL, + publisher_db sysname NULL, + publication sysname NULL, + subscriber sysname NULL, + subscriber_db sysname NULL, + subscription_type int NULL, + start_time nvarchar(24) NULL, + time nvarchar(24) NULL, + duration int NULL, + comments nvarchar(255) NULL, + delivery_time int NULL, + delivered_transactions int NULL, + delivered_commands int NULL, + average_commands int NULL, + delivery_rate float NULL, + delivery_latency int NULL, + error_id INT NULL, + job_id binary(16) NULL, + local_job bit NULL, + profile_id int NULL, + agent_id int NULL, + local_timestamp binary(8) NULL, + offload_enabled bit NULL, + offload_server sysname NULL, + subscriber_type tinyint NULL + ))') + + + INSERT INTO #ReplMonitorAgents (agent, + dbname, + name, + status, + publisher , + publisher_db, + publication, + subscriber, + subscriber_db, + subscription_type, + start_time, + time, + duration, + comments, + delivery_rate, + download_inserts, + download_updates, + download_deletes, + publisher_conficts, + upload_inserts, + upload_updates, + upload_deletes, + subscriber_conficts, + error_id, + job_id, + local_job, + profile_id, + agent_id, + local_timestamp, + offload_enabled, + offload_server, + subscriber_type) + SELECT 'Merge', + dbname, + name, + status, + publisher , + publisher_db, + publication, + subscriber, + subscriber_db, + subscription_type, + start_time, + time, + duration, + comments, + delivery_rate, + download_inserts, + download_updates, + download_deletes, + publisher_conficts, + upload_inserts, + upload_updates, + upload_deletes, + subscriber_conficts, + error_id, + job_id, + local_job, + profile_id, + agent_id, + local_timestamp, + offload_enabled, + offload_server, + subscriber_type + FROM OPENROWSET ('SQLOLEDB','Server=(local);TRUSTED_CONNECTION=YES;','SET FMTONLY OFF EXEC sp_MSenum_replication_agents @type = 4 with result sets + (( + dbname sysname NULL, + name nvarchar(100) NULL, + status int NULL, + publisher sysname NULL, + publisher_db sysname NULL, + publication sysname NULL, + subscriber sysname NULL, + subscriber_db sysname NULL, + subscription_type int NULL, + start_time nvarchar(24) NULL, + time nvarchar(24) NULL, + duration int NULL, + comments nvarchar(255) NULL, + delivery_rate float NULL, + download_inserts int NULL, + download_updates int NULL, + download_deletes int NULL, + publisher_conficts int NULL, + upload_inserts int NULL, + upload_updates int NULL, + upload_deletes int NULL, + subscriber_conficts int NULL, + error_id INT NULL, + job_id binary(16) NULL, + local_job bit NULL, + profile_id int NULL, + agent_id int NULL, + local_timestamp binary(8) NULL, + offload_enabled bit NULL, + offload_server sysname NULL, + subscriber_type tinyint NULL + ))') + + INSERT INTO #ReplMonitorAgents (agent, + dbname, + name, + status, + start_time, + time, + duration, + comments, + transactions_processed, + commands_processed, + average_commands, + delivery_rate, + delivery_latency, + error_id, + job_id, + profile_id, + agent_id, + local_timestamp) + SELECT 'Queue reader', + dbname, + name, + status, + start_time, + time, + duration, + comments, + transactions_processed, + commands_processed, + average_commands, + delivery_rate, + delivery_latency, + error_id, + job_id, + profile_id, + agent_id, + local_timestamp + FROM OPENROWSET ('SQLOLEDB','Server=(local);TRUSTED_CONNECTION=YES;','SET FMTONLY OFF EXEC sp_MSenum_replication_agents @type = 9 with result sets + (( + dbname sysname NULL, + name nvarchar(100) NULL, + status int NULL, + start_time nvarchar(24) NULL, + time nvarchar(24) NULL, + duration int NULL, + comments nvarchar(255) NULL, + transactions_processed int NULL, + commands_processed int NULL, + average_commands int NULL, + delivery_rate float NULL, + delivery_latency int NULL, + error_id INT NULL, + job_id binary(16) NULL, + profile_id int NULL, + agent_id int NULL, + local_timestamp binary(8) NULL + ))') + + DECLARE CursorLastHistory CURSOR FOR + SELECT agent,dbname,name,status,time,comments,agent_id,publication,publisher_db,subscriber + FROM #ReplMonitorAgents + ORDER BY publisher_db,publication desc,subscriber desc + + OPEN CursorLastHistory + + FETCH NEXT FROM CursorLastHistory + INTO @Agent_type,@distribution_db,@Jobname,@status,@EndTime,@Comments,@Agent_id,@publication,@publisher_db,@subscriber + + WHILE @@FETCH_STATUS = 0 + BEGIN + SET @message = '' + + SELECT @AlertKey = CASE @Agent_type WHEN 'Snapshot' THEN 'SnapAgt' + WHEN 'Logreader' THEN 'LogReadAgt' + WHEN 'Distribution' THEN 'DistAgt' + WHEN 'Merge' THEN 'MergeAgt' + WHEN 'Queue reader' THEN 'QreaderAgt' + END + + IF @status > 4 + BEGIN + + IF @subscriber IS NOT NULL AND @publication <> 'publ_Ceres_Arizona_Gaia_Tran' + BEGIN + BEGIN TRY + IF EXISTS(SELECT 1 FROM #LinkedServerPb WHERE posname = @subscriber) + BEGIN + SET @result_sp = 1 + END + ELSE + BEGIN + EXEC @result_sp = sys.sp_testlinkedserver @subscriber + END + END TRY + BEGIN CATCH + SET @result_sp = @@error; + END CATCH; + END + ELSE + SET @result_sp = 0 + + IF @result_sp = 0 + SELECT @message = 'L''agent '+ @Agent_type +' '+ @Jobname +' de la ' + CASE WHEN @publication IS NOT NULL THEN 'publication '+@publication + WHEN @publication IS NULL THEN 'base '+@publisher_db + END + + CASE WHEN @subscriber IS NOT NULL THEN ' de l''abonné '+@subscriber + ELSE '' + END + ' est en erreur : ' + @Comments + + IF @message <> '' + BEGIN + + SET @errfound = 1 + + SELECT @AlertID = DBA_monitoring_alerts_ID FROM [HCITools].[mon].[DBA_monitoring_alerts] WHERE DBAMA_key = @AlertKey + + IF @isProd = 1 + BEGIN + INSERT INTO [HCITools].[mon].[DBA_monitoring_alerts_history] (DBAMAH_monitoring_alerts, DBAMAH_criticity_level, DBAMAH_event_date, DBAMAH_long_message) + VALUES (@AlertID, 1, @CheckDate, @message) + END + ELSE + BEGIN + INSERT INTO [HCITools].[mon].[DBA_monitoring_alerts_history] (DBAMAH_monitoring_alerts, DBAMAH_criticity_level, DBAMAH_event_date, DBAMAH_long_message) + VALUES (@AlertID, 0, @CheckDate, @message) + END + + /* S'il y a une erreur, on envoie un mail aux DBA */ + IF @in_Email = 1 + BEGIN + EXEC [dbo].[aps_Send_Mail_with_template] + @in_param_varchar_2 = 'DBA_operator;', + @in_job_type = 3, /* 3 = warning */ + @in_param_varchar_3 = @Message + END + END + + END + ELSE IF @status = 2 AND DATEDIFF(SECOND,@EndTime,GETDATE()) > 120 + BEGIN + + IF @subscriber IS NOT NULL AND @publication <> 'publ_Ceres_Arizona_Gaia_Tran' + BEGIN + BEGIN TRY + IF EXISTS(SELECT 1 FROM #LinkedServerPb WHERE posname = @subscriber) + BEGIN + SET @result_sp = 1 + END + ELSE + BEGIN + EXEC @result_sp = sys.sp_testlinkedserver @subscriber + END + END TRY + BEGIN CATCH + SET @result_sp = @@error; + END CATCH; + END + ELSE IF @Agent_type = 'Snapshot' + SET @result_sp = 1 + ELSE + SET @result_sp = 0 + + IF @result_sp = 0 + SELECT @message = 'L''agent '+ @Agent_type +' '+ @Jobname +' de la ' + CASE WHEN @publication IS NOT NULL THEN 'publication '+@publication + WHEN @publication IS NULL THEN 'base '+@publisher_db + END + + CASE WHEN @subscriber IS NOT NULL THEN ' de l''abonné '+@subscriber + ELSE '' + END + ' est stoppé depuis plus de 2 minutes' + IF @message <> '' + BEGIN + SET @errfound = 1 + + SELECT @AlertID = DBA_monitoring_alerts_ID FROM [HCITools].[mon].[DBA_monitoring_alerts] WHERE DBAMA_key = 'StopJobs' + IF @isProd = 1 + BEGIN + INSERT INTO [HCITools].[mon].[DBA_monitoring_alerts_history] (DBAMAH_monitoring_alerts, DBAMAH_criticity_level, DBAMAH_event_date, DBAMAH_long_message) + VALUES (@AlertID, 2, @CheckDate, @message) + END + ELSE + BEGIN + INSERT INTO [HCITools].[mon].[DBA_monitoring_alerts_history] (DBAMAH_monitoring_alerts, DBAMAH_criticity_level, DBAMAH_event_date, DBAMAH_long_message) + VALUES (@AlertID, 0, @CheckDate, @message) + END + + /* S'il y a une erreur, on envoie un mail aux DBA */ + IF @in_Email = 1 + BEGIN + EXEC [dbo].[aps_Send_Mail_with_template] + @in_param_varchar_2 = 'DBA_operator;', + @in_job_type = 3, /* 3 = warning */ + @in_param_varchar_3 = @Message + END + END + END + ELSE + BEGIN + + SELECT @TableSys = CASE @Agent_type WHEN 'Snapshot' THEN 'MSsnapshot_history' + WHEN 'Logreader' THEN 'MSlogreader_history' + WHEN 'Distribution' THEN 'MSdistribution_history' + WHEN 'Merge' THEN 'MSmerge_history' + WHEN 'Queue reader' THEN 'MSqreader_history' + END + + + SET @tsql = 'IF EXISTS (SELECT 1 + FROM (SELECT TOP 3 + MH.agent_id, + MH.error_id + FROM '+ @distribution_db +'.dbo.'+ @TableSys +' as MH + WHERE MH.agent_id = @Agent_id ORDER BY MH.start_time DESC, MH.time desc) as T1 + WHERE T1.error_id > 0) + BEGIN + SELECT @message = ''A ''+CONVERT(nvarchar(30), T1.start_time, 120)+'' Il y a eu une erreur ''+CAST(T1.error_id as varchar(10))+'' sur l''''agent ''+ @Agent_type +'' ''+ @Jobname +'' de la '' + CASE WHEN @publication IS NOT NULL THEN ''publication ''+@publication + WHEN @publication IS NULL THEN ''base ''+@publisher_db + END + + CASE WHEN @subscriber IS NOT NULL THEN '' de l''''abonné ''+@subscriber + ELSE '''' + END + '' : '' + @Comments + FROM (SELECT TOP 3 + start_time, + error_id + FROM '+ @distribution_db +'.dbo.'+ @TableSys +' + WHERE agent_id = @Agent_id ORDER BY start_time DESC, time desc) as T1 + WHERE T1.error_id > 0 + END' + + EXEC [sys].[sp_executesql] @tsql, N'@Agent_id int,@Agent_type sysname,@JobName varchar(100),@publication sysname,@publisher_db sysname,@subscriber sysname,@comments varchar(250),@Message varchar(max) OUTPUT',@Agent_id=@Agent_id,@Agent_type=@Agent_type,@JobName=@JobName,@publication=@publication,@publisher_db=@publisher_db,@subscriber=@subscriber,@comments=@comments, @message = @message OUTPUT + + IF @Message like '%No replicated transactions are available%' or @Message like '%transaction(s) with%command(s) were delivered%' + BEGIN + SET @Message = '' + END + + IF @Message <> '' + BEGIN + SET @errfound = 1 + SELECT @AlertID = DBA_monitoring_alerts_ID FROM [HCITools].[mon].[DBA_monitoring_alerts] WHERE DBAMA_key = @AlertKey + + IF @isProd = 1 + BEGIN + INSERT INTO [HCITools].[mon].[DBA_monitoring_alerts_history] (DBAMAH_monitoring_alerts, DBAMAH_criticity_level, DBAMAH_event_date, DBAMAH_long_message) + VALUES (@AlertID, 1, @CheckDate, @message) + END + ELSE + BEGIN + INSERT INTO [HCITools].[mon].[DBA_monitoring_alerts_history] (DBAMAH_monitoring_alerts, DBAMAH_criticity_level, DBAMAH_event_date, DBAMAH_long_message) + VALUES (@AlertID, 0, @CheckDate, @message) + END + + /* S'il y a une erreur, on envoie un mail aux DBA */ + IF @in_Email = 1 + BEGIN + EXEC [dbo].[aps_Send_Mail_with_template] + @in_param_varchar_2 = 'DBA_operator;', + @in_job_type = 3, /* 3 = warning */ + @in_param_varchar_3 = @Message + END + END + END + + FETCH NEXT FROM CursorLastHistory + INTO @Agent_type,@distribution_db,@Jobname,@status,@EndTime,@Comments,@Agent_id,@publication,@publisher_db,@subscriber + + END + + CLOSE CursorLastHistory + DEALLOCATE CursorLastHistory + + IF OBJECT_ID('tempdb..#ReplMonitorAgents') IS NOT NULL + DROP TABLE #ReplMonitorAgents + + END + END TRY + BEGIN CATCH + /* Traitement des erreurs (avec RaiseError) */ + EXEC dbo.get_Error_Info @in_RaiseError = 1 + END CATCH + + /*----------------------------------------------------------------------------------------------------------------------------------------------------------------*/ + /* 9: Check jobs de réplication à double */ + /*----------------------------------------------------------------------------------------------------------------------------------------------------------------*/ + BEGIN TRY + IF (@in_CheckType = 9 or @in_CheckType = 0) + BEGIN + + SET @message = '' + + DECLARE c_pos CURSOR LOCAL FORWARD_ONLY STATIC FOR + SELECT SUBSTRING(name,CHARINDEX('ActivePosTran',name,0)+14,CHARINDEX('-',name,CHARINDEX('ActivePosTran',name,0)+14)-(CHARINDEX('ActivePosTran',name,0)+14)) + FROM msdb.dbo.sysjobs + WHERE name like '%ActivePos_read-ActivePosTran%' + AND SUBSTRING(name,CHARINDEX('ActivePosTran',name,0)+14,8) like 'W%' + GROUP BY SUBSTRING(name,CHARINDEX('ActivePosTran',name,0)+14,CHARINDEX('-',name,CHARINDEX('ActivePosTran',name,0)+14)-(CHARINDEX('ActivePosTran',name,0)+14)) + HAVING COUNT(*) > 1 + + OPEN c_pos + + FETCH NEXT FROM c_pos + INTO @POS + + WHILE @@fetch_status = 0 + BEGIN + + SET @message = @Message + 'Il y a trop de jobs pour le poste : '+@POS+CHAR(13)+CHAR(10) + + FETCH NEXT FROM c_pos + INTO @POS + END + + CLOSE c_pos + DEALLOCATE c_pos + + IF @message <> '' + BEGIN + + SET @errfound = 1 + SET @message = 'Liste des jobs en double :'+CHAR(13)+CHAR(10)+@message + SELECT @AlertID = DBA_monitoring_alerts_ID FROM [HCITools].[mon].[DBA_monitoring_alerts] WHERE DBAMA_key = 'DuplicJobs' + IF @isProd = 1 + BEGIN + INSERT INTO [HCITools].[mon].[DBA_monitoring_alerts_history] (DBAMAH_monitoring_alerts, DBAMAH_criticity_level, DBAMAH_event_date, DBAMAH_long_message) + VALUES (@AlertID, 1, @CheckDate, @message) + END + ELSE + BEGIN + INSERT INTO [HCITools].[mon].[DBA_monitoring_alerts_history] (DBAMAH_monitoring_alerts, DBAMAH_criticity_level, DBAMAH_event_date, DBAMAH_long_message) + VALUES (@AlertID, 0, @CheckDate, @message) + END + + /* S'il y a une erreur, on envoie un mail aux DBA */ + IF @in_Email = 1 + BEGIN + EXEC [dbo].[aps_Send_Mail_with_template] + @in_param_varchar_2 = 'DBA_operator;', + @in_job_type = 3, /* 3 = warning */ + @in_param_varchar_3 = @Message + END + END + END + END TRY + BEGIN CATCH + /* Traitement des erreurs (avec RaiseError) */ + EXEC dbo.get_Error_Info @in_RaiseError = 1 + END CATCH + + /*----------------------------------------------------------------------------------------------------------------------------------------------------------------*/ + /* 10: Verifications performances et des commandes non distribuées */ + /*----------------------------------------------------------------------------------------------------------------------------------------------------------------*/ + BEGIN TRY + IF (@in_CheckType = 10 or @in_CheckType = 0) + BEGIN + + SET @message = '' + SET @countko = 0 + SET @percent = 0 + + SELECT RQH_subscriber_db, RQH_records_in_queue, RQH_catch_up_time, RQH_log_date + INTO #LastHourStatus + FROM HciTools.[mon].[Replication_queue_history] + WHERE RQH_records_in_queue > 1000 and RQH_catch_up_time > 60 + AND RQH_log_date > DATEADD(hh, -1, getdate()) + ORDER BY RQH_log_date DESC + + /* Separate check for TriaFin replication, only ont subscription registered */ + IF EXISTS (SELECT RQH_subscriber_db, count(*) FROM #LastHourStatus + GROUP BY RQH_subscriber_db + HAVING RQH_subscriber_db like '%GALCTP' and count(*) >= 3) + BEGIN + SELECT @Message = @Message + CHAR(13) + CHAR(10) + '-' + RQH_subscriber_db + ' : ' + cast(RQH_records_in_queue as varchar(20)) +': ' + + cast(RQH_catch_up_time as varchar (10)) + '(s) : ' + + convert(varchar(20),RQH_log_date, 120) + CHAR(13) + CHAR(10) + FROM #LastHourStatus + WHERE RQH_subscriber_db like '%GALCTP' + END + + /* Suiz percentage check for perf, need to see caisse mall, pos covid and out f site pos (ex chantepoulet) single perf issue + SELECT @countko = count(distinct RQH_subscriber_db) + FROM #LastHourStatus + WHERE RQH_subscriber_db not like '%GALCTP' + + SELECT @percent = (@countko * 100 / (@counttot)) + + IF @percent < 50 and @message = '' + Return + */ + + + + IF EXISTS ( SELECT * + FROM distribution.sys.tables + WHERE name = 'msreplservers') + BEGIN + EXEC ('SELECT REPLACE([POS].[POS_hostname],''-'','''') as POS_hostname + INTO ##POS + FROM arizona.dbo.bmc_application_key WITH (NOLOCK) + JOIN arizona.dbo.bmc_application_default WITH (NOLOCK) + ON BAPD_bmc_application_key = Bmc_application_key_ID + JOIN arizona.dbo.organizational_unit OUA WITH (NOLOCK) + ON [OUA].[Organizational_unit_ID] = bapd_value + JOIN [Arizona].[dbo].[Organizational_unit] [ou] WITH(NOLOCK) + ON [ou].[OU_code] = [OUA].[OU_code] + JOIN [Arizona].[dbo].[Point_of_sale] [pos] + ON [ou].[Organizational_unit_ID] = [pos].[POS_organizational_unit] + WHERE BAPK_key = ''cvCurrentOrganizationalUnit'' + AND [pos].[POS_active] = 1 + AND [pos].[POS_number] <= 39 + AND [pos].[POS_type] IN (1,2) /* 1=POS, 2=Backoffice, 3=SAFE */ + --AND OU.CROU_locally_used = 1 + AND EXISTS (SELECT DISTINCT [ss].[srvname] + FROM distribution.dbo.MSreplservers ss WITH (NOLOCK) + INNER JOIN distribution.dbo.MSsubscriptions ms WITH (NOLOCK) + ON [ss].[srvid] = [ms].[subscriber_id] + WHERE [ss].[srvname] = POS.[POS_hostname])'); + END; + ELSE + BEGIN + EXEC ('SELECT REPLACE([POS].[POS_hostname],''-'','''') as POS_hostname + INTO ##POS + FROM arizona.dbo.bmc_application_key WITH (NOLOCK) + JOIN arizona.dbo.bmc_application_default WITH (NOLOCK) + ON BAPD_bmc_application_key = Bmc_application_key_ID + JOIN arizona.dbo.organizational_unit OUA WITH (NOLOCK) + ON [OUA].[Organizational_unit_ID] = bapd_value + JOIN [Arizona].[dbo].[Organizational_unit] [ou] WITH(NOLOCK) + ON [ou].[OU_code] = [OUA].[OU_code] + JOIN [Arizona].[dbo].[Point_of_sale] [pos] + ON [ou].[Organizational_unit_ID] = [pos].[POS_organizational_unit] + WHERE BAPK_key = ''cvCurrentOrganizationalUnit'' + AND [pos].[POS_active] = 1 + AND [pos].[POS_number] <= 39 + AND [pos].[POS_type] IN (1,2) /* 1=POS, 2=Backoffice, 3=SAFE */ + --AND OU.CROU_locally_used = 1 + AND EXISTS (SELECT DISTINCT [ss].[name] + FROM sys.servers ss WITH (NOLOCK) + INNER JOIN distribution.dbo.MSsubscriptions ms WITH (NOLOCK) + ON [ss].[server_id] = [ms].[subscriber_id] + WHERE [ss].[name] = POS.[POS_hostname])'); + END; + + /* Online subscription having undistributed transaction with latency in last hour */ + DECLARE c_Subscriptions4 CURSOR LOCAL FORWARD_ONLY STATIC FOR + SELECT * FROM ##POS + + OPEN c_Subscriptions4 + + FETCH NEXT FROM c_Subscriptions4 + INTO @POS + + WHILE @@fetch_status <> -1 + BEGIN + /* Select only POS having more or equal than 4 entries ko in last hour */ + IF NOT EXISTS(SELECT 1 FROM #LinkedServerPb WHERE posname = @POS) + AND EXISTS (SELECT RQH_subscriber_db, count(*) + FROM #LastHourStatus + GROUP BY RQH_subscriber_db + HAVING RQH_subscriber_db = @pos and count(*) >= 4) + BEGIN + SELECT @Message = @Message + '-' + RQH_subscriber_db + ' : ' + cast(RQH_records_in_queue as varchar(20)) + ': '+ cast(RQH_catch_up_time as varchar (10)) + '(s) : ' + + convert(varchar(20),RQH_log_date, 120) + CHAR(13) + CHAR(10) + FROM #LastHourStatus + WHERE RQH_subscriber_db = @pos + + SELECT @Message = @Message + CHAR(13) + CHAR(10) + + END + FETCH NEXT FROM c_Subscriptions4 + INTO @POS + END + + DROP TABLE #LastHourStatus + + IF @message <> '' + BEGIN + + SET @errfound = 1 + SET @message = 'Subscription(s) with undistributed commands and catch up time :' + CHAR(13) + CHAR(10) + CHAR(13) + CHAR(10) + @message + + /* S'il y a une erreur, on envoie un mail aux DBA */ + IF @in_Email = 1 + BEGIN + EXEC [dbo].[aps_Send_Mail_with_template] + @in_param_varchar_2 = 'DBA_operator;', + @in_job_type = 3, /* 3 = warning */ + @in_param_varchar_3 = @Message + END + END + + CLOSE c_Subscriptions4 + DEALLOCATE c_Subscriptions4 + + DROP TABLE ##POS + + END + + END TRY + BEGIN CATCH + /* Traitement des erreurs (avec RaiseError) */ + EXEC dbo.get_Error_Info @in_RaiseError = 1 + END CATCH + + /* Status OK si pas d'erreur */ + IF @errfound = 0 + BEGIN + SELECT @AlertID = DBA_monitoring_alerts_ID FROM [HCITools].[mon].[DBA_monitoring_alerts] WHERE DBAMA_key = 'OK' + INSERT INTO [HCITools].[mon].[DBA_monitoring_alerts_history] (DBAMAH_monitoring_alerts, DBAMAH_criticity_level, DBAMAH_event_date, DBAMAH_long_message) + VALUES (@AlertID, 0, @CheckDate, '') + END + + DROP TABLE #LinkedServerPb + + END + ELSE + BEGIN + /* N+2 Sites = OK */ + SELECT @AlertID = DBA_monitoring_alerts_ID FROM [HCITools].[mon].[DBA_monitoring_alerts] WHERE DBAMA_key = 'OK' + INSERT INTO [HCITools].[mon].[DBA_monitoring_alerts_history] (DBAMAH_monitoring_alerts, DBAMAH_criticity_level, DBAMAH_event_date, DBAMAH_long_message) + VALUES (@AlertID, 0, @CheckDate, '') + END +END +GO diff --git a/TPDT-268 - ACP in task sequence/dba_storedProcedures/Restore_all_principal_permission.sql b/TPDT-268 - ACP in task sequence/dba_storedProcedures/Restore_all_principal_permission.sql new file mode 100644 index 0000000..ddef207 --- /dev/null +++ b/TPDT-268 - ACP in task sequence/dba_storedProcedures/Restore_all_principal_permission.sql @@ -0,0 +1,138 @@ +USE [HCITools] +GO + +IF EXISTS (SELECT * FROM sys.objects WHERE object_id = OBJECT_ID(N'[dba].[Restore_all_principal_permission]') AND type in (N'P', N'PC')) + DROP PROCEDURE [dba].[Restore_all_principal_permission] +GO + +USE [HCITools] +GO +SET ANSI_NULLS ON +GO +SET QUOTED_IDENTIFIER ON +GO + +CREATE PROCEDURE [dba].[restore_all_principal_permission] + @in_param_label datetime, + @in_debug int = null +AS +/*============================================================================= + + Explication du traitement realise par la SP + ------------------------------------------- + Cette SP sert à restaurrer les sécurités sauvegardé pour toutes les bases. + + Contexte d'utilisation + ---------------------- + Cette SP doit être appélée après les mises à jour de nouvelle version. + + Parametres + ---------- + @in_debug : Si 1 alors on fait un print des commandes de restore + + Creation : 18.11.16 / RTC + +=============================================================================*/ + +set nocount on; + +declare @result_sp int, + @errno int, + @errmsg varchar(255) + +/*------------------------ Test des parametres input ------------------------*/ + +if (@in_param_label is null) +begin + select @errno = 70003, + @errmsg = '(APS) Invalid input parameter label !' + goto error_99 +end + +if not exists (select 1 from HCITools.dba.Principal_Permission where PP_timestamp = CONVERT(datetime, @in_param_label,121)) +begin + select @errno = 70003, + @errmsg = '(DBA) No label found to restore principal permission ! ' + @in_param_label + goto error_99 +end + +/*------------------- Declaration des variables --------------------*/ + +declare @name varchar (255), + @cmd varchar (8000), + @xml XML, + @delimiter VARCHAR(1), + @param_group_counter_list NVARCHAR(3000), + @label datetime + +select @param_group_counter_list = HCIP_value + from HCITools.dbo.HCI_PARAMS + where HCIP_key = 'BKP_NOT_DB' +set @delimiter = ',' +set @xml = CAST((''+REPLACE(@param_group_counter_list, @delimiter, '')+'') AS XML) + +declare c_databases cursor local forward_only static for + select name + from sys.databases + where LOWER(name) not in (SELECT C.value('.', 'varchar(3000)') AS value FROM @xml.nodes('X') AS X(C)) + AND state = 0 + order by name +; + +/*------------ Affectation des parametres aux variables ------------*/ + +select @errno = 0 +; +SET @errmsg = '' +; + +select @label = CONVERT(datetime, @in_param_label,121); +; + +/*-------------------------- Traitement ---------------------------*/ + +open c_databases +; +FETCH NEXT FROM c_databases + into @name +; + +while @@fetch_status = 0 +begin + /* Backup */ + + + begin try + print '---------------------------------------' + print '--Start processing database : ' + @name + execute [HCITools].[dba].[restore_principal_permission] @name ,@label ,@in_debug + + end try + begin catch + select @errno = 70003, + @errmsg = @errmsg + 'restore all permissions failed : ' + @name + ' ' + ERROR_MESSAGE() + CHAR(13) + ; + goto error_99 + end catch + ; + FETCH NEXT FROM c_databases + into @name + ; +end +; +close c_databases +; +deallocate c_databases +; + +/*------------------ Retour au programme appelant -----------------*/ + +return(@@error); + +/*---------------------- Traitement des erreurs ----------------------*/ +error_99: + raiserror(@errmsg, 14, 1) + return(@errno) +; + +go diff --git a/TPDT-268 - ACP in task sequence/dba_storedProcedures/Restore_principal_permission.sql b/TPDT-268 - ACP in task sequence/dba_storedProcedures/Restore_principal_permission.sql new file mode 100644 index 0000000..7fa1f78 --- /dev/null +++ b/TPDT-268 - ACP in task sequence/dba_storedProcedures/Restore_principal_permission.sql @@ -0,0 +1,115 @@ +USE [HCITools] +GO + +IF EXISTS (SELECT * FROM sys.objects WHERE object_id = OBJECT_ID(N'[dba].[Restore_principal_permission]') AND type in (N'P', N'PC')) + DROP PROCEDURE [dba].[Restore_principal_permission] +GO + +USE [HCITools] +GO + +SET ANSI_NULLS ON +GO + +SET QUOTED_IDENTIFIER ON +GO + +CREATE PROCEDURE [dba].[Restore_principal_permission] + @in_param_database_name varchar (255) = null, + @in_param_label datetime = null, + @in_debug int = null +AS +/*============================================================================= + + Explication du traitement realise par la SP + ------------------------------------------- + Cette Sp sert a rétablir à partir d'une sauvegarde les droits et sécurités pour une base donnée. + + Contexte d'utilisation + ---------------------- + Cette Sp est utilisée lors de la mise à jour des environnements afin de , + restaurer les droits à la fin de la mise à jour. + + Parametres + ---------- + @in_database_name = nom de la base + @@in_label = Label de l'extraction + + Creation : 17.11.16 / rtc + Dossier : #35262# + Security - Backup and restore SQL objects security + + Modifications : + DD.MM.YY / xxx : +=============================================================================*/ + +SET NOCOUNT ON; +declare @result_sp int, + @errno int, + @errmsg varchar(255); +/*------------------------ Test des parametres input ------------------------*/ + +if @in_param_database_name is null +or (@in_param_label is null) +begin + select @errno = 70003, + @errmsg = '(APS) Invalid input parameters !' + goto error_99 +end + +if not exists (select 1 from HCITools.dba.Principal_Permission where PP_timestamp = CONVERT(datetime, @in_param_label,121)) +begin + select @errno = 70003, + @errmsg = '(DBA) No label found to restore principal permission ! ' + @in_param_label + goto error_99 +end + +/*------------------- Declaration des variables --------------------*/ +declare @cmd varchar (max); +declare @label datetime, + @database_name varchar (255), + @database_id int; + +/*------------ Affectation des parametres aux variables ------------*/ + +select @label = CONVERT(datetime, @in_param_label,121); +select @database_name = @in_param_database_name +select top 1 @database_id = database_id + from sys.databases + where name = @database_name +select @cmd = '' + +/*-------------------------- Traitement ---------------------------*/ +begin try + + select @cmd = @cmd + PP_apply_permission_command + CHAR(13) + from HCITools.dba.Principal_Permission + where len(PP_apply_permission_command) > 3 + and PP_timestamp = CONVERT(datetime, @label,121) + and PP_database_name = @database_name + + select @cmd= 'USE ' + @database_name +';' + CHAR(13) + @cmd + + if (@in_Debug = 1) + print @cmd; + else + exec (@cmd) +end try + +begin catch + select @errno = 70000, + @errmsg = 'Error occured when restoring principals !! ' + ERROR_MESSAGE() + ; + goto error_99 +end catch + +/*------------------ Retour au programme appelant -----------------*/ + +return(ISNULL(@@error,0)); + +/*---------------------- Traitement des erreurs ----------------------*/ +error_99: + raiserror(@errmsg, 14, 1) + return(@errno) +; + +go \ No newline at end of file diff --git a/TPDT-268 - ACP in task sequence/dba_storedProcedures/Retrieve_Data_Interbase.sql b/TPDT-268 - ACP in task sequence/dba_storedProcedures/Retrieve_Data_Interbase.sql new file mode 100644 index 0000000..e3501a1 --- /dev/null +++ b/TPDT-268 - ACP in task sequence/dba_storedProcedures/Retrieve_Data_Interbase.sql @@ -0,0 +1,218 @@ +USE [HCITools] +GO + +IF EXISTS (SELECT * FROM sys.objects o JOIN sys.schemas s ON o.schema_id = s.schema_id WHERE o.name = 'Retrieve_Data_Interbase' AND OBJECTPROPERTY(object_id,N'IsProcedure') = 1 AND s.name = 'dba') + DROP PROCEDURE [dba].[Retrieve_Data_Interbase] +GO + +SET ANSI_NULLS ON +GO + +SET QUOTED_IDENTIFIER ON +GO + + + + + +CREATE PROCEDURE [dba].[Retrieve_Data_Interbase] + +AS +/*============================================================================= + + Explication du traitement realise par la SP + ------------------------------------------- + Cette SP est executee tous les jours et effectue le rattrapage des donnees entre SUNCENT et AMACENT par rapport a une table. + + 1: Recuperation du login et de la date + 2: Reprise des top 40 000 de la table [HCItools].[dba].[TT_AMR_interbase_to_retrieve] et isTreated = 0 puis mise en table temporaire + 3: Curseur sur la table temporaire avec le distinct table name + 4: Dummy update sur les records concernes sur SUNCENT + 5: Update AMR (AMR_type_of_change = 2) selon variables @currentlogin et @currentdate et current SPID + 6: Flag is isTreated = 1 sur la table [HCItools].[dba].[TT_AMR_interbase_to_retrieve] + + Parametres + ---------- + + Creation : 28.04.2021 / SPE + + Modifications : + +=============================================================================*/ + +SET NOCOUNT ON; + +/*------------------- Declaration des variables --------------------*/ + +DECLARE @errno int, + @errmsg varchar(255), + @tableName varchar(60), + @currentlogin sysname, + @currentdate datetime, + @pkname sysname, + @pktype sysname, + @colName varchar(255) + + + +/*-------------------------- Traitement ---------------------------*/ +BEGIN TRY + +/* 1: Recuperation du login et de la date */ +SET @currentlogin = SYSTEM_USER +SET @currentdate = getdate() + +/* 2: Reprise des top 40 000 de la table [HCItools].[dba].[TT_AMR_interbase_to_retrieve] et isTreated = 0 puis mise en table temporaire */ +CREATE TABLE #TT_current_AMR([AMRREF_AMR_table_name] [varchar](60) NULL,[AMRREF_row_ID] [int] NULL,[AMRREF_AMR_row_GUID] [varchar](60) NULL) + +INSERT INTO #TT_current_AMR([AMRREF_AMR_table_name],[AMRREF_row_ID],[AMRREF_AMR_row_GUID]) +SELECT TOP 40000 [AMRREF_AMR_table_name],[AMRREF_row_ID],[AMRREF_AMR_row_GUID] FROM [HCItools].[dba].[TT_AMR_interbase_to_retrieve] WHERE IsTreated = 0 ORDER BY [AMRREF_AMR_APS_TS] + +/* 3: Curseur sur la table temporaire avec le distinct table name */ +DECLARE c_alltables CURSOR LOCAL FORWARD_ONLY STATIC FOR +SELECT AMRREF_AMR_table_name + FROM #TT_current_AMR + GROUP BY AMRREF_AMR_table_name + ORDER BY AMRREF_AMR_table_name +; +OPEN c_alltables +; +FETCH NEXT FROM c_alltables + INTO @tableName +; +WHILE @@fetch_status = 0 +BEGIN + +SET @Colname = NULL + + /* 4: Dummy update sur les records concernes sur SUNCENT */ + + /* get target PK column name and type */ + select @pkname = c.[name], @pktype =col.data_type + from arizona.sys.tables t with (nolock) + join arizona.sys.indexes i with (nolock) + on i.[object_id] = t.[object_id] + and i.is_primary_key = 1 + join arizona.sys.index_columns ic with (nolock) + on ic.index_id = i.index_id + and ic.[object_id] = i.[object_id] + join arizona.sys.[columns] c with (nolock) + on c.[object_id] = ic.[object_id] + and c.column_id = ic.column_id + join arizona.INFORMATION_SCHEMA.COLUMNS col + on col.column_name = c.name + and col.table_name = t.[name] + where t.[name] = @tableName; + + SELECT TOP 1 @Colname = COLUMN_NAME + FROM arizona.information_schema.columns + WHERE table_name = @tableName + AND DATA_TYPE = 'bit' + AND IS_NULLABLE = 'NO' + + IF @Colname is null + BEGIN + SELECT TOP 1 @Colname = COLUMN_NAME + FROM arizona.information_schema.columns + WHERE table_name = @tableName + AND CHARACTER_MAXIMUM_LENGTH > 0 + AND IS_NULLABLE = 'NO' + ORDER BY CHARACTER_MAXIMUM_LENGTH ASC + END + + IF @Colname is null + BEGIN + SELECT TOP 1 @Colname = COLUMN_NAME + FROM arizona.information_schema.columns + WHERE table_name = @tableName + AND DATETIME_PRECISION is not null + AND IS_NULLABLE = 'NO' + END + + IF @Colname is null + BEGIN + SELECT TOP 1 @Colname = COLUMN_NAME + FROM arizona.information_schema.columns + WHERE table_name = @tableName + AND NUMERIC_PRECISION is not null + AND IS_NULLABLE = 'NO' + AND COLUMN_NAME <> @PKname + END + + if @pktype = 'int' + BEGIN + + /* dummy update */ + EXEC('UPDATE prod + SET prod.' + @Colname +' = prod.' + @Colname +' + FROM #TT_current_AMR tt + JOIN arizona.dbo.' + @tableName +' prod + ON tt.AMRREF_row_ID = prod.' + @pkname +' + WHERE tt.AMRREF_AMR_table_name = ''' + @tableName + '''') + + END + ELSE + BEGIN + + /* dummy update */ + EXEC('UPDATE prod + SET prod.' + @Colname +' = prod.' + @Colname +' + FROM #TT_current_AMR tt + JOIN arizona.dbo.' + @tableName +' prod + ON tt.AMRREF_AMR_row_GUID = prod.' + @pkname +' + WHERE tt.AMRREF_AMR_table_name = ''' + @tableName + '''') + + END + + FETCH NEXT FROM c_alltables + INTO @tableName + ; +END +; +CLOSE c_alltables +; +DEALLOCATE c_alltables + +/* 5: Update AMR (AMR_type_of_change = 2) selon variables @currentlogin et @currentdate et current SPID */ +UPDATE arizona.dbo.aps_monitor_row + SET AMR_type_of_change = 2 + WHERE AMR_APS_TS >= @currentdate + AND AMR_system_user = @currentlogin + AND AMR_SQL_spid = @@SPID + AND AMR_type_of_change IN (0,1) + +/* 6: Flag is isTreated = 1 sur la table [HCItools].[dba].[TT_AMR_interbase_to_retrieve] */ +UPDATE TTAMR + SET isTreated = 1 + FROM [HCItools].[dba].[TT_AMR_interbase_to_retrieve] TTAMR + JOIN #TT_current_AMR TT + ON TT.AMRREF_AMR_table_name = TTAMR.AMRREF_AMR_table_name + AND TT.AMRREF_row_ID = TTAMR.AMRREF_row_ID + +UPDATE TTAMR + SET isTreated = 1 + FROM [HCItools].[dba].[TT_AMR_interbase_to_retrieve] TTAMR + JOIN #TT_current_AMR TT + ON TT.AMRREF_AMR_table_name = TTAMR.AMRREF_AMR_table_name + AND TT.AMRREF_AMR_row_GUID = TTAMR.AMRREF_AMR_row_GUID + +DROP TABLE #TT_current_AMR + +END TRY +BEGIN CATCH + SELECT @errno = 70003, + @errmsg = 'error on Retrieve_Data_Interbase! ' + error_message() + goto error_99 +END CATCH; + +/*------------------ Retour au programme appelant -----------------*/ + +RETURN(@@error); + +/*---------------------- Traitement des erreurs ----------------------*/ +error_99: + RAISERROR (@errmsg, 16, 1); + RETURN(@errno); + + +GO diff --git a/TPDT-268 - ACP in task sequence/dba_storedProcedures/Set_TempDB.sql b/TPDT-268 - ACP in task sequence/dba_storedProcedures/Set_TempDB.sql new file mode 100644 index 0000000..d3b2e22 --- /dev/null +++ b/TPDT-268 - ACP in task sequence/dba_storedProcedures/Set_TempDB.sql @@ -0,0 +1,228 @@ +IF EXISTS (SELECT * FROM sys.objects WHERE object_id = OBJECT_ID(N'[dbo].[Set_TempDB]') AND type in (N'P', N'PC')) +DROP PROCEDURE [dbo].[Set_TempDB] +GO + +SET ANSI_NULLS ON +GO +SET QUOTED_IDENTIFIER ON +GO + +CREATE PROCEDURE [dbo].[Set_TempDB] + @in_debug int = null, + @in_Entity varchar(4), + @in_Mode smallint = 1 + +AS +/*============================================================================= + + Explication du traitement realise par la SP + ------------------------------------------- + Cette SP sert à paramètrer les fichiers de tempDB et les resizer correctement en fonction du nombre de CPU + + Contexte d'utilisation + ---------------------- + Cette SP peut être appelé dans SSMS pour l'initalisation de tempDB + Cette SP est appelé par le job _9402X - FLA -Redefine TempDB file Size + + Parametres + ---------- + @in_debug : affiche les commandes qui vont être executées + @in_Entity : SUN, AMA, AAI, CVI, RUEG + @in_Mode : 0 = init de tempDB, 1 = Mise à jour de la taille des fichiers de tempDB + + Creation : 01.11.16 / FLA + + Modifications : 09.01.2017 / FLA : Ajout de CVI + 07.02.2017 / RTC : Update AAI initial file size + 13.03.2017 / RTC : Update initial file size for AAI from 256 to 384. + 29.03.2017 / RTC : Update initial file size for AAI to 512 and auto growth to 128. + 20.12.2018 / SPE : #TFS49408# Migrate identification table [master].[cfg].[Identity] + 02.10.2019 / SPE : #TFS55659# change tempdb initial size 1056 + 16.10.2019 / SPE : #TFS55659# change tempdb initial size 1152 + 23.10.2019 / SPE : #TFS55659# change tempdb initial size 1280 (GC) 1024 (AAI) + 09.12.2019 / SPE : Change templog initial size to 2048 for GC + +=============================================================================*/ + +set nocount on; + +/*------------------- Declaration des variables --------------------*/ +declare @NbCPU INT, + @AutoGrow INT, + @FileSize INT, + @LogicalName VARCHAR(255), + @PhysicalName VARCHAR(255), + @FilePath VARCHAR(255), + @i INT, + @sql VARCHAR(255), + @file_id INT, + @FileName VARCHAR(255), + @LogAutoGrow INT, + @LogFileSize INT, + @cmd varchar(200); + +/*------------ Affectation des parametres aux variables ------------*/ +IF ((@in_Entity = 'AAI') or (@in_Entity = 'RUEG')) +BEGIN + /*in MB */ + SET @AutoGrow = 128; + SET @FileSize = 1024; + SET @LogFileSize = 1024; + SET @LogAutoGrow = 128; +END +ELSE +BEGIN + /*in MB */ + SET @AutoGrow = 128; + SET @FileSize = 1280; + SET @LogFileSize = 2048; + SET @LogAutoGrow = 256; +END + +SET @i = 2; + +/*-------------------------- Traitement ---------------------------*/ +BEGIN TRY + + IF (SELECT ((size*8)/1024) as SIZE_IN_MB from sys.master_files where database_id=2 and Name = 'tempdev') > @FileSize + BEGIN + PRINT 'Current tempdb FileSize is larger than the variable @FileSize! Leave this SP.' + RETURN + END + + IF @in_Mode = 0 + BEGIN + + /*********************************************************************************************************************************/ + /* Ce script créer automatiquement des fichiers tempDB sizé à l'identique en fonction du nombre de CPU, de l'espace disk etc... */ + /*********************************************************************************************************************************/ + + /* Check if tempDB is already sized*/ + IF (select count(file_id) + FROM tempdb.sys.dm_db_file_space_usage) <= 1 + BEGIN + + /* Get get actual tempDB file size and path for tempDB file*/ + SELECT @PhysicalName = physical_name, + @LogicalName = name + FROM tempdb.sys.database_files + WHERE type = 0 + + SET @FilePath = REVERSE(RIGHT(REVERSE(@PhysicalName),(LEN(@PhysicalName)-CHARINDEX('\', REVERSE(@PhysicalName),1))+1)); + SET @PhysicalName = SUBSTRING(@PhysicalName,LEN(@FilePath)+1,LEN(@PhysicalName)-LEN(@FilePath)-4); + + /* Get number of CPU */ + SELECT @NbCPU = cpu_count + FROM sys.dm_os_sys_info + + /* Check if CPU >= 8 */ + IF @NbCPU >= 8 + BEGIN + SET @NbCPU = 8 + END + + WHILE (@i <= @NbCPU) + BEGIN + SET @sql = 'ALTER DATABASE [tempdb] ADD FILE ( NAME = N'''+ @LogicalName + CONVERT(VARCHAR(1),@i)+''' , FILENAME = N'''+ @FilePath + @PhysicalName +CONVERT(VARCHAR(1),@i)+'.ndf'', SIZE = '+ CONVERT(VARCHAR(20),@FileSize) +' , FILEGROWTH = '+ CONVERT(VARCHAR(20),@AutoGrow) +')' + + IF @in_debug = 1 + PRINT @sql + ELSE + EXEC(@sql) + + SET @i = @i+1 + END + + END + ELSE + PRINT 'TempDB is already sized'; + + /*********************************************************************************************************************************/ + /* Ce script shrink et resize automatiquement le fichiers de log de tempDB en fonction des paramètres en entrée */ + /*********************************************************************************************************************************/ + + /* Get File id and file path of tempDB log file */ + SELECT @file_id = file_id, + @FilePath = physical_name, + @FileName = name + FROM tempdb.sys.database_files + WHERE type = 1 + + SET @cmd = 'USE tempDB; + /* SHRINK the tempDB file log */ + DBCC SHRINKFILE ('+CAST(@file_id as varchar(3))+') WITH NO_INFOMSGS'; + + EXEC (@cmd) + + /* Change the size of tempDB log file */ + SET @sql = 'ALTER DATABASE [tempdb] MODIFY FILE ( NAME = N'''+ @FileName + ''', FILENAME = N'''+ @FilePath + ''', SIZE = '+ CONVERT(VARCHAR(20),@LogFileSize) +' , FILEGROWTH = '+ CONVERT(VARCHAR(20),@LogAutoGrow) +')' + + IF @in_debug = 1 + PRINT @sql + ELSE + EXEC(@sql) +END +ELSE IF @in_Mode = 1 +BEGIN + + DECLARE c_Files CURSOR FOR + SELECT file_id, + physical_name, + name + FROM tempdb.sys.database_files + WHERE type = 0 + + open c_Files + + FETCH NEXT FROM c_Files + into @file_id, @FilePath, @FileName + + WHILE @@FETCH_STATUS = 0 + BEGIN + + SET @cmd = 'USE tempDB; + /* SHRINK the tempDB file log */ + DBCC SHRINKFILE ('+CAST(@file_id as varchar(3))+') WITH NO_INFOMSGS'; + + EXEC (@cmd) + + /* Change the size of tempDB file */ + SET @sql = 'ALTER DATABASE [tempdb] MODIFY FILE ( NAME = N'''+ @FileName + ''', FILENAME = N'''+ @FilePath + ''', SIZE = '+ CONVERT(VARCHAR(20),@FileSize) +' , FILEGROWTH = '+ CONVERT(VARCHAR(20),@AutoGrow) +')' + IF @in_debug = 1 + PRINT @sql + ELSE + EXEC(@sql) + + FETCH NEXT FROM c_Files + into @file_id, @FilePath, @FileName + END + + CLOSE c_Files + DEALLOCATE c_Files + + IF @in_Entity = 'SUN' + EXEC msdb.dbo.sp_update_job @job_name='_94021 - Redefine TempDB file Size',@enabled = 0 + IF @in_Entity = 'AMA' + EXEC msdb.dbo.sp_update_job @job_name='_94022 - Redefine TempDB file Size',@enabled = 0 + IF @in_Entity = 'AAI' + EXEC msdb.dbo.sp_update_job @job_name='_94023 - Redefine TempDB file Size',@enabled = 0 + IF @in_Entity = 'RUEG' + EXEC msdb.dbo.sp_update_job @job_name='_94023 - Redefine TempDB file Size',@enabled = 0 + IF @in_Entity = 'CVI' + EXEC msdb.dbo.sp_update_job @job_name='_94024 - Redefine TempDB file Size',@enabled = 0 +END + +/*---------------------- Traitement des erreurs ----------------------*/ +END TRY +BEGIN CATCH + + /* Traitement des erreurs (avec RaiseError) */ + EXEC dbo.get_Error_Info; + +END CATCH + + +GO + + + diff --git a/TPDT-268 - ACP in task sequence/dba_storedProcedures/Wait_For_LkSrv.sql b/TPDT-268 - ACP in task sequence/dba_storedProcedures/Wait_For_LkSrv.sql new file mode 100644 index 0000000..286da3a --- /dev/null +++ b/TPDT-268 - ACP in task sequence/dba_storedProcedures/Wait_For_LkSrv.sql @@ -0,0 +1,99 @@ +USE [HCITools] +GO + +IF EXISTS (SELECT * FROM sys.objects WHERE object_id = OBJECT_ID(N'[dbo].[Wait_For_LkSrv]') AND type in (N'P', N'PC')) +DROP PROCEDURE [dbo].[Wait_For_LkSrv] +GO + +USE [HCITools] +GO + +SET ANSI_NULLS ON +GO + +SET QUOTED_IDENTIFIER ON +GO + + + + + +CREATE PROCEDURE [dbo].[Wait_For_LkSrv] + @in_debug tinyint = 0, + @in_LkSrv sysname, + @in_Minutes smallint = 30 +AS +/*============================================================================= + + Explication du traitement realise par la SP + ------------------------------------------- + La SP sert à attendre que le Linked Server soit disponible + + Contexte d'utilisation + ---------------------- + Appelé depuis n'importe quel job + + Parametres + ---------- + @in_debug : non utilisé + @in_LkSrv : nom du Linked Server + @in_Minutes = Nombre de minutes maximal à attendre le Linked Server (30 par défaut) + + Creation : 27.10.16 / FLA + + Modifications : + +=============================================================================*/ + +set nocount on; + +/*------------------- Declaration des variables --------------------*/ +declare @Datetime_For_Exit datetime, + @LkdSrv_is_OK int + + +/*------------ Affectation des parametres aux variables ------------*/ +select @Datetime_For_Exit = dateadd(mi, @in_Minutes, getdate()), + @LkdSrv_is_OK = 0 + +/*-------------------------- Traitement ---------------------------*/ +BEGIN TRY + + + /* ON ATTEND QUE LE LINKED-SERVER SOIT ATTEIGNABLE */ + /* ET ON LAISSE TOMBER S'IL NE L'EST PAS AU BOUT DE X MINUTES */ + while @LkdSrv_is_OK = 0 + and getdate() < @Datetime_For_Exit + begin + BEGIN TRY + exec @LkdSrv_is_OK = sp_testlinkedserver @server = @in_LkSrv + ; + /* SI ON EST ICI, C'EST BON !! */ + select @LkdSrv_is_OK = 1 + ; + END TRY + BEGIN CATCH + /* ON ATTEND 5 MINUTES */ + waitfor delay '00:05:00' + ; + END CATCH + ; + end /* while */ + + if @LkdSrv_is_OK = 0 + begin + RAISERROR ('Error dans la SP Wait_For_LkSrv : Le linked-server est inaccessible.',16,1) + end + +/*---------------------- Traitement des erreurs ----------------------*/ +END TRY +BEGIN CATCH + + /* Traitement des erreurs (avec RaiseError) */ + EXEC dbo.get_Error_Info @in_RaiseError = 1 + +END CATCH + +GO + + diff --git a/TPDT-268 - ACP in task sequence/dba_storedProcedures/Wait_Random_Time.sql b/TPDT-268 - ACP in task sequence/dba_storedProcedures/Wait_Random_Time.sql new file mode 100644 index 0000000..af7ed2b --- /dev/null +++ b/TPDT-268 - ACP in task sequence/dba_storedProcedures/Wait_Random_Time.sql @@ -0,0 +1,77 @@ +USE [HCITools] +GO + +IF EXISTS (SELECT * FROM sys.objects WHERE object_id = OBJECT_ID(N'[dbo].[Wait_Random_Time]') AND type in (N'P', N'PC')) +DROP PROCEDURE [dbo].[Wait_Random_Time] +GO + +USE [HCITools] +GO + +SET ANSI_NULLS ON +GO + +SET QUOTED_IDENTIFIER ON +GO + +CREATE PROCEDURE [dbo].[Wait_Random_Time] + @in_debug tinyint = 0, + @in_Minutes smallint +AS +/*============================================================================= + + Explication du traitement realise par la SP + ------------------------------------------- + La SP sert à attendre un temps aléatoire compris entre 0 et une valeur définie + + Contexte d'utilisation + ---------------------- + Appelé depuis n'importe quel job + + Parametres + ---------- + @in_debug : non utilisé + @in_Minutes : temps maximum en minute + + Creation : 27.10.16 / FLA + + Modifications : 28.10.2016 / FLA : Standardisation de la gestion des erreurs + +=============================================================================*/ + +set nocount on; + + +/*------------------- Declaration des variables --------------------*/ + +declare @delay int, + @time datetime, + @errno int, + @errmsg varchar(255) + + +/*------------ Affectation des parametres aux variables ------------*/ + + + +/*-------------------------- Traitement ---------------------------*/ +BEGIN TRY + +select @delay = rand()* 60 * @in_Minutes +select @time = dateadd(ss,@delay, '01.01.1900') + +waitfor delay @time + + +/*---------------------- Traitement des erreurs ----------------------*/ +END TRY +BEGIN CATCH + + /* Traitement des erreurs (avec RaiseError) */ + EXEC dbo.get_Error_Info @in_RaiseError = 1 + +END CATCH + +GO + + diff --git a/TPDT-268 - ACP in task sequence/dba_storedProcedures/Wait_Random_Time_Sunday.sql b/TPDT-268 - ACP in task sequence/dba_storedProcedures/Wait_Random_Time_Sunday.sql new file mode 100644 index 0000000..92e5bfe --- /dev/null +++ b/TPDT-268 - ACP in task sequence/dba_storedProcedures/Wait_Random_Time_Sunday.sql @@ -0,0 +1,182 @@ +USE [HCITools] +GO + +IF EXISTS (SELECT * FROM sys.objects WHERE object_id = OBJECT_ID(N'[dbo].[Wait_Random_Time_Sunday]') AND type in (N'P', N'PC')) +DROP PROCEDURE [dbo].[Wait_Random_Time_Sunday] +GO + +SET ANSI_NULLS ON +GO + +SET QUOTED_IDENTIFIER ON +GO + + +CREATE PROCEDURE [dbo].[Wait_Random_Time_Sunday] + @in_debug tinyint = 0, + @in_Minutes smallint +AS +/*============================================================================= + + Explication du traitement realise par la SP + ------------------------------------------- + La SP sert à attendre un temps aléatoire compris entre 0 et une valeur définie seulement pour les pharmacies qui ne sont pas ouvertes le dimanche et pour les centrales + + Contexte d'utilisation + ---------------------- + Appelé depuis n'importe quel job + + Parametres + ---------- + @in_debug : non utilisé + @in_Minutes : temps maximum en minute + + Creation : 15.08.19 / SPE + + Modifications : 29.10.19 / SPE : Ajout de la partie centrales + 21.11.19 / SPE : Ajout verification du jour si dimanche et ne pas faire de random sur les centrales GC + +=============================================================================*/ + +set nocount on; + + +/*------------------- Declaration des variables --------------------*/ + +DECLARE @errno int, + @cvCurrentOrganizationalUnit int, + @subsidiary_id int, + @delay int, + @errmsg varchar(255), + @out_default_value varchar(60), + @format varchar(60), + @ou varchar(3), + @time datetime + + +/*------------ Affectation des parametres aux variables ------------*/ + + + +/*-------------------------- Traitement ---------------------------*/ +BEGIN TRY + +/* only if it's sunday */ +IF DATEPART(DW, GETDATE()) = 1 +BEGIN + + IF EXISTS(SELECT 1 FROM [master].[cfg].[InstanceContext] WHERE Business = 'TPPHAR') + BEGIN + /* ------------------------------------------------------------------------------------------------------------------------------------- */ + /* \\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\ 2 : RETRIEVE FORMAT AND OU CODE /////////////////////////////////////////////////// */ + /* ------------------------------------------------------------------------------------------------------------------------------------- */ + /* Get the cvCurrentOrganizationalUnit */ + EXEC arizona.dbo.sp_bmc_Bmc_Applic_Default + @in_job_type = 3, + @in_param_int_1 = null, + @in_param_int_2 = null, + @in_param_varchar_1 = 'cvCurrentOrganizationalUnit', + @out_default_value = @out_default_value OUTPUT, + @out_param_int_1 = null; + + SELECT @cvCurrentOrganizationalUnit = convert(int,@out_default_value); + + /* Check if we have a value, if not leave this SP */ + IF @cvCurrentOrganizationalUnit is null + BEGIN + SELECT @errno = 70001, + @errmsg = '(APS) Error cvCurrentOrganizationalUnit does not exist!'; + goto error_99; + END + + /* Get the subsidiary id and OU code */ + SELECT @subsidiary_id = ou.OU_subsidiary, @ou = ou.OU_Code + FROM arizona.dbo.Organizational_unit ou with (nolock) + WHERE ou.Organizational_unit_ID = @cvCurrentOrganizationalUnit; + + /* Check if we have a value, if not leave this SP */ + IF @subsidiary_id is null + BEGIN + SELECT @errno = 70001, + @errmsg = '(APS) Error subsidiary_id does not exist!'; + goto error_99; + END + + /* Get the current format */ + SELECT @format = sub.SUB_code + FROM arizona.dbo.Subsidiary sub with (nolock) + WHERE sub.Subsidiary_ID = @subsidiary_id; + + /* Check if we have a value, if not leave this SP */ + IF @format is null + BEGIN + SELECT @errno = 70001, + @errmsg = '(APS) Error format does not exist!'; + goto error_99; + END + + /* Change the value into a compatible format */ + IF @format = 'COOP' + BEGIN + SET @format = 'CVI' + END + + IF @format = 'CENT' + BEGIN + SET @format = 'SUN' + END + + IF @format = '000' + BEGIN + SET @format = 'AAI' + END + + IF NOT EXISTS(SELECT 1 FROM HCITools.dbo.HCI_PARAMS WHERE HCIP_Key = 'WorkonSUN' and HCIP_value like '%' + @format+@ou + '%') + BEGIN + + SELECT @delay = rand()* 60 * @in_Minutes + SELECT @time = dateadd(ss,@delay, '01.01.1900') + + WAITFOR DELAY @time + + END + END + ELSE + BEGIN /* Others servers (centrals) */ + + IF EXISTS(SELECT 1 FROM [master].[cfg].[Identity] WHERE Format = 'GCM') AND EXISTS(SELECT 1 FROM [master].[cfg].[InstanceContext] WHERE Business = 'TPCENT' and [Type] = 'PROD') + BEGIN + return(0) + END + ELSE + BEGIN + + SELECT @delay = rand()* 60 * @in_Minutes + SELECT @time = dateadd(ss,@delay, '01.01.1900') + + WAITFOR DELAY @time + + END + END +END + +/*---------------------- Traitement des erreurs ----------------------*/ +END TRY +BEGIN CATCH + SELECT @errno = 70003, + @errmsg = 'error on Wait_Random_Time_Sunday!' + goto error_99 +END CATCH; + +/*------------------ Retour au programme appelant -----------------*/ + +RETURN(@@error); + +/*---------------------- Traitement des erreurs ----------------------*/ +error_99: + RAISERROR (@errmsg, 16, 1); + RETURN(@errno); + +GO + + diff --git a/TPDT-268 - ACP in task sequence/dba_storedProcedures/aps_Send_Mail.sql b/TPDT-268 - ACP in task sequence/dba_storedProcedures/aps_Send_Mail.sql new file mode 100644 index 0000000..f642362 --- /dev/null +++ b/TPDT-268 - ACP in task sequence/dba_storedProcedures/aps_Send_Mail.sql @@ -0,0 +1,138 @@ +IF EXISTS (SELECT * FROM sys.objects where object_id = OBJECT_ID(N'[aps_Send_Mail]') AND OBJECTPROPERTY(object_id,N'IsProcedure') = 1) +DROP PROCEDURE [aps_Send_Mail] +GO + + +SET ANSI_NULLS OFF +GO +SET QUOTED_IDENTIFIER OFF +GO +CREATE PROCEDURE [aps_Send_Mail] + @in_sender varchar(8000)= null, + @in_sender_name varchar(8000) = null, + @in_recipient varchar(8000) = null, + @in_priority varchar(15) = null, + @in_subject varchar(8000) = null, + @in_message varchar(8000) = null, + @in_message_file varchar(8000) = null, + @in_attachments varchar(8000) = null, + @in_server varchar(255) = null, + @in_dbmail_profile_name varchar(255) = null +AS +/*=========================================================================== + + Procedure pour envoi d'un email via SMTP par execution de la SP "xp_smtp_sendmail". + + Pour rappel, la SP "xp_smtp_sendmail" n'est pas une SP officielle de Microsoft ! + Des lors, il n'y a aucune garantie que cette SP fonctionne avec les versions futures + de SQL Server ! ==> Voir modif. de CMA du 07.02.07 !! + + Parametres: + + @in_sender = adresse email de l'expediteur (ex: "cm@bmc.ch") (--> version SQL 2000 only) + @in_sender_name (or NULL) = nom de l'expediteur (ex: "Christophe Marchand") (--> version SQL 2000 only) + @in_recipient = adresse email du destinataire (ex: "info@bmc.ch") + @in_priority (or NULL) = priorite (valeurs possibles: "LOW, NORMAL, HIGH") + @in_subject (or NULL) = sujet du message + @in_message (or NULL) = corps du message + @in_message_file (or NULL) = corps du message contenu dans un fichier + @in_attachments (or NULL) = pieces jointes (file1;file2;file3) + @in_server = nom du serveur par lequel doit transiter l'email (--> version SQL 2000 only) + @in_dbmail_profile_name = nom du profil de "Database Mail" a utiliser (--> version SQL 2005 only) + + Creation: 19.11.04 / chris + + Modifications : + 01.12.04 / chris : Traitement des parametres "@in_message_file" et "@in_attachments" + 07.03.07 / chris : Adaptation de la SP pour SQL 2005. (#cm01) + La SP "xp_smtp_sendmail" n'etant plus compatible sous SQL 2005, + j'utilise a la place "Database Mail" de SQL 2005, ainsi que la + SP fournie par Microsoft "sp_send_dbmail". + 06.07.07 / chris : Adaptation du commentaire d'un parametre ci-dessus + 07.09.07 / chris : Adaptation commentaires ci-dessus + 17.03.20 / FLA : Suppression version SQL 2000 + 09.02.21 / SPE : #TFS62610# - Update all mail configurations to avoid SPAM +============================================================================*/ + +set nocount on + +declare @result_sp INT, + @errno INT, + @errmsg VARCHAR(255), + @Mailsubject VARCHAR(255) + +/*--------------- Remplacement des empty strings par des null ---------------*/ + +if @in_recipient = '' + select @in_recipient = null + +if @in_priority = '' + select @in_priority = null + +if @in_subject = '' + select @in_subject = null + +if @in_message = '' + select @in_message = null + +if @in_message_file = '' + select @in_message_file = null + +if @in_attachments = '' + select @in_attachments = null + +if @in_dbmail_profile_name = '' /* #cm01 */ + select @in_dbmail_profile_name = null + +/*-------------------------- Version de SQL Server --------------------------*/ + + +/*------------------------ Test des parametres input ------------------------*/ + +if (@in_dbmail_profile_name is null) /* #cm01 */ +or @in_recipient is null +begin + select @errno = 70003, + @errmsg = '(APS) Invalid input parameters !' + goto error_99 +end + +/*----------------------------- Valeurs par defaut --------------------------*/ + +if @in_priority is null + select @in_priority = 'NORMAL' + +/*--------------- Execution de la SP pour envoi de l'email SMTP -------------*/ + + + /* La SP "sp_send_dbmail" ne permet pas d'inclure un fichier dans le corps + du message. De ce fait, je l'ajoute en tant que piece jointe. + */ + if @in_message_file is not null + select @in_attachments = @in_message_file + ';' + @in_attachments + + set @Mailsubject = @in_subject + ' - [' + @@SERVERNAME + ']' + exec @result_sp = msdb.dbo.sp_send_dbmail + @profile_name = @in_dbmail_profile_name, + @recipients = @in_recipient, + @subject = @Mailsubject, + @importance = @in_priority, + @body = @in_message, + @file_attachments = @in_attachments + + if @result_sp <> 0 + begin + select @errno = 70003, + @errmsg = '(APS) Error executing sp_send_dbmail in aps_Send_Mail !' + goto error_99 + end + +/*------------------------- Retour a la SP appelante ------------------------*/ + +return(@@error) + +/*-------------------------- Traitement des erreurs -------------------------*/ +error_99: + raiserror (@errmsg, 16, 1) + return(@errno) +GO diff --git a/TPDT-268 - ACP in task sequence/dba_storedProcedures/aps_Send_Mail_with_template.sql b/TPDT-268 - ACP in task sequence/dba_storedProcedures/aps_Send_Mail_with_template.sql new file mode 100644 index 0000000..769056b --- /dev/null +++ b/TPDT-268 - ACP in task sequence/dba_storedProcedures/aps_Send_Mail_with_template.sql @@ -0,0 +1,384 @@ +IF EXISTS (SELECT * FROM sys.objects where object_id = OBJECT_ID(N'[dbo].[aps_Send_Mail_with_template]') AND OBJECTPROPERTY(object_id,N'IsProcedure') = 1) +DROP PROCEDURE [dbo].[aps_Send_Mail_with_template] +GO + +SET ANSI_NULLS OFF +GO + +SET QUOTED_IDENTIFIER OFF +GO + +CREATE PROCEDURE [dbo].[aps_Send_Mail_with_template] + @in_job_type int = 1, + @in_param_sender varchar(8000)= null, + @in_param_sender_name varchar(8000) = null, + @in_param_recipient varchar(8000) = null, + @in_param_priority varchar(15) = null, + @in_param_subject varchar(8000) = null, + @in_param_message varchar(8000) = null, + @in_param_message_file varchar(8000) = null, + @in_param_attachments varchar(8000) = null, + @in_param_server varchar(255) = null, + @in_param_dbmail_profile_name varchar(255) = null, + @in_param_varchar_1 varchar (8000) = null, + @in_param_varchar_2 varchar (8000) = null, + @in_param_varchar_3 varchar (8000) = null +AS +/*=========================================================================== + + Procedure pour envoi d'un email + + Parametres: + + @in_param_sender = adresse email de l'expediteur (ex: "cm@bmc.ch") (--> version SQL 2000 only) + @in_param_sender_name (or NULL) = nom de l'expediteur (ex: "Christophe Marchand") (--> version SQL 2000 only) + @in_param_recipient = adresse email du destinataire (ex: "info@bmc.ch") + @in_param_priority (or NULL) = priorite (valeurs possibles: "LOW, NORMAL, HIGH") + @in_param_subject (or NULL) = sujet du message + @in_param_message (or NULL) = corps du message + @in_param_message_file (or NULL) = corps du message contenu dans un fichier + @in_param_attachments (or NULL) = pieces jointes (file1;file2;file3) + @in_param_server = nom du serveur par lequel doit transiter l'email (--> version SQL 2000 only) + @in_param_dbmail_profile_name = nom du profil de "Database Mail" a utiliser (--> version SQL 2005 only) + @in_job_type = 0 -> envoi d'email sans template + 1/NULL -> envoi d'email pour echec de job + 2 -> envoi d'email pour succes de job + 3 -> envoi d'email pour warning de job + 4 -> envoi d'email pour message de job + 10 -> envoi d'email pour infos du processus en cours + @in_param_varchar_1 = contenu qui depend du template choisi ; nom du job SI job_type = 1 ou 2 + @in_param_varchar_2 = contenu qui depend du template choisi ; liste(s) de diffusion SI job_type = 1 ou 2 + @in_param_varchar_3 = contenu qui depend du template choisi ; ajout au corps du mail SI job_type = 1 ou 2 + Creation: 06.03.12 / PDE + + Modifications : + 06.03.2012 / PDE : Creation + 13.07.2012 / PDE : Utilisation de la table DBA_Mailing_list + 03.12.2012 / PDE : modif liste emails de secours #pde01# + 13.12.2012 / PDE : Remplacement des ; par des , dans les destinataires, sinon ca echoue dans SQL 20005 #pde03# + 13.12.2012 / PDE : Debuggage de la modification precedente #pde04# + 22.08.2013 / PDE : #TFS19397# Ajout adresse IP dans le message #pde05# + 07.12.2013 / PDE : Mise en commentaire des TRY/CATCH, pour permettre l'appel depuis un trigger. + 07.12.2013 / PDE : Ajout job_type = 10 (mouchard) + 12.12.2013 / PDE : #TFS21035# Remise en place des TRY/CATCH, car sinon la SP echoue dans les environnements sans Arizona + 31.03.2015 / DVE : suppression du email de PDE #dve01# + 15.07.2015 / FLA : correction bug quand un @DML_Code est identique à une adresse mail contenue dans @recipients #fla01# + 28.07.2015 / FLA : correction bug afin de pouvoir ajouter un _ devant l'adresse mail #fla02# + 01.12.2015 / FLA : modification de l'adresse d'envoi par défaut en _hci_dba@hcisolutions.ch #fla03# + 21.11.2016 / AFL : #TFS35792# Add cvSpecificCustomer 124 (coop) + 17.03.2020 / FLA : Suppression version SQL 2000 + 09.02.2021 / SPE : #TFS62610# - Update all mail configurations to avoid SPAM + 16.03.2022 / FLA : Standardisation des mails + 13.07.2023 / SPE : OCTPDBA-690: Replace xp_cmdshell in [dbo].[aps_Send_Mail_with_template] stored procedure + 17.08.2023 / SPE : OCTPDBA-726: Replace mail profile name APSSQL_MAIL_PROFILE into AzureManagedInstance_dbmail_profile to be SQL managed instances compatible +============================================================================*/ + +SET NOCOUNT ON + +DECLARE @result_sp INT, + @errno INT, + @cpt_boucle INT, + @posPV_01 INT, + @posPV_02 INT, + @attachments VARCHAR(MAX), + @message_file VARCHAR(MAX), + @subject VARCHAR(MAX), + @message VARCHAR(MAX), + @recipients VARCHAR(MAX), + @recipients_temoin VARCHAR(MAX), + @DML_Recipients VARCHAR(MAX), + @EAD_email_address VARCHAR(MAX), + @cmd NVARCHAR(255), + @job_name VARCHAR(255), + @DML_Code VARCHAR(255), + @errmsg VARCHAR(255), + @dbmail_profile_name VARCHAR(255), + @priority VARCHAR(30), + @jobid UNIQUEIDENTIFIER + + + + +/* BUILD DETAILS OF THE EMAIL */ + +/* Get default mailbox profile name */ +DECLARE @defaultprofilname varchar(100) +SELECT DISTINCT @defaultprofilname = p.name FROM msdb.dbo.sysmail_profile p JOIN msdb.dbo.sysmail_principalprofile pp ON pp.profile_id = p.profile_id AND pp.is_default = 1 + +SET @in_param_dbmail_profile_name = @defaultprofilname + +/* SET RECIPIENTS */ +SELECT @recipients = isnull (@in_param_recipient, isnull (@in_param_varchar_2, '')) + +IF EXISTS(SELECT 1 FROM sys.objects WHERE object_id = OBJECT_ID(N'[dbo].[DBA_Mailing_list]') AND OBJECTPROPERTY(object_id, N'IsUserTable') = 1) +BEGIN + + /* DECRYPTAGE DES DESTINATAIRES */ + SET @recipients_temoin = '' + SET @cpt_boucle = 0 + + WHILE @recipients_temoin <> @recipients and @cpt_boucle < 10 + BEGIN + /* COMPTEUR DE BOUCLE, POUR COURT-CIRCUITER LES BOUCLES INFINIES */ + SET @cpt_boucle = @cpt_boucle + 1 + + /* TEMOIN DU CHAMP DESTINATAIRE, POUR CONTINUER A FAIRE DES REMPLACEMENTS TANT QU'AU MOINS UN REMPLACEMENT A ETE EFFECTUE */ + SET @recipients_temoin = @recipients + + /* BOUCLE SUR LA TABLE DE CORRESPONDANCE DES LISTES DE DIFFUSION */ + DECLARE c_DML CURSOR LOCAL FORWARD_ONLY STATIC FOR + SELECT DML_Code, isnull(DML_Recipients, '') + ';' /*#pde04#*/ + FROM DBA_Mailing_list with (nolock) + OPEN c_DML + FETCH NEXT FROM c_DML + INTO @DML_Code, @DML_Recipients + WHILE @@fetch_status <> -1 + BEGIN + IF @@fetch_status <> -2 + BEGIN + /*#fla01# */ + IF(CHARINDEX (@DML_Code,@recipients) <> 0) + IF(SUBSTRING (@recipients,CHARINDEX (@DML_Code,@recipients)+LEN(@DML_Code),1) <> '@') + SET @recipients = replace (@recipients, @DML_Code, @DML_Recipients) + SET @recipients = replace (@recipients, ',', ';') /*#pde04#*/ + SET @recipients = replace (@recipients, ';;', ';') + SET @recipients = replace (@recipients, ' ', '') + END /* if @@fetch_status <> -2 */ + + FETCH NEXT FROM c_DML + INTO @DML_Code, @DML_Recipients + + END /* while @@fetch_status <> -1 */ + + CLOSE c_DML + DEALLOCATE c_DML + + END /* @recipients_temoin <> @recipients and @@cpt_boucle < 10 */ +END /* If exists (DBA_Mailing_list) */ + +/* EN CAS D'ABSENCE DE DESTINATAIRE, OU EN CAS D'ABSENCE DE CARACTERE @, ECRITURE D'ADRESSES EN DUR */ +IF charindex ('@', @recipients) = 0 +BEGIN + SET @recipients = 'Gal_SE_DBA@galenica.com' /*#pde01#, #dve01# #fla03#*/ +END + +IF @in_job_type in (1, 2, 3, 4) +BEGIN + /* EMAIL D'ECHEC/SUCCES DE JOB */ + IF @in_param_varchar_1 is not null + SET @job_name = @in_param_varchar_1 + ELSE + BEGIN + SET @cmd = 'set @guid = cast(' + isnull (substring(app_name(), 30, 34), '') + ' as uniqueidentifier)' + + /* ATTENTION, CETTE LIGNE DE CODE PEUT GENERER UN WARNING QUAND ELLE N'EST PAS EXECUTEE PAR UN JOB */ + /* ERREUR TYPIQUE DANS UN LANCEMENT AVEC SQL STUDIO : Incorrect syntax near 'Studio'. */ + EXEC sp_executesql @cmd, N'@guid uniqueidentifier out', @guid = @jobid OUT + + IF @jobid is not null + BEGIN + SELECT @job_name = name + FROM msdb..sysjobs + WHERE job_id = @jobid + END + ELSE + SET @job_name = 'job inconnu ou appel hors d''un job' + END +END + +/* JOB FAILURE */ +IF @in_job_type = 1 +BEGIN + SELECT @priority = isnull (@in_param_priority, 'HIGH'), + @subject = isnull (@in_param_subject, 'Job ' + isnull (@job_name, '') + ' has failed.'), + @message = isnull (@in_param_message, 'Job ' + isnull (@job_name, '') + ' has failed.') +END + +/* JOB SUCCESS */ +ELSE IF @in_job_type = 2 +BEGIN + SELECT @priority = isnull (@in_param_priority, 'LOW'), + @subject = isnull (@in_param_subject, 'Job ' + isnull (@job_name, '') + ' successfull.'), + @message = isnull (@in_param_message, 'Job ' + isnull (@job_name, '') + ' has succeeded.') +END + +/* JOB WARNING */ +ELSE IF @in_job_type = 3 +BEGIN + SELECT @priority = isnull (@in_param_priority, 'HIGH'), + @subject = isnull (@in_param_subject, 'Job ' + isnull (@job_name, '') + ' : warning.'), + @message = isnull (@in_param_message, 'Job ' + isnull (@job_name, '') + ' has sent a warning.') +END + +/* JOB MESSAGE */ +ELSE IF @in_job_type = 4 +BEGIN + SELECT @priority = isnull (@in_param_priority, 'LOW'), + @subject = isnull (@in_param_subject, 'Job ' + isnull (@job_name, '') + ' : message.'), + @message = isnull (@in_param_message, 'Job ' + isnull (@job_name, '') + '.') +END + +/* SPY MESSAGE */ +ELSE IF @in_job_type = 10 +BEGIN + SELECT @subject = isnull (@in_param_subject,'Spy message') + SELECT @message = 'This email is being sent by ' + char(10) + char(13) + 'the SPID [' + + convert (varchar (10), isnull(p.session_id, 'NULL')) + + '], ' + char(10) + char(13) + 'of the instance [' + + @@SERVERNAME + + '], ' + char(10) + char(13) + 'run by the program [' + + ltrim(rtrim(isnull(p.program_name, 'NULL'))) + + '] ' + char(10) + char(13) + 'on the host [' + + ltrim(rtrim(isnull(p.host_name, 'NULL'))) + + '] ' + char(10) + char(13) + 'as user [' + + ltrim(rtrim(isnull(p.login_name, 'NULL'))) + + '] ' + char(10) + char(13) + 'on the database [' + + ltrim(rtrim(isnull(db.name, 'NULL'))) + + '].' + from master.sys.dm_exec_sessions p with (nolock) + left join sysdatabases db with (nolock) + on db.dbid = p.database_id + where p.session_id = @@spid +END +ELSE /* UNKNOWN JOB TYPE */ +BEGIN + SELECT @priority = isnull (@in_param_priority, 'NORMAL'), + @subject = isnull (@in_param_subject, 'Message'), + @message = isnull (@in_param_message, 'Message sent by [' + @@SERVERNAME + '].') +END + +/* ADDITIONAL INFO FOR EMAIL MESSAGE */ +IF ISNULL(@in_param_varchar_3, '') <> '' +BEGIN + SET @message = isnull (@message , '') + char(13) + char(13) + isnull (@in_param_varchar_3, '') +END + +SET @message = isnull (@message, '') + ' + + +/*------------------------- */ +Destinataires de l''email : +' + replace (isnull (@recipients, ''), ';', ' ' + CHAR(13)) + +' +' + +/* SEND EMAIL */ +SELECT @recipients = isnull (@in_param_recipient, @recipients), + @priority = isnull (@in_param_priority, @priority), + @subject = isnull (@in_param_subject, @subject), + @message_file = isnull (@in_param_message_file, @message_file), + @attachments = isnull (@in_param_attachments, @attachments), + @dbmail_profile_name = isnull (@in_param_dbmail_profile_name, @dbmail_profile_name) + +SET @recipients = REPLACE(@recipients, ',', ';') /*#pde04#*/ +SET @recipients = REPLACE(@recipients, ' ', '') /*#pde04#*/ + +/* Nettoyage de liste d'emails */ +BEGIN /*#pde04#*/ + DECLARE @Email_address TABLE + ( + Email_address_id int identity, + EAD_email_address varchar (1000) + ) + + SET @posPV_01 = 0 + SET @posPV_02 = 0 + + WHILE @recipients is not null + AND @posPV_02 < LEN (@recipients) + BEGIN + SET @posPV_01 = @posPV_02 + SET @posPV_02 = charindex (';',@recipients, @posPV_02+1) + + IF @posPV_02 is null OR @posPV_02 = 0 + SET @posPV_02 = LEN (@recipients) + + INSERT INTO @Email_address + VALUES(substring(@recipients, @posPV_01+1, @posPV_02-@posPV_01)) + END /*while*/ + + /* NETTOYAGE */ + UPDATE @Email_address + SET EAD_email_address = replace (EAD_email_address, ';', '') + + /* #fla02# */ + DELETE @Email_address + WHERE EAD_email_address not like '[_a-z0-9]%[a-z0-9]@[a-z0-9]%[a-z0-9].[a-z09]%[a-z0-9]' + + UPDATE @Email_address + SET EAD_email_address = EAD_email_address + ';' + + /* CONSTRUCTION DE LA CHAINE DE CARACTERES AVEC LES ADRESSES EMAILS */ + SET @recipients = '' + + DECLARE c_EAD CURSOR LOCAL FORWARD_ONLY STATIC FOR + SELECT EAD_email_address + FROM @Email_address + ORDER BY Email_address_id + OPEN c_EAD + FETCH NEXT FROM c_EAD + INTO @EAD_email_address + WHILE @@fetch_status <> -1 + BEGIN + IF @@fetch_status <> -2 + BEGIN + SET @recipients = @recipients + @EAD_email_address + END /* if @@fetch_status <> -2 */ + + FETCH NEXT FROM c_EAD + INTO @EAD_email_address + + END /* while @@fetch_status <> -1 */ + + CLOSE c_EAD + DEALLOCATE c_EAD + +END + +SET @message = isnull (@in_param_message, @message) + +BEGIN TRY + EXEC @result_sp = aps_Send_Mail + @in_recipient = @recipients, + @in_priority = @priority, + @in_subject = @subject, + @in_message = @message, + @in_message_file = @message_file, + @in_attachments = @attachments, + @in_dbmail_profile_name = @dbmail_profile_name + +END TRY +BEGIN CATCH + SET @result_sp = -1 +END CATCH + +/* ---- VERSION LA PLUS SIMPLE POUR L'ENVOI DE MAIL ---- */ +IF @result_sp <> 0 +BEGIN + SET @subject = @subject + ' - [' + @@SERVERNAME + ']' + EXEC @result_sp = msdb.dbo.sp_send_dbmail + @profile_name = @dbmail_profile_name, + @recipients = @recipients, + @subject = @subject, + @body = @message, + @importance = @priority, + @file_attachments = @attachments +END + +IF @result_sp <> 0 +BEGIN + SET @errno = 70003 + SET @errmsg = '(APS) Error executing aps_Send_Mail in aps_Send_Mail_with_template.' + GOTO error_99 +END + + +/*------------------------- Retour a la SP appelante ------------------------*/ +RETURN(@@error) + +/*-------------------------- Traitement des erreurs -------------------------*/ +error_99: + RAISERROR (@errno, -1, -1, @errmsg); + RETURN(@errno) + +GO diff --git a/TPDT-268 - ACP in task sequence/dba_storedProcedures/aps_Wait_Random_Time.sql b/TPDT-268 - ACP in task sequence/dba_storedProcedures/aps_Wait_Random_Time.sql new file mode 100644 index 0000000..e3b58a8 Binary files /dev/null and b/TPDT-268 - ACP in task sequence/dba_storedProcedures/aps_Wait_Random_Time.sql differ diff --git a/TPDT-268 - ACP in task sequence/dba_storedProcedures/bkp_Archive.sql b/TPDT-268 - ACP in task sequence/dba_storedProcedures/bkp_Archive.sql new file mode 100644 index 0000000..cbb212b --- /dev/null +++ b/TPDT-268 - ACP in task sequence/dba_storedProcedures/bkp_Archive.sql @@ -0,0 +1,293 @@ +USE [HCITools] +GO + +IF EXISTS (SELECT * FROM sys.objects WHERE object_id = OBJECT_ID(N'[dbo].[bkp_Archive]') AND type in (N'P', N'PC')) +DROP PROCEDURE [dbo].[bkp_Archive] +GO + +USE [HCITools] +GO + +SET ANSI_NULLS ON +GO + +SET QUOTED_IDENTIFIER ON +GO + + +CREATE PROCEDURE [dbo].[bkp_Archive] + @in_debug int = null, + @in_Recovery_Model varchar(25) = null +AS +/*============================================================================= + + Explication du traitement realise par la SP + ------------------------------------------- + Cette SP sert à archiver les backups des bases de données en fonction du paramètre BKP_FRQ contenu dans la table HCI_PARAMS + L'archivage se fait sur 3 jours glissant puis en fonction du choix, sur 30 jours et 60 jours + + Contexte d'utilisation + ---------------------- + Cette SP est appelée par les jobs D91010 - Backup of several databases + D91040 - Backup of simple databases + D91050 - Backup of full databases + + Parametres + ---------- + @in_debug : non utilisé pour le moment + + Creation : 06.10.15 / FLA + + Modifications : 14.09.16 / FLA Remplacement des xp_cmdshell par la CLR + Ajout de la gestion des erreurs de chaque step + Ajout de la gestion de l'archivage uniquement des bases backupées + 15.09.16 / FLA Séléction uniquement des bases de données online + 24.05.17 / FLA Ajout du choix du mode de recovery des bases pour archiver leur backup + 17.03.22 / FLA Change DBA mail +=============================================================================*/ + +set nocount on; + +declare @result_sp int, + @errno int, + @errmsg varchar(255) + +/*------------------- Declaration des variables --------------------*/ + +declare @NbError int, + @TypeArchive int, + @BackupFolder varchar (4000), + @BackupFolderA varchar (4000), + @OldPath varchar (4000), + @NewPath varchar (4000), + @Path varchar (4000), + @messageError varchar (max), + @messageToSend varchar(8000), + @xml xml, + @delimiter varchar(1), + @param_group_counter_list nvarchar(3000), + @name varchar (255) + + +/*------------ Affectation des parametres aux variables ------------*/ + +SELECT @TypeArchive=HCIP_value FROM dbo.HCI_PARAMS WHERE HCIP_key = 'BKP_FRQ' +; +SELECT @BackupFolder=HCIP_value FROM dbo.HCI_PARAMS WHERE HCIP_key = 'BKP_DIR' +; +SELECT @BackupFolderA=HCIP_value FROM dbo.HCI_PARAMS WHERE HCIP_key = 'BKP_DIR_A' +; +SELECT @param_group_counter_list = HCIP_value FROM dbo.HCI_PARAMS WHERE HCIP_key = 'BKP_NOT_DB' +; + +IF @in_Recovery_Model is null + SET @in_Recovery_Model = 'FULL,SIMPLE,BULK-LOGGED' + +SET @delimiter = ',' +SET @xml = CAST((''+REPLACE(@param_group_counter_list, @delimiter, '')+''+''+REPLACE(@in_Recovery_Model, @delimiter, '')+'') AS XML) +set @NbError = 0 +set @messageError = '' + +if @TypeArchive is null or @BackupFolder is null or @BackupFolderA is null or @param_group_counter_list is null +begin + select @errno = 70003, + @errmsg = '(BKP) Paramètres BKP_FRQ ou BKP_DIR ou BKP_DIR_A ou BKP_NOT_DB non initialisé dans HCI_PARAMS !' + goto error_99 +end + +/*-------------------------- Traitement ---------------------------*/ + +IF @TypeArchive <> 0 +BEGIN + + /* ON PARCOURT TOUTES LES BASES */ + declare c_databases cursor local forward_only static for + SELECT name + FROM sys.databases + WHERE LOWER(name) not in (SELECT C.value('.', 'varchar(3000)') AS value FROM @xml.nodes('X') AS X(C)) + AND state = 0 + AND recovery_model_desc IN (SELECT C.value('.', 'varchar(3000)') AS value FROM @xml.nodes('Y') AS X(C)) + ORDER BY name + ; + open c_databases + ; + FETCH NEXT FROM c_databases + into @name + ; + while @@fetch_status <> -1 + begin + if @@fetch_status <> -2 + begin + + /* ARCHIVE */ + /* MOVE LAST DUMP FOR ARCHIVING */ + BEGIN TRY + SET @OldPath = @BackupFolder + @name + '_Dump.bak' + SET @NewPath = @BackupFolderA + @name + '_Dump.bak' + + exec dbo.aps_File_Move @OldPath, @NewPath + + END TRY + BEGIN CATCH + select @messageError = @messageError + 'Move last backup for archiving failed : ' + @name + ' ' + ERROR_MESSAGE() + CHAR(13) + SET @NbError = @NbError + 1 + END CATCH + + /* DELETE OLDEST DUMP, OR ARCHIVE AS MONTHLY DUMP */ + if datepart (dd, getdate()) > 7 + or datepart (weekday, getdate()) <> datepart (weekday, '2013-01-01') /* '2013-01-01' was a Tuesday */ + begin + /* DELETE OLDEST ARCHIVED DUMP */ + BEGIN TRY + SET @Path = @BackupFolderA + @name + '_Dump_3.bak' + + exec dbo.aps_File_Delete @Path + + END TRY + BEGIN CATCH + select @messageError = @messageError + 'Delete oldest archived backup failed : ' + @name + ' ' + ERROR_MESSAGE() + CHAR(13) + SET @NbError = @NbError + 1 + END CATCH + + end + else + begin + + /* IN THE FIRST TUESDAY OF THE MONTH, THE MONTHLY DUMP IS UPDATED */ + IF @TypeArchive = 330 + BEGIN + /* DELETE MONTHLY DUMP */ + BEGIN TRY + SET @Path = @BackupFolderA + @name + '_Dump_30.bak' + + exec dbo.aps_File_Delete @Path + + END TRY + BEGIN CATCH + select @messageError = @messageError + 'Delete monthly backup failed : ' + @name + ' ' + ERROR_MESSAGE() + CHAR(13) + SET @NbError = @NbError + 1 + END CATCH + + END + ELSE IF @TypeArchive = 33060 + BEGIN + /* DELETE MONTHLY DUMP 60 */ + BEGIN TRY + SET @Path = @BackupFolderA + @name + '_Dump_60.bak' + + exec dbo.aps_File_Delete @Path + + END TRY + BEGIN CATCH + select @messageError = @messageError + 'Delete monthly backup 60 failed : ' + @name + ' ' + ERROR_MESSAGE() + CHAR(13) + SET @NbError = @NbError + 1 + END CATCH + + /* RENAME TO MONTHLY DUMP 30 TO 60 */ + BEGIN TRY + SET @OldPath = @BackupFolderA + @name + '_Dump_30.bak' + SET @NewPath = @BackupFolderA + @name + '_Dump_60.bak' + + exec dbo.aps_File_Move @OldPath, @NewPath + + END TRY + BEGIN CATCH + select @messageError = @messageError + 'Rename to monthly backup 30 TO 60 failed : ' + @name + ' ' + ERROR_MESSAGE() + CHAR(13) + SET @NbError = @NbError + 1 + END CATCH + END + + BEGIN TRY + SET @OldPath = @BackupFolderA + @name + '_Dump_3.bak' + SET @NewPath = @BackupFolderA + @name + '_Dump_30.bak' + + exec dbo.aps_File_Move @OldPath, @NewPath + + END TRY + BEGIN CATCH + select @messageError = @messageError + 'Rename to monthly backup 3 to 30 failed : ' + @name + ' ' + ERROR_MESSAGE() + CHAR(13) + SET @NbError = @NbError + 1 + END CATCH + END + ; + + /* RENAME ARCHIVED DUMPS */ + BEGIN TRY + SET @OldPath = @BackupFolderA + @name + '_Dump_2.bak' + SET @NewPath = @BackupFolderA + @name + '_Dump_3.bak' + + exec dbo.aps_File_Move @OldPath, @NewPath + + END TRY + BEGIN CATCH + select @messageError = @messageError + 'Rename archived backup 2 to 3 failed : ' + @name + ' ' + ERROR_MESSAGE() + CHAR(13) + SET @NbError = @NbError + 1 + END CATCH + + + BEGIN TRY + SET @OldPath = @BackupFolderA + @name + '_Dump_1.bak' + SET @NewPath = @BackupFolderA + @name + '_Dump_2.bak' + + exec dbo.aps_File_Move @OldPath, @NewPath + + END TRY + BEGIN CATCH + select @messageError = @messageError + 'Rename archived backup 1 to 2 failed : ' + @name + ' ' + ERROR_MESSAGE() + CHAR(13) + SET @NbError = @NbError + 1 + END CATCH + + BEGIN TRY + SET @OldPath = @BackupFolderA + @name + '_Dump.bak' + SET @NewPath = @BackupFolderA + @name + '_Dump_1.bak' + + exec dbo.aps_File_Move @OldPath, @NewPath + + END TRY + BEGIN CATCH + select @messageError = @messageError + 'Rename archived backup to 1 failed : ' + @name + ' ' + ERROR_MESSAGE() + CHAR(13) + SET @NbError = @NbError + 1 + END CATCH + + end /* if @@fetch_status <> -2 */ + ; + FETCH NEXT FROM c_databases + into @name + ; + end /* while @@fetch_status <> -1 */ + ; + close c_databases + ; + deallocate c_databases + ; + + if @NbError > 0 + BEGIN + + SET @messageToSend = SUBSTRING(@messageError,0,8000); + + exec aps_Send_Mail_with_template + @in_param_varchar_2 = 'DBA_operator;', + @in_job_type = 3, /* 3 = warning */ + @in_param_varchar_3 = @messageError + ; + + select @errno = 70003, + @errmsg = '(BKP) Erreur lors du job d''archivage' + END + +END +; + +/*------------------ Retour au programme appelant -----------------*/ + +return(@@error); + +/*---------------------- Traitement des erreurs ----------------------*/ +error_99: + raiserror (@errmsg, 16, 1); + return(@errno); + +GO + + diff --git a/TPDT-268 - ACP in task sequence/dba_storedProcedures/bkp_Dump.sql b/TPDT-268 - ACP in task sequence/dba_storedProcedures/bkp_Dump.sql new file mode 100644 index 0000000..f81dabf --- /dev/null +++ b/TPDT-268 - ACP in task sequence/dba_storedProcedures/bkp_Dump.sql @@ -0,0 +1,160 @@ +USE [HCITools] +GO + +/****** Object: StoredProcedure [dbo].[bkp_Dump] Script Date: 10/15/2015 10:58:14 ******/ +IF EXISTS (SELECT * FROM sys.objects WHERE object_id = OBJECT_ID(N'[dbo].[bkp_Dump]') AND type in (N'P', N'PC')) +DROP PROCEDURE [dbo].[bkp_Dump] +GO + +USE [HCITools] +GO + +/****** Object: StoredProcedure [dbo].[bkp_Dump] Script Date: 10/15/2015 10:58:14 ******/ +SET ANSI_NULLS ON +GO + +SET QUOTED_IDENTIFIER ON +GO + + + +CREATE PROCEDURE [dbo].[bkp_Dump] + @in_debug int = null, + @in_Recovery_Model varchar(25) = null +AS +/*============================================================================= + + Explication du traitement realise par la SP + ------------------------------------------- + Cette SP sert à créer les backups des bases de données. Suivant la version de SQL Server, la compression se fait ou pas avec la possibilité de choisir les bases par mode de recovery + + + Contexte d'utilisation + ---------------------- + Cette SP est appelée par le D91010 - Backup of several databases + D91040 - Backup of simple databases + D91050 - Backup of full databases + + + Parametres + ---------- + @in_debug : Si 1 alors on fait un print des commandes de backup + @@in_Recovery_Model : Choix du mode de recovery des bases. si null : All recovery model sinon recovery model défini + + Creation : 15.10.15 / FLA + + Modifications : 21.07.16 / FLA : Séléction uniquement des bases de données online (state = 0) + 28.11.16 / FLA : Correct bug in checking version + 24.05.17 / FLA : Ajout du choix du mode de recovery des bases à backuper + 28.08.18 / FLA : Suppression gestion version car bug detecté et plus nécessaire + 17.03.22 / FLA : Change DBA mail +=============================================================================*/ + +set nocount on; + +declare @result_sp int, + @errno int, + @errmsg varchar(255) + +/*------------------- Declaration des variables --------------------*/ + +declare @name varchar (255), + @cmd varchar (8000), + @messageError varchar (8000), + @xml XML, + @delimiter VARCHAR(1), + @param_group_counter_list NVARCHAR(3000) + + +IF @in_Recovery_Model is null + SET @in_Recovery_Model = 'FULL,SIMPLE,BULK-LOGGED' + +SELECT @param_group_counter_list = HCIP_value FROM dbo.HCI_PARAMS WHERE HCIP_key = 'BKP_NOT_DB' +SET @delimiter = ',' +SET @xml = CAST((''+REPLACE(@param_group_counter_list, @delimiter, '')+''+''+REPLACE(@in_Recovery_Model, @delimiter, '')+'') AS XML) + +declare c_databases cursor local forward_only static for + SELECT name + FROM sys.databases + WHERE LOWER(name) not in (SELECT C.value('.', 'varchar(3000)') AS value FROM @xml.nodes('X') AS X(C)) + AND state = 0 + AND recovery_model_desc IN (SELECT C.value('.', 'varchar(3000)') AS value FROM @xml.nodes('Y') AS X(C)) + ORDER BY name + +/*------------ Affectation des parametres aux variables ------------*/ + +select @errno = 0 +; +SET @messageError = '' +; +SET @errmsg = '' +; + + +/*-------------------------- Traitement ---------------------------*/ + +open c_databases +; +FETCH NEXT FROM c_databases + into @name +; + +while @@fetch_status = 0 +begin + /* DUMP */ + select @cmd = 'BACKUP DATABASE [' + @name + '] TO [' + @name + '_Dump] WITH INIT, NOUNLOAD, NAME = N''' + @name + ' backup'', SKIP , STATS = 10, FORMAT, COMPRESSION, CHECKSUM; RESTORE VERIFYONLY FROM [' + @name + '_Dump];' + ; + + BEGIN TRY + + IF (@in_debug = 1) + print @cmd; + ELSE + exec (@cmd) + ; + END TRY + BEGIN CATCH + + select @messageError = @messageError + 'Backup failed : ' + @name + ' ' + ERROR_MESSAGE() + CHAR(13) + ; + + SET @errno = @errno + 1 + ; + END CATCH + ; + FETCH NEXT FROM c_databases + into @name + ; +end +; +close c_databases +; +deallocate c_databases +; + +if @errno > 0 +BEGIN + exec aps_Send_Mail_with_template + @in_param_varchar_2 = 'DBA_operator;', + @in_job_type = 3, /* 3 = warning */ + @in_param_varchar_3 = @messageError + ; + + select @errno = 70003, + @errmsg = '(BKP) Erreur lors du job de backup' + goto error_99 +END +; + +/*------------------ Retour au programme appelant -----------------*/ + +return(@@error); + +/*---------------------- Traitement des erreurs ----------------------*/ +error_99: + raiserror (@errmsg, 16, 1); + return(@errno); + +GO + + diff --git a/TPDT-268 - ACP in task sequence/dba_storedProcedures/bkp_Log.sql b/TPDT-268 - ACP in task sequence/dba_storedProcedures/bkp_Log.sql new file mode 100644 index 0000000..516d926 --- /dev/null +++ b/TPDT-268 - ACP in task sequence/dba_storedProcedures/bkp_Log.sql @@ -0,0 +1,149 @@ +USE [HCITools] +GO + + +IF EXISTS (SELECT * FROM sys.objects WHERE object_id = OBJECT_ID(N'[dbo].[bkp_Log]') AND type in (N'P', N'PC')) +DROP PROCEDURE [dbo].[bkp_Log] +GO + +USE [HCITools] +GO + + +SET ANSI_NULLS ON +GO + +SET QUOTED_IDENTIFIER ON +GO + + + + +CREATE PROCEDURE [dbo].[bkp_Log] + @in_debug int = null +AS +/*============================================================================= + + Explication du traitement realise par la SP + ------------------------------------------- + Cette SP sert backuper les logs de transaction des bases de données en mode FULL + + Contexte d'utilisation + ---------------------- + Cette SP est appelée par le job DR91020 - Log-backup + + Parametres + ---------- + @in_debug : Si 1 alors on fait un print des commandes de backup + + Creation : 28.10.16 / FLA + + Modifications : 17.03.2022 - FLA : Change DBA mail + +=============================================================================*/ + +set nocount on; + +/*------------------- Declaration des variables --------------------*/ +declare @DB_name varchar (255), + @path varchar (4000), + @backupDate datetime, + @fullpath varchar (2000), + @messageError varchar (8000), + @error int, + @BackupLogFolder varchar (4000) + + +/*------------ Affectation des parametres aux variables ------------*/ +select @backupDate = getdate (); +select @error = 0 +select @messageError = '' + +/*-------------------------- Traitement ---------------------------*/ +BEGIN TRY + SELECT @BackupLogFolder=HCIP_value FROM dbo.HCI_PARAMS WHERE HCIP_key = 'BKP_DIR_L' + + /* On ne backup le transaction log que des bases de données en mode FULL (base model exclus) */ + declare c_databases cursor local forward_only static for + SELECT name + FROM sys.databases + WHERE LOWER(name) not in ('model') + AND recovery_model_desc = 'FULL' + AND state = 0 + ORDER BY name + + open c_databases + + FETCH NEXT FROM c_databases + into @DB_name + + while @@fetch_status = 0 + begin + + select @path = @BackupLogFolder + @DB_name; + + /* BUILD THE EXPECTED FORMAT: [DBName_backup_201108041510.trn] */ + declare @filename varchar (2000); + select @filename = @DB_name + + '_backup_' + + convert(varchar, datepart (YYYY, @backupDate)) + '_' + + right('0'+convert(varchar, datepart (MM, @backupDate)),2) + '_' + + right('0'+convert(varchar, datepart (DD, @backupDate)),2) + '_' + + right('0'+convert(varchar, datepart (HH, @backupDate)),2) + + right('0'+convert(varchar, datepart (MI, @backupDate)),2) + + right('0'+convert(varchar, datepart (SS, @backupDate)),2) + '_' + + right('00'+convert(varchar, datepart (MS, @backupDate)),3) + + '.trn' + + select @fullpath = @path+'\'+@filename; + + BEGIN TRY + /* BACKUP THE LOG */ + + IF (@in_debug = 1) + print 'BACKUP LOG '+@DB_name+ ' TO DISK = '+@fullpath + else + BACKUP LOG @DB_name TO DISK = @fullpath + + END TRY + BEGIN CATCH + + select @messageError = @messageError + 'Backup Log failed : ' + @DB_name + ' ' + ERROR_MESSAGE() + CHAR(13) + SET @error = @error + 1 + + END CATCH + + FETCH NEXT FROM c_databases + into @DB_name + end + + close c_databases + deallocate c_databases + + /* S'il y a une erreur, on envoie un mail aux DBA */ + IF @messageError <> '' + BEGIN + exec aps_Send_Mail_with_template + @in_param_varchar_2 = 'DBA_operator;', + @in_job_type = 3, /* 3 = warning */ + @in_param_varchar_3 = @messageError + + RAISERROR ('Erreur dans la SP [dbo].[bkp_Log]',16,1) + END + + +/*---------------------- Traitement des erreurs ----------------------*/ +END TRY +BEGIN CATCH + + /* Traitement des erreurs (avec RaiseError) */ + EXEC dbo.get_Error_Info @in_RaiseError = 1 + +END CATCH + + + + +GO + + diff --git a/TPDT-268 - ACP in task sequence/dba_storedProcedures/bkp_Purge_Log.sql b/TPDT-268 - ACP in task sequence/dba_storedProcedures/bkp_Purge_Log.sql new file mode 100644 index 0000000..11e94ec --- /dev/null +++ b/TPDT-268 - ACP in task sequence/dba_storedProcedures/bkp_Purge_Log.sql @@ -0,0 +1,125 @@ +USE [HCITools] +GO + +IF EXISTS (SELECT * FROM sys.objects WHERE object_id = OBJECT_ID(N'[dbo].[bkp_Purge_Log]') AND type in (N'P', N'PC')) +DROP PROCEDURE [dbo].[bkp_Purge_Log] +GO + +USE [HCITools] +GO + +SET ANSI_NULLS ON +GO + +SET QUOTED_IDENTIFIER ON +GO + + + + +CREATE PROCEDURE [dbo].[bkp_Purge_Log] + @in_debug int = null, + @in_NbDays smallint + +AS +/*============================================================================= + + Explication du traitement realise par la SP + ------------------------------------------- + Cette SP sert à supprimer les anciens fichiers de log de plus de X jours + + Contexte d'utilisation + ---------------------- + Cette SP est appelée par le job DR91020 - Log-backup + + Parametres + ---------- + @in_debug : non utilisé + @in_NbDays : nombre de jours de rétention des logs + + Creation : 28.10.16 / FLA + + Modifications : 17.03.2022 - FLA : Change DBA mail + +=============================================================================*/ + +set nocount on; + +/*------------------- Declaration des variables --------------------*/ +declare @DB_name varchar (255), + @messageError varchar(8000), + @dt datetime, + @result_xp int, + @BackupLogFolder varchar (4000), + @path varchar (4000) + +declare @t_result TABLE + (result_text VARCHAR(200)) + +/*------------ Affectation des parametres aux variables ------------*/ +SELECT @BackupLogFolder=HCIP_value FROM dbo.HCI_PARAMS WHERE HCIP_key = 'BKP_DIR_L' +select @dt = DateAdd(dd, -@in_NbDays, GetDate()) +SET @messageError = '' + +/*-------------------------- Traitement ---------------------------*/ +BEGIN TRY + + declare c_databases cursor local forward_only static for + SELECT name + FROM sys.databases + WHERE LOWER(name) not in ('model') + AND recovery_model_desc = 'FULL' + ORDER BY name + + open c_databases + + FETCH NEXT FROM c_databases + into @DB_name + + while @@fetch_status = 0 + begin + + select @path = @BackupLogFolder+ @DB_name; + + INSERT INTO @t_result(result_text) + EXECUTE @result_xp = master.dbo.xp_delete_file 0,@path,N'trn',@dt,1 + + if (@result_xp <> 0) + BEGIN + SELECT @messageError = @messageError + @DB_name + ': '+ result_text + CHAR(13) + FROM @t_result + WHERE result_text IS NOT NULL + END + delete from @t_result; + + FETCH NEXT FROM c_databases + into @DB_name + end + + close c_databases + deallocate c_databases + + /* S'il y a une erreur, on envoie un mail aux DBA */ + IF @messageError <> '' + BEGIN + exec aps_Send_Mail_with_template + @in_param_varchar_2 = 'DBA_operator;', + @in_job_type = 3, /* 3 = warning */ + @in_param_varchar_3 = @messageError + + RAISERROR ('Erreur dans la SP [dbo].[bkp_Purge_Log]',16,1) + END + +/*---------------------- Traitement des erreurs ----------------------*/ +END TRY +BEGIN CATCH + + /* Traitement des erreurs (avec RaiseError) */ + EXEC dbo.get_Error_Info @in_RaiseError = 1 + +END CATCH + + +GO + + diff --git a/TPDT-268 - ACP in task sequence/dba_storedProcedures/dba_replmonitorsubscriptionpendingcmds.sql b/TPDT-268 - ACP in task sequence/dba_storedProcedures/dba_replmonitorsubscriptionpendingcmds.sql new file mode 100644 index 0000000..972f938 Binary files /dev/null and b/TPDT-268 - ACP in task sequence/dba_storedProcedures/dba_replmonitorsubscriptionpendingcmds.sql differ diff --git a/TPDT-268 - ACP in task sequence/dba_storedProcedures/dbo.DatabaseIntegrityCheck.sql b/TPDT-268 - ACP in task sequence/dba_storedProcedures/dbo.DatabaseIntegrityCheck.sql new file mode 100644 index 0000000..e4e574c --- /dev/null +++ b/TPDT-268 - ACP in task sequence/dba_storedProcedures/dbo.DatabaseIntegrityCheck.sql @@ -0,0 +1,1867 @@ +/****************************************************************************************/ +/********* 1. CREATE STORED PROCEDURE [HCITools].[dbo].[DatabaseIntegrityCheck] *********/ +/****************************************************************************************/ + +USE [HCITools] +GO + +IF EXISTS (SELECT * FROM sys.objects WHERE object_id = OBJECT_ID(N'[dbo].[DatabaseIntegrityCheck]') AND type in (N'P', N'PC')) +DROP PROCEDURE [dbo].[DatabaseIntegrityCheck] +GO + +SET ANSI_NULLS ON +GO +SET QUOTED_IDENTIFIER ON +GO +CREATE PROCEDURE [dbo].[DatabaseIntegrityCheck] + +@Databases nvarchar(max) = NULL, +@CheckCommands nvarchar(max) = 'CHECKDB', +@PhysicalOnly nvarchar(max) = 'N', +@DataPurity nvarchar(max) = 'N', +@NoIndex nvarchar(max) = 'N', +@ExtendedLogicalChecks nvarchar(max) = 'N', +@TabLock nvarchar(max) = 'N', +@FileGroups nvarchar(max) = NULL, +@Objects nvarchar(max) = NULL, +@MaxDOP int = NULL, +@AvailabilityGroups nvarchar(max) = NULL, +@AvailabilityGroupReplicas nvarchar(max) = 'ALL', +@Updateability nvarchar(max) = 'ALL', +@TimeLimit int = NULL, +@LockTimeout int = NULL, +@LockMessageSeverity int = 16, +@StringDelimiter nvarchar(max) = ',', +@DatabaseOrder nvarchar(max) = NULL, +@DatabasesInParallel nvarchar(max) = 'N', +@LogToTable nvarchar(max) = 'N', +@Execute nvarchar(max) = 'Y' + +AS + +BEGIN + + ---------------------------------------------------------------------------------------------------- + --// Source: https://ola.hallengren.com //-- + --// License: https://ola.hallengren.com/license.html //-- + --// GitHub: https://github.com/olahallengren/sql-server-maintenance-solution //-- + --// Version: 2020-11-15 18:44:03 //-- + ---------------------------------------------------------------------------------------------------- + + SET NOCOUNT ON + + DECLARE @StartMessage nvarchar(max) + DECLARE @EndMessage nvarchar(max) + DECLARE @DatabaseMessage nvarchar(max) + DECLARE @ErrorMessage nvarchar(max) + DECLARE @Severity int + + DECLARE @StartTime datetime2 = SYSDATETIME() + DECLARE @SchemaName nvarchar(max) = OBJECT_SCHEMA_NAME(@@PROCID) + DECLARE @ObjectName nvarchar(max) = OBJECT_NAME(@@PROCID) + DECLARE @VersionTimestamp nvarchar(max) = SUBSTRING(OBJECT_DEFINITION(@@PROCID),CHARINDEX('--// Version: ',OBJECT_DEFINITION(@@PROCID)) + LEN('--// Version: ') + 1, 19) + DECLARE @Parameters nvarchar(max) + + DECLARE @HostPlatform nvarchar(max) + + DECLARE @QueueID int + DECLARE @QueueStartTime datetime2 + + DECLARE @CurrentDBID int + DECLARE @CurrentDatabaseName nvarchar(max) + + DECLARE @CurrentDatabase_sp_executesql nvarchar(max) + + DECLARE @CurrentUserAccess nvarchar(max) + DECLARE @CurrentIsReadOnly bit + DECLARE @CurrentDatabaseState nvarchar(max) + DECLARE @CurrentInStandby bit + DECLARE @CurrentRecoveryModel nvarchar(max) + + DECLARE @CurrentIsDatabaseAccessible bit + DECLARE @CurrentAvailabilityGroup nvarchar(max) + DECLARE @CurrentAvailabilityGroupRole nvarchar(max) + DECLARE @CurrentAvailabilityGroupBackupPreference nvarchar(max) + DECLARE @CurrentIsPreferredBackupReplica bit + DECLARE @CurrentDatabaseMirroringRole nvarchar(max) + + DECLARE @CurrentFGID int + DECLARE @CurrentFileGroupID int + DECLARE @CurrentFileGroupName nvarchar(max) + DECLARE @CurrentFileGroupExists bit + + DECLARE @CurrentOID int + DECLARE @CurrentSchemaID int + DECLARE @CurrentSchemaName nvarchar(max) + DECLARE @CurrentObjectID int + DECLARE @CurrentObjectName nvarchar(max) + DECLARE @CurrentObjectType nvarchar(max) + DECLARE @CurrentObjectExists bit + + DECLARE @CurrentDatabaseContext nvarchar(max) + DECLARE @CurrentCommand nvarchar(max) + DECLARE @CurrentCommandOutput int + DECLARE @CurrentCommandType nvarchar(max) + + DECLARE @Errors TABLE (ID int IDENTITY PRIMARY KEY, + [Message] nvarchar(max) NOT NULL, + Severity int NOT NULL, + [State] int) + + DECLARE @CurrentMessage nvarchar(max) + DECLARE @CurrentSeverity int + DECLARE @CurrentState int + + DECLARE @tmpDatabases TABLE (ID int IDENTITY, + DatabaseName nvarchar(max), + DatabaseType nvarchar(max), + AvailabilityGroup bit, + [Snapshot] bit, + StartPosition int, + LastCommandTime datetime2, + DatabaseSize bigint, + LastGoodCheckDbTime datetime2, + [Order] int, + Selected bit, + Completed bit, + PRIMARY KEY(Selected, Completed, [Order], ID)) + + DECLARE @tmpAvailabilityGroups TABLE (ID int IDENTITY PRIMARY KEY, + AvailabilityGroupName nvarchar(max), + StartPosition int, + Selected bit) + + DECLARE @tmpDatabasesAvailabilityGroups TABLE (DatabaseName nvarchar(max), + AvailabilityGroupName nvarchar(max)) + + DECLARE @tmpFileGroups TABLE (ID int IDENTITY, + FileGroupID int, + FileGroupName nvarchar(max), + StartPosition int, + [Order] int, + Selected bit, + Completed bit, + PRIMARY KEY(Selected, Completed, [Order], ID)) + + DECLARE @tmpObjects TABLE (ID int IDENTITY, + SchemaID int, + SchemaName nvarchar(max), + ObjectID int, + ObjectName nvarchar(max), + ObjectType nvarchar(max), + StartPosition int, + [Order] int, + Selected bit, + Completed bit, + PRIMARY KEY(Selected, Completed, [Order], ID)) + + DECLARE @SelectedDatabases TABLE (DatabaseName nvarchar(max), + DatabaseType nvarchar(max), + AvailabilityGroup nvarchar(max), + StartPosition int, + Selected bit) + + DECLARE @SelectedAvailabilityGroups TABLE (AvailabilityGroupName nvarchar(max), + StartPosition int, + Selected bit) + + DECLARE @SelectedFileGroups TABLE (DatabaseName nvarchar(max), + FileGroupName nvarchar(max), + StartPosition int, + Selected bit) + + DECLARE @SelectedObjects TABLE (DatabaseName nvarchar(max), + SchemaName nvarchar(max), + ObjectName nvarchar(max), + StartPosition int, + Selected bit) + + DECLARE @SelectedCheckCommands TABLE (CheckCommand nvarchar(max)) + + DECLARE @Error int = 0 + DECLARE @ReturnCode int = 0 + + DECLARE @EmptyLine nvarchar(max) = CHAR(9) + + DECLARE @Version numeric(18,10) = CAST(LEFT(CAST(SERVERPROPERTY('ProductVersion') AS nvarchar(max)),CHARINDEX('.',CAST(SERVERPROPERTY('ProductVersion') AS nvarchar(max))) - 1) + '.' + REPLACE(RIGHT(CAST(SERVERPROPERTY('ProductVersion') AS nvarchar(max)), LEN(CAST(SERVERPROPERTY('ProductVersion') AS nvarchar(max))) - CHARINDEX('.',CAST(SERVERPROPERTY('ProductVersion') AS nvarchar(max)))),'.','') AS numeric(18,10)) + + IF @Version >= 14 + BEGIN + SELECT @HostPlatform = host_platform + FROM sys.dm_os_host_info + END + ELSE + BEGIN + SET @HostPlatform = 'Windows' + END + + DECLARE @AmazonRDS bit = CASE WHEN DB_ID('rdsadmin') IS NOT NULL AND SUSER_SNAME(0x01) = 'rdsa' THEN 1 ELSE 0 END + + ---------------------------------------------------------------------------------------------------- + --// Log initial information //-- + ---------------------------------------------------------------------------------------------------- + + SET @Parameters = '@Databases = ' + ISNULL('''' + REPLACE(@Databases,'''','''''') + '''','NULL') + SET @Parameters += ', @CheckCommands = ' + ISNULL('''' + REPLACE(@CheckCommands,'''','''''') + '''','NULL') + SET @Parameters += ', @PhysicalOnly = ' + ISNULL('''' + REPLACE(@PhysicalOnly,'''','''''') + '''','NULL') + SET @Parameters += ', @DataPurity = ' + ISNULL('''' + REPLACE(@DataPurity,'''','''''') + '''','NULL') + SET @Parameters += ', @NoIndex = ' + ISNULL('''' + REPLACE(@NoIndex,'''','''''') + '''','NULL') + SET @Parameters += ', @ExtendedLogicalChecks = ' + ISNULL('''' + REPLACE(@ExtendedLogicalChecks,'''','''''') + '''','NULL') + SET @Parameters += ', @TabLock = ' + ISNULL('''' + REPLACE(@TabLock,'''','''''') + '''','NULL') + SET @Parameters += ', @FileGroups = ' + ISNULL('''' + REPLACE(@FileGroups,'''','''''') + '''','NULL') + SET @Parameters += ', @Objects = ' + ISNULL('''' + REPLACE(@Objects,'''','''''') + '''','NULL') + SET @Parameters += ', @MaxDOP = ' + ISNULL(CAST(@MaxDOP AS nvarchar),'NULL') + SET @Parameters += ', @AvailabilityGroups = ' + ISNULL('''' + REPLACE(@AvailabilityGroups,'''','''''') + '''','NULL') + SET @Parameters += ', @AvailabilityGroupReplicas = ' + ISNULL('''' + REPLACE(@AvailabilityGroupReplicas,'''','''''') + '''','NULL') + SET @Parameters += ', @Updateability = ' + ISNULL('''' + REPLACE(@Updateability,'''','''''') + '''','NULL') + SET @Parameters += ', @TimeLimit = ' + ISNULL(CAST(@TimeLimit AS nvarchar),'NULL') + SET @Parameters += ', @LockTimeout = ' + ISNULL(CAST(@LockTimeout AS nvarchar),'NULL') + SET @Parameters += ', @LockMessageSeverity = ' + ISNULL(CAST(@LockMessageSeverity AS nvarchar),'NULL') + SET @Parameters += ', @StringDelimiter = ' + ISNULL('''' + REPLACE(@StringDelimiter,'''','''''') + '''','NULL') + SET @Parameters += ', @DatabaseOrder = ' + ISNULL('''' + REPLACE(@DatabaseOrder,'''','''''') + '''','NULL') + SET @Parameters += ', @DatabasesInParallel = ' + ISNULL('''' + REPLACE(@DatabasesInParallel,'''','''''') + '''','NULL') + SET @Parameters += ', @LogToTable = ' + ISNULL('''' + REPLACE(@LogToTable,'''','''''') + '''','NULL') + SET @Parameters += ', @Execute = ' + ISNULL('''' + REPLACE(@Execute,'''','''''') + '''','NULL') + + SET @StartMessage = 'Date and time: ' + CONVERT(nvarchar,@StartTime,120) + RAISERROR('%s',10,1,@StartMessage) WITH NOWAIT + + SET @StartMessage = 'Server: ' + CAST(SERVERPROPERTY('ServerName') AS nvarchar(max)) + RAISERROR('%s',10,1,@StartMessage) WITH NOWAIT + + SET @StartMessage = 'Version: ' + CAST(SERVERPROPERTY('ProductVersion') AS nvarchar(max)) + RAISERROR('%s',10,1,@StartMessage) WITH NOWAIT + + SET @StartMessage = 'Edition: ' + CAST(SERVERPROPERTY('Edition') AS nvarchar(max)) + RAISERROR('%s',10,1,@StartMessage) WITH NOWAIT + + SET @StartMessage = 'Platform: ' + @HostPlatform + RAISERROR('%s',10,1,@StartMessage) WITH NOWAIT + + SET @StartMessage = 'Procedure: ' + QUOTENAME(DB_NAME(DB_ID())) + '.' + QUOTENAME(@SchemaName) + '.' + QUOTENAME(@ObjectName) + RAISERROR('%s',10,1,@StartMessage) WITH NOWAIT + + SET @StartMessage = 'Parameters: ' + @Parameters + RAISERROR('%s',10,1,@StartMessage) WITH NOWAIT + + SET @StartMessage = 'Version: ' + @VersionTimestamp + RAISERROR('%s',10,1,@StartMessage) WITH NOWAIT + + SET @StartMessage = 'Source: https://ola.hallengren.com' + RAISERROR('%s',10,1,@StartMessage) WITH NOWAIT + + RAISERROR(@EmptyLine,10,1) WITH NOWAIT + + ---------------------------------------------------------------------------------------------------- + --// Check core requirements //-- + ---------------------------------------------------------------------------------------------------- + + IF NOT (SELECT [compatibility_level] FROM sys.databases WHERE database_id = DB_ID()) >= 90 + BEGIN + INSERT INTO @Errors ([Message], Severity, [State]) + SELECT 'The database ' + QUOTENAME(DB_NAME(DB_ID())) + ' has to be in compatibility level 90 or higher.', 16, 1 + END + + IF NOT (SELECT uses_ansi_nulls FROM sys.sql_modules WHERE [object_id] = @@PROCID) = 1 + BEGIN + INSERT INTO @Errors ([Message], Severity, [State]) + SELECT 'ANSI_NULLS has to be set to ON for the stored procedure.', 16, 1 + END + + IF NOT (SELECT uses_quoted_identifier FROM sys.sql_modules WHERE [object_id] = @@PROCID) = 1 + BEGIN + INSERT INTO @Errors ([Message], Severity, [State]) + SELECT 'QUOTED_IDENTIFIER has to be set to ON for the stored procedure.', 16, 1 + END + + IF NOT EXISTS (SELECT * FROM sys.objects objects INNER JOIN sys.schemas schemas ON objects.[schema_id] = schemas.[schema_id] WHERE objects.[type] = 'P' AND schemas.[name] = 'dbo' AND objects.[name] = 'CommandExecute') + BEGIN + INSERT INTO @Errors ([Message], Severity, [State]) + SELECT 'The stored procedure CommandExecute is missing. Download https://ola.hallengren.com/scripts/CommandExecute.sql.', 16, 1 + END + + IF EXISTS (SELECT * FROM sys.objects objects INNER JOIN sys.schemas schemas ON objects.[schema_id] = schemas.[schema_id] WHERE objects.[type] = 'P' AND schemas.[name] = 'dbo' AND objects.[name] = 'CommandExecute' AND OBJECT_DEFINITION(objects.[object_id]) NOT LIKE '%@DatabaseContext%') + BEGIN + INSERT INTO @Errors ([Message], Severity, [State]) + SELECT 'The stored procedure CommandExecute needs to be updated. Download https://ola.hallengren.com/scripts/CommandExecute.sql.', 16, 1 + END + + IF @LogToTable = 'Y' AND NOT EXISTS (SELECT * FROM sys.objects objects INNER JOIN sys.schemas schemas ON objects.[schema_id] = schemas.[schema_id] WHERE objects.[type] = 'U' AND schemas.[name] = 'dbo' AND objects.[name] = 'CommandLog') + BEGIN + INSERT INTO @Errors ([Message], Severity, [State]) + SELECT 'The table CommandLog is missing. Download https://ola.hallengren.com/scripts/CommandLog.sql.', 16, 1 + END + + IF @DatabasesInParallel = 'Y' AND NOT EXISTS (SELECT * FROM sys.objects objects INNER JOIN sys.schemas schemas ON objects.[schema_id] = schemas.[schema_id] WHERE objects.[type] = 'U' AND schemas.[name] = 'dbo' AND objects.[name] = 'Queue') + BEGIN + INSERT INTO @Errors ([Message], Severity, [State]) + SELECT 'The table Queue is missing. Download https://ola.hallengren.com/scripts/Queue.sql.', 16, 1 + END + + IF @DatabasesInParallel = 'Y' AND NOT EXISTS (SELECT * FROM sys.objects objects INNER JOIN sys.schemas schemas ON objects.[schema_id] = schemas.[schema_id] WHERE objects.[type] = 'U' AND schemas.[name] = 'dbo' AND objects.[name] = 'QueueDatabase') + BEGIN + INSERT INTO @Errors ([Message], Severity, [State]) + SELECT 'The table QueueDatabase is missing. Download https://ola.hallengren.com/scripts/QueueDatabase.sql.', 16, 1 + END + + IF @@TRANCOUNT <> 0 + BEGIN + INSERT INTO @Errors ([Message], Severity, [State]) + SELECT 'The transaction count is not 0.', 16, 1 + END + + ---------------------------------------------------------------------------------------------------- + --// Select databases //-- + ---------------------------------------------------------------------------------------------------- + + SET @Databases = REPLACE(@Databases, CHAR(10), '') + SET @Databases = REPLACE(@Databases, CHAR(13), '') + + WHILE CHARINDEX(@StringDelimiter + ' ', @Databases) > 0 SET @Databases = REPLACE(@Databases, @StringDelimiter + ' ', @StringDelimiter) + WHILE CHARINDEX(' ' + @StringDelimiter, @Databases) > 0 SET @Databases = REPLACE(@Databases, ' ' + @StringDelimiter, @StringDelimiter) + + SET @Databases = LTRIM(RTRIM(@Databases)); + + WITH Databases1 (StartPosition, EndPosition, DatabaseItem) AS + ( + SELECT 1 AS StartPosition, + ISNULL(NULLIF(CHARINDEX(@StringDelimiter, @Databases, 1), 0), LEN(@Databases) + 1) AS EndPosition, + SUBSTRING(@Databases, 1, ISNULL(NULLIF(CHARINDEX(@StringDelimiter, @Databases, 1), 0), LEN(@Databases) + 1) - 1) AS DatabaseItem + WHERE @Databases IS NOT NULL + UNION ALL + SELECT CAST(EndPosition AS int) + 1 AS StartPosition, + ISNULL(NULLIF(CHARINDEX(@StringDelimiter, @Databases, EndPosition + 1), 0), LEN(@Databases) + 1) AS EndPosition, + SUBSTRING(@Databases, EndPosition + 1, ISNULL(NULLIF(CHARINDEX(@StringDelimiter, @Databases, EndPosition + 1), 0), LEN(@Databases) + 1) - EndPosition - 1) AS DatabaseItem + FROM Databases1 + WHERE EndPosition < LEN(@Databases) + 1 + ), + Databases2 (DatabaseItem, StartPosition, Selected) AS + ( + SELECT CASE WHEN DatabaseItem LIKE '-%' THEN RIGHT(DatabaseItem,LEN(DatabaseItem) - 1) ELSE DatabaseItem END AS DatabaseItem, + StartPosition, + CASE WHEN DatabaseItem LIKE '-%' THEN 0 ELSE 1 END AS Selected + FROM Databases1 + ), + Databases3 (DatabaseItem, DatabaseType, AvailabilityGroup, StartPosition, Selected) AS + ( + SELECT CASE WHEN DatabaseItem IN('ALL_DATABASES','SYSTEM_DATABASES','USER_DATABASES','AVAILABILITY_GROUP_DATABASES') THEN '%' ELSE DatabaseItem END AS DatabaseItem, + CASE WHEN DatabaseItem = 'SYSTEM_DATABASES' THEN 'S' WHEN DatabaseItem = 'USER_DATABASES' THEN 'U' ELSE NULL END AS DatabaseType, + CASE WHEN DatabaseItem = 'AVAILABILITY_GROUP_DATABASES' THEN 1 ELSE NULL END AvailabilityGroup, + StartPosition, + Selected + FROM Databases2 + ), + Databases4 (DatabaseName, DatabaseType, AvailabilityGroup, StartPosition, Selected) AS + ( + SELECT CASE WHEN LEFT(DatabaseItem,1) = '[' AND RIGHT(DatabaseItem,1) = ']' THEN PARSENAME(DatabaseItem,1) ELSE DatabaseItem END AS DatabaseItem, + DatabaseType, + AvailabilityGroup, + StartPosition, + Selected + FROM Databases3 + ) + INSERT INTO @SelectedDatabases (DatabaseName, DatabaseType, AvailabilityGroup, StartPosition, Selected) + SELECT DatabaseName, + DatabaseType, + AvailabilityGroup, + StartPosition, + Selected + FROM Databases4 + OPTION (MAXRECURSION 0) + + IF @Version >= 11 AND SERVERPROPERTY('IsHadrEnabled') = 1 + BEGIN + INSERT INTO @tmpAvailabilityGroups (AvailabilityGroupName, Selected) + SELECT name AS AvailabilityGroupName, + 0 AS Selected + FROM sys.availability_groups + + INSERT INTO @tmpDatabasesAvailabilityGroups (DatabaseName, AvailabilityGroupName) + SELECT databases.name, + availability_groups.name + FROM sys.databases databases + INNER JOIN sys.dm_hadr_availability_replica_states dm_hadr_availability_replica_states ON databases.replica_id = dm_hadr_availability_replica_states.replica_id + INNER JOIN sys.availability_groups availability_groups ON dm_hadr_availability_replica_states.group_id = availability_groups.group_id + END + + INSERT INTO @tmpDatabases (DatabaseName, DatabaseType, AvailabilityGroup, [Snapshot], [Order], Selected, Completed) + SELECT [name] AS DatabaseName, + CASE WHEN name IN('master','msdb','model') OR is_distributor = 1 THEN 'S' ELSE 'U' END AS DatabaseType, + NULL AS AvailabilityGroup, + CASE WHEN source_database_id IS NOT NULL THEN 1 ELSE 0 END AS [Snapshot], + 0 AS [Order], + 0 AS Selected, + 0 AS Completed + FROM sys.databases + ORDER BY [name] ASC + + UPDATE tmpDatabases + SET AvailabilityGroup = CASE WHEN EXISTS (SELECT * FROM @tmpDatabasesAvailabilityGroups WHERE DatabaseName = tmpDatabases.DatabaseName) THEN 1 ELSE 0 END + FROM @tmpDatabases tmpDatabases + + UPDATE tmpDatabases + SET tmpDatabases.Selected = SelectedDatabases.Selected + FROM @tmpDatabases tmpDatabases + INNER JOIN @SelectedDatabases SelectedDatabases + ON tmpDatabases.DatabaseName LIKE REPLACE(SelectedDatabases.DatabaseName,'_','[_]') + AND (tmpDatabases.DatabaseType = SelectedDatabases.DatabaseType OR SelectedDatabases.DatabaseType IS NULL) + AND (tmpDatabases.AvailabilityGroup = SelectedDatabases.AvailabilityGroup OR SelectedDatabases.AvailabilityGroup IS NULL) + AND NOT ((tmpDatabases.DatabaseName = 'tempdb' OR tmpDatabases.[Snapshot] = 1) AND tmpDatabases.DatabaseName <> SelectedDatabases.DatabaseName) + WHERE SelectedDatabases.Selected = 1 + + UPDATE tmpDatabases + SET tmpDatabases.Selected = SelectedDatabases.Selected + FROM @tmpDatabases tmpDatabases + INNER JOIN @SelectedDatabases SelectedDatabases + ON tmpDatabases.DatabaseName LIKE REPLACE(SelectedDatabases.DatabaseName,'_','[_]') + AND (tmpDatabases.DatabaseType = SelectedDatabases.DatabaseType OR SelectedDatabases.DatabaseType IS NULL) + AND (tmpDatabases.AvailabilityGroup = SelectedDatabases.AvailabilityGroup OR SelectedDatabases.AvailabilityGroup IS NULL) + AND NOT ((tmpDatabases.DatabaseName = 'tempdb' OR tmpDatabases.[Snapshot] = 1) AND tmpDatabases.DatabaseName <> SelectedDatabases.DatabaseName) + WHERE SelectedDatabases.Selected = 0 + + UPDATE tmpDatabases + SET tmpDatabases.StartPosition = SelectedDatabases2.StartPosition + FROM @tmpDatabases tmpDatabases + INNER JOIN (SELECT tmpDatabases.DatabaseName, MIN(SelectedDatabases.StartPosition) AS StartPosition + FROM @tmpDatabases tmpDatabases + INNER JOIN @SelectedDatabases SelectedDatabases + ON tmpDatabases.DatabaseName LIKE REPLACE(SelectedDatabases.DatabaseName,'_','[_]') + AND (tmpDatabases.DatabaseType = SelectedDatabases.DatabaseType OR SelectedDatabases.DatabaseType IS NULL) + AND (tmpDatabases.AvailabilityGroup = SelectedDatabases.AvailabilityGroup OR SelectedDatabases.AvailabilityGroup IS NULL) + WHERE SelectedDatabases.Selected = 1 + GROUP BY tmpDatabases.DatabaseName) SelectedDatabases2 + ON tmpDatabases.DatabaseName = SelectedDatabases2.DatabaseName + + IF @Databases IS NOT NULL AND (NOT EXISTS(SELECT * FROM @SelectedDatabases) OR EXISTS(SELECT * FROM @SelectedDatabases WHERE DatabaseName IS NULL OR DatabaseName = '')) + BEGIN + INSERT INTO @Errors ([Message], Severity, [State]) + SELECT 'The value for the parameter @Databases is not supported.', 16, 1 + END + + ---------------------------------------------------------------------------------------------------- + --// Select availability groups //-- + ---------------------------------------------------------------------------------------------------- + + IF @AvailabilityGroups IS NOT NULL AND @Version >= 11 AND SERVERPROPERTY('IsHadrEnabled') = 1 + BEGIN + + SET @AvailabilityGroups = REPLACE(@AvailabilityGroups, CHAR(10), '') + SET @AvailabilityGroups = REPLACE(@AvailabilityGroups, CHAR(13), '') + + WHILE CHARINDEX(@StringDelimiter + ' ', @AvailabilityGroups) > 0 SET @AvailabilityGroups = REPLACE(@AvailabilityGroups, @StringDelimiter + ' ', @StringDelimiter) + WHILE CHARINDEX(' ' + @StringDelimiter, @AvailabilityGroups) > 0 SET @AvailabilityGroups = REPLACE(@AvailabilityGroups, ' ' + @StringDelimiter, @StringDelimiter) + + SET @AvailabilityGroups = LTRIM(RTRIM(@AvailabilityGroups)); + + WITH AvailabilityGroups1 (StartPosition, EndPosition, AvailabilityGroupItem) AS + ( + SELECT 1 AS StartPosition, + ISNULL(NULLIF(CHARINDEX(@StringDelimiter, @AvailabilityGroups, 1), 0), LEN(@AvailabilityGroups) + 1) AS EndPosition, + SUBSTRING(@AvailabilityGroups, 1, ISNULL(NULLIF(CHARINDEX(@StringDelimiter, @AvailabilityGroups, 1), 0), LEN(@AvailabilityGroups) + 1) - 1) AS AvailabilityGroupItem + WHERE @AvailabilityGroups IS NOT NULL + UNION ALL + SELECT CAST(EndPosition AS int) + 1 AS StartPosition, + ISNULL(NULLIF(CHARINDEX(@StringDelimiter, @AvailabilityGroups, EndPosition + 1), 0), LEN(@AvailabilityGroups) + 1) AS EndPosition, + SUBSTRING(@AvailabilityGroups, EndPosition + 1, ISNULL(NULLIF(CHARINDEX(@StringDelimiter, @AvailabilityGroups, EndPosition + 1), 0), LEN(@AvailabilityGroups) + 1) - EndPosition - 1) AS AvailabilityGroupItem + FROM AvailabilityGroups1 + WHERE EndPosition < LEN(@AvailabilityGroups) + 1 + ), + AvailabilityGroups2 (AvailabilityGroupItem, StartPosition, Selected) AS + ( + SELECT CASE WHEN AvailabilityGroupItem LIKE '-%' THEN RIGHT(AvailabilityGroupItem,LEN(AvailabilityGroupItem) - 1) ELSE AvailabilityGroupItem END AS AvailabilityGroupItem, + StartPosition, + CASE WHEN AvailabilityGroupItem LIKE '-%' THEN 0 ELSE 1 END AS Selected + FROM AvailabilityGroups1 + ), + AvailabilityGroups3 (AvailabilityGroupItem, StartPosition, Selected) AS + ( + SELECT CASE WHEN AvailabilityGroupItem = 'ALL_AVAILABILITY_GROUPS' THEN '%' ELSE AvailabilityGroupItem END AS AvailabilityGroupItem, + StartPosition, + Selected + FROM AvailabilityGroups2 + ), + AvailabilityGroups4 (AvailabilityGroupName, StartPosition, Selected) AS + ( + SELECT CASE WHEN LEFT(AvailabilityGroupItem,1) = '[' AND RIGHT(AvailabilityGroupItem,1) = ']' THEN PARSENAME(AvailabilityGroupItem,1) ELSE AvailabilityGroupItem END AS AvailabilityGroupItem, + StartPosition, + Selected + FROM AvailabilityGroups3 + ) + INSERT INTO @SelectedAvailabilityGroups (AvailabilityGroupName, StartPosition, Selected) + SELECT AvailabilityGroupName, StartPosition, Selected + FROM AvailabilityGroups4 + OPTION (MAXRECURSION 0) + + UPDATE tmpAvailabilityGroups + SET tmpAvailabilityGroups.Selected = SelectedAvailabilityGroups.Selected + FROM @tmpAvailabilityGroups tmpAvailabilityGroups + INNER JOIN @SelectedAvailabilityGroups SelectedAvailabilityGroups + ON tmpAvailabilityGroups.AvailabilityGroupName LIKE REPLACE(SelectedAvailabilityGroups.AvailabilityGroupName,'_','[_]') + WHERE SelectedAvailabilityGroups.Selected = 1 + + UPDATE tmpAvailabilityGroups + SET tmpAvailabilityGroups.Selected = SelectedAvailabilityGroups.Selected + FROM @tmpAvailabilityGroups tmpAvailabilityGroups + INNER JOIN @SelectedAvailabilityGroups SelectedAvailabilityGroups + ON tmpAvailabilityGroups.AvailabilityGroupName LIKE REPLACE(SelectedAvailabilityGroups.AvailabilityGroupName,'_','[_]') + WHERE SelectedAvailabilityGroups.Selected = 0 + + UPDATE tmpAvailabilityGroups + SET tmpAvailabilityGroups.StartPosition = SelectedAvailabilityGroups2.StartPosition + FROM @tmpAvailabilityGroups tmpAvailabilityGroups + INNER JOIN (SELECT tmpAvailabilityGroups.AvailabilityGroupName, MIN(SelectedAvailabilityGroups.StartPosition) AS StartPosition + FROM @tmpAvailabilityGroups tmpAvailabilityGroups + INNER JOIN @SelectedAvailabilityGroups SelectedAvailabilityGroups + ON tmpAvailabilityGroups.AvailabilityGroupName LIKE REPLACE(SelectedAvailabilityGroups.AvailabilityGroupName,'_','[_]') + WHERE SelectedAvailabilityGroups.Selected = 1 + GROUP BY tmpAvailabilityGroups.AvailabilityGroupName) SelectedAvailabilityGroups2 + ON tmpAvailabilityGroups.AvailabilityGroupName = SelectedAvailabilityGroups2.AvailabilityGroupName + + UPDATE tmpDatabases + SET tmpDatabases.StartPosition = tmpAvailabilityGroups.StartPosition, + tmpDatabases.Selected = 1 + FROM @tmpDatabases tmpDatabases + INNER JOIN @tmpDatabasesAvailabilityGroups tmpDatabasesAvailabilityGroups ON tmpDatabases.DatabaseName = tmpDatabasesAvailabilityGroups.DatabaseName + INNER JOIN @tmpAvailabilityGroups tmpAvailabilityGroups ON tmpDatabasesAvailabilityGroups.AvailabilityGroupName = tmpAvailabilityGroups.AvailabilityGroupName + WHERE tmpAvailabilityGroups.Selected = 1 + + END + + IF @AvailabilityGroups IS NOT NULL AND (NOT EXISTS(SELECT * FROM @SelectedAvailabilityGroups) OR EXISTS(SELECT * FROM @SelectedAvailabilityGroups WHERE AvailabilityGroupName IS NULL OR AvailabilityGroupName = '') OR @Version < 11 OR SERVERPROPERTY('IsHadrEnabled') = 0) + BEGIN + INSERT INTO @Errors ([Message], Severity, [State]) + SELECT 'The value for the parameter @AvailabilityGroups is not supported.', 16, 1 + END + + IF (@Databases IS NULL AND @AvailabilityGroups IS NULL) + BEGIN + INSERT INTO @Errors ([Message], Severity, [State]) + SELECT 'You need to specify one of the parameters @Databases and @AvailabilityGroups.', 16, 2 + END + + IF (@Databases IS NOT NULL AND @AvailabilityGroups IS NOT NULL) + BEGIN + INSERT INTO @Errors ([Message], Severity, [State]) + SELECT 'You can only specify one of the parameters @Databases and @AvailabilityGroups.', 16, 3 + END + + ---------------------------------------------------------------------------------------------------- + --// Select filegroups //-- + ---------------------------------------------------------------------------------------------------- + + SET @FileGroups = REPLACE(@FileGroups, CHAR(10), '') + SET @FileGroups = REPLACE(@FileGroups, CHAR(13), '') + + WHILE CHARINDEX(@StringDelimiter + ' ', @FileGroups) > 0 SET @FileGroups = REPLACE(@FileGroups, @StringDelimiter + ' ', @StringDelimiter) + WHILE CHARINDEX(' ' + @StringDelimiter, @FileGroups) > 0 SET @FileGroups = REPLACE(@FileGroups, ' ' + @StringDelimiter, @StringDelimiter) + + SET @FileGroups = LTRIM(RTRIM(@FileGroups)); + + WITH FileGroups1 (StartPosition, EndPosition, FileGroupItem) AS + ( + SELECT 1 AS StartPosition, + ISNULL(NULLIF(CHARINDEX(@StringDelimiter, @FileGroups, 1), 0), LEN(@FileGroups) + 1) AS EndPosition, + SUBSTRING(@FileGroups, 1, ISNULL(NULLIF(CHARINDEX(@StringDelimiter, @FileGroups, 1), 0), LEN(@FileGroups) + 1) - 1) AS FileGroupItem + WHERE @FileGroups IS NOT NULL + UNION ALL + SELECT CAST(EndPosition AS int) + 1 AS StartPosition, + ISNULL(NULLIF(CHARINDEX(@StringDelimiter, @FileGroups, EndPosition + 1), 0), LEN(@FileGroups) + 1) AS EndPosition, + SUBSTRING(@FileGroups, EndPosition + 1, ISNULL(NULLIF(CHARINDEX(@StringDelimiter, @FileGroups, EndPosition + 1), 0), LEN(@FileGroups) + 1) - EndPosition - 1) AS FileGroupItem + FROM FileGroups1 + WHERE EndPosition < LEN(@FileGroups) + 1 + ), + FileGroups2 (FileGroupItem, StartPosition, Selected) AS + ( + SELECT CASE WHEN FileGroupItem LIKE '-%' THEN RIGHT(FileGroupItem,LEN(FileGroupItem) - 1) ELSE FileGroupItem END AS FileGroupItem, + StartPosition, + CASE WHEN FileGroupItem LIKE '-%' THEN 0 ELSE 1 END AS Selected + FROM FileGroups1 + ), + FileGroups3 (FileGroupItem, StartPosition, Selected) AS + ( + SELECT CASE WHEN FileGroupItem = 'ALL_FILEGROUPS' THEN '%.%' ELSE FileGroupItem END AS FileGroupItem, + StartPosition, + Selected + FROM FileGroups2 + ), + FileGroups4 (DatabaseName, FileGroupName, StartPosition, Selected) AS + ( + SELECT CASE WHEN PARSENAME(FileGroupItem,4) IS NULL AND PARSENAME(FileGroupItem,3) IS NULL THEN PARSENAME(FileGroupItem,2) ELSE NULL END AS DatabaseName, + CASE WHEN PARSENAME(FileGroupItem,4) IS NULL AND PARSENAME(FileGroupItem,3) IS NULL THEN PARSENAME(FileGroupItem,1) ELSE NULL END AS FileGroupName, + StartPosition, + Selected + FROM FileGroups3 + ) + INSERT INTO @SelectedFileGroups (DatabaseName, FileGroupName, StartPosition, Selected) + SELECT DatabaseName, FileGroupName, StartPosition, Selected + FROM FileGroups4 + OPTION (MAXRECURSION 0) + + ---------------------------------------------------------------------------------------------------- + --// Select objects //-- + ---------------------------------------------------------------------------------------------------- + + SET @Objects = REPLACE(@Objects, CHAR(10), '') + SET @Objects = REPLACE(@Objects, CHAR(13), '') + + WHILE CHARINDEX(@StringDelimiter + ' ', @Objects) > 0 SET @Objects = REPLACE(@Objects, @StringDelimiter + ' ', @StringDelimiter) + WHILE CHARINDEX(' ' + @StringDelimiter, @Objects) > 0 SET @Objects = REPLACE(@Objects, ' ' + @StringDelimiter, @StringDelimiter) + + SET @Objects = LTRIM(RTRIM(@Objects)); + + WITH Objects1 (StartPosition, EndPosition, ObjectItem) AS + ( + SELECT 1 AS StartPosition, + ISNULL(NULLIF(CHARINDEX(@StringDelimiter, @Objects, 1), 0), LEN(@Objects) + 1) AS EndPosition, + SUBSTRING(@Objects, 1, ISNULL(NULLIF(CHARINDEX(@StringDelimiter, @Objects, 1), 0), LEN(@Objects) + 1) - 1) AS ObjectItem + WHERE @Objects IS NOT NULL + UNION ALL + SELECT CAST(EndPosition AS int) + 1 AS StartPosition, + ISNULL(NULLIF(CHARINDEX(@StringDelimiter, @Objects, EndPosition + 1), 0), LEN(@Objects) + 1) AS EndPosition, + SUBSTRING(@Objects, EndPosition + 1, ISNULL(NULLIF(CHARINDEX(@StringDelimiter, @Objects, EndPosition + 1), 0), LEN(@Objects) + 1) - EndPosition - 1) AS ObjectItem + FROM Objects1 + WHERE EndPosition < LEN(@Objects) + 1 + ), + Objects2 (ObjectItem, StartPosition, Selected) AS + ( + SELECT CASE WHEN ObjectItem LIKE '-%' THEN RIGHT(ObjectItem,LEN(ObjectItem) - 1) ELSE ObjectItem END AS ObjectItem, + StartPosition, + CASE WHEN ObjectItem LIKE '-%' THEN 0 ELSE 1 END AS Selected + FROM Objects1 + ), + Objects3 (ObjectItem, StartPosition, Selected) AS + ( + SELECT CASE WHEN ObjectItem = 'ALL_OBJECTS' THEN '%.%.%' ELSE ObjectItem END AS ObjectItem, + StartPosition, + Selected + FROM Objects2 + ), + Objects4 (DatabaseName, SchemaName, ObjectName, StartPosition, Selected) AS + ( + SELECT CASE WHEN PARSENAME(ObjectItem,4) IS NULL THEN PARSENAME(ObjectItem,3) ELSE NULL END AS DatabaseName, + CASE WHEN PARSENAME(ObjectItem,4) IS NULL THEN PARSENAME(ObjectItem,2) ELSE NULL END AS SchemaName, + CASE WHEN PARSENAME(ObjectItem,4) IS NULL THEN PARSENAME(ObjectItem,1) ELSE NULL END AS ObjectName, + StartPosition, + Selected + FROM Objects3 + ) + INSERT INTO @SelectedObjects (DatabaseName, SchemaName, ObjectName, StartPosition, Selected) + SELECT DatabaseName, SchemaName, ObjectName, StartPosition, Selected + FROM Objects4 + OPTION (MAXRECURSION 0) + + ---------------------------------------------------------------------------------------------------- + --// Select check commands //-- + ---------------------------------------------------------------------------------------------------- + + SET @CheckCommands = REPLACE(@CheckCommands, @StringDelimiter + ' ', @StringDelimiter); + + WITH CheckCommands (StartPosition, EndPosition, CheckCommand) AS + ( + SELECT 1 AS StartPosition, + ISNULL(NULLIF(CHARINDEX(@StringDelimiter, @CheckCommands, 1), 0), LEN(@CheckCommands) + 1) AS EndPosition, + SUBSTRING(@CheckCommands, 1, ISNULL(NULLIF(CHARINDEX(@StringDelimiter, @CheckCommands, 1), 0), LEN(@CheckCommands) + 1) - 1) AS CheckCommand + WHERE @CheckCommands IS NOT NULL + UNION ALL + SELECT CAST(EndPosition AS int) + 1 AS StartPosition, + ISNULL(NULLIF(CHARINDEX(@StringDelimiter, @CheckCommands, EndPosition + 1), 0), LEN(@CheckCommands) + 1) AS EndPosition, + SUBSTRING(@CheckCommands, EndPosition + 1, ISNULL(NULLIF(CHARINDEX(@StringDelimiter, @CheckCommands, EndPosition + 1), 0), LEN(@CheckCommands) + 1) - EndPosition - 1) AS CheckCommand + FROM CheckCommands + WHERE EndPosition < LEN(@CheckCommands) + 1 + ) + INSERT INTO @SelectedCheckCommands (CheckCommand) + SELECT CheckCommand + FROM CheckCommands + OPTION (MAXRECURSION 0) + + ---------------------------------------------------------------------------------------------------- + --// Check input parameters //-- + ---------------------------------------------------------------------------------------------------- + + IF EXISTS (SELECT * FROM @SelectedCheckCommands WHERE CheckCommand NOT IN('CHECKDB','CHECKFILEGROUP','CHECKALLOC','CHECKTABLE','CHECKCATALOG')) + BEGIN + INSERT INTO @Errors ([Message], Severity, [State]) + SELECT 'The value for the parameter @CheckCommands is not supported.', 16, 1 + END + + IF EXISTS (SELECT * FROM @SelectedCheckCommands GROUP BY CheckCommand HAVING COUNT(*) > 1) + BEGIN + INSERT INTO @Errors ([Message], Severity, [State]) + SELECT 'The value for the parameter @CheckCommands is not supported.', 16, 2 + END + + IF NOT EXISTS (SELECT * FROM @SelectedCheckCommands) + BEGIN + INSERT INTO @Errors ([Message], Severity, [State]) + SELECT 'The value for the parameter @CheckCommands is not supported.' , 16, 3 + END + + IF EXISTS (SELECT * FROM @SelectedCheckCommands WHERE CheckCommand IN('CHECKDB')) AND EXISTS (SELECT CheckCommand FROM @SelectedCheckCommands WHERE CheckCommand IN('CHECKFILEGROUP','CHECKALLOC','CHECKTABLE','CHECKCATALOG')) + BEGIN + INSERT INTO @Errors ([Message], Severity, [State]) + SELECT 'The value for the parameter @CheckCommands is not supported.', 16, 4 + END + + IF EXISTS (SELECT * FROM @SelectedCheckCommands WHERE CheckCommand IN('CHECKFILEGROUP')) AND EXISTS (SELECT CheckCommand FROM @SelectedCheckCommands WHERE CheckCommand IN('CHECKALLOC','CHECKTABLE')) + BEGIN + INSERT INTO @Errors ([Message], Severity, [State]) + SELECT 'The value for the parameter @CheckCommands is not supported.', 16, 5 + END + + ---------------------------------------------------------------------------------------------------- + + IF @PhysicalOnly NOT IN ('Y','N') OR @PhysicalOnly IS NULL + BEGIN + INSERT INTO @Errors ([Message], Severity, [State]) + SELECT 'The value for the parameter @PhysicalOnly is not supported.', 16, 1 + END + + ---------------------------------------------------------------------------------------------------- + + IF @DataPurity NOT IN ('Y','N') OR @DataPurity IS NULL + BEGIN + INSERT INTO @Errors ([Message], Severity, [State]) + SELECT 'The value for the parameter @DataPurity is not supported.', 16, 1 + END + + IF @PhysicalOnly = 'Y' AND @DataPurity = 'Y' + BEGIN + INSERT INTO @Errors ([Message], Severity, [State]) + SELECT 'The parameters @PhysicalOnly and @DataPurity cannot be used together.', 16, 2 + END + + ---------------------------------------------------------------------------------------------------- + + IF @NoIndex NOT IN ('Y','N') OR @NoIndex IS NULL + BEGIN + INSERT INTO @Errors ([Message], Severity, [State]) + SELECT 'The value for the parameter @NoIndex is not supported.', 16, 1 + END + + ---------------------------------------------------------------------------------------------------- + + IF @ExtendedLogicalChecks NOT IN ('Y','N') OR @ExtendedLogicalChecks IS NULL + BEGIN + INSERT INTO @Errors ([Message], Severity, [State]) + SELECT 'The value for the parameter @ExtendedLogicalChecks is not supported.', 16, 1 + END + + IF @PhysicalOnly = 'Y' AND @ExtendedLogicalChecks = 'Y' + BEGIN + INSERT INTO @Errors ([Message], Severity, [State]) + SELECT 'The parameters @PhysicalOnly and @ExtendedLogicalChecks cannot be used together.', 16, 2 + END + + ---------------------------------------------------------------------------------------------------- + + IF @TabLock NOT IN ('Y','N') OR @TabLock IS NULL + BEGIN + INSERT INTO @Errors ([Message], Severity, [State]) + SELECT 'The value for the parameter @TabLock is not supported.', 16, 1 + END + + ---------------------------------------------------------------------------------------------------- + + IF EXISTS(SELECT * FROM @SelectedFileGroups WHERE DatabaseName IS NULL OR FileGroupName IS NULL) + BEGIN + INSERT INTO @Errors ([Message], Severity, [State]) + SELECT 'The value for the parameter @FileGroups is not supported.', 16, 1 + END + + IF @FileGroups IS NOT NULL AND NOT EXISTS(SELECT * FROM @SelectedFileGroups) + BEGIN + INSERT INTO @Errors ([Message], Severity, [State]) + SELECT 'The value for the parameter @FileGroups is not supported.', 16, 2 + END + + IF @FileGroups IS NOT NULL AND NOT EXISTS (SELECT * FROM @SelectedCheckCommands WHERE CheckCommand = 'CHECKFILEGROUP') + BEGIN + INSERT INTO @Errors ([Message], Severity, [State]) + SELECT 'The value for the parameter @FileGroups is not supported.', 16, 3 + END + + ---------------------------------------------------------------------------------------------------- + + IF EXISTS(SELECT * FROM @SelectedObjects WHERE DatabaseName IS NULL OR SchemaName IS NULL OR ObjectName IS NULL) + BEGIN + INSERT INTO @Errors ([Message], Severity, [State]) + SELECT 'The value for the parameter @Objects is not supported.', 16, 1 + END + + IF (@Objects IS NOT NULL AND NOT EXISTS(SELECT * FROM @SelectedObjects)) + BEGIN + INSERT INTO @Errors ([Message], Severity, [State]) + SELECT 'The value for the parameter @Objects is not supported.', 16, 2 + END + + IF (@Objects IS NOT NULL AND NOT EXISTS (SELECT * FROM @SelectedCheckCommands WHERE CheckCommand = 'CHECKTABLE')) + BEGIN + INSERT INTO @Errors ([Message], Severity, [State]) + SELECT 'The value for the parameter @Objects is not supported.', 16, 3 + END + + ---------------------------------------------------------------------------------------------------- + + IF @MaxDOP < 0 OR @MaxDOP > 64 + BEGIN + INSERT INTO @Errors ([Message], Severity, [State]) + SELECT 'The value for the parameter @MaxDOP is not supported.', 16, 1 + END + + IF @MaxDOP IS NOT NULL AND NOT (@Version >= 12.050000 OR SERVERPROPERTY('EngineEdition') IN (5, 8)) + BEGIN + INSERT INTO @Errors ([Message], Severity, [State]) + SELECT 'The value for the parameter @MaxDOP is not supported. MAXDOP is not available in this version of SQL Server.', 16, 2 + END + + ---------------------------------------------------------------------------------------------------- + + IF @AvailabilityGroupReplicas NOT IN('ALL','PRIMARY','SECONDARY','PREFERRED_BACKUP_REPLICA') OR @AvailabilityGroupReplicas IS NULL + BEGIN + INSERT INTO @Errors ([Message], Severity, [State]) + SELECT 'The value for the parameter @AvailabilityGroupReplicas is not supported.', 16, 1 + END + + ---------------------------------------------------------------------------------------------------- + + IF @Updateability NOT IN('READ_ONLY','READ_WRITE','ALL') OR @Updateability IS NULL + BEGIN + INSERT INTO @Errors ([Message], Severity, [State]) + SELECT 'The value for the parameter @Updateability is not supported.', 16, 1 + END + + ---------------------------------------------------------------------------------------------------- + + IF @TimeLimit < 0 + BEGIN + INSERT INTO @Errors ([Message], Severity, [State]) + SELECT 'The value for the parameter @TimeLimit is not supported.', 16, 1 + END + + ---------------------------------------------------------------------------------------------------- + + IF @LockTimeout < 0 + BEGIN + INSERT INTO @Errors ([Message], Severity, [State]) + SELECT 'The value for the parameter @LockTimeout is not supported.', 16, 1 + END + + ---------------------------------------------------------------------------------------------------- + + IF @LockMessageSeverity NOT IN(10, 16) + BEGIN + INSERT INTO @Errors ([Message], Severity, [State]) + SELECT 'The value for the parameter @LockMessageSeverity is not supported.', 16, 1 + END + + ---------------------------------------------------------------------------------------------------- + + IF @StringDelimiter IS NULL OR LEN(@StringDelimiter) > 1 + BEGIN + INSERT INTO @Errors ([Message], Severity, [State]) + SELECT 'The value for the parameter @StringDelimiter is not supported.', 16, 1 + END + + ---------------------------------------------------------------------------------------------------- + + IF @DatabaseOrder NOT IN('DATABASE_NAME_ASC','DATABASE_NAME_DESC','DATABASE_SIZE_ASC','DATABASE_SIZE_DESC','DATABASE_LAST_GOOD_CHECK_ASC','DATABASE_LAST_GOOD_CHECK_DESC','REPLICA_LAST_GOOD_CHECK_ASC','REPLICA_LAST_GOOD_CHECK_DESC') + BEGIN + INSERT INTO @Errors ([Message], Severity, [State]) + SELECT 'The value for the parameter @DatabaseOrder is not supported.', 16, 1 + END + + IF @DatabaseOrder IN('DATABASE_LAST_GOOD_CHECK_ASC','DATABASE_LAST_GOOD_CHECK_DESC') AND NOT ((@Version >= 12.06024 AND @Version < 13) OR (@Version >= 13.05026 AND @Version < 14) OR @Version >= 14.0302916) + BEGIN + INSERT INTO @Errors ([Message], Severity, [State]) + SELECT 'The value for the parameter @DatabaseOrder is not supported. DATABASEPROPERTYEX(''DatabaseName'', ''LastGoodCheckDbTime'') is not available in this version of SQL Server.', 16, 2 + END + + IF @DatabaseOrder IN('REPLICA_LAST_GOOD_CHECK_ASC','REPLICA_LAST_GOOD_CHECK_DESC') AND @LogToTable = 'N' + BEGIN + INSERT INTO @Errors ([Message], Severity, [State]) + SELECT 'The value for the parameter @DatabaseOrder is not supported. You need to provide the parameter @LogToTable = ''Y''.', 16, 3 + END + + IF @DatabaseOrder IN('DATABASE_LAST_GOOD_CHECK_ASC','DATABASE_LAST_GOOD_CHECK_DESC','REPLICA_LAST_GOOD_CHECK_ASC','REPLICA_LAST_GOOD_CHECK_DESC') AND @CheckCommands <> 'CHECKDB' + BEGIN + INSERT INTO @Errors ([Message], Severity, [State]) + SELECT 'The value for the parameter @DatabaseOrder is not supported. You need to provide the parameter @CheckCommands = ''CHECKDB''.', 16, 4 + END + + IF @DatabaseOrder IS NOT NULL AND SERVERPROPERTY('EngineEdition') = 5 + BEGIN + INSERT INTO @Errors ([Message], Severity, [State]) + SELECT 'The value for the parameter @DatabaseOrder is not supported. This parameter is not supported in Azure SQL Database.', 16, 5 + END + + ---------------------------------------------------------------------------------------------------- + + IF @DatabasesInParallel NOT IN('Y','N') OR @DatabasesInParallel IS NULL + BEGIN + INSERT INTO @Errors ([Message], Severity, [State]) + SELECT 'The value for the parameter @DatabasesInParallel is not supported.', 16, 1 + END + + IF @DatabasesInParallel = 'Y' AND SERVERPROPERTY('EngineEdition') = 5 + BEGIN + INSERT INTO @Errors ([Message], Severity, [State]) + SELECT 'The value for the parameter @DatabasesInParallel is not supported. This parameter is not supported in Azure SQL Database.', 16, 2 + END + + ---------------------------------------------------------------------------------------------------- + + IF @LogToTable NOT IN('Y','N') OR @LogToTable IS NULL + BEGIN + INSERT INTO @Errors ([Message], Severity, [State]) + SELECT 'The value for the parameter @LogToTable is not supported.', 16, 1 + END + + ---------------------------------------------------------------------------------------------------- + + IF @Execute NOT IN('Y','N') OR @Execute IS NULL + BEGIN + INSERT INTO @Errors ([Message], Severity, [State]) + SELECT 'The value for the parameter @Execute is not supported.', 16, 1 + END + + ---------------------------------------------------------------------------------------------------- + + IF EXISTS(SELECT * FROM @Errors) + BEGIN + INSERT INTO @Errors ([Message], Severity, [State]) + SELECT 'The documentation is available at https://ola.hallengren.com/sql-server-integrity-check.html.', 16, 1 + END + + ---------------------------------------------------------------------------------------------------- + --// Check that selected databases and availability groups exist //-- + ---------------------------------------------------------------------------------------------------- + + SET @ErrorMessage = '' + SELECT @ErrorMessage = @ErrorMessage + QUOTENAME(DatabaseName) + ', ' + FROM @SelectedDatabases + WHERE DatabaseName NOT LIKE '%[%]%' + AND DatabaseName NOT IN (SELECT DatabaseName FROM @tmpDatabases) + IF @@ROWCOUNT > 0 + BEGIN + INSERT INTO @Errors ([Message], Severity, [State]) + SELECT 'The following databases in the @Databases parameter do not exist: ' + LEFT(@ErrorMessage,LEN(@ErrorMessage)-1) + '.', 10, 1 + END + + SET @ErrorMessage = '' + SELECT @ErrorMessage = @ErrorMessage + QUOTENAME(DatabaseName) + ', ' + FROM @SelectedFileGroups + WHERE DatabaseName NOT LIKE '%[%]%' + AND DatabaseName NOT IN (SELECT DatabaseName FROM @tmpDatabases) + IF @@ROWCOUNT > 0 + BEGIN + INSERT INTO @Errors ([Message], Severity, [State]) + SELECT 'The following databases in the @FileGroups parameter do not exist: ' + LEFT(@ErrorMessage,LEN(@ErrorMessage)-1) + '.', 10, 1 + END + + SET @ErrorMessage = '' + SELECT @ErrorMessage = @ErrorMessage + QUOTENAME(DatabaseName) + ', ' + FROM @SelectedObjects + WHERE DatabaseName NOT LIKE '%[%]%' + AND DatabaseName NOT IN (SELECT DatabaseName FROM @tmpDatabases) + IF @@ROWCOUNT > 0 + BEGIN + INSERT INTO @Errors ([Message], Severity, [State]) + SELECT 'The following databases in the @Objects parameter do not exist: ' + LEFT(@ErrorMessage,LEN(@ErrorMessage)-1) + '.', 10, 1 + END + + SET @ErrorMessage = '' + SELECT @ErrorMessage = @ErrorMessage + QUOTENAME(AvailabilityGroupName) + ', ' + FROM @SelectedAvailabilityGroups + WHERE AvailabilityGroupName NOT LIKE '%[%]%' + AND AvailabilityGroupName NOT IN (SELECT AvailabilityGroupName FROM @tmpAvailabilityGroups) + IF @@ROWCOUNT > 0 + BEGIN + INSERT INTO @Errors ([Message], Severity, [State]) + SELECT 'The following availability groups do not exist: ' + LEFT(@ErrorMessage,LEN(@ErrorMessage)-1) + '.', 10, 1 + END + + SET @ErrorMessage = '' + SELECT @ErrorMessage = @ErrorMessage + QUOTENAME(DatabaseName) + ', ' + FROM @SelectedFileGroups + WHERE DatabaseName NOT LIKE '%[%]%' + AND DatabaseName IN (SELECT DatabaseName FROM @tmpDatabases) + AND DatabaseName NOT IN (SELECT DatabaseName FROM @tmpDatabases WHERE Selected = 1) + IF @@ROWCOUNT > 0 + BEGIN + INSERT INTO @Errors ([Message], Severity, [State]) + SELECT 'The following databases have been selected in the @FileGroups parameter, but not in the @Databases or @AvailabilityGroups parameters: ' + LEFT(@ErrorMessage,LEN(@ErrorMessage)-1) + '.', 10, 1 + END + + SET @ErrorMessage = '' + SELECT @ErrorMessage = @ErrorMessage + QUOTENAME(DatabaseName) + ', ' + FROM @SelectedObjects + WHERE DatabaseName NOT LIKE '%[%]%' + AND DatabaseName IN (SELECT DatabaseName FROM @tmpDatabases) + AND DatabaseName NOT IN (SELECT DatabaseName FROM @tmpDatabases WHERE Selected = 1) + IF @@ROWCOUNT > 0 + BEGIN + INSERT INTO @Errors ([Message], Severity, [State]) + SELECT 'The following databases have been selected in the @Objects parameter, but not in the @Databases or @AvailabilityGroups parameters: ' + LEFT(@ErrorMessage,LEN(@ErrorMessage)-1) + '.', 10, 1 + END + + ---------------------------------------------------------------------------------------------------- + --// Check @@SERVERNAME //-- + ---------------------------------------------------------------------------------------------------- + + IF @@SERVERNAME <> CAST(SERVERPROPERTY('ServerName') AS nvarchar(max)) AND SERVERPROPERTY('IsHadrEnabled') = 1 + BEGIN + INSERT INTO @Errors ([Message], Severity, [State]) + SELECT 'The @@SERVERNAME does not match SERVERPROPERTY(''ServerName''). See ' + CASE WHEN SERVERPROPERTY('IsClustered') = 0 THEN 'https://docs.microsoft.com/en-us/sql/database-engine/install-windows/rename-a-computer-that-hosts-a-stand-alone-instance-of-sql-server' WHEN SERVERPROPERTY('IsClustered') = 1 THEN 'https://docs.microsoft.com/en-us/sql/sql-server/failover-clusters/install/rename-a-sql-server-failover-cluster-instance' END + '.', 16, 1 + END + + ---------------------------------------------------------------------------------------------------- + --// Raise errors //-- + ---------------------------------------------------------------------------------------------------- + + DECLARE ErrorCursor CURSOR FAST_FORWARD FOR SELECT [Message], Severity, [State] FROM @Errors ORDER BY [ID] ASC + + OPEN ErrorCursor + + FETCH ErrorCursor INTO @CurrentMessage, @CurrentSeverity, @CurrentState + + WHILE @@FETCH_STATUS = 0 + BEGIN + RAISERROR('%s', @CurrentSeverity, @CurrentState, @CurrentMessage) WITH NOWAIT + RAISERROR(@EmptyLine, 10, 1) WITH NOWAIT + + FETCH NEXT FROM ErrorCursor INTO @CurrentMessage, @CurrentSeverity, @CurrentState + END + + CLOSE ErrorCursor + + DEALLOCATE ErrorCursor + + IF EXISTS (SELECT * FROM @Errors WHERE Severity >= 16) + BEGIN + SET @ReturnCode = 50000 + GOTO Logging + END + + ---------------------------------------------------------------------------------------------------- + --// Update database order //-- + ---------------------------------------------------------------------------------------------------- + + IF @DatabaseOrder IN('DATABASE_SIZE_ASC','DATABASE_SIZE_DESC') + BEGIN + UPDATE tmpDatabases + SET DatabaseSize = (SELECT SUM(CAST(size AS bigint)) FROM sys.master_files WHERE [type] = 0 AND database_id = DB_ID(tmpDatabases.DatabaseName)) + FROM @tmpDatabases tmpDatabases + END + + IF @DatabaseOrder IN('DATABASE_LAST_GOOD_CHECK_ASC','DATABASE_LAST_GOOD_CHECK_DESC') + BEGIN + UPDATE tmpDatabases + SET LastGoodCheckDbTime = NULLIF(CAST(DATABASEPROPERTYEX (DatabaseName,'LastGoodCheckDbTime') AS datetime2),'1900-01-01 00:00:00.000') + FROM @tmpDatabases tmpDatabases + END + + IF @DatabaseOrder IN('REPLICA_LAST_GOOD_CHECK_ASC','REPLICA_LAST_GOOD_CHECK_DESC') + BEGIN + UPDATE tmpDatabases + SET LastCommandTime = MaxStartTime + FROM @tmpDatabases tmpDatabases + INNER JOIN (SELECT DatabaseName, MAX(StartTime) AS MaxStartTime + FROM dbo.CommandLog + WHERE CommandType = 'DBCC_CHECKDB' + AND ErrorNumber = 0 + GROUP BY DatabaseName) CommandLog + ON tmpDatabases.DatabaseName = CommandLog.DatabaseName COLLATE DATABASE_DEFAULT + END + + IF @DatabaseOrder IS NULL + BEGIN + WITH tmpDatabases AS ( + SELECT DatabaseName, [Order], ROW_NUMBER() OVER (ORDER BY StartPosition ASC, DatabaseName ASC) AS RowNumber + FROM @tmpDatabases tmpDatabases + WHERE Selected = 1 + ) + UPDATE tmpDatabases + SET [Order] = RowNumber + END + ELSE + IF @DatabaseOrder = 'DATABASE_NAME_ASC' + BEGIN + WITH tmpDatabases AS ( + SELECT DatabaseName, [Order], ROW_NUMBER() OVER (ORDER BY DatabaseName ASC) AS RowNumber + FROM @tmpDatabases tmpDatabases + WHERE Selected = 1 + ) + UPDATE tmpDatabases + SET [Order] = RowNumber + END + ELSE + IF @DatabaseOrder = 'DATABASE_NAME_DESC' + BEGIN + WITH tmpDatabases AS ( + SELECT DatabaseName, [Order], ROW_NUMBER() OVER (ORDER BY DatabaseName DESC) AS RowNumber + FROM @tmpDatabases tmpDatabases + WHERE Selected = 1 + ) + UPDATE tmpDatabases + SET [Order] = RowNumber + END + ELSE + IF @DatabaseOrder = 'DATABASE_SIZE_ASC' + BEGIN + WITH tmpDatabases AS ( + SELECT DatabaseName, [Order], ROW_NUMBER() OVER (ORDER BY DatabaseSize ASC) AS RowNumber + FROM @tmpDatabases tmpDatabases + WHERE Selected = 1 + ) + UPDATE tmpDatabases + SET [Order] = RowNumber + END + ELSE + IF @DatabaseOrder = 'DATABASE_SIZE_DESC' + BEGIN + WITH tmpDatabases AS ( + SELECT DatabaseName, [Order], ROW_NUMBER() OVER (ORDER BY DatabaseSize DESC) AS RowNumber + FROM @tmpDatabases tmpDatabases + WHERE Selected = 1 + ) + UPDATE tmpDatabases + SET [Order] = RowNumber + END + ELSE + IF @DatabaseOrder = 'DATABASE_LAST_GOOD_CHECK_ASC' + BEGIN + WITH tmpDatabases AS ( + SELECT DatabaseName, [Order], ROW_NUMBER() OVER (ORDER BY LastGoodCheckDbTime ASC) AS RowNumber + FROM @tmpDatabases tmpDatabases + WHERE Selected = 1 + ) + UPDATE tmpDatabases + SET [Order] = RowNumber + END + ELSE + IF @DatabaseOrder = 'DATABASE_LAST_GOOD_CHECK_DESC' + BEGIN + WITH tmpDatabases AS ( + SELECT DatabaseName, [Order], ROW_NUMBER() OVER (ORDER BY LastGoodCheckDbTime DESC) AS RowNumber + FROM @tmpDatabases tmpDatabases + WHERE Selected = 1 + ) + UPDATE tmpDatabases + SET [Order] = RowNumber + END + ELSE + IF @DatabaseOrder = 'REPLICA_LAST_GOOD_CHECK_ASC' + BEGIN + WITH tmpDatabases AS ( + SELECT DatabaseName, [Order], ROW_NUMBER() OVER (ORDER BY LastCommandTime ASC) AS RowNumber + FROM @tmpDatabases tmpDatabases + WHERE Selected = 1 + ) + UPDATE tmpDatabases + SET [Order] = RowNumber + END + ELSE + IF @DatabaseOrder = 'REPLICA_LAST_GOOD_CHECK_DESC' + BEGIN + WITH tmpDatabases AS ( + SELECT DatabaseName, [Order], ROW_NUMBER() OVER (ORDER BY LastCommandTime DESC) AS RowNumber + FROM @tmpDatabases tmpDatabases + WHERE Selected = 1 + ) + UPDATE tmpDatabases + SET [Order] = RowNumber + END + + ---------------------------------------------------------------------------------------------------- + --// Update the queue //-- + ---------------------------------------------------------------------------------------------------- + + IF @DatabasesInParallel = 'Y' + BEGIN + + BEGIN TRY + + SELECT @QueueID = QueueID + FROM dbo.[Queue] + WHERE SchemaName = @SchemaName + AND ObjectName = @ObjectName + AND [Parameters] = @Parameters + + IF @QueueID IS NULL + BEGIN + BEGIN TRANSACTION + + SELECT @QueueID = QueueID + FROM dbo.[Queue] WITH (UPDLOCK, HOLDLOCK) + WHERE SchemaName = @SchemaName + AND ObjectName = @ObjectName + AND [Parameters] = @Parameters + + IF @QueueID IS NULL + BEGIN + INSERT INTO dbo.[Queue] (SchemaName, ObjectName, [Parameters]) + SELECT @SchemaName, @ObjectName, @Parameters + + SET @QueueID = SCOPE_IDENTITY() + END + + COMMIT TRANSACTION + END + + BEGIN TRANSACTION + + UPDATE [Queue] + SET QueueStartTime = SYSDATETIME(), + SessionID = @@SPID, + RequestID = (SELECT request_id FROM sys.dm_exec_requests WHERE session_id = @@SPID), + RequestStartTime = (SELECT start_time FROM sys.dm_exec_requests WHERE session_id = @@SPID) + FROM dbo.[Queue] [Queue] + WHERE QueueID = @QueueID + AND NOT EXISTS (SELECT * + FROM sys.dm_exec_requests + WHERE session_id = [Queue].SessionID + AND request_id = [Queue].RequestID + AND start_time = [Queue].RequestStartTime) + AND NOT EXISTS (SELECT * + FROM dbo.QueueDatabase QueueDatabase + INNER JOIN sys.dm_exec_requests ON QueueDatabase.SessionID = session_id AND QueueDatabase.RequestID = request_id AND QueueDatabase.RequestStartTime = start_time + WHERE QueueDatabase.QueueID = @QueueID) + + IF @@ROWCOUNT = 1 + BEGIN + INSERT INTO dbo.QueueDatabase (QueueID, DatabaseName) + SELECT @QueueID AS QueueID, + DatabaseName + FROM @tmpDatabases tmpDatabases + WHERE Selected = 1 + AND NOT EXISTS (SELECT * FROM dbo.QueueDatabase WHERE DatabaseName = tmpDatabases.DatabaseName AND QueueID = @QueueID) + + DELETE QueueDatabase + FROM dbo.QueueDatabase QueueDatabase + WHERE QueueID = @QueueID + AND NOT EXISTS (SELECT * FROM @tmpDatabases tmpDatabases WHERE DatabaseName = QueueDatabase.DatabaseName AND Selected = 1) + + UPDATE QueueDatabase + SET DatabaseOrder = tmpDatabases.[Order] + FROM dbo.QueueDatabase QueueDatabase + INNER JOIN @tmpDatabases tmpDatabases ON QueueDatabase.DatabaseName = tmpDatabases.DatabaseName + WHERE QueueID = @QueueID + END + + COMMIT TRANSACTION + + SELECT @QueueStartTime = QueueStartTime + FROM dbo.[Queue] + WHERE QueueID = @QueueID + + END TRY + + BEGIN CATCH + IF XACT_STATE() <> 0 + BEGIN + ROLLBACK TRANSACTION + END + SET @ErrorMessage = 'Msg ' + CAST(ERROR_NUMBER() AS nvarchar) + ', ' + ISNULL(ERROR_MESSAGE(),'') + RAISERROR('%s',16,1,@ErrorMessage) WITH NOWAIT + RAISERROR(@EmptyLine,10,1) WITH NOWAIT + SET @ReturnCode = ERROR_NUMBER() + GOTO Logging + END CATCH + + END + + ---------------------------------------------------------------------------------------------------- + --// Execute commands //-- + ---------------------------------------------------------------------------------------------------- + + WHILE (1 = 1) + BEGIN + + IF @DatabasesInParallel = 'Y' + BEGIN + UPDATE QueueDatabase + SET DatabaseStartTime = NULL, + SessionID = NULL, + RequestID = NULL, + RequestStartTime = NULL + FROM dbo.QueueDatabase QueueDatabase + WHERE QueueID = @QueueID + AND DatabaseStartTime IS NOT NULL + AND DatabaseEndTime IS NULL + AND NOT EXISTS (SELECT * FROM sys.dm_exec_requests WHERE session_id = QueueDatabase.SessionID AND request_id = QueueDatabase.RequestID AND start_time = QueueDatabase.RequestStartTime) + + UPDATE QueueDatabase + SET DatabaseStartTime = SYSDATETIME(), + DatabaseEndTime = NULL, + SessionID = @@SPID, + RequestID = (SELECT request_id FROM sys.dm_exec_requests WHERE session_id = @@SPID), + RequestStartTime = (SELECT start_time FROM sys.dm_exec_requests WHERE session_id = @@SPID), + @CurrentDatabaseName = DatabaseName + FROM (SELECT TOP 1 DatabaseStartTime, + DatabaseEndTime, + SessionID, + RequestID, + RequestStartTime, + DatabaseName + FROM dbo.QueueDatabase + WHERE QueueID = @QueueID + AND (DatabaseStartTime < @QueueStartTime OR DatabaseStartTime IS NULL) + AND NOT (DatabaseStartTime IS NOT NULL AND DatabaseEndTime IS NULL) + ORDER BY DatabaseOrder ASC + ) QueueDatabase + END + ELSE + BEGIN + SELECT TOP 1 @CurrentDBID = ID, + @CurrentDatabaseName = DatabaseName + FROM @tmpDatabases + WHERE Selected = 1 + AND Completed = 0 + ORDER BY [Order] ASC + END + + IF @@ROWCOUNT = 0 + BEGIN + BREAK + END + + SET @CurrentDatabase_sp_executesql = QUOTENAME(@CurrentDatabaseName) + '.sys.sp_executesql' + + BEGIN + SET @DatabaseMessage = 'Date and time: ' + CONVERT(nvarchar,SYSDATETIME(),120) + RAISERROR('%s',10,1,@DatabaseMessage) WITH NOWAIT + + SET @DatabaseMessage = 'Database: ' + QUOTENAME(@CurrentDatabaseName) + RAISERROR('%s',10,1,@DatabaseMessage) WITH NOWAIT + END + + SELECT @CurrentUserAccess = user_access_desc, + @CurrentIsReadOnly = is_read_only, + @CurrentDatabaseState = state_desc, + @CurrentInStandby = is_in_standby, + @CurrentRecoveryModel = recovery_model_desc + FROM sys.databases + WHERE [name] = @CurrentDatabaseName + + BEGIN + SET @DatabaseMessage = 'State: ' + @CurrentDatabaseState + RAISERROR('%s',10,1,@DatabaseMessage) WITH NOWAIT + + SET @DatabaseMessage = 'Standby: ' + CASE WHEN @CurrentInStandby = 1 THEN 'Yes' ELSE 'No' END + RAISERROR('%s',10,1,@DatabaseMessage) WITH NOWAIT + + SET @DatabaseMessage = 'Updateability: ' + CASE WHEN @CurrentIsReadOnly = 1 THEN 'READ_ONLY' WHEN @CurrentIsReadOnly = 0 THEN 'READ_WRITE' END + RAISERROR('%s',10,1,@DatabaseMessage) WITH NOWAIT + + SET @DatabaseMessage = 'User access: ' + @CurrentUserAccess + RAISERROR('%s',10,1,@DatabaseMessage) WITH NOWAIT + + SET @DatabaseMessage = 'Recovery model: ' + @CurrentRecoveryModel + RAISERROR('%s',10,1,@DatabaseMessage) WITH NOWAIT + END + + IF @CurrentDatabaseState = 'ONLINE' AND SERVERPROPERTY('EngineEdition') <> 5 + BEGIN + IF EXISTS (SELECT * FROM sys.database_recovery_status WHERE database_id = DB_ID(@CurrentDatabaseName) AND database_guid IS NOT NULL) + BEGIN + SET @CurrentIsDatabaseAccessible = 1 + END + ELSE + BEGIN + SET @CurrentIsDatabaseAccessible = 0 + END + END + + IF @Version >= 11 AND SERVERPROPERTY('IsHadrEnabled') = 1 + BEGIN + SELECT @CurrentAvailabilityGroup = availability_groups.name, + @CurrentAvailabilityGroupRole = dm_hadr_availability_replica_states.role_desc, + @CurrentAvailabilityGroupBackupPreference = UPPER(availability_groups.automated_backup_preference_desc) + FROM sys.databases databases + INNER JOIN sys.dm_hadr_availability_replica_states dm_hadr_availability_replica_states ON databases.replica_id = dm_hadr_availability_replica_states.replica_id + INNER JOIN sys.availability_groups availability_groups ON dm_hadr_availability_replica_states.group_id = availability_groups.group_id + WHERE databases.name = @CurrentDatabaseName + END + + IF @Version >= 11 AND SERVERPROPERTY('IsHadrEnabled') = 1 AND @CurrentAvailabilityGroup IS NOT NULL AND @AvailabilityGroupReplicas = 'PREFERRED_BACKUP_REPLICA' + BEGIN + SELECT @CurrentIsPreferredBackupReplica = sys.fn_hadr_backup_is_preferred_replica(@CurrentDatabaseName) + END + + IF SERVERPROPERTY('EngineEdition') <> 5 + BEGIN + SELECT @CurrentDatabaseMirroringRole = UPPER(mirroring_role_desc) + FROM sys.database_mirroring + WHERE database_id = DB_ID(@CurrentDatabaseName) + END + + IF @CurrentIsDatabaseAccessible IS NOT NULL + BEGIN + SET @DatabaseMessage = 'Is accessible: ' + CASE WHEN @CurrentIsDatabaseAccessible = 1 THEN 'Yes' ELSE 'No' END + RAISERROR('%s',10,1,@DatabaseMessage) WITH NOWAIT + END + + IF @CurrentAvailabilityGroup IS NOT NULL + BEGIN + SET @DatabaseMessage = 'Availability group: ' + ISNULL(@CurrentAvailabilityGroup,'N/A') + RAISERROR('%s',10,1,@DatabaseMessage) WITH NOWAIT + + SET @DatabaseMessage = 'Availability group role: ' + ISNULL(@CurrentAvailabilityGroupRole,'N/A') + RAISERROR('%s',10,1,@DatabaseMessage) WITH NOWAIT + + IF @AvailabilityGroupReplicas = 'PREFERRED_BACKUP_REPLICA' + BEGIN + SET @DatabaseMessage = 'Availability group backup preference: ' + ISNULL(@CurrentAvailabilityGroupBackupPreference,'N/A') + RAISERROR('%s',10,1,@DatabaseMessage) WITH NOWAIT + + SET @DatabaseMessage = 'Is preferred backup replica: ' + CASE WHEN @CurrentIsPreferredBackupReplica = 1 THEN 'Yes' WHEN @CurrentIsPreferredBackupReplica = 0 THEN 'No' ELSE 'N/A' END + RAISERROR('%s',10,1,@DatabaseMessage) WITH NOWAIT + END + END + + IF @CurrentDatabaseMirroringRole IS NOT NULL + BEGIN + SET @DatabaseMessage = 'Database mirroring role: ' + @CurrentDatabaseMirroringRole + RAISERROR('%s',10,1,@DatabaseMessage) WITH NOWAIT + END + + RAISERROR(@EmptyLine,10,1) WITH NOWAIT + + IF @CurrentDatabaseState = 'ONLINE' + AND NOT (@CurrentUserAccess = 'SINGLE_USER' AND @CurrentIsDatabaseAccessible = 0) + AND (@CurrentAvailabilityGroupRole = 'PRIMARY' OR @CurrentAvailabilityGroupRole IS NULL OR SERVERPROPERTY('EngineEdition') = 3) + AND ((@AvailabilityGroupReplicas = 'PRIMARY' AND @CurrentAvailabilityGroupRole = 'PRIMARY') OR (@AvailabilityGroupReplicas = 'SECONDARY' AND @CurrentAvailabilityGroupRole = 'SECONDARY') OR (@AvailabilityGroupReplicas = 'PREFERRED_BACKUP_REPLICA' AND @CurrentIsPreferredBackupReplica = 1) OR @AvailabilityGroupReplicas = 'ALL' OR @CurrentAvailabilityGroupRole IS NULL) + AND NOT (@CurrentIsReadOnly = 1 AND @Updateability = 'READ_WRITE') + AND NOT (@CurrentIsReadOnly = 0 AND @Updateability = 'READ_ONLY') + BEGIN + + -- Check database + IF EXISTS(SELECT * FROM @SelectedCheckCommands WHERE CheckCommand = 'CHECKDB') AND (SYSDATETIME() < DATEADD(SECOND,@TimeLimit,@StartTime) OR @TimeLimit IS NULL) + BEGIN + SET @CurrentDatabaseContext = CASE WHEN SERVERPROPERTY('EngineEdition') = 5 THEN @CurrentDatabaseName ELSE 'master' END + + SET @CurrentCommandType = 'DBCC_CHECKDB' + + SET @CurrentCommand = '' + IF @LockTimeout IS NOT NULL SET @CurrentCommand = 'SET LOCK_TIMEOUT ' + CAST(@LockTimeout * 1000 AS nvarchar) + '; ' + SET @CurrentCommand += 'DBCC CHECKDB (' + QUOTENAME(@CurrentDatabaseName) + IF @NoIndex = 'Y' SET @CurrentCommand += ', NOINDEX' + SET @CurrentCommand += ') WITH NO_INFOMSGS, ALL_ERRORMSGS' + IF @DataPurity = 'Y' SET @CurrentCommand += ', DATA_PURITY' + IF @PhysicalOnly = 'Y' SET @CurrentCommand += ', PHYSICAL_ONLY' + IF @ExtendedLogicalChecks = 'Y' SET @CurrentCommand += ', EXTENDED_LOGICAL_CHECKS' + IF @TabLock = 'Y' SET @CurrentCommand += ', TABLOCK' + IF @MaxDOP IS NOT NULL SET @CurrentCommand += ', MAXDOP = ' + CAST(@MaxDOP AS nvarchar) + + EXECUTE @CurrentCommandOutput = dbo.CommandExecute @DatabaseContext = @CurrentDatabaseContext, @Command = @CurrentCommand, @CommandType = @CurrentCommandType, @Mode = 1, @DatabaseName = @CurrentDatabaseName, @LogToTable = @LogToTable, @Execute = @Execute + SET @Error = @@ERROR + IF @Error <> 0 SET @CurrentCommandOutput = @Error + IF @CurrentCommandOutput <> 0 SET @ReturnCode = @CurrentCommandOutput + END + + -- Check filegroups + IF EXISTS(SELECT * FROM @SelectedCheckCommands WHERE CheckCommand = 'CHECKFILEGROUP') AND (SYSDATETIME() < DATEADD(SECOND,@TimeLimit,@StartTime) OR @TimeLimit IS NULL) + BEGIN + SET @CurrentCommand = 'SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTED; SELECT data_space_id AS FileGroupID, name AS FileGroupName, 0 AS [Order], 0 AS Selected, 0 AS Completed FROM sys.filegroups filegroups WHERE [type] <> ''FX'' ORDER BY CASE WHEN filegroups.name = ''PRIMARY'' THEN 1 ELSE 0 END DESC, filegroups.name ASC' + + INSERT INTO @tmpFileGroups (FileGroupID, FileGroupName, [Order], Selected, Completed) + EXECUTE @CurrentDatabase_sp_executesql @stmt = @CurrentCommand + SET @Error = @@ERROR + IF @Error <> 0 SET @ReturnCode = @Error + + IF @FileGroups IS NULL + BEGIN + UPDATE tmpFileGroups + SET tmpFileGroups.Selected = 1 + FROM @tmpFileGroups tmpFileGroups + END + ELSE + BEGIN + UPDATE tmpFileGroups + SET tmpFileGroups.Selected = SelectedFileGroups.Selected + FROM @tmpFileGroups tmpFileGroups + INNER JOIN @SelectedFileGroups SelectedFileGroups + ON @CurrentDatabaseName LIKE REPLACE(SelectedFileGroups.DatabaseName,'_','[_]') AND tmpFileGroups.FileGroupName LIKE REPLACE(SelectedFileGroups.FileGroupName,'_','[_]') + WHERE SelectedFileGroups.Selected = 1 + + UPDATE tmpFileGroups + SET tmpFileGroups.Selected = SelectedFileGroups.Selected + FROM @tmpFileGroups tmpFileGroups + INNER JOIN @SelectedFileGroups SelectedFileGroups + ON @CurrentDatabaseName LIKE REPLACE(SelectedFileGroups.DatabaseName,'_','[_]') AND tmpFileGroups.FileGroupName LIKE REPLACE(SelectedFileGroups.FileGroupName,'_','[_]') + WHERE SelectedFileGroups.Selected = 0 + + UPDATE tmpFileGroups + SET tmpFileGroups.StartPosition = SelectedFileGroups2.StartPosition + FROM @tmpFileGroups tmpFileGroups + INNER JOIN (SELECT tmpFileGroups.FileGroupName, MIN(SelectedFileGroups.StartPosition) AS StartPosition + FROM @tmpFileGroups tmpFileGroups + INNER JOIN @SelectedFileGroups SelectedFileGroups + ON @CurrentDatabaseName LIKE REPLACE(SelectedFileGroups.DatabaseName,'_','[_]') AND tmpFileGroups.FileGroupName LIKE REPLACE(SelectedFileGroups.FileGroupName,'_','[_]') + WHERE SelectedFileGroups.Selected = 1 + GROUP BY tmpFileGroups.FileGroupName) SelectedFileGroups2 + ON tmpFileGroups.FileGroupName = SelectedFileGroups2.FileGroupName + END; + + WITH tmpFileGroups AS ( + SELECT FileGroupName, [Order], ROW_NUMBER() OVER (ORDER BY StartPosition ASC, FileGroupName ASC) AS RowNumber + FROM @tmpFileGroups tmpFileGroups + WHERE Selected = 1 + ) + UPDATE tmpFileGroups + SET [Order] = RowNumber + + SET @ErrorMessage = '' + SELECT @ErrorMessage = @ErrorMessage + QUOTENAME(DatabaseName) + '.' + QUOTENAME(FileGroupName) + ', ' + FROM @SelectedFileGroups SelectedFileGroups + WHERE DatabaseName = @CurrentDatabaseName + AND FileGroupName NOT LIKE '%[%]%' + AND NOT EXISTS (SELECT * FROM @tmpFileGroups WHERE FileGroupName = SelectedFileGroups.FileGroupName) + IF @@ROWCOUNT > 0 + BEGIN + SET @ErrorMessage = 'The following file groups do not exist: ' + LEFT(@ErrorMessage,LEN(@ErrorMessage)-1) + '.' + RAISERROR('%s',10,1,@ErrorMessage) WITH NOWAIT + SET @Error = @@ERROR + RAISERROR(@EmptyLine,10,1) WITH NOWAIT + END + + WHILE (SYSDATETIME() < DATEADD(SECOND,@TimeLimit,@StartTime) OR @TimeLimit IS NULL) + BEGIN + SELECT TOP 1 @CurrentFGID = ID, + @CurrentFileGroupID = FileGroupID, + @CurrentFileGroupName = FileGroupName + FROM @tmpFileGroups + WHERE Selected = 1 + AND Completed = 0 + ORDER BY [Order] ASC + + IF @@ROWCOUNT = 0 + BEGIN + BREAK + END + + -- Does the filegroup exist? + SET @CurrentCommand = '' + IF @LockTimeout IS NOT NULL SET @CurrentCommand = 'SET LOCK_TIMEOUT ' + CAST(@LockTimeout * 1000 AS nvarchar) + '; ' + SET @CurrentCommand += 'IF EXISTS(SELECT * FROM sys.filegroups filegroups WHERE [type] <> ''FX'' AND filegroups.data_space_id = @ParamFileGroupID AND filegroups.[name] = @ParamFileGroupName) BEGIN SET @ParamFileGroupExists = 1 END' + + BEGIN TRY + EXECUTE @CurrentDatabase_sp_executesql @stmt = @CurrentCommand, @params = N'@ParamFileGroupID int, @ParamFileGroupName sysname, @ParamFileGroupExists bit OUTPUT', @ParamFileGroupID = @CurrentFileGroupID, @ParamFileGroupName = @CurrentFileGroupName, @ParamFileGroupExists = @CurrentFileGroupExists OUTPUT + + IF @CurrentFileGroupExists IS NULL SET @CurrentFileGroupExists = 0 + END TRY + BEGIN CATCH + SET @ErrorMessage = 'Msg ' + CAST(ERROR_NUMBER() AS nvarchar) + ', ' + ISNULL(ERROR_MESSAGE(),'') + CASE WHEN ERROR_NUMBER() = 1222 THEN ', ' + ' The file group ' + QUOTENAME(@CurrentFileGroupName) + ' in the database ' + QUOTENAME(@CurrentDatabaseName) + ' is locked. It could not be checked if the filegroup exists.' ELSE '' END + SET @Severity = CASE WHEN ERROR_NUMBER() IN(1205,1222) THEN @LockMessageSeverity ELSE 16 END + RAISERROR('%s',@Severity,1,@ErrorMessage) WITH NOWAIT + RAISERROR(@EmptyLine,10,1) WITH NOWAIT + + IF NOT (ERROR_NUMBER() IN(1205,1222) AND @LockMessageSeverity = 10) + BEGIN + SET @ReturnCode = ERROR_NUMBER() + END + END CATCH + + IF @CurrentFileGroupExists = 1 + BEGIN + SET @CurrentDatabaseContext = @CurrentDatabaseName + + SET @CurrentCommandType = 'DBCC_CHECKFILEGROUP' + + SET @CurrentCommand = '' + IF @LockTimeout IS NOT NULL SET @CurrentCommand = 'SET LOCK_TIMEOUT ' + CAST(@LockTimeout * 1000 AS nvarchar) + '; ' + SET @CurrentCommand += 'DBCC CHECKFILEGROUP (' + QUOTENAME(@CurrentFileGroupName) + IF @NoIndex = 'Y' SET @CurrentCommand += ', NOINDEX' + SET @CurrentCommand += ') WITH NO_INFOMSGS, ALL_ERRORMSGS' + IF @PhysicalOnly = 'Y' SET @CurrentCommand += ', PHYSICAL_ONLY' + IF @TabLock = 'Y' SET @CurrentCommand += ', TABLOCK' + IF @MaxDOP IS NOT NULL SET @CurrentCommand += ', MAXDOP = ' + CAST(@MaxDOP AS nvarchar) + + EXECUTE @CurrentCommandOutput = dbo.CommandExecute @DatabaseContext = @CurrentDatabaseContext, @Command = @CurrentCommand, @CommandType = @CurrentCommandType, @Mode = 1, @DatabaseName = @CurrentDatabaseName, @LogToTable = @LogToTable, @Execute = @Execute + SET @Error = @@ERROR + IF @Error <> 0 SET @CurrentCommandOutput = @Error + IF @CurrentCommandOutput <> 0 SET @ReturnCode = @CurrentCommandOutput + END + + UPDATE @tmpFileGroups + SET Completed = 1 + WHERE Selected = 1 + AND Completed = 0 + AND ID = @CurrentFGID + + SET @CurrentFGID = NULL + SET @CurrentFileGroupID = NULL + SET @CurrentFileGroupName = NULL + SET @CurrentFileGroupExists = NULL + + SET @CurrentDatabaseContext = NULL + SET @CurrentCommand = NULL + SET @CurrentCommandOutput = NULL + SET @CurrentCommandType = NULL + END + END + + -- Check disk space allocation structures + IF EXISTS(SELECT * FROM @SelectedCheckCommands WHERE CheckCommand = 'CHECKALLOC') AND (SYSDATETIME() < DATEADD(SECOND,@TimeLimit,@StartTime) OR @TimeLimit IS NULL) + BEGIN + SET @CurrentDatabaseContext = CASE WHEN SERVERPROPERTY('EngineEdition') = 5 THEN @CurrentDatabaseName ELSE 'master' END + + SET @CurrentCommandType = 'DBCC_CHECKALLOC' + + SET @CurrentCommand = '' + IF @LockTimeout IS NOT NULL SET @CurrentCommand = 'SET LOCK_TIMEOUT ' + CAST(@LockTimeout * 1000 AS nvarchar) + '; ' + SET @CurrentCommand += 'DBCC CHECKALLOC (' + QUOTENAME(@CurrentDatabaseName) + SET @CurrentCommand += ') WITH NO_INFOMSGS, ALL_ERRORMSGS' + IF @TabLock = 'Y' SET @CurrentCommand += ', TABLOCK' + + EXECUTE @CurrentCommandOutput = dbo.CommandExecute @DatabaseContext = @CurrentDatabaseContext, @Command = @CurrentCommand, @CommandType = @CurrentCommandType, @Mode = 1, @DatabaseName = @CurrentDatabaseName, @LogToTable = @LogToTable, @Execute = @Execute + SET @Error = @@ERROR + IF @Error <> 0 SET @CurrentCommandOutput = @Error + IF @CurrentCommandOutput <> 0 SET @ReturnCode = @CurrentCommandOutput + END + + -- Check objects + IF EXISTS(SELECT * FROM @SelectedCheckCommands WHERE CheckCommand = 'CHECKTABLE') AND (SYSDATETIME() < DATEADD(SECOND,@TimeLimit,@StartTime) OR @TimeLimit IS NULL) + BEGIN + SET @CurrentCommand = 'SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTED; SELECT schemas.[schema_id] AS SchemaID, schemas.[name] AS SchemaName, objects.[object_id] AS ObjectID, objects.[name] AS ObjectName, RTRIM(objects.[type]) AS ObjectType, 0 AS [Order], 0 AS Selected, 0 AS Completed FROM sys.objects objects INNER JOIN sys.schemas schemas ON objects.schema_id = schemas.schema_id LEFT OUTER JOIN sys.tables tables ON objects.object_id = tables.object_id WHERE objects.[type] IN(''U'',''V'') AND EXISTS(SELECT * FROM sys.indexes indexes WHERE indexes.object_id = objects.object_id)' + CASE WHEN @Version >= 12 THEN ' AND (tables.is_memory_optimized = 0 OR is_memory_optimized IS NULL)' ELSE '' END + ' ORDER BY schemas.name ASC, objects.name ASC' + + INSERT INTO @tmpObjects (SchemaID, SchemaName, ObjectID, ObjectName, ObjectType, [Order], Selected, Completed) + EXECUTE @CurrentDatabase_sp_executesql @stmt = @CurrentCommand + SET @Error = @@ERROR + IF @Error <> 0 SET @ReturnCode = @Error + + IF @Objects IS NULL + BEGIN + UPDATE tmpObjects + SET tmpObjects.Selected = 1 + FROM @tmpObjects tmpObjects + END + ELSE + BEGIN + UPDATE tmpObjects + SET tmpObjects.Selected = SelectedObjects.Selected + FROM @tmpObjects tmpObjects + INNER JOIN @SelectedObjects SelectedObjects + ON @CurrentDatabaseName LIKE REPLACE(SelectedObjects.DatabaseName,'_','[_]') AND tmpObjects.SchemaName LIKE REPLACE(SelectedObjects.SchemaName,'_','[_]') AND tmpObjects.ObjectName LIKE REPLACE(SelectedObjects.ObjectName,'_','[_]') + WHERE SelectedObjects.Selected = 1 + + UPDATE tmpObjects + SET tmpObjects.Selected = SelectedObjects.Selected + FROM @tmpObjects tmpObjects + INNER JOIN @SelectedObjects SelectedObjects + ON @CurrentDatabaseName LIKE REPLACE(SelectedObjects.DatabaseName,'_','[_]') AND tmpObjects.SchemaName LIKE REPLACE(SelectedObjects.SchemaName,'_','[_]') AND tmpObjects.ObjectName LIKE REPLACE(SelectedObjects.ObjectName,'_','[_]') + WHERE SelectedObjects.Selected = 0 + + UPDATE tmpObjects + SET tmpObjects.StartPosition = SelectedObjects2.StartPosition + FROM @tmpObjects tmpObjects + INNER JOIN (SELECT tmpObjects.SchemaName, tmpObjects.ObjectName, MIN(SelectedObjects.StartPosition) AS StartPosition + FROM @tmpObjects tmpObjects + INNER JOIN @SelectedObjects SelectedObjects + ON @CurrentDatabaseName LIKE REPLACE(SelectedObjects.DatabaseName,'_','[_]') AND tmpObjects.SchemaName LIKE REPLACE(SelectedObjects.SchemaName,'_','[_]') AND tmpObjects.ObjectName LIKE REPLACE(SelectedObjects.ObjectName,'_','[_]') + WHERE SelectedObjects.Selected = 1 + GROUP BY tmpObjects.SchemaName, tmpObjects.ObjectName) SelectedObjects2 + ON tmpObjects.SchemaName = SelectedObjects2.SchemaName AND tmpObjects.ObjectName = SelectedObjects2.ObjectName + END; + + WITH tmpObjects AS ( + SELECT SchemaName, ObjectName, [Order], ROW_NUMBER() OVER (ORDER BY StartPosition ASC, SchemaName ASC, ObjectName ASC) AS RowNumber + FROM @tmpObjects tmpObjects + WHERE Selected = 1 + ) + UPDATE tmpObjects + SET [Order] = RowNumber + + SET @ErrorMessage = '' + SELECT @ErrorMessage = @ErrorMessage + QUOTENAME(DatabaseName) + '.' + QUOTENAME(SchemaName) + '.' + QUOTENAME(ObjectName) + ', ' + FROM @SelectedObjects SelectedObjects + WHERE DatabaseName = @CurrentDatabaseName + AND SchemaName NOT LIKE '%[%]%' + AND ObjectName NOT LIKE '%[%]%' + AND NOT EXISTS (SELECT * FROM @tmpObjects WHERE SchemaName = SelectedObjects.SchemaName AND ObjectName = SelectedObjects.ObjectName) + IF @@ROWCOUNT > 0 + BEGIN + SET @ErrorMessage = 'The following objects do not exist: ' + LEFT(@ErrorMessage,LEN(@ErrorMessage)-1) + '.' + RAISERROR('%s',10,1,@ErrorMessage) WITH NOWAIT + SET @Error = @@ERROR + RAISERROR(@EmptyLine,10,1) WITH NOWAIT + END + + WHILE (SYSDATETIME() < DATEADD(SECOND,@TimeLimit,@StartTime) OR @TimeLimit IS NULL) + BEGIN + SELECT TOP 1 @CurrentOID = ID, + @CurrentSchemaID = SchemaID, + @CurrentSchemaName = SchemaName, + @CurrentObjectID = ObjectID, + @CurrentObjectName = ObjectName, + @CurrentObjectType = ObjectType + FROM @tmpObjects + WHERE Selected = 1 + AND Completed = 0 + ORDER BY [Order] ASC + + IF @@ROWCOUNT = 0 + BEGIN + BREAK + END + + -- Does the object exist? + SET @CurrentCommand = '' + IF @LockTimeout IS NOT NULL SET @CurrentCommand = 'SET LOCK_TIMEOUT ' + CAST(@LockTimeout * 1000 AS nvarchar) + '; ' + SET @CurrentCommand += 'IF EXISTS(SELECT * FROM sys.objects objects INNER JOIN sys.schemas schemas ON objects.schema_id = schemas.schema_id LEFT OUTER JOIN sys.tables tables ON objects.object_id = tables.object_id WHERE objects.[type] IN(''U'',''V'') AND EXISTS(SELECT * FROM sys.indexes indexes WHERE indexes.object_id = objects.object_id)' + CASE WHEN @Version >= 12 THEN ' AND (tables.is_memory_optimized = 0 OR is_memory_optimized IS NULL)' ELSE '' END + ' AND schemas.[schema_id] = @ParamSchemaID AND schemas.[name] = @ParamSchemaName AND objects.[object_id] = @ParamObjectID AND objects.[name] = @ParamObjectName AND objects.[type] = @ParamObjectType) BEGIN SET @ParamObjectExists = 1 END' + + BEGIN TRY + EXECUTE @CurrentDatabase_sp_executesql @stmt = @CurrentCommand, @params = N'@ParamSchemaID int, @ParamSchemaName sysname, @ParamObjectID int, @ParamObjectName sysname, @ParamObjectType sysname, @ParamObjectExists bit OUTPUT', @ParamSchemaID = @CurrentSchemaID, @ParamSchemaName = @CurrentSchemaName, @ParamObjectID = @CurrentObjectID, @ParamObjectName = @CurrentObjectName, @ParamObjectType = @CurrentObjectType, @ParamObjectExists = @CurrentObjectExists OUTPUT + + IF @CurrentObjectExists IS NULL SET @CurrentObjectExists = 0 + END TRY + BEGIN CATCH + SET @ErrorMessage = 'Msg ' + CAST(ERROR_NUMBER() AS nvarchar) + ', ' + ISNULL(ERROR_MESSAGE(),'') + CASE WHEN ERROR_NUMBER() = 1222 THEN ', ' + 'The object ' + QUOTENAME(@CurrentDatabaseName) + '.' + QUOTENAME(@CurrentSchemaName) + '.' + QUOTENAME(@CurrentObjectName) + ' is locked. It could not be checked if the object exists.' ELSE '' END + SET @Severity = CASE WHEN ERROR_NUMBER() IN(1205,1222) THEN @LockMessageSeverity ELSE 16 END + RAISERROR('%s',@Severity,1,@ErrorMessage) WITH NOWAIT + RAISERROR(@EmptyLine,10,1) WITH NOWAIT + + IF NOT (ERROR_NUMBER() IN(1205,1222) AND @LockMessageSeverity = 10) + BEGIN + SET @ReturnCode = ERROR_NUMBER() + END + END CATCH + + IF @CurrentObjectExists = 1 + BEGIN + SET @CurrentDatabaseContext = @CurrentDatabaseName + + SET @CurrentCommandType = 'DBCC_CHECKTABLE' + + SET @CurrentCommand = '' + IF @LockTimeout IS NOT NULL SET @CurrentCommand = 'SET LOCK_TIMEOUT ' + CAST(@LockTimeout * 1000 AS nvarchar) + '; ' + SET @CurrentCommand += 'DBCC CHECKTABLE (''' + QUOTENAME(@CurrentSchemaName) + '.' + QUOTENAME(@CurrentObjectName) + '''' + IF @NoIndex = 'Y' SET @CurrentCommand += ', NOINDEX' + SET @CurrentCommand += ') WITH NO_INFOMSGS, ALL_ERRORMSGS' + IF @DataPurity = 'Y' SET @CurrentCommand += ', DATA_PURITY' + IF @PhysicalOnly = 'Y' SET @CurrentCommand += ', PHYSICAL_ONLY' + IF @ExtendedLogicalChecks = 'Y' SET @CurrentCommand += ', EXTENDED_LOGICAL_CHECKS' + IF @TabLock = 'Y' SET @CurrentCommand += ', TABLOCK' + IF @MaxDOP IS NOT NULL SET @CurrentCommand += ', MAXDOP = ' + CAST(@MaxDOP AS nvarchar) + + EXECUTE @CurrentCommandOutput = dbo.CommandExecute @DatabaseContext = @CurrentDatabaseContext, @Command = @CurrentCommand, @CommandType = @CurrentCommandType, @Mode = 1, @DatabaseName = @CurrentDatabaseName, @SchemaName = @CurrentSchemaName, @ObjectName = @CurrentObjectName, @ObjectType = @CurrentObjectType, @LogToTable = @LogToTable, @Execute = @Execute + SET @Error = @@ERROR + IF @Error <> 0 SET @CurrentCommandOutput = @Error + IF @CurrentCommandOutput <> 0 SET @ReturnCode = @CurrentCommandOutput + END + + UPDATE @tmpObjects + SET Completed = 1 + WHERE Selected = 1 + AND Completed = 0 + AND ID = @CurrentOID + + SET @CurrentOID = NULL + SET @CurrentSchemaID = NULL + SET @CurrentSchemaName = NULL + SET @CurrentObjectID = NULL + SET @CurrentObjectName = NULL + SET @CurrentObjectType = NULL + SET @CurrentObjectExists = NULL + + SET @CurrentDatabaseContext = NULL + SET @CurrentCommand = NULL + SET @CurrentCommandOutput = NULL + SET @CurrentCommandType = NULL + END + END + + -- Check catalog + IF EXISTS(SELECT * FROM @SelectedCheckCommands WHERE CheckCommand = 'CHECKCATALOG') AND (SYSDATETIME() < DATEADD(SECOND,@TimeLimit,@StartTime) OR @TimeLimit IS NULL) + BEGIN + SET @CurrentDatabaseContext = CASE WHEN SERVERPROPERTY('EngineEdition') = 5 THEN @CurrentDatabaseName ELSE 'master' END + + SET @CurrentCommandType = 'DBCC_CHECKCATALOG' + + SET @CurrentCommand = '' + IF @LockTimeout IS NOT NULL SET @CurrentCommand = 'SET LOCK_TIMEOUT ' + CAST(@LockTimeout * 1000 AS nvarchar) + '; ' + SET @CurrentCommand += 'DBCC CHECKCATALOG (' + QUOTENAME(@CurrentDatabaseName) + SET @CurrentCommand += ') WITH NO_INFOMSGS' + + EXECUTE @CurrentCommandOutput = dbo.CommandExecute @DatabaseContext = @CurrentDatabaseContext, @Command = @CurrentCommand, @CommandType = @CurrentCommandType, @Mode = 1, @DatabaseName = @CurrentDatabaseName, @LogToTable = @LogToTable, @Execute = @Execute + SET @Error = @@ERROR + IF @Error <> 0 SET @CurrentCommandOutput = @Error + IF @CurrentCommandOutput <> 0 SET @ReturnCode = @CurrentCommandOutput + END + + END + + IF @CurrentDatabaseState = 'SUSPECT' + BEGIN + SET @ErrorMessage = 'The database ' + QUOTENAME(@CurrentDatabaseName) + ' is in a SUSPECT state.' + RAISERROR('%s',16,1,@ErrorMessage) WITH NOWAIT + SET @Error = @@ERROR + RAISERROR(@EmptyLine,10,1) WITH NOWAIT + END + + -- Update that the database is completed + IF @DatabasesInParallel = 'Y' + BEGIN + UPDATE dbo.QueueDatabase + SET DatabaseEndTime = SYSDATETIME() + WHERE QueueID = @QueueID + AND DatabaseName = @CurrentDatabaseName + END + ELSE + BEGIN + UPDATE @tmpDatabases + SET Completed = 1 + WHERE Selected = 1 + AND Completed = 0 + AND ID = @CurrentDBID + END + + -- Clear variables + SET @CurrentDBID = NULL + SET @CurrentDatabaseName = NULL + + SET @CurrentDatabase_sp_executesql = NULL + + SET @CurrentUserAccess = NULL + SET @CurrentIsReadOnly = NULL + SET @CurrentDatabaseState = NULL + SET @CurrentInStandby = NULL + SET @CurrentRecoveryModel = NULL + + SET @CurrentIsDatabaseAccessible = NULL + SET @CurrentAvailabilityGroup = NULL + SET @CurrentAvailabilityGroupRole = NULL + SET @CurrentAvailabilityGroupBackupPreference = NULL + SET @CurrentIsPreferredBackupReplica = NULL + SET @CurrentDatabaseMirroringRole = NULL + + SET @CurrentDatabaseContext = NULL + SET @CurrentCommand = NULL + SET @CurrentCommandOutput = NULL + SET @CurrentCommandType = NULL + + DELETE FROM @tmpFileGroups + DELETE FROM @tmpObjects + + END + + ---------------------------------------------------------------------------------------------------- + --// Log completing information //-- + ---------------------------------------------------------------------------------------------------- + + Logging: + SET @EndMessage = 'Date and time: ' + CONVERT(nvarchar,SYSDATETIME(),120) + RAISERROR('%s',10,1,@EndMessage) WITH NOWAIT + + RAISERROR(@EmptyLine,10,1) WITH NOWAIT + + IF @ReturnCode <> 0 + BEGIN + RETURN @ReturnCode + END + + ---------------------------------------------------------------------------------------------------- + +END + +GO diff --git a/TPDT-268 - ACP in task sequence/dba_storedProcedures/dbo.Get_Job_Error_Info.sql b/TPDT-268 - ACP in task sequence/dba_storedProcedures/dbo.Get_Job_Error_Info.sql new file mode 100644 index 0000000..715bdc9 --- /dev/null +++ b/TPDT-268 - ACP in task sequence/dba_storedProcedures/dbo.Get_Job_Error_Info.sql @@ -0,0 +1,120 @@ +USE [HCITools] +GO + +IF EXISTS (SELECT * FROM sys.objects WHERE object_id = OBJECT_ID(N'[dbo].[Get_Job_Error_Info]') AND type in (N'P', N'PC')) +DROP PROCEDURE [dbo].[Get_Job_Error_Info] +GO + +USE [HCITools] +GO + +SET ANSI_NULLS ON +GO + +SET QUOTED_IDENTIFIER ON +GO + + +CREATE PROCEDURE [dbo].[Get_Job_Error_Info] + @in_debug tinyint = 0, + @in_JobName nvarchar(1000), + @in_Recipients varchar(250) +AS +/*============================================================================= + + Explication du traitement realise par la SP + ------------------------------------------- + Cette SP sert a récupérer le message d'erreur d'un step de job et de l'envoyer par mail. + + Contexte d'utilisation + ---------------------- + Appelée depuis le step Empty Step et Send mail KO des jobs + + Parametres + ---------- + @in_debug : non utilisé + @in_JobName : nom du job + @in_Recipients : mail/profil du/des destinataire(s) + + Creation : 1.4.16 / RTC + + Modifications : 04.04.16 / FLA : normalisation de la SP, modification du paramètre d'entrée, modification de l'appel de l'envoi de mail + 06.10.16 / FLA : ajout de la gestion des erreurs de query timeout + 19.02.21 / SPE : Modification null message (Bug) + +=============================================================================*/ + +SET nocount ON; + +/*------------------- Declaration des variables --------------------*/ +DECLARE @message nvarchar(max) + +/*------------ Affectation des parametres aux variables ------------*/ +SET @message = ''; + +/*-------------------------- Traitement ---------------------------*/ +BEGIN TRY + + SELECT @message = @message + 'STEP NAME: '+ jh.step_name + CHAR(13) + + 'ERROR MESSAGE: ' + CHAR(13) + jh.message + CHAR(13) + CHAR(13) + FROM msdb..sysjobhistory jh + INNER JOIN msdb..sysjobactivity ja + on ja.job_id = jh.job_id + INNER JOIN msdb..sysjobs j + on j.job_id = ja.job_id + WHERE j.name = @in_JobName AND run_status = 0 --and ja.stop_execution_date is null-- + AND ja.session_id = (SELECT TOP 1 session_id FROM msdb.dbo.syssessions ORDER BY agent_start_date DESC) + AND start_execution_date is not null + --AND stop_execution_date is null + AND msdb.dbo.agent_datetime(run_date, run_time) >= start_execution_date + + /* Gestion des Query Timeout Error */ + if EXISTS (SELECT 1 + FROM msdb..sysjobhistory jh + INNER JOIN msdb..sysjobactivity ja + on ja.job_id = jh.job_id + INNER JOIN msdb..sysjobs j + on j.job_id = ja.job_id + WHERE j.name = @in_JobName AND run_status = 1 --and ja.stop_execution_date is null-- + AND ja.session_id = (SELECT TOP 1 session_id FROM msdb.dbo.syssessions ORDER BY agent_start_date DESC) + AND start_execution_date is not null + AND jh.sql_message_id = 7412 + AND msdb.dbo.agent_datetime(run_date, run_time) >= start_execution_date) + BEGIN + + SELECT @message = @message + 'STEP NAME: '+ jh.step_name + CHAR(13) + + 'ERROR MESSAGE: ' + CHAR(13) + jh.message + CHAR(13) + CHAR(13) + FROM msdb..sysjobhistory jh + INNER JOIN msdb..sysjobactivity ja + on ja.job_id = jh.job_id + INNER JOIN msdb..sysjobs j + on j.job_id = ja.job_id + WHERE j.name = @in_JobName AND run_status = 1 --and ja.stop_execution_date is null-- + AND ja.session_id = (SELECT TOP 1 session_id FROM msdb.dbo.syssessions ORDER BY agent_start_date DESC) + AND start_execution_date is not null + AND jh.sql_message_id = 7412 + AND msdb.dbo.agent_datetime(run_date, run_time) >= start_execution_date + END + + /*---------------------- Evoie du mail ------------*/ + IF (@message <> '') + EXEC aps_Send_Mail_with_template @in_param_varchar_2 = @in_Recipients, + @in_param_message = @message, + @in_job_type = 1 /* 0:sans template; 1/NULL:echec; 2:succes; 3:warning; 4:message*/ + +END TRY +BEGIN CATCH + + /* Traitement des erreurs (sans RaiseError) */ + EXEC dbo.get_Error_Info @in_RaiseError = 0 + +END CATCH +; + +/*------------------ Retour au programme appelant -----------------*/ +RETURN(@@error); + + +GO + + diff --git a/TPDT-268 - ACP in task sequence/dba_storedProcedures/dbo.IndexOptimize.sql b/TPDT-268 - ACP in task sequence/dba_storedProcedures/dbo.IndexOptimize.sql new file mode 100644 index 0000000..3949652 --- /dev/null +++ b/TPDT-268 - ACP in task sequence/dba_storedProcedures/dbo.IndexOptimize.sql @@ -0,0 +1,2397 @@ +/********************************************************************************/ +/********* 3. CREATE STORED PROCEDURE [HCITools].[dbo].[IndexOptimize] *********/ +/********************************************************************************/ +USE [HCITools] +GO + +IF EXISTS (SELECT * FROM sys.objects WHERE object_id = OBJECT_ID(N'[HCITools].[dbo].[IndexOptimize]') AND type in (N'P', N'PC')) + DROP PROCEDURE [dbo].[IndexOptimize] +GO + + + + +CREATE PROCEDURE [dbo].[IndexOptimize] + +@Databases nvarchar(max) = NULL, +@FragmentationLow nvarchar(max) = NULL, +@FragmentationMedium nvarchar(max) = 'INDEX_REORGANIZE,INDEX_REBUILD_ONLINE,INDEX_REBUILD_OFFLINE', +@FragmentationHigh nvarchar(max) = 'INDEX_REBUILD_ONLINE,INDEX_REBUILD_OFFLINE', +@FragmentationLevel1 int = 5, +@FragmentationLevel2 int = 30, +@MinNumberOfPages int = 1000, +@MaxNumberOfPages int = NULL, +@SortInTempdb nvarchar(max) = 'N', +@MaxDOP int = NULL, +@FillFactor int = NULL, +@PadIndex nvarchar(max) = NULL, +@LOBCompaction nvarchar(max) = 'Y', +@UpdateStatistics nvarchar(max) = NULL, +@OnlyModifiedStatistics nvarchar(max) = 'N', +@StatisticsModificationLevel int = NULL, +@StatisticsSample int = NULL, +@StatisticsResample nvarchar(max) = 'N', +@PartitionLevel nvarchar(max) = 'Y', +@MSShippedObjects nvarchar(max) = 'N', +@Indexes nvarchar(max) = NULL, +@TimeLimit int = NULL, +@Delay int = NULL, +@WaitAtLowPriorityMaxDuration int = NULL, +@WaitAtLowPriorityAbortAfterWait nvarchar(max) = NULL, +@Resumable nvarchar(max) = 'N', +@AvailabilityGroups nvarchar(max) = NULL, +@LockTimeout int = NULL, +@LockMessageSeverity int = 16, +@StringDelimiter nvarchar(max) = ',', +@DatabaseOrder nvarchar(max) = NULL, +@DatabasesInParallel nvarchar(max) = 'N', +@LogToTable nvarchar(max) = 'N', +@Execute nvarchar(max) = 'Y' + +AS + +BEGIN + + ---------------------------------------------------------------------------------------------------- + --// Source: https://ola.hallengren.com //-- + --// License: https://ola.hallengren.com/license.html //-- + --// GitHub: https://github.com/olahallengren/sql-server-maintenance-solution //-- + --// Version: 2020-11-15 18:44:03 //-- + ---------------------------------------------------------------------------------------------------- + + SET NOCOUNT ON + + SET ARITHABORT ON + + SET NUMERIC_ROUNDABORT OFF + + DECLARE @StartMessage nvarchar(max) + DECLARE @EndMessage nvarchar(max) + DECLARE @DatabaseMessage nvarchar(max) + DECLARE @ErrorMessage nvarchar(max) + DECLARE @Severity int + + DECLARE @StartTime datetime2 = SYSDATETIME() + DECLARE @SchemaName nvarchar(max) = OBJECT_SCHEMA_NAME(@@PROCID) + DECLARE @ObjectName nvarchar(max) = OBJECT_NAME(@@PROCID) + DECLARE @VersionTimestamp nvarchar(max) = SUBSTRING(OBJECT_DEFINITION(@@PROCID),CHARINDEX('--// Version: ',OBJECT_DEFINITION(@@PROCID)) + LEN('--// Version: ') + 1, 19) + DECLARE @Parameters nvarchar(max) + + DECLARE @HostPlatform nvarchar(max) + + DECLARE @PartitionLevelStatistics bit + + DECLARE @QueueID int + DECLARE @QueueStartTime datetime2 + + DECLARE @CurrentDBID int + DECLARE @CurrentDatabaseName nvarchar(max) + + DECLARE @CurrentDatabase_sp_executesql nvarchar(max) + + DECLARE @CurrentUserAccess nvarchar(max) + DECLARE @CurrentIsReadOnly bit + DECLARE @CurrentDatabaseState nvarchar(max) + DECLARE @CurrentInStandby bit + DECLARE @CurrentRecoveryModel nvarchar(max) + + DECLARE @CurrentIsDatabaseAccessible bit + DECLARE @CurrentAvailabilityGroup nvarchar(max) + DECLARE @CurrentAvailabilityGroupRole nvarchar(max) + DECLARE @CurrentDatabaseMirroringRole nvarchar(max) + + DECLARE @CurrentDatabaseContext nvarchar(max) + DECLARE @CurrentCommand nvarchar(max) + DECLARE @CurrentCommandOutput int + DECLARE @CurrentCommandType nvarchar(max) + DECLARE @CurrentComment nvarchar(max) + DECLARE @CurrentExtendedInfo xml + + DECLARE @Errors TABLE (ID int IDENTITY PRIMARY KEY, + [Message] nvarchar(max) NOT NULL, + Severity int NOT NULL, + [State] int) + + DECLARE @CurrentMessage nvarchar(max) + DECLARE @CurrentSeverity int + DECLARE @CurrentState int + + DECLARE @CurrentIxID int + DECLARE @CurrentIxOrder int + DECLARE @CurrentSchemaID int + DECLARE @CurrentSchemaName nvarchar(max) + DECLARE @CurrentObjectID int + DECLARE @CurrentObjectName nvarchar(max) + DECLARE @CurrentObjectType nvarchar(max) + DECLARE @CurrentIsMemoryOptimized bit + DECLARE @CurrentIndexID int + DECLARE @CurrentIndexName nvarchar(max) + DECLARE @CurrentIndexType int + DECLARE @CurrentStatisticsID int + DECLARE @CurrentStatisticsName nvarchar(max) + DECLARE @CurrentPartitionID bigint + DECLARE @CurrentPartitionNumber int + DECLARE @CurrentPartitionCount int + DECLARE @CurrentIsPartition bit + DECLARE @CurrentIndexExists bit + DECLARE @CurrentStatisticsExists bit + DECLARE @CurrentIsImageText bit + DECLARE @CurrentIsNewLOB bit + DECLARE @CurrentIsFileStream bit + DECLARE @CurrentIsColumnStore bit + DECLARE @CurrentIsComputed bit + DECLARE @CurrentIsTimestamp bit + DECLARE @CurrentAllowPageLocks bit + DECLARE @CurrentNoRecompute bit + DECLARE @CurrentIsIncremental bit + DECLARE @CurrentRowCount bigint + DECLARE @CurrentModificationCounter bigint + DECLARE @CurrentOnReadOnlyFileGroup bit + DECLARE @CurrentResumableIndexOperation bit + DECLARE @CurrentFragmentationLevel float + DECLARE @CurrentPageCount bigint + DECLARE @CurrentFragmentationGroup nvarchar(max) + DECLARE @CurrentAction nvarchar(max) + DECLARE @CurrentMaxDOP int + DECLARE @CurrentUpdateStatistics nvarchar(max) + DECLARE @CurrentStatisticsSample int + DECLARE @CurrentStatisticsResample nvarchar(max) + DECLARE @CurrentDelay datetime + + DECLARE @tmpDatabases TABLE (ID int IDENTITY, + DatabaseName nvarchar(max), + DatabaseType nvarchar(max), + AvailabilityGroup bit, + StartPosition int, + DatabaseSize bigint, + [Order] int, + Selected bit, + Completed bit, + PRIMARY KEY(Selected, Completed, [Order], ID)) + + DECLARE @tmpAvailabilityGroups TABLE (ID int IDENTITY PRIMARY KEY, + AvailabilityGroupName nvarchar(max), + StartPosition int, + Selected bit) + + DECLARE @tmpDatabasesAvailabilityGroups TABLE (DatabaseName nvarchar(max), + AvailabilityGroupName nvarchar(max)) + + DECLARE @tmpIndexesStatistics TABLE (ID int IDENTITY, + SchemaID int, + SchemaName nvarchar(max), + ObjectID int, + ObjectName nvarchar(max), + ObjectType nvarchar(max), + IsMemoryOptimized bit, + IndexID int, + IndexName nvarchar(max), + IndexType int, + AllowPageLocks bit, + IsImageText bit, + IsNewLOB bit, + IsFileStream bit, + IsColumnStore bit, + IsComputed bit, + IsTimestamp bit, + OnReadOnlyFileGroup bit, + ResumableIndexOperation bit, + StatisticsID int, + StatisticsName nvarchar(max), + [NoRecompute] bit, + IsIncremental bit, + PartitionID bigint, + PartitionNumber int, + PartitionCount int, + StartPosition int, + [Order] int, + Selected bit, + Completed bit, + PRIMARY KEY(Selected, Completed, [Order], ID)) + + DECLARE @SelectedDatabases TABLE (DatabaseName nvarchar(max), + DatabaseType nvarchar(max), + AvailabilityGroup nvarchar(max), + StartPosition int, + Selected bit) + + DECLARE @SelectedAvailabilityGroups TABLE (AvailabilityGroupName nvarchar(max), + StartPosition int, + Selected bit) + + DECLARE @SelectedIndexes TABLE (DatabaseName nvarchar(max), + SchemaName nvarchar(max), + ObjectName nvarchar(max), + IndexName nvarchar(max), + StartPosition int, + Selected bit) + + DECLARE @Actions TABLE ([Action] nvarchar(max)) + + INSERT INTO @Actions([Action]) VALUES('INDEX_REBUILD_ONLINE') + INSERT INTO @Actions([Action]) VALUES('INDEX_REBUILD_OFFLINE') + INSERT INTO @Actions([Action]) VALUES('INDEX_REORGANIZE') + + DECLARE @ActionsPreferred TABLE (FragmentationGroup nvarchar(max), + [Priority] int, + [Action] nvarchar(max)) + + DECLARE @CurrentActionsAllowed TABLE ([Action] nvarchar(max)) + + DECLARE @CurrentAlterIndexWithClauseArguments TABLE (ID int IDENTITY, + Argument nvarchar(max), + Added bit DEFAULT 0) + + DECLARE @CurrentAlterIndexArgumentID int + DECLARE @CurrentAlterIndexArgument nvarchar(max) + DECLARE @CurrentAlterIndexWithClause nvarchar(max) + + DECLARE @CurrentUpdateStatisticsWithClauseArguments TABLE (ID int IDENTITY, + Argument nvarchar(max), + Added bit DEFAULT 0) + + DECLARE @CurrentUpdateStatisticsArgumentID int + DECLARE @CurrentUpdateStatisticsArgument nvarchar(max) + DECLARE @CurrentUpdateStatisticsWithClause nvarchar(max) + + DECLARE @Error int = 0 + DECLARE @ReturnCode int = 0 + + DECLARE @EmptyLine nvarchar(max) = CHAR(9) + + DECLARE @Version numeric(18,10) = CAST(LEFT(CAST(SERVERPROPERTY('ProductVersion') AS nvarchar(max)),CHARINDEX('.',CAST(SERVERPROPERTY('ProductVersion') AS nvarchar(max))) - 1) + '.' + REPLACE(RIGHT(CAST(SERVERPROPERTY('ProductVersion') AS nvarchar(max)), LEN(CAST(SERVERPROPERTY('ProductVersion') AS nvarchar(max))) - CHARINDEX('.',CAST(SERVERPROPERTY('ProductVersion') AS nvarchar(max)))),'.','') AS numeric(18,10)) + + IF @Version >= 14 + BEGIN + SELECT @HostPlatform = host_platform + FROM sys.dm_os_host_info + END + ELSE + BEGIN + SET @HostPlatform = 'Windows' + END + + DECLARE @AmazonRDS bit = CASE WHEN DB_ID('rdsadmin') IS NOT NULL AND SUSER_SNAME(0x01) = 'rdsa' THEN 1 ELSE 0 END + + ---------------------------------------------------------------------------------------------------- + --// Log initial information //-- + ---------------------------------------------------------------------------------------------------- + + SET @Parameters = '@Databases = ' + ISNULL('''' + REPLACE(@Databases,'''','''''') + '''','NULL') + SET @Parameters += ', @FragmentationLow = ' + ISNULL('''' + REPLACE(@FragmentationLow,'''','''''') + '''','NULL') + SET @Parameters += ', @FragmentationMedium = ' + ISNULL('''' + REPLACE(@FragmentationMedium,'''','''''') + '''','NULL') + SET @Parameters += ', @FragmentationHigh = ' + ISNULL('''' + REPLACE(@FragmentationHigh,'''','''''') + '''','NULL') + SET @Parameters += ', @FragmentationLevel1 = ' + ISNULL(CAST(@FragmentationLevel1 AS nvarchar),'NULL') + SET @Parameters += ', @FragmentationLevel2 = ' + ISNULL(CAST(@FragmentationLevel2 AS nvarchar),'NULL') + SET @Parameters += ', @MinNumberOfPages = ' + ISNULL(CAST(@MinNumberOfPages AS nvarchar),'NULL') + SET @Parameters += ', @MaxNumberOfPages = ' + ISNULL(CAST(@MaxNumberOfPages AS nvarchar),'NULL') + SET @Parameters += ', @SortInTempdb = ' + ISNULL('''' + REPLACE(@SortInTempdb,'''','''''') + '''','NULL') + SET @Parameters += ', @MaxDOP = ' + ISNULL(CAST(@MaxDOP AS nvarchar),'NULL') + SET @Parameters += ', @FillFactor = ' + ISNULL(CAST(@FillFactor AS nvarchar),'NULL') + SET @Parameters += ', @PadIndex = ' + ISNULL('''' + REPLACE(@PadIndex,'''','''''') + '''','NULL') + SET @Parameters += ', @LOBCompaction = ' + ISNULL('''' + REPLACE(@LOBCompaction,'''','''''') + '''','NULL') + SET @Parameters += ', @UpdateStatistics = ' + ISNULL('''' + REPLACE(@UpdateStatistics,'''','''''') + '''','NULL') + SET @Parameters += ', @OnlyModifiedStatistics = ' + ISNULL('''' + REPLACE(@OnlyModifiedStatistics,'''','''''') + '''','NULL') + SET @Parameters += ', @StatisticsModificationLevel = ' + ISNULL(CAST(@StatisticsModificationLevel AS nvarchar),'NULL') + SET @Parameters += ', @StatisticsSample = ' + ISNULL(CAST(@StatisticsSample AS nvarchar),'NULL') + SET @Parameters += ', @StatisticsResample = ' + ISNULL('''' + REPLACE(@StatisticsResample,'''','''''') + '''','NULL') + SET @Parameters += ', @PartitionLevel = ' + ISNULL('''' + REPLACE(@PartitionLevel,'''','''''') + '''','NULL') + SET @Parameters += ', @MSShippedObjects = ' + ISNULL('''' + REPLACE(@MSShippedObjects,'''','''''') + '''','NULL') + SET @Parameters += ', @Indexes = ' + ISNULL('''' + REPLACE(@Indexes,'''','''''') + '''','NULL') + SET @Parameters += ', @TimeLimit = ' + ISNULL(CAST(@TimeLimit AS nvarchar),'NULL') + SET @Parameters += ', @Delay = ' + ISNULL(CAST(@Delay AS nvarchar),'NULL') + SET @Parameters += ', @WaitAtLowPriorityMaxDuration = ' + ISNULL(CAST(@WaitAtLowPriorityMaxDuration AS nvarchar),'NULL') + SET @Parameters += ', @WaitAtLowPriorityAbortAfterWait = ' + ISNULL('''' + REPLACE(@WaitAtLowPriorityAbortAfterWait,'''','''''') + '''','NULL') + SET @Parameters += ', @Resumable = ' + ISNULL('''' + REPLACE(@Resumable,'''','''''') + '''','NULL') + SET @Parameters += ', @AvailabilityGroups = ' + ISNULL('''' + REPLACE(@AvailabilityGroups,'''','''''') + '''','NULL') + SET @Parameters += ', @LockTimeout = ' + ISNULL(CAST(@LockTimeout AS nvarchar),'NULL') + SET @Parameters += ', @LockMessageSeverity = ' + ISNULL(CAST(@LockMessageSeverity AS nvarchar),'NULL') + SET @Parameters += ', @StringDelimiter = ' + ISNULL('''' + REPLACE(@StringDelimiter,'''','''''') + '''','NULL') + SET @Parameters += ', @DatabaseOrder = ' + ISNULL('''' + REPLACE(@DatabaseOrder,'''','''''') + '''','NULL') + SET @Parameters += ', @DatabasesInParallel = ' + ISNULL('''' + REPLACE(@DatabasesInParallel,'''','''''') + '''','NULL') + SET @Parameters += ', @LogToTable = ' + ISNULL('''' + REPLACE(@LogToTable,'''','''''') + '''','NULL') + SET @Parameters += ', @Execute = ' + ISNULL('''' + REPLACE(@Execute,'''','''''') + '''','NULL') + + SET @StartMessage = 'Date and time: ' + CONVERT(nvarchar,@StartTime,120) + RAISERROR('%s',10,1,@StartMessage) WITH NOWAIT + + SET @StartMessage = 'Server: ' + CAST(SERVERPROPERTY('ServerName') AS nvarchar(max)) + RAISERROR('%s',10,1,@StartMessage) WITH NOWAIT + + SET @StartMessage = 'Version: ' + CAST(SERVERPROPERTY('ProductVersion') AS nvarchar(max)) + RAISERROR('%s',10,1,@StartMessage) WITH NOWAIT + + SET @StartMessage = 'Edition: ' + CAST(SERVERPROPERTY('Edition') AS nvarchar(max)) + RAISERROR('%s',10,1,@StartMessage) WITH NOWAIT + + SET @StartMessage = 'Platform: ' + @HostPlatform + RAISERROR('%s',10,1,@StartMessage) WITH NOWAIT + + SET @StartMessage = 'Procedure: ' + QUOTENAME(DB_NAME(DB_ID())) + '.' + QUOTENAME(@SchemaName) + '.' + QUOTENAME(@ObjectName) + RAISERROR('%s',10,1,@StartMessage) WITH NOWAIT + + SET @StartMessage = 'Parameters: ' + @Parameters + RAISERROR('%s',10,1,@StartMessage) WITH NOWAIT + + SET @StartMessage = 'Version: ' + @VersionTimestamp + RAISERROR('%s',10,1,@StartMessage) WITH NOWAIT + + SET @StartMessage = 'Source: https://ola.hallengren.com' + RAISERROR('%s',10,1,@StartMessage) WITH NOWAIT + + RAISERROR(@EmptyLine,10,1) WITH NOWAIT + + ---------------------------------------------------------------------------------------------------- + --// Check core requirements //-- + ---------------------------------------------------------------------------------------------------- + + IF NOT (SELECT [compatibility_level] FROM sys.databases WHERE database_id = DB_ID()) >= 90 + BEGIN + INSERT INTO @Errors ([Message], Severity, [State]) + SELECT 'The database ' + QUOTENAME(DB_NAME(DB_ID())) + ' has to be in compatibility level 90 or higher.', 16, 1 + END + + IF NOT (SELECT uses_ansi_nulls FROM sys.sql_modules WHERE [object_id] = @@PROCID) = 1 + BEGIN + INSERT INTO @Errors ([Message], Severity, [State]) + SELECT 'ANSI_NULLS has to be set to ON for the stored procedure.', 16, 1 + END + + IF NOT (SELECT uses_quoted_identifier FROM sys.sql_modules WHERE [object_id] = @@PROCID) = 1 + BEGIN + INSERT INTO @Errors ([Message], Severity, [State]) + SELECT 'QUOTED_IDENTIFIER has to be set to ON for the stored procedure.', 16, 1 + END + + IF NOT EXISTS (SELECT * FROM sys.objects objects INNER JOIN sys.schemas schemas ON objects.[schema_id] = schemas.[schema_id] WHERE objects.[type] = 'P' AND schemas.[name] = 'dbo' AND objects.[name] = 'CommandExecute') + BEGIN + INSERT INTO @Errors ([Message], Severity, [State]) + SELECT 'The stored procedure CommandExecute is missing. Download https://ola.hallengren.com/scripts/CommandExecute.sql.', 16, 1 + END + + IF EXISTS (SELECT * FROM sys.objects objects INNER JOIN sys.schemas schemas ON objects.[schema_id] = schemas.[schema_id] WHERE objects.[type] = 'P' AND schemas.[name] = 'dbo' AND objects.[name] = 'CommandExecute' AND OBJECT_DEFINITION(objects.[object_id]) NOT LIKE '%@DatabaseContext%') + BEGIN + INSERT INTO @Errors ([Message], Severity, [State]) + SELECT 'The stored procedure CommandExecute needs to be updated. Download https://ola.hallengren.com/scripts/CommandExecute.sql.', 16, 1 + END + + IF @LogToTable = 'Y' AND NOT EXISTS (SELECT * FROM sys.objects objects INNER JOIN sys.schemas schemas ON objects.[schema_id] = schemas.[schema_id] WHERE objects.[type] = 'U' AND schemas.[name] = 'dbo' AND objects.[name] = 'CommandLog') + BEGIN + INSERT INTO @Errors ([Message], Severity, [State]) + SELECT 'The table CommandLog is missing. Download https://ola.hallengren.com/scripts/CommandLog.sql.', 16, 1 + END + + IF @DatabasesInParallel = 'Y' AND NOT EXISTS (SELECT * FROM sys.objects objects INNER JOIN sys.schemas schemas ON objects.[schema_id] = schemas.[schema_id] WHERE objects.[type] = 'U' AND schemas.[name] = 'dbo' AND objects.[name] = 'Queue') + BEGIN + INSERT INTO @Errors ([Message], Severity, [State]) + SELECT 'The table Queue is missing. Download https://ola.hallengren.com/scripts/Queue.sql.', 16, 1 + END + + IF @DatabasesInParallel = 'Y' AND NOT EXISTS (SELECT * FROM sys.objects objects INNER JOIN sys.schemas schemas ON objects.[schema_id] = schemas.[schema_id] WHERE objects.[type] = 'U' AND schemas.[name] = 'dbo' AND objects.[name] = 'QueueDatabase') + BEGIN + INSERT INTO @Errors ([Message], Severity, [State]) + SELECT 'The table QueueDatabase is missing. Download https://ola.hallengren.com/scripts/QueueDatabase.sql.', 16, 1 + END + + IF @@TRANCOUNT <> 0 + BEGIN + INSERT INTO @Errors ([Message], Severity, [State]) + SELECT 'The transaction count is not 0.', 16, 1 + END + + ---------------------------------------------------------------------------------------------------- + --// Select databases //-- + ---------------------------------------------------------------------------------------------------- + + SET @Databases = REPLACE(@Databases, CHAR(10), '') + SET @Databases = REPLACE(@Databases, CHAR(13), '') + + WHILE CHARINDEX(@StringDelimiter + ' ', @Databases) > 0 SET @Databases = REPLACE(@Databases, @StringDelimiter + ' ', @StringDelimiter) + WHILE CHARINDEX(' ' + @StringDelimiter, @Databases) > 0 SET @Databases = REPLACE(@Databases, ' ' + @StringDelimiter, @StringDelimiter) + + SET @Databases = LTRIM(RTRIM(@Databases)); + + WITH Databases1 (StartPosition, EndPosition, DatabaseItem) AS + ( + SELECT 1 AS StartPosition, + ISNULL(NULLIF(CHARINDEX(@StringDelimiter, @Databases, 1), 0), LEN(@Databases) + 1) AS EndPosition, + SUBSTRING(@Databases, 1, ISNULL(NULLIF(CHARINDEX(@StringDelimiter, @Databases, 1), 0), LEN(@Databases) + 1) - 1) AS DatabaseItem + WHERE @Databases IS NOT NULL + UNION ALL + SELECT CAST(EndPosition AS int) + 1 AS StartPosition, + ISNULL(NULLIF(CHARINDEX(@StringDelimiter, @Databases, EndPosition + 1), 0), LEN(@Databases) + 1) AS EndPosition, + SUBSTRING(@Databases, EndPosition + 1, ISNULL(NULLIF(CHARINDEX(@StringDelimiter, @Databases, EndPosition + 1), 0), LEN(@Databases) + 1) - EndPosition - 1) AS DatabaseItem + FROM Databases1 + WHERE EndPosition < LEN(@Databases) + 1 + ), + Databases2 (DatabaseItem, StartPosition, Selected) AS + ( + SELECT CASE WHEN DatabaseItem LIKE '-%' THEN RIGHT(DatabaseItem,LEN(DatabaseItem) - 1) ELSE DatabaseItem END AS DatabaseItem, + StartPosition, + CASE WHEN DatabaseItem LIKE '-%' THEN 0 ELSE 1 END AS Selected + FROM Databases1 + ), + Databases3 (DatabaseItem, DatabaseType, AvailabilityGroup, StartPosition, Selected) AS + ( + SELECT CASE WHEN DatabaseItem IN('ALL_DATABASES','SYSTEM_DATABASES','USER_DATABASES','AVAILABILITY_GROUP_DATABASES') THEN '%' ELSE DatabaseItem END AS DatabaseItem, + CASE WHEN DatabaseItem = 'SYSTEM_DATABASES' THEN 'S' WHEN DatabaseItem = 'USER_DATABASES' THEN 'U' ELSE NULL END AS DatabaseType, + CASE WHEN DatabaseItem = 'AVAILABILITY_GROUP_DATABASES' THEN 1 ELSE NULL END AvailabilityGroup, + StartPosition, + Selected + FROM Databases2 + ), + Databases4 (DatabaseName, DatabaseType, AvailabilityGroup, StartPosition, Selected) AS + ( + SELECT CASE WHEN LEFT(DatabaseItem,1) = '[' AND RIGHT(DatabaseItem,1) = ']' THEN PARSENAME(DatabaseItem,1) ELSE DatabaseItem END AS DatabaseItem, + DatabaseType, + AvailabilityGroup, + StartPosition, + Selected + FROM Databases3 + ) + INSERT INTO @SelectedDatabases (DatabaseName, DatabaseType, AvailabilityGroup, StartPosition, Selected) + SELECT DatabaseName, + DatabaseType, + AvailabilityGroup, + StartPosition, + Selected + FROM Databases4 + OPTION (MAXRECURSION 0) + + IF @Version >= 11 AND SERVERPROPERTY('IsHadrEnabled') = 1 + BEGIN + INSERT INTO @tmpAvailabilityGroups (AvailabilityGroupName, Selected) + SELECT name AS AvailabilityGroupName, + 0 AS Selected + FROM sys.availability_groups + + INSERT INTO @tmpDatabasesAvailabilityGroups (DatabaseName, AvailabilityGroupName) + SELECT databases.name, + availability_groups.name + FROM sys.databases databases + INNER JOIN sys.dm_hadr_availability_replica_states dm_hadr_availability_replica_states ON databases.replica_id = dm_hadr_availability_replica_states.replica_id + INNER JOIN sys.availability_groups availability_groups ON dm_hadr_availability_replica_states.group_id = availability_groups.group_id + END + + INSERT INTO @tmpDatabases (DatabaseName, DatabaseType, AvailabilityGroup, [Order], Selected, Completed) + SELECT [name] AS DatabaseName, + CASE WHEN name IN('master','msdb','model') OR is_distributor = 1 THEN 'S' ELSE 'U' END AS DatabaseType, + NULL AS AvailabilityGroup, + 0 AS [Order], + 0 AS Selected, + 0 AS Completed + FROM sys.databases + WHERE [name] <> 'tempdb' + AND source_database_id IS NULL + ORDER BY [name] ASC + + UPDATE tmpDatabases + SET AvailabilityGroup = CASE WHEN EXISTS (SELECT * FROM @tmpDatabasesAvailabilityGroups WHERE DatabaseName = tmpDatabases.DatabaseName) THEN 1 ELSE 0 END + FROM @tmpDatabases tmpDatabases + + UPDATE tmpDatabases + SET tmpDatabases.Selected = SelectedDatabases.Selected + FROM @tmpDatabases tmpDatabases + INNER JOIN @SelectedDatabases SelectedDatabases + ON tmpDatabases.DatabaseName LIKE REPLACE(SelectedDatabases.DatabaseName,'_','[_]') + AND (tmpDatabases.DatabaseType = SelectedDatabases.DatabaseType OR SelectedDatabases.DatabaseType IS NULL) + AND (tmpDatabases.AvailabilityGroup = SelectedDatabases.AvailabilityGroup OR SelectedDatabases.AvailabilityGroup IS NULL) + WHERE SelectedDatabases.Selected = 1 + + UPDATE tmpDatabases + SET tmpDatabases.Selected = SelectedDatabases.Selected + FROM @tmpDatabases tmpDatabases + INNER JOIN @SelectedDatabases SelectedDatabases + ON tmpDatabases.DatabaseName LIKE REPLACE(SelectedDatabases.DatabaseName,'_','[_]') + AND (tmpDatabases.DatabaseType = SelectedDatabases.DatabaseType OR SelectedDatabases.DatabaseType IS NULL) + AND (tmpDatabases.AvailabilityGroup = SelectedDatabases.AvailabilityGroup OR SelectedDatabases.AvailabilityGroup IS NULL) + WHERE SelectedDatabases.Selected = 0 + + UPDATE tmpDatabases + SET tmpDatabases.StartPosition = SelectedDatabases2.StartPosition + FROM @tmpDatabases tmpDatabases + INNER JOIN (SELECT tmpDatabases.DatabaseName, MIN(SelectedDatabases.StartPosition) AS StartPosition + FROM @tmpDatabases tmpDatabases + INNER JOIN @SelectedDatabases SelectedDatabases + ON tmpDatabases.DatabaseName LIKE REPLACE(SelectedDatabases.DatabaseName,'_','[_]') + AND (tmpDatabases.DatabaseType = SelectedDatabases.DatabaseType OR SelectedDatabases.DatabaseType IS NULL) + AND (tmpDatabases.AvailabilityGroup = SelectedDatabases.AvailabilityGroup OR SelectedDatabases.AvailabilityGroup IS NULL) + WHERE SelectedDatabases.Selected = 1 + GROUP BY tmpDatabases.DatabaseName) SelectedDatabases2 + ON tmpDatabases.DatabaseName = SelectedDatabases2.DatabaseName + + IF @Databases IS NOT NULL AND (NOT EXISTS(SELECT * FROM @SelectedDatabases) OR EXISTS(SELECT * FROM @SelectedDatabases WHERE DatabaseName IS NULL OR DatabaseName = '')) + BEGIN + INSERT INTO @Errors ([Message], Severity, [State]) + SELECT 'The value for the parameter @Databases is not supported.', 16, 1 + END + + ---------------------------------------------------------------------------------------------------- + --// Select availability groups //-- + ---------------------------------------------------------------------------------------------------- + + IF @AvailabilityGroups IS NOT NULL AND @Version >= 11 AND SERVERPROPERTY('IsHadrEnabled') = 1 + BEGIN + + SET @AvailabilityGroups = REPLACE(@AvailabilityGroups, CHAR(10), '') + SET @AvailabilityGroups = REPLACE(@AvailabilityGroups, CHAR(13), '') + + WHILE CHARINDEX(@StringDelimiter + ' ', @AvailabilityGroups) > 0 SET @AvailabilityGroups = REPLACE(@AvailabilityGroups, @StringDelimiter + ' ', @StringDelimiter) + WHILE CHARINDEX(' ' + @StringDelimiter, @AvailabilityGroups) > 0 SET @AvailabilityGroups = REPLACE(@AvailabilityGroups, ' ' + @StringDelimiter, @StringDelimiter) + + SET @AvailabilityGroups = LTRIM(RTRIM(@AvailabilityGroups)); + + WITH AvailabilityGroups1 (StartPosition, EndPosition, AvailabilityGroupItem) AS + ( + SELECT 1 AS StartPosition, + ISNULL(NULLIF(CHARINDEX(@StringDelimiter, @AvailabilityGroups, 1), 0), LEN(@AvailabilityGroups) + 1) AS EndPosition, + SUBSTRING(@AvailabilityGroups, 1, ISNULL(NULLIF(CHARINDEX(@StringDelimiter, @AvailabilityGroups, 1), 0), LEN(@AvailabilityGroups) + 1) - 1) AS AvailabilityGroupItem + WHERE @AvailabilityGroups IS NOT NULL + UNION ALL + SELECT CAST(EndPosition AS int) + 1 AS StartPosition, + ISNULL(NULLIF(CHARINDEX(@StringDelimiter, @AvailabilityGroups, EndPosition + 1), 0), LEN(@AvailabilityGroups) + 1) AS EndPosition, + SUBSTRING(@AvailabilityGroups, EndPosition + 1, ISNULL(NULLIF(CHARINDEX(@StringDelimiter, @AvailabilityGroups, EndPosition + 1), 0), LEN(@AvailabilityGroups) + 1) - EndPosition - 1) AS AvailabilityGroupItem + FROM AvailabilityGroups1 + WHERE EndPosition < LEN(@AvailabilityGroups) + 1 + ), + AvailabilityGroups2 (AvailabilityGroupItem, StartPosition, Selected) AS + ( + SELECT CASE WHEN AvailabilityGroupItem LIKE '-%' THEN RIGHT(AvailabilityGroupItem,LEN(AvailabilityGroupItem) - 1) ELSE AvailabilityGroupItem END AS AvailabilityGroupItem, + StartPosition, + CASE WHEN AvailabilityGroupItem LIKE '-%' THEN 0 ELSE 1 END AS Selected + FROM AvailabilityGroups1 + ), + AvailabilityGroups3 (AvailabilityGroupItem, StartPosition, Selected) AS + ( + SELECT CASE WHEN AvailabilityGroupItem = 'ALL_AVAILABILITY_GROUPS' THEN '%' ELSE AvailabilityGroupItem END AS AvailabilityGroupItem, + StartPosition, + Selected + FROM AvailabilityGroups2 + ), + AvailabilityGroups4 (AvailabilityGroupName, StartPosition, Selected) AS + ( + SELECT CASE WHEN LEFT(AvailabilityGroupItem,1) = '[' AND RIGHT(AvailabilityGroupItem,1) = ']' THEN PARSENAME(AvailabilityGroupItem,1) ELSE AvailabilityGroupItem END AS AvailabilityGroupItem, + StartPosition, + Selected + FROM AvailabilityGroups3 + ) + INSERT INTO @SelectedAvailabilityGroups (AvailabilityGroupName, StartPosition, Selected) + SELECT AvailabilityGroupName, StartPosition, Selected + FROM AvailabilityGroups4 + OPTION (MAXRECURSION 0) + + UPDATE tmpAvailabilityGroups + SET tmpAvailabilityGroups.Selected = SelectedAvailabilityGroups.Selected + FROM @tmpAvailabilityGroups tmpAvailabilityGroups + INNER JOIN @SelectedAvailabilityGroups SelectedAvailabilityGroups + ON tmpAvailabilityGroups.AvailabilityGroupName LIKE REPLACE(SelectedAvailabilityGroups.AvailabilityGroupName,'_','[_]') + WHERE SelectedAvailabilityGroups.Selected = 1 + + UPDATE tmpAvailabilityGroups + SET tmpAvailabilityGroups.Selected = SelectedAvailabilityGroups.Selected + FROM @tmpAvailabilityGroups tmpAvailabilityGroups + INNER JOIN @SelectedAvailabilityGroups SelectedAvailabilityGroups + ON tmpAvailabilityGroups.AvailabilityGroupName LIKE REPLACE(SelectedAvailabilityGroups.AvailabilityGroupName,'_','[_]') + WHERE SelectedAvailabilityGroups.Selected = 0 + + UPDATE tmpAvailabilityGroups + SET tmpAvailabilityGroups.StartPosition = SelectedAvailabilityGroups2.StartPosition + FROM @tmpAvailabilityGroups tmpAvailabilityGroups + INNER JOIN (SELECT tmpAvailabilityGroups.AvailabilityGroupName, MIN(SelectedAvailabilityGroups.StartPosition) AS StartPosition + FROM @tmpAvailabilityGroups tmpAvailabilityGroups + INNER JOIN @SelectedAvailabilityGroups SelectedAvailabilityGroups + ON tmpAvailabilityGroups.AvailabilityGroupName LIKE REPLACE(SelectedAvailabilityGroups.AvailabilityGroupName,'_','[_]') + WHERE SelectedAvailabilityGroups.Selected = 1 + GROUP BY tmpAvailabilityGroups.AvailabilityGroupName) SelectedAvailabilityGroups2 + ON tmpAvailabilityGroups.AvailabilityGroupName = SelectedAvailabilityGroups2.AvailabilityGroupName + + UPDATE tmpDatabases + SET tmpDatabases.StartPosition = tmpAvailabilityGroups.StartPosition, + tmpDatabases.Selected = 1 + FROM @tmpDatabases tmpDatabases + INNER JOIN @tmpDatabasesAvailabilityGroups tmpDatabasesAvailabilityGroups ON tmpDatabases.DatabaseName = tmpDatabasesAvailabilityGroups.DatabaseName + INNER JOIN @tmpAvailabilityGroups tmpAvailabilityGroups ON tmpDatabasesAvailabilityGroups.AvailabilityGroupName = tmpAvailabilityGroups.AvailabilityGroupName + WHERE tmpAvailabilityGroups.Selected = 1 + + END + + IF @AvailabilityGroups IS NOT NULL AND (NOT EXISTS(SELECT * FROM @SelectedAvailabilityGroups) OR EXISTS(SELECT * FROM @SelectedAvailabilityGroups WHERE AvailabilityGroupName IS NULL OR AvailabilityGroupName = '') OR @Version < 11 OR SERVERPROPERTY('IsHadrEnabled') = 0) + BEGIN + INSERT INTO @Errors ([Message], Severity, [State]) + SELECT 'The value for the parameter @AvailabilityGroups is not supported.', 16, 1 + END + + IF (@Databases IS NULL AND @AvailabilityGroups IS NULL) + BEGIN + INSERT INTO @Errors ([Message], Severity, [State]) + SELECT 'You need to specify one of the parameters @Databases and @AvailabilityGroups.', 16, 2 + END + + IF (@Databases IS NOT NULL AND @AvailabilityGroups IS NOT NULL) + BEGIN + INSERT INTO @Errors ([Message], Severity, [State]) + SELECT 'You can only specify one of the parameters @Databases and @AvailabilityGroups.', 16, 3 + END + + ---------------------------------------------------------------------------------------------------- + --// Select indexes //-- + ---------------------------------------------------------------------------------------------------- + + SET @Indexes = REPLACE(@Indexes, CHAR(10), '') + SET @Indexes = REPLACE(@Indexes, CHAR(13), '') + + WHILE CHARINDEX(@StringDelimiter + ' ', @Indexes) > 0 SET @Indexes = REPLACE(@Indexes, @StringDelimiter + ' ', @StringDelimiter) + WHILE CHARINDEX(' ' + @StringDelimiter, @Indexes) > 0 SET @Indexes = REPLACE(@Indexes, ' ' + @StringDelimiter, @StringDelimiter) + + SET @Indexes = LTRIM(RTRIM(@Indexes)); + + WITH Indexes1 (StartPosition, EndPosition, IndexItem) AS + ( + SELECT 1 AS StartPosition, + ISNULL(NULLIF(CHARINDEX(@StringDelimiter, @Indexes, 1), 0), LEN(@Indexes) + 1) AS EndPosition, + SUBSTRING(@Indexes, 1, ISNULL(NULLIF(CHARINDEX(@StringDelimiter, @Indexes, 1), 0), LEN(@Indexes) + 1) - 1) AS IndexItem + WHERE @Indexes IS NOT NULL + UNION ALL + SELECT CAST(EndPosition AS int) + 1 AS StartPosition, + ISNULL(NULLIF(CHARINDEX(@StringDelimiter, @Indexes, EndPosition + 1), 0), LEN(@Indexes) + 1) AS EndPosition, + SUBSTRING(@Indexes, EndPosition + 1, ISNULL(NULLIF(CHARINDEX(@StringDelimiter, @Indexes, EndPosition + 1), 0), LEN(@Indexes) + 1) - EndPosition - 1) AS IndexItem + FROM Indexes1 + WHERE EndPosition < LEN(@Indexes) + 1 + ), + Indexes2 (IndexItem, StartPosition, Selected) AS + ( + SELECT CASE WHEN IndexItem LIKE '-%' THEN RIGHT(IndexItem,LEN(IndexItem) - 1) ELSE IndexItem END AS IndexItem, + StartPosition, + CASE WHEN IndexItem LIKE '-%' THEN 0 ELSE 1 END AS Selected + FROM Indexes1 + ), + Indexes3 (IndexItem, StartPosition, Selected) AS + ( + SELECT CASE WHEN IndexItem = 'ALL_INDEXES' THEN '%.%.%.%' ELSE IndexItem END AS IndexItem, + StartPosition, + Selected + FROM Indexes2 + ), + Indexes4 (DatabaseName, SchemaName, ObjectName, IndexName, StartPosition, Selected) AS + ( + SELECT CASE WHEN PARSENAME(IndexItem,4) IS NULL THEN PARSENAME(IndexItem,3) ELSE PARSENAME(IndexItem,4) END AS DatabaseName, + CASE WHEN PARSENAME(IndexItem,4) IS NULL THEN PARSENAME(IndexItem,2) ELSE PARSENAME(IndexItem,3) END AS SchemaName, + CASE WHEN PARSENAME(IndexItem,4) IS NULL THEN PARSENAME(IndexItem,1) ELSE PARSENAME(IndexItem,2) END AS ObjectName, + CASE WHEN PARSENAME(IndexItem,4) IS NULL THEN '%' ELSE PARSENAME(IndexItem,1) END AS IndexName, + StartPosition, + Selected + FROM Indexes3 + ) + INSERT INTO @SelectedIndexes (DatabaseName, SchemaName, ObjectName, IndexName, StartPosition, Selected) + SELECT DatabaseName, SchemaName, ObjectName, IndexName, StartPosition, Selected + FROM Indexes4 + OPTION (MAXRECURSION 0) + + ---------------------------------------------------------------------------------------------------- + --// Select actions //-- + ---------------------------------------------------------------------------------------------------- + + SET @FragmentationLow = REPLACE(@FragmentationLow, @StringDelimiter + ' ', @StringDelimiter); + + WITH FragmentationLow (StartPosition, EndPosition, [Action]) AS + ( + SELECT 1 AS StartPosition, + ISNULL(NULLIF(CHARINDEX(@StringDelimiter, @FragmentationLow, 1), 0), LEN(@FragmentationLow) + 1) AS EndPosition, + SUBSTRING(@FragmentationLow, 1, ISNULL(NULLIF(CHARINDEX(@StringDelimiter, @FragmentationLow, 1), 0), LEN(@FragmentationLow) + 1) - 1) AS [Action] + WHERE @FragmentationLow IS NOT NULL + UNION ALL + SELECT CAST(EndPosition AS int) + 1 AS StartPosition, + ISNULL(NULLIF(CHARINDEX(@StringDelimiter, @FragmentationLow, EndPosition + 1), 0), LEN(@FragmentationLow) + 1) AS EndPosition, + SUBSTRING(@FragmentationLow, EndPosition + 1, ISNULL(NULLIF(CHARINDEX(@StringDelimiter, @FragmentationLow, EndPosition + 1), 0), LEN(@FragmentationLow) + 1) - EndPosition - 1) AS [Action] + FROM FragmentationLow + WHERE EndPosition < LEN(@FragmentationLow) + 1 + ) + INSERT INTO @ActionsPreferred(FragmentationGroup, [Priority], [Action]) + SELECT 'Low' AS FragmentationGroup, + ROW_NUMBER() OVER(ORDER BY StartPosition ASC) AS [Priority], + [Action] + FROM FragmentationLow + OPTION (MAXRECURSION 0) + + SET @FragmentationMedium = REPLACE(@FragmentationMedium, @StringDelimiter + ' ', @StringDelimiter); + + WITH FragmentationMedium (StartPosition, EndPosition, [Action]) AS + ( + SELECT 1 AS StartPosition, + ISNULL(NULLIF(CHARINDEX(@StringDelimiter, @FragmentationMedium, 1), 0), LEN(@FragmentationMedium) + 1) AS EndPosition, + SUBSTRING(@FragmentationMedium, 1, ISNULL(NULLIF(CHARINDEX(@StringDelimiter, @FragmentationMedium, 1), 0), LEN(@FragmentationMedium) + 1) - 1) AS [Action] + WHERE @FragmentationMedium IS NOT NULL + UNION ALL + SELECT CAST(EndPosition AS int) + 1 AS StartPosition, + ISNULL(NULLIF(CHARINDEX(@StringDelimiter, @FragmentationMedium, EndPosition + 1), 0), LEN(@FragmentationMedium) + 1) AS EndPosition, + SUBSTRING(@FragmentationMedium, EndPosition + 1, ISNULL(NULLIF(CHARINDEX(@StringDelimiter, @FragmentationMedium, EndPosition + 1), 0), LEN(@FragmentationMedium) + 1) - EndPosition - 1) AS [Action] + FROM FragmentationMedium + WHERE EndPosition < LEN(@FragmentationMedium) + 1 + ) + INSERT INTO @ActionsPreferred(FragmentationGroup, [Priority], [Action]) + SELECT 'Medium' AS FragmentationGroup, + ROW_NUMBER() OVER(ORDER BY StartPosition ASC) AS [Priority], + [Action] + FROM FragmentationMedium + OPTION (MAXRECURSION 0) + + SET @FragmentationHigh = REPLACE(@FragmentationHigh, @StringDelimiter + ' ', @StringDelimiter); + + WITH FragmentationHigh (StartPosition, EndPosition, [Action]) AS + ( + SELECT 1 AS StartPosition, + ISNULL(NULLIF(CHARINDEX(@StringDelimiter, @FragmentationHigh, 1), 0), LEN(@FragmentationHigh) + 1) AS EndPosition, + SUBSTRING(@FragmentationHigh, 1, ISNULL(NULLIF(CHARINDEX(@StringDelimiter, @FragmentationHigh, 1), 0), LEN(@FragmentationHigh) + 1) - 1) AS [Action] + WHERE @FragmentationHigh IS NOT NULL + UNION ALL + SELECT CAST(EndPosition AS int) + 1 AS StartPosition, + ISNULL(NULLIF(CHARINDEX(@StringDelimiter, @FragmentationHigh, EndPosition + 1), 0), LEN(@FragmentationHigh) + 1) AS EndPosition, + SUBSTRING(@FragmentationHigh, EndPosition + 1, ISNULL(NULLIF(CHARINDEX(@StringDelimiter, @FragmentationHigh, EndPosition + 1), 0), LEN(@FragmentationHigh) + 1) - EndPosition - 1) AS [Action] + FROM FragmentationHigh + WHERE EndPosition < LEN(@FragmentationHigh) + 1 + ) + INSERT INTO @ActionsPreferred(FragmentationGroup, [Priority], [Action]) + SELECT 'High' AS FragmentationGroup, + ROW_NUMBER() OVER(ORDER BY StartPosition ASC) AS [Priority], + [Action] + FROM FragmentationHigh + OPTION (MAXRECURSION 0) + + ---------------------------------------------------------------------------------------------------- + --// Check input parameters //-- + ---------------------------------------------------------------------------------------------------- + + IF EXISTS (SELECT [Action] FROM @ActionsPreferred WHERE FragmentationGroup = 'Low' AND [Action] NOT IN(SELECT * FROM @Actions)) + BEGIN + INSERT INTO @Errors ([Message], Severity, [State]) + SELECT 'The value for the parameter @FragmentationLow is not supported.', 16, 1 + END + + IF EXISTS (SELECT * FROM @ActionsPreferred WHERE FragmentationGroup = 'Low' GROUP BY [Action] HAVING COUNT(*) > 1) + BEGIN + INSERT INTO @Errors ([Message], Severity, [State]) + SELECT 'The value for the parameter @FragmentationLow is not supported.', 16, 2 + END + + ---------------------------------------------------------------------------------------------------- + + IF EXISTS (SELECT [Action] FROM @ActionsPreferred WHERE FragmentationGroup = 'Medium' AND [Action] NOT IN(SELECT * FROM @Actions)) + BEGIN + INSERT INTO @Errors ([Message], Severity, [State]) + SELECT 'The value for the parameter @FragmentationMedium is not supported.', 16, 1 + END + + IF EXISTS (SELECT * FROM @ActionsPreferred WHERE FragmentationGroup = 'Medium' GROUP BY [Action] HAVING COUNT(*) > 1) + BEGIN + INSERT INTO @Errors ([Message], Severity, [State]) + SELECT 'The value for the parameter @FragmentationMedium is not supported.', 16, 2 + END + + ---------------------------------------------------------------------------------------------------- + + IF EXISTS (SELECT [Action] FROM @ActionsPreferred WHERE FragmentationGroup = 'High' AND [Action] NOT IN(SELECT * FROM @Actions)) + BEGIN + INSERT INTO @Errors ([Message], Severity, [State]) + SELECT 'The value for the parameter @FragmentationHigh is not supported.', 16, 1 + END + + IF EXISTS (SELECT * FROM @ActionsPreferred WHERE FragmentationGroup = 'High' GROUP BY [Action] HAVING COUNT(*) > 1) + BEGIN + INSERT INTO @Errors ([Message], Severity, [State]) + SELECT 'The value for the parameter @FragmentationHigh is not supported.', 16, 2 + END + + ---------------------------------------------------------------------------------------------------- + + IF @FragmentationLevel1 <= 0 OR @FragmentationLevel1 >= 100 OR @FragmentationLevel1 IS NULL + BEGIN + INSERT INTO @Errors ([Message], Severity, [State]) + SELECT 'The value for the parameter @FragmentationLevel1 is not supported.', 16, 1 + END + + IF @FragmentationLevel1 >= @FragmentationLevel2 + BEGIN + INSERT INTO @Errors ([Message], Severity, [State]) + SELECT 'The value for the parameter @FragmentationLevel1 is not supported.', 16, 2 + END + + ---------------------------------------------------------------------------------------------------- + + IF @FragmentationLevel2 <= 0 OR @FragmentationLevel2 >= 100 OR @FragmentationLevel2 IS NULL + BEGIN + INSERT INTO @Errors ([Message], Severity, [State]) + SELECT 'The value for the parameter @FragmentationLevel2 is not supported.', 16, 1 + END + + IF @FragmentationLevel2 <= @FragmentationLevel1 + BEGIN + INSERT INTO @Errors ([Message], Severity, [State]) + SELECT 'The value for the parameter @FragmentationLevel2 is not supported.', 16, 2 + END + + ---------------------------------------------------------------------------------------------------- + + IF @MinNumberOfPages < 0 OR @MinNumberOfPages IS NULL + BEGIN + INSERT INTO @Errors ([Message], Severity, [State]) + SELECT 'The value for the parameter @MinNumberOfPages is not supported.', 16, 1 + END + + ---------------------------------------------------------------------------------------------------- + + IF @MaxNumberOfPages < 0 + BEGIN + INSERT INTO @Errors ([Message], Severity, [State]) + SELECT 'The value for the parameter @MaxNumberOfPages is not supported.', 16, 1 + END + + ---------------------------------------------------------------------------------------------------- + + IF @SortInTempdb NOT IN('Y','N') OR @SortInTempdb IS NULL + BEGIN + INSERT INTO @Errors ([Message], Severity, [State]) + SELECT 'The value for the parameter @SortInTempdb is not supported.', 16, 1 + END + + ---------------------------------------------------------------------------------------------------- + + IF @MaxDOP < 0 OR @MaxDOP > 64 + BEGIN + INSERT INTO @Errors ([Message], Severity, [State]) + SELECT 'The value for the parameter @MaxDOP is not supported.', 16, 1 + END + + ---------------------------------------------------------------------------------------------------- + + IF @FillFactor <= 0 OR @FillFactor > 100 + BEGIN + INSERT INTO @Errors ([Message], Severity, [State]) + SELECT 'The value for the parameter @FillFactor is not supported.', 16, 1 + END + + ---------------------------------------------------------------------------------------------------- + + IF @PadIndex NOT IN('Y','N') + BEGIN + INSERT INTO @Errors ([Message], Severity, [State]) + SELECT 'The value for the parameter @PadIndex is not supported.', 16, 1 + END + + ---------------------------------------------------------------------------------------------------- + + IF @LOBCompaction NOT IN('Y','N') OR @LOBCompaction IS NULL + BEGIN + INSERT INTO @Errors ([Message], Severity, [State]) + SELECT 'The value for the parameter @LOBCompaction is not supported.', 16, 1 + END + + ---------------------------------------------------------------------------------------------------- + + IF @UpdateStatistics NOT IN('ALL','COLUMNS','INDEX') + BEGIN + INSERT INTO @Errors ([Message], Severity, [State]) + SELECT 'The value for the parameter @UpdateStatistics is not supported.', 16, 1 + END + + ---------------------------------------------------------------------------------------------------- + + IF @OnlyModifiedStatistics NOT IN('Y','N') OR @OnlyModifiedStatistics IS NULL + BEGIN + INSERT INTO @Errors ([Message], Severity, [State]) + SELECT 'The value for the parameter @OnlyModifiedStatistics is not supported.', 16, 1 + END + + ---------------------------------------------------------------------------------------------------- + + IF @StatisticsModificationLevel <= 0 OR @StatisticsModificationLevel > 100 + BEGIN + INSERT INTO @Errors ([Message], Severity, [State]) + SELECT 'The value for the parameter @StatisticsModificationLevel is not supported.', 16, 1 + END + + ---------------------------------------------------------------------------------------------------- + + IF @OnlyModifiedStatistics = 'Y' AND @StatisticsModificationLevel IS NOT NULL + BEGIN + INSERT INTO @Errors ([Message], Severity, [State]) + SELECT 'You can only specify one of the parameters @OnlyModifiedStatistics and @StatisticsModificationLevel.', 16, 1 + END + + ---------------------------------------------------------------------------------------------------- + + IF @StatisticsSample <= 0 OR @StatisticsSample > 100 + BEGIN + INSERT INTO @Errors ([Message], Severity, [State]) + SELECT 'The value for the parameter @StatisticsSample is not supported.', 16, 1 + END + + ---------------------------------------------------------------------------------------------------- + + IF @StatisticsResample NOT IN('Y','N') OR @StatisticsResample IS NULL + BEGIN + INSERT INTO @Errors ([Message], Severity, [State]) + SELECT 'The value for the parameter @StatisticsResample is not supported.', 16, 1 + END + + IF @StatisticsResample = 'Y' AND @StatisticsSample IS NOT NULL + BEGIN + INSERT INTO @Errors ([Message], Severity, [State]) + SELECT 'The value for the parameter @StatisticsResample is not supported.', 16, 2 + END + + ---------------------------------------------------------------------------------------------------- + + IF @PartitionLevel NOT IN('Y','N') OR @PartitionLevel IS NULL + BEGIN + INSERT INTO @Errors ([Message], Severity, [State]) + SELECT 'The value for the parameter @PartitionLevel is not supported.', 16, 1 + END + + ---------------------------------------------------------------------------------------------------- + + IF @MSShippedObjects NOT IN('Y','N') OR @MSShippedObjects IS NULL + BEGIN + INSERT INTO @Errors ([Message], Severity, [State]) + SELECT 'The value for the parameter @MSShippedObjects is not supported.', 16, 1 + END + + ---------------------------------------------------------------------------------------------------- + + IF EXISTS(SELECT * FROM @SelectedIndexes WHERE DatabaseName IS NULL OR SchemaName IS NULL OR ObjectName IS NULL OR IndexName IS NULL) + BEGIN + INSERT INTO @Errors ([Message], Severity, [State]) + SELECT 'The value for the parameter @Indexes is not supported.', 16, 1 + END + + IF @Indexes IS NOT NULL AND NOT EXISTS(SELECT * FROM @SelectedIndexes) + BEGIN + INSERT INTO @Errors ([Message], Severity, [State]) + SELECT 'The value for the parameter @Indexes is not supported.', 16, 2 + END + + ---------------------------------------------------------------------------------------------------- + + IF @TimeLimit < 0 + BEGIN + INSERT INTO @Errors ([Message], Severity, [State]) + SELECT 'The value for the parameter @TimeLimit is not supported.', 16, 1 + END + + ---------------------------------------------------------------------------------------------------- + + IF @Delay < 0 + BEGIN + INSERT INTO @Errors ([Message], Severity, [State]) + SELECT 'The value for the parameter @Delay is not supported.', 16, 1 + END + + ---------------------------------------------------------------------------------------------------- + + IF @WaitAtLowPriorityMaxDuration < 0 + BEGIN + INSERT INTO @Errors ([Message], Severity, [State]) + SELECT 'The value for the parameter @WaitAtLowPriorityMaxDuration is not supported.', 16, 1 + END + + IF @WaitAtLowPriorityMaxDuration IS NOT NULL AND @Version < 12 + BEGIN + INSERT INTO @Errors ([Message], Severity, [State]) + SELECT 'The value for the parameter @WaitAtLowPriorityMaxDuration is not supported.', 16, 2 + END + + ---------------------------------------------------------------------------------------------------- + + IF @WaitAtLowPriorityAbortAfterWait NOT IN('NONE','SELF','BLOCKERS') + BEGIN + INSERT INTO @Errors ([Message], Severity, [State]) + SELECT 'The value for the parameter @WaitAtLowPriorityAbortAfterWait is not supported.', 16, 1 + END + + IF @WaitAtLowPriorityAbortAfterWait IS NOT NULL AND @Version < 12 + BEGIN + INSERT INTO @Errors ([Message], Severity, [State]) + SELECT 'The value for the parameter @WaitAtLowPriorityAbortAfterWait is not supported.', 16, 2 + END + + ---------------------------------------------------------------------------------------------------- + + IF (@WaitAtLowPriorityAbortAfterWait IS NOT NULL AND @WaitAtLowPriorityMaxDuration IS NULL) OR (@WaitAtLowPriorityAbortAfterWait IS NULL AND @WaitAtLowPriorityMaxDuration IS NOT NULL) + BEGIN + INSERT INTO @Errors ([Message], Severity, [State]) + SELECT 'The parameters @WaitAtLowPriorityMaxDuration and @WaitAtLowPriorityAbortAfterWait can only be used together.', 16, 1 + END + + ---------------------------------------------------------------------------------------------------- + + IF @Resumable NOT IN('Y','N') OR @Resumable IS NULL + BEGIN + INSERT INTO @Errors ([Message], Severity, [State]) + SELECT 'The value for the parameter @Resumable is not supported.', 16, 1 + END + + IF @Resumable = 'Y' AND NOT (@Version >= 14 OR SERVERPROPERTY('EngineEdition') IN (5, 8)) + BEGIN + INSERT INTO @Errors ([Message], Severity, [State]) + SELECT 'The value for the parameter @Resumable is not supported.', 16, 2 + END + + IF @Resumable = 'Y' AND @SortInTempdb = 'Y' + BEGIN + INSERT INTO @Errors ([Message], Severity, [State]) + SELECT 'You can only specify one of the parameters @Resumable and @SortInTempdb.', 16, 3 + END + + ---------------------------------------------------------------------------------------------------- + + IF @LockTimeout < 0 + BEGIN + INSERT INTO @Errors ([Message], Severity, [State]) + SELECT 'The value for the parameter @LockTimeout is not supported.', 16, 1 + END + + ---------------------------------------------------------------------------------------------------- + + IF @LockMessageSeverity NOT IN(10, 16) + BEGIN + INSERT INTO @Errors ([Message], Severity, [State]) + SELECT 'The value for the parameter @LockMessageSeverity is not supported.', 16, 1 + END + + ---------------------------------------------------------------------------------------------------- + + IF @StringDelimiter IS NULL OR LEN(@StringDelimiter) > 1 + BEGIN + INSERT INTO @Errors ([Message], Severity, [State]) + SELECT 'The value for the parameter @StringDelimiter is not supported.', 16, 1 + END + + ---------------------------------------------------------------------------------------------------- + + IF @DatabaseOrder NOT IN('DATABASE_NAME_ASC','DATABASE_NAME_DESC','DATABASE_SIZE_ASC','DATABASE_SIZE_DESC') + BEGIN + INSERT INTO @Errors ([Message], Severity, [State]) + SELECT 'The value for the parameter @DatabaseOrder is not supported.', 16, 1 + END + + IF @DatabaseOrder IS NOT NULL AND SERVERPROPERTY('EngineEdition') = 5 + BEGIN + INSERT INTO @Errors ([Message], Severity, [State]) + SELECT 'The value for the parameter @DatabaseOrder is not supported.', 16, 2 + END + + ---------------------------------------------------------------------------------------------------- + + IF @DatabasesInParallel NOT IN('Y','N') OR @DatabasesInParallel IS NULL + BEGIN + INSERT INTO @Errors ([Message], Severity, [State]) + SELECT 'The value for the parameter @DatabasesInParallel is not supported.', 16, 1 + END + + IF @DatabasesInParallel = 'Y' AND SERVERPROPERTY('EngineEdition') = 5 + BEGIN + INSERT INTO @Errors ([Message], Severity, [State]) + SELECT 'The value for the parameter @DatabasesInParallel is not supported.', 16, 2 + END + + ---------------------------------------------------------------------------------------------------- + + IF @LogToTable NOT IN('Y','N') OR @LogToTable IS NULL + BEGIN + INSERT INTO @Errors ([Message], Severity, [State]) + SELECT 'The value for the parameter @LogToTable is not supported.', 16, 1 + END + + ---------------------------------------------------------------------------------------------------- + + IF @Execute NOT IN('Y','N') OR @Execute IS NULL + BEGIN + INSERT INTO @Errors ([Message], Severity, [State]) + SELECT 'The value for the parameter @Execute is not supported.', 16, 1 + END + + ---------------------------------------------------------------------------------------------------- + + IF EXISTS(SELECT * FROM @Errors) + BEGIN + INSERT INTO @Errors ([Message], Severity, [State]) + SELECT 'The documentation is available at https://ola.hallengren.com/sql-server-index-and-statistics-maintenance.html.', 16, 1 + END + + ---------------------------------------------------------------------------------------------------- + --// Check that selected databases and availability groups exist //-- + ---------------------------------------------------------------------------------------------------- + + SET @ErrorMessage = '' + SELECT @ErrorMessage = @ErrorMessage + QUOTENAME(DatabaseName) + ', ' + FROM @SelectedDatabases + WHERE DatabaseName NOT LIKE '%[%]%' + AND DatabaseName NOT IN (SELECT DatabaseName FROM @tmpDatabases) + IF @@ROWCOUNT > 0 + BEGIN + INSERT INTO @Errors ([Message], Severity, [State]) + SELECT 'The following databases in the @Databases parameter do not exist: ' + LEFT(@ErrorMessage,LEN(@ErrorMessage)-1) + '.', 10, 1 + END + + SET @ErrorMessage = '' + SELECT @ErrorMessage = @ErrorMessage + QUOTENAME(DatabaseName) + ', ' + FROM @SelectedIndexes + WHERE DatabaseName NOT LIKE '%[%]%' + AND DatabaseName NOT IN (SELECT DatabaseName FROM @tmpDatabases) + IF @@ROWCOUNT > 0 + BEGIN + INSERT INTO @Errors ([Message], Severity, [State]) + SELECT 'The following databases in the @Indexes parameter do not exist: ' + LEFT(@ErrorMessage,LEN(@ErrorMessage)-1) + '.', 10, 1 + END + + SET @ErrorMessage = '' + SELECT @ErrorMessage = @ErrorMessage + QUOTENAME(AvailabilityGroupName) + ', ' + FROM @SelectedAvailabilityGroups + WHERE AvailabilityGroupName NOT LIKE '%[%]%' + AND AvailabilityGroupName NOT IN (SELECT AvailabilityGroupName FROM @tmpAvailabilityGroups) + IF @@ROWCOUNT > 0 + BEGIN + INSERT INTO @Errors ([Message], Severity, [State]) + SELECT 'The following availability groups do not exist: ' + LEFT(@ErrorMessage,LEN(@ErrorMessage)-1) + '.', 10, 1 + END + + SET @ErrorMessage = '' + SELECT @ErrorMessage = @ErrorMessage + QUOTENAME(DatabaseName) + ', ' + FROM @SelectedIndexes + WHERE DatabaseName NOT LIKE '%[%]%' + AND DatabaseName IN (SELECT DatabaseName FROM @tmpDatabases) + AND DatabaseName NOT IN (SELECT DatabaseName FROM @tmpDatabases WHERE Selected = 1) + IF @@ROWCOUNT > 0 + BEGIN + INSERT INTO @Errors ([Message], Severity, [State]) + SELECT 'The following databases have been selected in the @Indexes parameter, but not in the @Databases or @AvailabilityGroups parameters: ' + LEFT(@ErrorMessage,LEN(@ErrorMessage)-1) + '.', 10, 1 + END + + ---------------------------------------------------------------------------------------------------- + --// Raise errors //-- + ---------------------------------------------------------------------------------------------------- + + DECLARE ErrorCursor CURSOR FAST_FORWARD FOR SELECT [Message], Severity, [State] FROM @Errors ORDER BY [ID] ASC + + OPEN ErrorCursor + + FETCH ErrorCursor INTO @CurrentMessage, @CurrentSeverity, @CurrentState + + WHILE @@FETCH_STATUS = 0 + BEGIN + RAISERROR('%s', @CurrentSeverity, @CurrentState, @CurrentMessage) WITH NOWAIT + RAISERROR(@EmptyLine, 10, 1) WITH NOWAIT + + FETCH NEXT FROM ErrorCursor INTO @CurrentMessage, @CurrentSeverity, @CurrentState + END + + CLOSE ErrorCursor + + DEALLOCATE ErrorCursor + + IF EXISTS (SELECT * FROM @Errors WHERE Severity >= 16) + BEGIN + SET @ReturnCode = 50000 + GOTO Logging + END + + ---------------------------------------------------------------------------------------------------- + --// Should statistics be updated on the partition level? //-- + ---------------------------------------------------------------------------------------------------- + + SET @PartitionLevelStatistics = CASE WHEN @PartitionLevel = 'Y' AND ((@Version >= 12.05 AND @Version < 13) OR @Version >= 13.04422 OR SERVERPROPERTY('EngineEdition') IN (5,8)) THEN 1 ELSE 0 END + + ---------------------------------------------------------------------------------------------------- + --// Update database order //-- + ---------------------------------------------------------------------------------------------------- + + IF @DatabaseOrder IN('DATABASE_SIZE_ASC','DATABASE_SIZE_DESC') + BEGIN + UPDATE tmpDatabases + SET DatabaseSize = (SELECT SUM(CAST(size AS bigint)) FROM sys.master_files WHERE [type] = 0 AND database_id = DB_ID(tmpDatabases.DatabaseName)) + FROM @tmpDatabases tmpDatabases + END + + IF @DatabaseOrder IS NULL + BEGIN + WITH tmpDatabases AS ( + SELECT DatabaseName, [Order], ROW_NUMBER() OVER (ORDER BY StartPosition ASC, DatabaseName ASC) AS RowNumber + FROM @tmpDatabases tmpDatabases + WHERE Selected = 1 + ) + UPDATE tmpDatabases + SET [Order] = RowNumber + END + ELSE + IF @DatabaseOrder = 'DATABASE_NAME_ASC' + BEGIN + WITH tmpDatabases AS ( + SELECT DatabaseName, [Order], ROW_NUMBER() OVER (ORDER BY DatabaseName ASC) AS RowNumber + FROM @tmpDatabases tmpDatabases + WHERE Selected = 1 + ) + UPDATE tmpDatabases + SET [Order] = RowNumber + END + ELSE + IF @DatabaseOrder = 'DATABASE_NAME_DESC' + BEGIN + WITH tmpDatabases AS ( + SELECT DatabaseName, [Order], ROW_NUMBER() OVER (ORDER BY DatabaseName DESC) AS RowNumber + FROM @tmpDatabases tmpDatabases + WHERE Selected = 1 + ) + UPDATE tmpDatabases + SET [Order] = RowNumber + END + ELSE + IF @DatabaseOrder = 'DATABASE_SIZE_ASC' + BEGIN + WITH tmpDatabases AS ( + SELECT DatabaseName, [Order], ROW_NUMBER() OVER (ORDER BY DatabaseSize ASC) AS RowNumber + FROM @tmpDatabases tmpDatabases + WHERE Selected = 1 + ) + UPDATE tmpDatabases + SET [Order] = RowNumber + END + ELSE + IF @DatabaseOrder = 'DATABASE_SIZE_DESC' + BEGIN + WITH tmpDatabases AS ( + SELECT DatabaseName, [Order], ROW_NUMBER() OVER (ORDER BY DatabaseSize DESC) AS RowNumber + FROM @tmpDatabases tmpDatabases + WHERE Selected = 1 + ) + UPDATE tmpDatabases + SET [Order] = RowNumber + END + + ---------------------------------------------------------------------------------------------------- + --// Update the queue //-- + ---------------------------------------------------------------------------------------------------- + + IF @DatabasesInParallel = 'Y' + BEGIN + + BEGIN TRY + + SELECT @QueueID = QueueID + FROM dbo.[Queue] + WHERE SchemaName = @SchemaName + AND ObjectName = @ObjectName + AND [Parameters] = @Parameters + + IF @QueueID IS NULL + BEGIN + BEGIN TRANSACTION + + SELECT @QueueID = QueueID + FROM dbo.[Queue] WITH (UPDLOCK, HOLDLOCK) + WHERE SchemaName = @SchemaName + AND ObjectName = @ObjectName + AND [Parameters] = @Parameters + + IF @QueueID IS NULL + BEGIN + INSERT INTO dbo.[Queue] (SchemaName, ObjectName, [Parameters]) + SELECT @SchemaName, @ObjectName, @Parameters + + SET @QueueID = SCOPE_IDENTITY() + END + + COMMIT TRANSACTION + END + + BEGIN TRANSACTION + + UPDATE [Queue] + SET QueueStartTime = SYSDATETIME(), + SessionID = @@SPID, + RequestID = (SELECT request_id FROM sys.dm_exec_requests WHERE session_id = @@SPID), + RequestStartTime = (SELECT start_time FROM sys.dm_exec_requests WHERE session_id = @@SPID) + FROM dbo.[Queue] [Queue] + WHERE QueueID = @QueueID + AND NOT EXISTS (SELECT * + FROM sys.dm_exec_requests + WHERE session_id = [Queue].SessionID + AND request_id = [Queue].RequestID + AND start_time = [Queue].RequestStartTime) + AND NOT EXISTS (SELECT * + FROM dbo.QueueDatabase QueueDatabase + INNER JOIN sys.dm_exec_requests ON QueueDatabase.SessionID = session_id AND QueueDatabase.RequestID = request_id AND QueueDatabase.RequestStartTime = start_time + WHERE QueueDatabase.QueueID = @QueueID) + + IF @@ROWCOUNT = 1 + BEGIN + INSERT INTO dbo.QueueDatabase (QueueID, DatabaseName) + SELECT @QueueID AS QueueID, + DatabaseName + FROM @tmpDatabases tmpDatabases + WHERE Selected = 1 + AND NOT EXISTS (SELECT * FROM dbo.QueueDatabase WHERE DatabaseName = tmpDatabases.DatabaseName AND QueueID = @QueueID) + + DELETE QueueDatabase + FROM dbo.QueueDatabase QueueDatabase + WHERE QueueID = @QueueID + AND NOT EXISTS (SELECT * FROM @tmpDatabases tmpDatabases WHERE DatabaseName = QueueDatabase.DatabaseName AND Selected = 1) + + UPDATE QueueDatabase + SET DatabaseOrder = tmpDatabases.[Order] + FROM dbo.QueueDatabase QueueDatabase + INNER JOIN @tmpDatabases tmpDatabases ON QueueDatabase.DatabaseName = tmpDatabases.DatabaseName + WHERE QueueID = @QueueID + END + + COMMIT TRANSACTION + + SELECT @QueueStartTime = QueueStartTime + FROM dbo.[Queue] + WHERE QueueID = @QueueID + + END TRY + + BEGIN CATCH + IF XACT_STATE() <> 0 + BEGIN + ROLLBACK TRANSACTION + END + SET @ErrorMessage = 'Msg ' + CAST(ERROR_NUMBER() AS nvarchar) + ', ' + ISNULL(ERROR_MESSAGE(),'') + RAISERROR('%s',16,1,@ErrorMessage) WITH NOWAIT + RAISERROR(@EmptyLine,10,1) WITH NOWAIT + SET @ReturnCode = ERROR_NUMBER() + GOTO Logging + END CATCH + + END + + ---------------------------------------------------------------------------------------------------- + --// Execute commands //-- + ---------------------------------------------------------------------------------------------------- + + WHILE (1 = 1) + BEGIN + + IF @DatabasesInParallel = 'Y' + BEGIN + UPDATE QueueDatabase + SET DatabaseStartTime = NULL, + SessionID = NULL, + RequestID = NULL, + RequestStartTime = NULL + FROM dbo.QueueDatabase QueueDatabase + WHERE QueueID = @QueueID + AND DatabaseStartTime IS NOT NULL + AND DatabaseEndTime IS NULL + AND NOT EXISTS (SELECT * FROM sys.dm_exec_requests WHERE session_id = QueueDatabase.SessionID AND request_id = QueueDatabase.RequestID AND start_time = QueueDatabase.RequestStartTime) + + UPDATE QueueDatabase + SET DatabaseStartTime = SYSDATETIME(), + DatabaseEndTime = NULL, + SessionID = @@SPID, + RequestID = (SELECT request_id FROM sys.dm_exec_requests WHERE session_id = @@SPID), + RequestStartTime = (SELECT start_time FROM sys.dm_exec_requests WHERE session_id = @@SPID), + @CurrentDatabaseName = DatabaseName + FROM (SELECT TOP 1 DatabaseStartTime, + DatabaseEndTime, + SessionID, + RequestID, + RequestStartTime, + DatabaseName + FROM dbo.QueueDatabase + WHERE QueueID = @QueueID + AND (DatabaseStartTime < @QueueStartTime OR DatabaseStartTime IS NULL) + AND NOT (DatabaseStartTime IS NOT NULL AND DatabaseEndTime IS NULL) + ORDER BY DatabaseOrder ASC + ) QueueDatabase + END + ELSE + BEGIN + SELECT TOP 1 @CurrentDBID = ID, + @CurrentDatabaseName = DatabaseName + FROM @tmpDatabases + WHERE Selected = 1 + AND Completed = 0 + ORDER BY [Order] ASC + END + + IF @@ROWCOUNT = 0 + BEGIN + BREAK + END + + SET @CurrentDatabase_sp_executesql = QUOTENAME(@CurrentDatabaseName) + '.sys.sp_executesql' + + BEGIN + SET @DatabaseMessage = 'Date and time: ' + CONVERT(nvarchar,SYSDATETIME(),120) + RAISERROR('%s',10,1,@DatabaseMessage) WITH NOWAIT + + SET @DatabaseMessage = 'Database: ' + QUOTENAME(@CurrentDatabaseName) + RAISERROR('%s',10,1,@DatabaseMessage) WITH NOWAIT + END + + SELECT @CurrentUserAccess = user_access_desc, + @CurrentIsReadOnly = is_read_only, + @CurrentDatabaseState = state_desc, + @CurrentInStandby = is_in_standby, + @CurrentRecoveryModel = recovery_model_desc + FROM sys.databases + WHERE [name] = @CurrentDatabaseName + + BEGIN + SET @DatabaseMessage = 'State: ' + @CurrentDatabaseState + RAISERROR('%s',10,1,@DatabaseMessage) WITH NOWAIT + + SET @DatabaseMessage = 'Standby: ' + CASE WHEN @CurrentInStandby = 1 THEN 'Yes' ELSE 'No' END + RAISERROR('%s',10,1,@DatabaseMessage) WITH NOWAIT + + SET @DatabaseMessage = 'Updateability: ' + CASE WHEN @CurrentIsReadOnly = 1 THEN 'READ_ONLY' WHEN @CurrentIsReadOnly = 0 THEN 'READ_WRITE' END + RAISERROR('%s',10,1,@DatabaseMessage) WITH NOWAIT + + SET @DatabaseMessage = 'User access: ' + @CurrentUserAccess + RAISERROR('%s',10,1,@DatabaseMessage) WITH NOWAIT + + SET @DatabaseMessage = 'Recovery model: ' + @CurrentRecoveryModel + RAISERROR('%s',10,1,@DatabaseMessage) WITH NOWAIT + END + + IF @CurrentDatabaseState = 'ONLINE' AND SERVERPROPERTY('EngineEdition') <> 5 + BEGIN + IF EXISTS (SELECT * FROM sys.database_recovery_status WHERE database_id = DB_ID(@CurrentDatabaseName) AND database_guid IS NOT NULL) + BEGIN + SET @CurrentIsDatabaseAccessible = 1 + END + ELSE + BEGIN + SET @CurrentIsDatabaseAccessible = 0 + END + END + + IF @Version >= 11 AND SERVERPROPERTY('IsHadrEnabled') = 1 + BEGIN + SELECT @CurrentAvailabilityGroup = availability_groups.name, + @CurrentAvailabilityGroupRole = dm_hadr_availability_replica_states.role_desc + FROM sys.databases databases + INNER JOIN sys.dm_hadr_availability_replica_states dm_hadr_availability_replica_states ON databases.replica_id = dm_hadr_availability_replica_states.replica_id + INNER JOIN sys.availability_groups availability_groups ON dm_hadr_availability_replica_states.group_id = availability_groups.group_id + WHERE databases.name = @CurrentDatabaseName + END + + IF SERVERPROPERTY('EngineEdition') <> 5 + BEGIN + SELECT @CurrentDatabaseMirroringRole = UPPER(mirroring_role_desc) + FROM sys.database_mirroring + WHERE database_id = DB_ID(@CurrentDatabaseName) + END + + IF @CurrentIsDatabaseAccessible IS NOT NULL + BEGIN + SET @DatabaseMessage = 'Is accessible: ' + CASE WHEN @CurrentIsDatabaseAccessible = 1 THEN 'Yes' ELSE 'No' END + RAISERROR('%s',10,1,@DatabaseMessage) WITH NOWAIT + END + + IF @CurrentAvailabilityGroup IS NOT NULL + BEGIN + SET @DatabaseMessage = 'Availability group: ' + ISNULL(@CurrentAvailabilityGroup,'N/A') + RAISERROR('%s',10,1,@DatabaseMessage) WITH NOWAIT + + SET @DatabaseMessage = 'Availability group role: ' + ISNULL(@CurrentAvailabilityGroupRole,'N/A') + RAISERROR('%s',10,1,@DatabaseMessage) WITH NOWAIT + END + + IF @CurrentDatabaseMirroringRole IS NOT NULL + BEGIN + SET @DatabaseMessage = 'Database mirroring role: ' + @CurrentDatabaseMirroringRole + RAISERROR('%s',10,1,@DatabaseMessage) WITH NOWAIT + END + + RAISERROR(@EmptyLine,10,1) WITH NOWAIT + + IF @CurrentDatabaseState = 'ONLINE' + AND NOT (@CurrentUserAccess = 'SINGLE_USER' AND @CurrentIsDatabaseAccessible = 0) + AND DATABASEPROPERTYEX(@CurrentDatabaseName,'Updateability') = 'READ_WRITE' + BEGIN + + -- Select indexes in the current database + IF (EXISTS(SELECT * FROM @ActionsPreferred) OR @UpdateStatistics IS NOT NULL) AND (SYSDATETIME() < DATEADD(SECOND,@TimeLimit,@StartTime) OR @TimeLimit IS NULL) + BEGIN + SET @CurrentCommand = 'SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTED;' + + ' SELECT SchemaID, SchemaName, ObjectID, ObjectName, ObjectType, IsMemoryOptimized, IndexID, IndexName, IndexType, AllowPageLocks, IsImageText, IsNewLOB, IsFileStream, IsColumnStore, IsComputed, IsTimestamp, OnReadOnlyFileGroup, ResumableIndexOperation, StatisticsID, StatisticsName, NoRecompute, IsIncremental, PartitionID, PartitionNumber, PartitionCount, [Order], Selected, Completed' + + ' FROM (' + + IF EXISTS(SELECT * FROM @ActionsPreferred) OR @UpdateStatistics IN('ALL','INDEX') + BEGIN + SET @CurrentCommand = @CurrentCommand + 'SELECT schemas.[schema_id] AS SchemaID' + + ', schemas.[name] AS SchemaName' + + ', objects.[object_id] AS ObjectID' + + ', objects.[name] AS ObjectName' + + ', RTRIM(objects.[type]) AS ObjectType' + + ', ' + CASE WHEN @Version >= 12 THEN 'tables.is_memory_optimized' ELSE '0' END + ' AS IsMemoryOptimized' + + ', indexes.index_id AS IndexID' + + ', indexes.[name] AS IndexName' + + ', indexes.[type] AS IndexType' + + ', indexes.allow_page_locks AS AllowPageLocks' + + + ', CASE WHEN indexes.[type] = 1 AND EXISTS(SELECT * FROM sys.columns columns INNER JOIN sys.types types ON columns.system_type_id = types.user_type_id WHERE columns.[object_id] = objects.object_id AND types.name IN(''image'',''text'',''ntext'')) THEN 1 ELSE 0 END AS IsImageText' + + + ', CASE WHEN indexes.[type] = 1 AND EXISTS(SELECT * FROM sys.columns columns INNER JOIN sys.types types ON columns.system_type_id = types.user_type_id OR (columns.user_type_id = types.user_type_id AND types.is_assembly_type = 1) WHERE columns.[object_id] = objects.object_id AND (types.name IN(''xml'') OR (types.name IN(''varchar'',''nvarchar'',''varbinary'') AND columns.max_length = -1) OR (types.is_assembly_type = 1 AND columns.max_length = -1))) THEN 1' + + ' WHEN indexes.[type] = 2 AND EXISTS(SELECT * FROM sys.index_columns index_columns INNER JOIN sys.columns columns ON index_columns.[object_id] = columns.[object_id] AND index_columns.column_id = columns.column_id INNER JOIN sys.types types ON columns.system_type_id = types.user_type_id OR (columns.user_type_id = types.user_type_id AND types.is_assembly_type = 1) WHERE index_columns.[object_id] = objects.object_id AND index_columns.index_id = indexes.index_id AND (types.[name] IN(''xml'') OR (types.[name] IN(''varchar'',''nvarchar'',''varbinary'') AND columns.max_length = -1) OR (types.is_assembly_type = 1 AND columns.max_length = -1))) THEN 1 ELSE 0 END AS IsNewLOB' + + + ', CASE WHEN indexes.[type] = 1 AND EXISTS(SELECT * FROM sys.columns columns WHERE columns.[object_id] = objects.object_id AND columns.is_filestream = 1) THEN 1 ELSE 0 END AS IsFileStream' + + + ', CASE WHEN EXISTS(SELECT * FROM sys.indexes indexes WHERE indexes.[object_id] = objects.object_id AND [type] IN(5,6)) THEN 1 ELSE 0 END AS IsColumnStore' + + + ', CASE WHEN EXISTS(SELECT * FROM sys.index_columns index_columns INNER JOIN sys.columns columns ON index_columns.object_id = columns.object_id AND index_columns.column_id = columns.column_id WHERE (index_columns.key_ordinal > 0 OR index_columns.partition_ordinal > 0) AND columns.is_computed = 1 AND index_columns.object_id = indexes.object_id AND index_columns.index_id = indexes.index_id) THEN 1 ELSE 0 END AS IsComputed' + + + ', CASE WHEN EXISTS(SELECT * FROM sys.index_columns index_columns INNER JOIN sys.columns columns ON index_columns.[object_id] = columns.[object_id] AND index_columns.column_id = columns.column_id INNER JOIN sys.types types ON columns.system_type_id = types.system_type_id WHERE index_columns.[object_id] = objects.object_id AND index_columns.index_id = indexes.index_id AND types.[name] = ''timestamp'') THEN 1 ELSE 0 END AS IsTimestamp' + + + ', CASE WHEN EXISTS (SELECT * FROM sys.indexes indexes2 INNER JOIN sys.destination_data_spaces destination_data_spaces ON indexes.data_space_id = destination_data_spaces.partition_scheme_id INNER JOIN sys.filegroups filegroups ON destination_data_spaces.data_space_id = filegroups.data_space_id WHERE filegroups.is_read_only = 1 AND indexes2.[object_id] = indexes.[object_id] AND indexes2.[index_id] = indexes.index_id' + CASE WHEN @PartitionLevel = 'Y' THEN ' AND destination_data_spaces.destination_id = partitions.partition_number' ELSE '' END + ') THEN 1' + + ' WHEN EXISTS (SELECT * FROM sys.indexes indexes2 INNER JOIN sys.filegroups filegroups ON indexes.data_space_id = filegroups.data_space_id WHERE filegroups.is_read_only = 1 AND indexes.[object_id] = indexes2.[object_id] AND indexes.[index_id] = indexes2.index_id) THEN 1' + + ' WHEN indexes.[type] = 1 AND EXISTS (SELECT * FROM sys.tables tables INNER JOIN sys.filegroups filegroups ON tables.lob_data_space_id = filegroups.data_space_id WHERE filegroups.is_read_only = 1 AND tables.[object_id] = objects.[object_id]) THEN 1 ELSE 0 END AS OnReadOnlyFileGroup' + + + ', ' + CASE WHEN @Version >= 14 THEN 'CASE WHEN EXISTS(SELECT * FROM sys.index_resumable_operations index_resumable_operations WHERE state_desc = ''PAUSED'' AND index_resumable_operations.object_id = indexes.object_id AND index_resumable_operations.index_id = indexes.index_id AND (index_resumable_operations.partition_number = partitions.partition_number OR index_resumable_operations.partition_number IS NULL)) THEN 1 ELSE 0 END' ELSE '0' END + ' AS ResumableIndexOperation' + + + ', stats.stats_id AS StatisticsID' + + ', stats.name AS StatisticsName' + + ', stats.no_recompute AS NoRecompute' + + ', ' + CASE WHEN @Version >= 12 THEN 'stats.is_incremental' ELSE '0' END + ' AS IsIncremental' + + ', ' + CASE WHEN @PartitionLevel = 'Y' THEN 'partitions.partition_id AS PartitionID' WHEN @PartitionLevel = 'N' THEN 'NULL AS PartitionID' END + + ', ' + CASE WHEN @PartitionLevel = 'Y' THEN 'partitions.partition_number AS PartitionNumber' WHEN @PartitionLevel = 'N' THEN 'NULL AS PartitionNumber' END + + ', ' + CASE WHEN @PartitionLevel = 'Y' THEN 'IndexPartitions.partition_count AS PartitionCount' WHEN @PartitionLevel = 'N' THEN 'NULL AS PartitionCount' END + + ', 0 AS [Order]' + + ', 0 AS Selected' + + ', 0 AS Completed' + + ' FROM sys.indexes indexes' + + ' INNER JOIN sys.objects objects ON indexes.[object_id] = objects.[object_id]' + + ' INNER JOIN sys.schemas schemas ON objects.[schema_id] = schemas.[schema_id]' + + ' LEFT OUTER JOIN sys.tables tables ON objects.[object_id] = tables.[object_id]' + + ' LEFT OUTER JOIN sys.stats stats ON indexes.[object_id] = stats.[object_id] AND indexes.[index_id] = stats.[stats_id]' + IF @PartitionLevel = 'Y' + BEGIN + SET @CurrentCommand = @CurrentCommand + ' LEFT OUTER JOIN sys.partitions partitions ON indexes.[object_id] = partitions.[object_id] AND indexes.index_id = partitions.index_id' + + ' LEFT OUTER JOIN (SELECT partitions.[object_id], partitions.index_id, COUNT(DISTINCT partitions.partition_number) AS partition_count FROM sys.partitions partitions GROUP BY partitions.[object_id], partitions.index_id) IndexPartitions ON partitions.[object_id] = IndexPartitions.[object_id] AND partitions.[index_id] = IndexPartitions.[index_id]' + END + + SET @CurrentCommand = @CurrentCommand + ' WHERE objects.[type] IN(''U'',''V'')' + + CASE WHEN @MSShippedObjects = 'N' THEN ' AND objects.is_ms_shipped = 0' ELSE '' END + + ' AND indexes.[type] IN(1,2,3,4,5,6,7)' + + ' AND indexes.is_disabled = 0 AND indexes.is_hypothetical = 0' + END + + IF (EXISTS(SELECT * FROM @ActionsPreferred) AND @UpdateStatistics = 'COLUMNS') OR @UpdateStatistics = 'ALL' + BEGIN + SET @CurrentCommand = @CurrentCommand + ' UNION ' + END + + IF @UpdateStatistics IN('ALL','COLUMNS') + BEGIN + SET @CurrentCommand = @CurrentCommand + 'SELECT schemas.[schema_id] AS SchemaID' + + ', schemas.[name] AS SchemaName' + + ', objects.[object_id] AS ObjectID' + + ', objects.[name] AS ObjectName' + + ', RTRIM(objects.[type]) AS ObjectType' + + ', ' + CASE WHEN @Version >= 12 THEN 'tables.is_memory_optimized' ELSE '0' END + ' AS IsMemoryOptimized' + + ', NULL AS IndexID, NULL AS IndexName' + + ', NULL AS IndexType' + + ', NULL AS AllowPageLocks' + + ', NULL AS IsImageText' + + ', NULL AS IsNewLOB' + + ', NULL AS IsFileStream' + + ', NULL AS IsColumnStore' + + ', NULL AS IsComputed' + + ', NULL AS IsTimestamp' + + ', NULL AS OnReadOnlyFileGroup' + + ', NULL AS ResumableIndexOperation' + + ', stats.stats_id AS StatisticsID' + + ', stats.name AS StatisticsName' + + ', stats.no_recompute AS NoRecompute' + + ', ' + CASE WHEN @Version >= 12 THEN 'stats.is_incremental' ELSE '0' END + ' AS IsIncremental' + + ', NULL AS PartitionID' + + ', ' + CASE WHEN @PartitionLevelStatistics = 1 THEN 'dm_db_incremental_stats_properties.partition_number' ELSE 'NULL' END + ' AS PartitionNumber' + + ', NULL AS PartitionCount' + + ', 0 AS [Order]' + + ', 0 AS Selected' + + ', 0 AS Completed' + + ' FROM sys.stats stats' + + ' INNER JOIN sys.objects objects ON stats.[object_id] = objects.[object_id]' + + ' INNER JOIN sys.schemas schemas ON objects.[schema_id] = schemas.[schema_id]' + + ' LEFT OUTER JOIN sys.tables tables ON objects.[object_id] = tables.[object_id]' + + IF @PartitionLevelStatistics = 1 + BEGIN + SET @CurrentCommand = @CurrentCommand + ' OUTER APPLY sys.dm_db_incremental_stats_properties(stats.object_id, stats.stats_id) dm_db_incremental_stats_properties' + END + + SET @CurrentCommand = @CurrentCommand + ' WHERE objects.[type] IN(''U'',''V'')' + + CASE WHEN @MSShippedObjects = 'N' THEN ' AND objects.is_ms_shipped = 0' ELSE '' END + + ' AND NOT EXISTS(SELECT * FROM sys.indexes indexes WHERE indexes.[object_id] = stats.[object_id] AND indexes.index_id = stats.stats_id)' + END + + SET @CurrentCommand = @CurrentCommand + ') IndexesStatistics' + + INSERT INTO @tmpIndexesStatistics (SchemaID, SchemaName, ObjectID, ObjectName, ObjectType, IsMemoryOptimized, IndexID, IndexName, IndexType, AllowPageLocks, IsImageText, IsNewLOB, IsFileStream, IsColumnStore, IsComputed, IsTimestamp, OnReadOnlyFileGroup, ResumableIndexOperation, StatisticsID, StatisticsName, [NoRecompute], IsIncremental, PartitionID, PartitionNumber, PartitionCount, [Order], Selected, Completed) + EXECUTE @CurrentDatabase_sp_executesql @stmt = @CurrentCommand + SET @Error = @@ERROR + IF @Error <> 0 + BEGIN + SET @ReturnCode = @Error + END + END + + IF @Indexes IS NULL + BEGIN + UPDATE tmpIndexesStatistics + SET tmpIndexesStatistics.Selected = 1 + FROM @tmpIndexesStatistics tmpIndexesStatistics + END + ELSE + BEGIN + UPDATE tmpIndexesStatistics + SET tmpIndexesStatistics.Selected = SelectedIndexes.Selected + FROM @tmpIndexesStatistics tmpIndexesStatistics + INNER JOIN @SelectedIndexes SelectedIndexes + ON @CurrentDatabaseName LIKE REPLACE(SelectedIndexes.DatabaseName,'_','[_]') AND tmpIndexesStatistics.SchemaName LIKE REPLACE(SelectedIndexes.SchemaName,'_','[_]') AND tmpIndexesStatistics.ObjectName LIKE REPLACE(SelectedIndexes.ObjectName,'_','[_]') AND COALESCE(tmpIndexesStatistics.IndexName,tmpIndexesStatistics.StatisticsName) LIKE REPLACE(SelectedIndexes.IndexName,'_','[_]') + WHERE SelectedIndexes.Selected = 1 + + UPDATE tmpIndexesStatistics + SET tmpIndexesStatistics.Selected = SelectedIndexes.Selected + FROM @tmpIndexesStatistics tmpIndexesStatistics + INNER JOIN @SelectedIndexes SelectedIndexes + ON @CurrentDatabaseName LIKE REPLACE(SelectedIndexes.DatabaseName,'_','[_]') AND tmpIndexesStatistics.SchemaName LIKE REPLACE(SelectedIndexes.SchemaName,'_','[_]') AND tmpIndexesStatistics.ObjectName LIKE REPLACE(SelectedIndexes.ObjectName,'_','[_]') AND COALESCE(tmpIndexesStatistics.IndexName,tmpIndexesStatistics.StatisticsName) LIKE REPLACE(SelectedIndexes.IndexName,'_','[_]') + WHERE SelectedIndexes.Selected = 0 + + UPDATE tmpIndexesStatistics + SET tmpIndexesStatistics.StartPosition = SelectedIndexes2.StartPosition + FROM @tmpIndexesStatistics tmpIndexesStatistics + INNER JOIN (SELECT tmpIndexesStatistics.SchemaName, tmpIndexesStatistics.ObjectName, tmpIndexesStatistics.IndexName, tmpIndexesStatistics.StatisticsName, MIN(SelectedIndexes.StartPosition) AS StartPosition + FROM @tmpIndexesStatistics tmpIndexesStatistics + INNER JOIN @SelectedIndexes SelectedIndexes + ON @CurrentDatabaseName LIKE REPLACE(SelectedIndexes.DatabaseName,'_','[_]') AND tmpIndexesStatistics.SchemaName LIKE REPLACE(SelectedIndexes.SchemaName,'_','[_]') AND tmpIndexesStatistics.ObjectName LIKE REPLACE(SelectedIndexes.ObjectName,'_','[_]') AND COALESCE(tmpIndexesStatistics.IndexName,tmpIndexesStatistics.StatisticsName) LIKE REPLACE(SelectedIndexes.IndexName,'_','[_]') + WHERE SelectedIndexes.Selected = 1 + GROUP BY tmpIndexesStatistics.SchemaName, tmpIndexesStatistics.ObjectName, tmpIndexesStatistics.IndexName, tmpIndexesStatistics.StatisticsName) SelectedIndexes2 + ON tmpIndexesStatistics.SchemaName = SelectedIndexes2.SchemaName + AND tmpIndexesStatistics.ObjectName = SelectedIndexes2.ObjectName + AND (tmpIndexesStatistics.IndexName = SelectedIndexes2.IndexName OR tmpIndexesStatistics.IndexName IS NULL) + AND (tmpIndexesStatistics.StatisticsName = SelectedIndexes2.StatisticsName OR tmpIndexesStatistics.StatisticsName IS NULL) + END; + + WITH tmpIndexesStatistics AS ( + SELECT SchemaName, ObjectName, [Order], ROW_NUMBER() OVER (ORDER BY ISNULL(ResumableIndexOperation,0) DESC, StartPosition ASC, SchemaName ASC, ObjectName ASC, CASE WHEN IndexType IS NULL THEN 1 ELSE 0 END ASC, IndexType ASC, IndexName ASC, StatisticsName ASC, PartitionNumber ASC) AS RowNumber + FROM @tmpIndexesStatistics tmpIndexesStatistics + WHERE Selected = 1 + ) + UPDATE tmpIndexesStatistics + SET [Order] = RowNumber + + SET @ErrorMessage = '' + SELECT @ErrorMessage = @ErrorMessage + QUOTENAME(DatabaseName) + '.' + QUOTENAME(SchemaName) + '.' + QUOTENAME(ObjectName) + ', ' + FROM @SelectedIndexes SelectedIndexes + WHERE DatabaseName = @CurrentDatabaseName + AND SchemaName NOT LIKE '%[%]%' + AND ObjectName NOT LIKE '%[%]%' + AND IndexName LIKE '%[%]%' + AND NOT EXISTS (SELECT * FROM @tmpIndexesStatistics WHERE SchemaName = SelectedIndexes.SchemaName AND ObjectName = SelectedIndexes.ObjectName) + IF @@ROWCOUNT > 0 + BEGIN + SET @ErrorMessage = 'The following objects in the @Indexes parameter do not exist: ' + LEFT(@ErrorMessage,LEN(@ErrorMessage)-1) + '.' + RAISERROR('%s',10,1,@ErrorMessage) WITH NOWAIT + SET @Error = @@ERROR + RAISERROR(@EmptyLine,10,1) WITH NOWAIT + END + + SET @ErrorMessage = '' + SELECT @ErrorMessage = @ErrorMessage + QUOTENAME(DatabaseName) + QUOTENAME(SchemaName) + '.' + QUOTENAME(ObjectName) + '.' + QUOTENAME(IndexName) + ', ' + FROM @SelectedIndexes SelectedIndexes + WHERE DatabaseName = @CurrentDatabaseName + AND SchemaName NOT LIKE '%[%]%' + AND ObjectName NOT LIKE '%[%]%' + AND IndexName NOT LIKE '%[%]%' + AND NOT EXISTS (SELECT * FROM @tmpIndexesStatistics WHERE SchemaName = SelectedIndexes.SchemaName AND ObjectName = SelectedIndexes.ObjectName AND IndexName = SelectedIndexes.IndexName) + IF @@ROWCOUNT > 0 + BEGIN + SET @ErrorMessage = 'The following indexes in the @Indexes parameter do not exist: ' + LEFT(@ErrorMessage,LEN(@ErrorMessage)-1) + '.' + RAISERROR('%s',10,1,@ErrorMessage) WITH NOWAIT + SET @Error = @@ERROR + RAISERROR(@EmptyLine,10,1) WITH NOWAIT + END + + WHILE (SYSDATETIME() < DATEADD(SECOND,@TimeLimit,@StartTime) OR @TimeLimit IS NULL) + BEGIN + SELECT TOP 1 @CurrentIxID = ID, + @CurrentIxOrder = [Order], + @CurrentSchemaID = SchemaID, + @CurrentSchemaName = SchemaName, + @CurrentObjectID = ObjectID, + @CurrentObjectName = ObjectName, + @CurrentObjectType = ObjectType, + @CurrentIsMemoryOptimized = IsMemoryOptimized, + @CurrentIndexID = IndexID, + @CurrentIndexName = IndexName, + @CurrentIndexType = IndexType, + @CurrentAllowPageLocks = AllowPageLocks, + @CurrentIsImageText = IsImageText, + @CurrentIsNewLOB = IsNewLOB, + @CurrentIsFileStream = IsFileStream, + @CurrentIsColumnStore = IsColumnStore, + @CurrentIsComputed = IsComputed, + @CurrentIsTimestamp = IsTimestamp, + @CurrentOnReadOnlyFileGroup = OnReadOnlyFileGroup, + @CurrentResumableIndexOperation = ResumableIndexOperation, + @CurrentStatisticsID = StatisticsID, + @CurrentStatisticsName = StatisticsName, + @CurrentNoRecompute = [NoRecompute], + @CurrentIsIncremental = IsIncremental, + @CurrentPartitionID = PartitionID, + @CurrentPartitionNumber = PartitionNumber, + @CurrentPartitionCount = PartitionCount + FROM @tmpIndexesStatistics + WHERE Selected = 1 + AND Completed = 0 + ORDER BY [Order] ASC + + IF @@ROWCOUNT = 0 + BEGIN + BREAK + END + + -- Is the index a partition? + IF @CurrentPartitionNumber IS NULL OR @CurrentPartitionCount = 1 BEGIN SET @CurrentIsPartition = 0 END ELSE BEGIN SET @CurrentIsPartition = 1 END + + -- Does the index exist? + IF @CurrentIndexID IS NOT NULL AND EXISTS(SELECT * FROM @ActionsPreferred) + BEGIN + SET @CurrentCommand = '' + + IF @LockTimeout IS NOT NULL SET @CurrentCommand = 'SET LOCK_TIMEOUT ' + CAST(@LockTimeout * 1000 AS nvarchar) + '; ' + + IF @CurrentIsPartition = 0 SET @CurrentCommand += 'IF EXISTS(SELECT * FROM sys.indexes indexes INNER JOIN sys.objects objects ON indexes.[object_id] = objects.[object_id] INNER JOIN sys.schemas schemas ON objects.[schema_id] = schemas.[schema_id] WHERE objects.[type] IN(''U'',''V'') AND indexes.[type] IN(1,2,3,4,5,6,7) AND indexes.is_disabled = 0 AND indexes.is_hypothetical = 0 AND schemas.[schema_id] = @ParamSchemaID AND schemas.[name] = @ParamSchemaName AND objects.[object_id] = @ParamObjectID AND objects.[name] = @ParamObjectName AND objects.[type] = @ParamObjectType AND indexes.index_id = @ParamIndexID AND indexes.[name] = @ParamIndexName AND indexes.[type] = @ParamIndexType) BEGIN SET @ParamIndexExists = 1 END' + IF @CurrentIsPartition = 1 SET @CurrentCommand += 'IF EXISTS(SELECT * FROM sys.indexes indexes INNER JOIN sys.objects objects ON indexes.[object_id] = objects.[object_id] INNER JOIN sys.schemas schemas ON objects.[schema_id] = schemas.[schema_id] INNER JOIN sys.partitions partitions ON indexes.[object_id] = partitions.[object_id] AND indexes.index_id = partitions.index_id WHERE objects.[type] IN(''U'',''V'') AND indexes.[type] IN(1,2,3,4,5,6,7) AND indexes.is_disabled = 0 AND indexes.is_hypothetical = 0 AND schemas.[schema_id] = @ParamSchemaID AND schemas.[name] = @ParamSchemaName AND objects.[object_id] = @ParamObjectID AND objects.[name] = @ParamObjectName AND objects.[type] = @ParamObjectType AND indexes.index_id = @ParamIndexID AND indexes.[name] = @ParamIndexName AND indexes.[type] = @ParamIndexType AND partitions.partition_id = @ParamPartitionID AND partitions.partition_number = @ParamPartitionNumber) BEGIN SET @ParamIndexExists = 1 END' + + BEGIN TRY + EXECUTE @CurrentDatabase_sp_executesql @stmt = @CurrentCommand, @params = N'@ParamSchemaID int, @ParamSchemaName sysname, @ParamObjectID int, @ParamObjectName sysname, @ParamObjectType sysname, @ParamIndexID int, @ParamIndexName sysname, @ParamIndexType int, @ParamPartitionID bigint, @ParamPartitionNumber int, @ParamIndexExists bit OUTPUT', @ParamSchemaID = @CurrentSchemaID, @ParamSchemaName = @CurrentSchemaName, @ParamObjectID = @CurrentObjectID, @ParamObjectName = @CurrentObjectName, @ParamObjectType = @CurrentObjectType, @ParamIndexID = @CurrentIndexID, @ParamIndexName = @CurrentIndexName, @ParamIndexType = @CurrentIndexType, @ParamPartitionID = @CurrentPartitionID, @ParamPartitionNumber = @CurrentPartitionNumber, @ParamIndexExists = @CurrentIndexExists OUTPUT + + IF @CurrentIndexExists IS NULL + BEGIN + SET @CurrentIndexExists = 0 + GOTO NoAction + END + END TRY + BEGIN CATCH + SET @ErrorMessage = 'Msg ' + CAST(ERROR_NUMBER() AS nvarchar) + ', ' + ISNULL(ERROR_MESSAGE(),'') + CASE WHEN ERROR_NUMBER() = 1222 THEN ' The index ' + QUOTENAME(@CurrentIndexName) + ' on the object ' + QUOTENAME(@CurrentDatabaseName) + '.' + QUOTENAME(@CurrentSchemaName) + '.' + QUOTENAME(@CurrentObjectName) + ' is locked. It could not be checked if the index exists.' ELSE '' END + SET @Severity = CASE WHEN ERROR_NUMBER() IN(1205,1222) THEN @LockMessageSeverity ELSE 16 END + RAISERROR('%s',@Severity,1,@ErrorMessage) WITH NOWAIT + RAISERROR(@EmptyLine,10,1) WITH NOWAIT + + IF NOT (ERROR_NUMBER() IN(1205,1222) AND @LockMessageSeverity = 10) + BEGIN + SET @ReturnCode = ERROR_NUMBER() + END + + GOTO NoAction + END CATCH + END + + -- Does the statistics exist? + IF @CurrentStatisticsID IS NOT NULL AND @UpdateStatistics IS NOT NULL + BEGIN + SET @CurrentCommand = '' + + IF @LockTimeout IS NOT NULL SET @CurrentCommand = 'SET LOCK_TIMEOUT ' + CAST(@LockTimeout * 1000 AS nvarchar) + '; ' + + SET @CurrentCommand += 'IF EXISTS(SELECT * FROM sys.stats stats INNER JOIN sys.objects objects ON stats.[object_id] = objects.[object_id] INNER JOIN sys.schemas schemas ON objects.[schema_id] = schemas.[schema_id] WHERE objects.[type] IN(''U'',''V'')' + CASE WHEN @MSShippedObjects = 'N' THEN ' AND objects.is_ms_shipped = 0' ELSE '' END + ' AND schemas.[schema_id] = @ParamSchemaID AND schemas.[name] = @ParamSchemaName AND objects.[object_id] = @ParamObjectID AND objects.[name] = @ParamObjectName AND objects.[type] = @ParamObjectType AND stats.stats_id = @ParamStatisticsID AND stats.[name] = @ParamStatisticsName) BEGIN SET @ParamStatisticsExists = 1 END' + + BEGIN TRY + EXECUTE @CurrentDatabase_sp_executesql @stmt = @CurrentCommand, @params = N'@ParamSchemaID int, @ParamSchemaName sysname, @ParamObjectID int, @ParamObjectName sysname, @ParamObjectType sysname, @ParamStatisticsID int, @ParamStatisticsName sysname, @ParamStatisticsExists bit OUTPUT', @ParamSchemaID = @CurrentSchemaID, @ParamSchemaName = @CurrentSchemaName, @ParamObjectID = @CurrentObjectID, @ParamObjectName = @CurrentObjectName, @ParamObjectType = @CurrentObjectType, @ParamStatisticsID = @CurrentStatisticsID, @ParamStatisticsName = @CurrentStatisticsName, @ParamStatisticsExists = @CurrentStatisticsExists OUTPUT + + IF @CurrentStatisticsExists IS NULL + BEGIN + SET @CurrentStatisticsExists = 0 + GOTO NoAction + END + END TRY + BEGIN CATCH + SET @ErrorMessage = 'Msg ' + CAST(ERROR_NUMBER() AS nvarchar) + ', ' + ISNULL(ERROR_MESSAGE(),'') + CASE WHEN ERROR_NUMBER() = 1222 THEN ' The statistics ' + QUOTENAME(@CurrentStatisticsName) + ' on the object ' + QUOTENAME(@CurrentDatabaseName) + '.' + QUOTENAME(@CurrentSchemaName) + '.' + QUOTENAME(@CurrentObjectName) + ' is locked. It could not be checked if the statistics exists.' ELSE '' END + SET @Severity = CASE WHEN ERROR_NUMBER() IN(1205,1222) THEN @LockMessageSeverity ELSE 16 END + RAISERROR('%s',@Severity,1,@ErrorMessage) WITH NOWAIT + RAISERROR(@EmptyLine,10,1) WITH NOWAIT + + IF NOT (ERROR_NUMBER() IN(1205,1222) AND @LockMessageSeverity = 10) + BEGIN + SET @ReturnCode = ERROR_NUMBER() + END + + GOTO NoAction + END CATCH + END + + -- Has the data in the statistics been modified since the statistics was last updated? + IF @CurrentStatisticsID IS NOT NULL AND @UpdateStatistics IS NOT NULL + BEGIN + SET @CurrentCommand = '' + + IF @LockTimeout IS NOT NULL SET @CurrentCommand = 'SET LOCK_TIMEOUT ' + CAST(@LockTimeout * 1000 AS nvarchar) + '; ' + + IF @PartitionLevelStatistics = 1 AND @CurrentIsIncremental = 1 + BEGIN + SET @CurrentCommand += 'SELECT @ParamRowCount = [rows], @ParamModificationCounter = modification_counter FROM sys.dm_db_incremental_stats_properties (@ParamObjectID, @ParamStatisticsID) WHERE partition_number = @ParamPartitionNumber' + END + ELSE + IF (@Version >= 10.504000 AND @Version < 11) OR @Version >= 11.03000 + BEGIN + SET @CurrentCommand += 'SELECT @ParamRowCount = [rows], @ParamModificationCounter = modification_counter FROM sys.dm_db_stats_properties (@ParamObjectID, @ParamStatisticsID)' + END + ELSE + BEGIN + SET @CurrentCommand += 'SELECT @ParamRowCount = rowcnt, @ParamModificationCounter = rowmodctr FROM sys.sysindexes sysindexes WHERE sysindexes.[id] = @ParamObjectID AND sysindexes.[indid] = @ParamStatisticsID' + END + + BEGIN TRY + EXECUTE @CurrentDatabase_sp_executesql @stmt = @CurrentCommand, @params = N'@ParamObjectID int, @ParamStatisticsID int, @ParamPartitionNumber int, @ParamRowCount bigint OUTPUT, @ParamModificationCounter bigint OUTPUT', @ParamObjectID = @CurrentObjectID, @ParamStatisticsID = @CurrentStatisticsID, @ParamPartitionNumber = @CurrentPartitionNumber, @ParamRowCount = @CurrentRowCount OUTPUT, @ParamModificationCounter = @CurrentModificationCounter OUTPUT + + IF @CurrentRowCount IS NULL SET @CurrentRowCount = 0 + IF @CurrentModificationCounter IS NULL SET @CurrentModificationCounter = 0 + END TRY + BEGIN CATCH + SET @ErrorMessage = 'Msg ' + CAST(ERROR_NUMBER() AS nvarchar) + ', ' + ISNULL(ERROR_MESSAGE(),'') + CASE WHEN ERROR_NUMBER() = 1222 THEN ' The statistics ' + QUOTENAME(@CurrentStatisticsName) + ' on the object ' + QUOTENAME(@CurrentDatabaseName) + '.' + QUOTENAME(@CurrentSchemaName) + '.' + QUOTENAME(@CurrentObjectName) + ' is locked. The rows and modification_counter could not be checked.' ELSE '' END + SET @Severity = CASE WHEN ERROR_NUMBER() IN(1205,1222) THEN @LockMessageSeverity ELSE 16 END + RAISERROR('%s',@Severity,1,@ErrorMessage) WITH NOWAIT + RAISERROR(@EmptyLine,10,1) WITH NOWAIT + + IF NOT (ERROR_NUMBER() IN(1205,1222) AND @LockMessageSeverity = 10) + BEGIN + SET @ReturnCode = ERROR_NUMBER() + END + + GOTO NoAction + END CATCH + END + + -- Is the index fragmented? + IF @CurrentIndexID IS NOT NULL + AND @CurrentOnReadOnlyFileGroup = 0 + AND EXISTS(SELECT * FROM @ActionsPreferred) + AND (EXISTS(SELECT [Priority], [Action], COUNT(*) FROM @ActionsPreferred GROUP BY [Priority], [Action] HAVING COUNT(*) <> 3) OR @MinNumberOfPages > 0 OR @MaxNumberOfPages IS NOT NULL) + BEGIN + SET @CurrentCommand = '' + + IF @LockTimeout IS NOT NULL SET @CurrentCommand = 'SET LOCK_TIMEOUT ' + CAST(@LockTimeout * 1000 AS nvarchar) + '; ' + + SET @CurrentCommand += 'SELECT @ParamFragmentationLevel = MAX(avg_fragmentation_in_percent), @ParamPageCount = SUM(page_count) FROM sys.dm_db_index_physical_stats(DB_ID(@ParamDatabaseName), @ParamObjectID, @ParamIndexID, @ParamPartitionNumber, ''LIMITED'') WHERE alloc_unit_type_desc = ''IN_ROW_DATA'' AND index_level = 0' + + BEGIN TRY + EXECUTE sp_executesql @stmt = @CurrentCommand, @params = N'@ParamDatabaseName nvarchar(max), @ParamObjectID int, @ParamIndexID int, @ParamPartitionNumber int, @ParamFragmentationLevel float OUTPUT, @ParamPageCount bigint OUTPUT', @ParamDatabaseName = @CurrentDatabaseName, @ParamObjectID = @CurrentObjectID, @ParamIndexID = @CurrentIndexID, @ParamPartitionNumber = @CurrentPartitionNumber, @ParamFragmentationLevel = @CurrentFragmentationLevel OUTPUT, @ParamPageCount = @CurrentPageCount OUTPUT + END TRY + BEGIN CATCH + SET @ErrorMessage = 'Msg ' + CAST(ERROR_NUMBER() AS nvarchar) + ', ' + ISNULL(ERROR_MESSAGE(),'') + CASE WHEN ERROR_NUMBER() = 1222 THEN ' The index ' + QUOTENAME(@CurrentIndexName) + ' on the object ' + QUOTENAME(@CurrentDatabaseName) + '.' + QUOTENAME(@CurrentSchemaName) + '.' + QUOTENAME(@CurrentObjectName) + ' is locked. The page_count and avg_fragmentation_in_percent could not be checked.' ELSE '' END + SET @Severity = CASE WHEN ERROR_NUMBER() IN(1205,1222) THEN @LockMessageSeverity ELSE 16 END + RAISERROR('%s',@Severity,1,@ErrorMessage) WITH NOWAIT + RAISERROR(@EmptyLine,10,1) WITH NOWAIT + + IF NOT (ERROR_NUMBER() IN(1205,1222) AND @LockMessageSeverity = 10) + BEGIN + SET @ReturnCode = ERROR_NUMBER() + END + + GOTO NoAction + END CATCH + END + + -- Select fragmentation group + IF @CurrentIndexID IS NOT NULL AND @CurrentOnReadOnlyFileGroup = 0 AND EXISTS(SELECT * FROM @ActionsPreferred) + BEGIN + SET @CurrentFragmentationGroup = CASE + WHEN @CurrentFragmentationLevel >= @FragmentationLevel2 THEN 'High' + WHEN @CurrentFragmentationLevel >= @FragmentationLevel1 AND @CurrentFragmentationLevel < @FragmentationLevel2 THEN 'Medium' + WHEN @CurrentFragmentationLevel < @FragmentationLevel1 THEN 'Low' + END + END + + -- Which actions are allowed? + IF @CurrentIndexID IS NOT NULL AND EXISTS(SELECT * FROM @ActionsPreferred) + BEGIN + IF @CurrentOnReadOnlyFileGroup = 0 AND @CurrentIndexType IN (1,2,3,4,5) AND (@CurrentIsMemoryOptimized = 0 OR @CurrentIsMemoryOptimized IS NULL) AND (@CurrentAllowPageLocks = 1 OR @CurrentIndexType = 5) + BEGIN + INSERT INTO @CurrentActionsAllowed ([Action]) + VALUES ('INDEX_REORGANIZE') + END + IF @CurrentOnReadOnlyFileGroup = 0 AND @CurrentIndexType IN (1,2,3,4,5) AND (@CurrentIsMemoryOptimized = 0 OR @CurrentIsMemoryOptimized IS NULL) + BEGIN + INSERT INTO @CurrentActionsAllowed ([Action]) + VALUES ('INDEX_REBUILD_OFFLINE') + END + IF @CurrentOnReadOnlyFileGroup = 0 + AND (@CurrentIsMemoryOptimized = 0 OR @CurrentIsMemoryOptimized IS NULL) + AND (@CurrentIsPartition = 0 OR @Version >= 12) + AND ((@CurrentIndexType = 1 AND @CurrentIsImageText = 0 AND @CurrentIsNewLOB = 0) + OR (@CurrentIndexType = 2 AND @CurrentIsNewLOB = 0) + OR (@CurrentIndexType = 1 AND @CurrentIsImageText = 0 AND @CurrentIsFileStream = 0 AND @Version >= 11) + OR (@CurrentIndexType = 2 AND @Version >= 11)) + AND (@CurrentIsColumnStore = 0 OR @Version < 11) + AND SERVERPROPERTY('EngineEdition') IN (3,5,8) + BEGIN + INSERT INTO @CurrentActionsAllowed ([Action]) + VALUES ('INDEX_REBUILD_ONLINE') + END + END + + -- Decide action + IF @CurrentIndexID IS NOT NULL + AND EXISTS(SELECT * FROM @ActionsPreferred) + AND (@CurrentPageCount >= @MinNumberOfPages OR @MinNumberOfPages = 0) + AND (@CurrentPageCount <= @MaxNumberOfPages OR @MaxNumberOfPages IS NULL) + AND @CurrentResumableIndexOperation = 0 + BEGIN + IF EXISTS(SELECT [Priority], [Action], COUNT(*) FROM @ActionsPreferred GROUP BY [Priority], [Action] HAVING COUNT(*) <> 3) + BEGIN + SELECT @CurrentAction = [Action] + FROM @ActionsPreferred + WHERE FragmentationGroup = @CurrentFragmentationGroup + AND [Priority] = (SELECT MIN([Priority]) + FROM @ActionsPreferred + WHERE FragmentationGroup = @CurrentFragmentationGroup + AND [Action] IN (SELECT [Action] FROM @CurrentActionsAllowed)) + END + ELSE + BEGIN + SELECT @CurrentAction = [Action] + FROM @ActionsPreferred + WHERE [Priority] = (SELECT MIN([Priority]) + FROM @ActionsPreferred + WHERE [Action] IN (SELECT [Action] FROM @CurrentActionsAllowed)) + END + END + + IF @CurrentResumableIndexOperation = 1 + BEGIN + SET @CurrentAction = 'INDEX_REBUILD_ONLINE' + END + + -- Workaround for limitation in SQL Server, http://support.microsoft.com/kb/2292737 + IF @CurrentIndexID IS NOT NULL + BEGIN + SET @CurrentMaxDOP = @MaxDOP + + IF @CurrentAction = 'INDEX_REBUILD_ONLINE' AND @CurrentAllowPageLocks = 0 + BEGIN + SET @CurrentMaxDOP = 1 + END + END + + -- Update statistics? + IF @CurrentStatisticsID IS NOT NULL + AND ((@UpdateStatistics = 'ALL' AND (@CurrentIndexType IN (1,2,3,4,7) OR @CurrentIndexID IS NULL)) OR (@UpdateStatistics = 'INDEX' AND @CurrentIndexID IS NOT NULL AND @CurrentIndexType IN (1,2,3,4,7)) OR (@UpdateStatistics = 'COLUMNS' AND @CurrentIndexID IS NULL)) + AND ((@OnlyModifiedStatistics = 'N' AND @StatisticsModificationLevel IS NULL) OR (@OnlyModifiedStatistics = 'Y' AND @CurrentModificationCounter > 0) OR ((@CurrentModificationCounter * 1. / NULLIF(@CurrentRowCount,0)) * 100 >= @StatisticsModificationLevel) OR (@StatisticsModificationLevel IS NOT NULL AND @CurrentModificationCounter > 0 AND (@CurrentModificationCounter >= SQRT(@CurrentRowCount * 1000))) OR (@CurrentIsMemoryOptimized = 1 AND NOT (@Version >= 13 OR SERVERPROPERTY('EngineEdition') IN (5,8)))) + AND ((@CurrentIsPartition = 0 AND (@CurrentAction NOT IN('INDEX_REBUILD_ONLINE','INDEX_REBUILD_OFFLINE') OR @CurrentAction IS NULL)) OR (@CurrentIsPartition = 1 AND (@CurrentPartitionNumber = @CurrentPartitionCount OR (@PartitionLevelStatistics = 1 AND @CurrentIsIncremental = 1)))) + BEGIN + SET @CurrentUpdateStatistics = 'Y' + END + ELSE + BEGIN + SET @CurrentUpdateStatistics = 'N' + END + + SET @CurrentStatisticsSample = @StatisticsSample + SET @CurrentStatisticsResample = @StatisticsResample + + -- Memory-optimized tables only supports FULLSCAN and RESAMPLE in SQL Server 2014 + IF @CurrentIsMemoryOptimized = 1 AND NOT (@Version >= 13 OR SERVERPROPERTY('EngineEdition') IN (5,8)) AND (@CurrentStatisticsSample <> 100 OR @CurrentStatisticsSample IS NULL) + BEGIN + SET @CurrentStatisticsSample = NULL + SET @CurrentStatisticsResample = 'Y' + END + + -- Incremental statistics only supports RESAMPLE + IF @PartitionLevelStatistics = 1 AND @CurrentIsIncremental = 1 + BEGIN + SET @CurrentStatisticsSample = NULL + SET @CurrentStatisticsResample = 'Y' + END + + -- Create index comment + IF @CurrentIndexID IS NOT NULL + BEGIN + SET @CurrentComment = 'ObjectType: ' + CASE WHEN @CurrentObjectType = 'U' THEN 'Table' WHEN @CurrentObjectType = 'V' THEN 'View' ELSE 'N/A' END + ', ' + SET @CurrentComment += 'IndexType: ' + CASE WHEN @CurrentIndexType = 1 THEN 'Clustered' WHEN @CurrentIndexType = 2 THEN 'NonClustered' WHEN @CurrentIndexType = 3 THEN 'XML' WHEN @CurrentIndexType = 4 THEN 'Spatial' WHEN @CurrentIndexType = 5 THEN 'Clustered Columnstore' WHEN @CurrentIndexType = 6 THEN 'NonClustered Columnstore' WHEN @CurrentIndexType = 7 THEN 'NonClustered Hash' ELSE 'N/A' END + ', ' + SET @CurrentComment += 'ImageText: ' + CASE WHEN @CurrentIsImageText = 1 THEN 'Yes' WHEN @CurrentIsImageText = 0 THEN 'No' ELSE 'N/A' END + ', ' + SET @CurrentComment += 'NewLOB: ' + CASE WHEN @CurrentIsNewLOB = 1 THEN 'Yes' WHEN @CurrentIsNewLOB = 0 THEN 'No' ELSE 'N/A' END + ', ' + SET @CurrentComment += 'FileStream: ' + CASE WHEN @CurrentIsFileStream = 1 THEN 'Yes' WHEN @CurrentIsFileStream = 0 THEN 'No' ELSE 'N/A' END + ', ' + IF @Version >= 11 SET @CurrentComment += 'ColumnStore: ' + CASE WHEN @CurrentIsColumnStore = 1 THEN 'Yes' WHEN @CurrentIsColumnStore = 0 THEN 'No' ELSE 'N/A' END + ', ' + IF @Version >= 14 AND @Resumable = 'Y' SET @CurrentComment += 'Computed: ' + CASE WHEN @CurrentIsComputed = 1 THEN 'Yes' WHEN @CurrentIsComputed = 0 THEN 'No' ELSE 'N/A' END + ', ' + IF @Version >= 14 AND @Resumable = 'Y' SET @CurrentComment += 'Timestamp: ' + CASE WHEN @CurrentIsTimestamp = 1 THEN 'Yes' WHEN @CurrentIsTimestamp = 0 THEN 'No' ELSE 'N/A' END + ', ' + SET @CurrentComment += 'AllowPageLocks: ' + CASE WHEN @CurrentAllowPageLocks = 1 THEN 'Yes' WHEN @CurrentAllowPageLocks = 0 THEN 'No' ELSE 'N/A' END + ', ' + SET @CurrentComment += 'PageCount: ' + ISNULL(CAST(@CurrentPageCount AS nvarchar),'N/A') + ', ' + SET @CurrentComment += 'Fragmentation: ' + ISNULL(CAST(@CurrentFragmentationLevel AS nvarchar),'N/A') + END + + IF @CurrentIndexID IS NOT NULL AND (@CurrentPageCount IS NOT NULL OR @CurrentFragmentationLevel IS NOT NULL) + BEGIN + SET @CurrentExtendedInfo = (SELECT * + FROM (SELECT CAST(@CurrentPageCount AS nvarchar) AS [PageCount], + CAST(@CurrentFragmentationLevel AS nvarchar) AS Fragmentation + ) ExtendedInfo FOR XML RAW('ExtendedInfo'), ELEMENTS) + END + + IF @CurrentIndexID IS NOT NULL AND @CurrentAction IS NOT NULL AND (SYSDATETIME() < DATEADD(SECOND,@TimeLimit,@StartTime) OR @TimeLimit IS NULL) + BEGIN + SET @CurrentDatabaseContext = @CurrentDatabaseName + + SET @CurrentCommandType = 'ALTER_INDEX' + + SET @CurrentCommand = '' + IF @LockTimeout IS NOT NULL SET @CurrentCommand = 'SET LOCK_TIMEOUT ' + CAST(@LockTimeout * 1000 AS nvarchar) + '; ' + SET @CurrentCommand += 'ALTER INDEX ' + QUOTENAME(@CurrentIndexName) + ' ON ' + QUOTENAME(@CurrentSchemaName) + '.' + QUOTENAME(@CurrentObjectName) + IF @CurrentResumableIndexOperation = 1 SET @CurrentCommand += ' RESUME' + IF @CurrentAction IN('INDEX_REBUILD_ONLINE','INDEX_REBUILD_OFFLINE') AND @CurrentResumableIndexOperation = 0 SET @CurrentCommand += ' REBUILD' + IF @CurrentAction IN('INDEX_REORGANIZE') AND @CurrentResumableIndexOperation = 0 SET @CurrentCommand += ' REORGANIZE' + IF @CurrentIsPartition = 1 AND @CurrentResumableIndexOperation = 0 SET @CurrentCommand += ' PARTITION = ' + CAST(@CurrentPartitionNumber AS nvarchar) + + IF @CurrentAction IN('INDEX_REBUILD_ONLINE','INDEX_REBUILD_OFFLINE') AND @SortInTempdb = 'Y' AND @CurrentIndexType IN(1,2,3,4) AND @CurrentResumableIndexOperation = 0 + BEGIN + INSERT INTO @CurrentAlterIndexWithClauseArguments (Argument) + SELECT 'SORT_IN_TEMPDB = ON' + END + + IF @CurrentAction IN('INDEX_REBUILD_ONLINE','INDEX_REBUILD_OFFLINE') AND @SortInTempdb = 'N' AND @CurrentIndexType IN(1,2,3,4) AND @CurrentResumableIndexOperation = 0 + BEGIN + INSERT INTO @CurrentAlterIndexWithClauseArguments (Argument) + SELECT 'SORT_IN_TEMPDB = OFF' + END + + IF @CurrentAction = 'INDEX_REBUILD_ONLINE' AND (@CurrentIsPartition = 0 OR @Version >= 12) AND @CurrentResumableIndexOperation = 0 + BEGIN + INSERT INTO @CurrentAlterIndexWithClauseArguments (Argument) + SELECT 'ONLINE = ON' + CASE WHEN @WaitAtLowPriorityMaxDuration IS NOT NULL THEN ' (WAIT_AT_LOW_PRIORITY (MAX_DURATION = ' + CAST(@WaitAtLowPriorityMaxDuration AS nvarchar) + ', ABORT_AFTER_WAIT = ' + UPPER(@WaitAtLowPriorityAbortAfterWait) + '))' ELSE '' END + END + + IF @CurrentAction = 'INDEX_REBUILD_OFFLINE' AND (@CurrentIsPartition = 0 OR @Version >= 12) AND @CurrentResumableIndexOperation = 0 + BEGIN + INSERT INTO @CurrentAlterIndexWithClauseArguments (Argument) + SELECT 'ONLINE = OFF' + END + + IF @CurrentAction IN('INDEX_REBUILD_ONLINE','INDEX_REBUILD_OFFLINE') AND @CurrentMaxDOP IS NOT NULL + BEGIN + INSERT INTO @CurrentAlterIndexWithClauseArguments (Argument) + SELECT 'MAXDOP = ' + CAST(@CurrentMaxDOP AS nvarchar) + END + + IF @CurrentAction IN('INDEX_REBUILD_ONLINE','INDEX_REBUILD_OFFLINE') AND @FillFactor IS NOT NULL AND @CurrentIsPartition = 0 AND @CurrentIndexType IN(1,2,3,4) AND @CurrentResumableIndexOperation = 0 + BEGIN + INSERT INTO @CurrentAlterIndexWithClauseArguments (Argument) + SELECT 'FILLFACTOR = ' + CAST(@FillFactor AS nvarchar) + END + + IF @CurrentAction IN('INDEX_REBUILD_ONLINE','INDEX_REBUILD_OFFLINE') AND @PadIndex = 'Y' AND @CurrentIsPartition = 0 AND @CurrentIndexType IN(1,2,3,4) AND @CurrentResumableIndexOperation = 0 + BEGIN + INSERT INTO @CurrentAlterIndexWithClauseArguments (Argument) + SELECT 'PAD_INDEX = ON' + END + + IF (@Version >= 14 OR SERVERPROPERTY('EngineEdition') IN (5,8)) AND @CurrentAction = 'INDEX_REBUILD_ONLINE' AND @CurrentResumableIndexOperation = 0 + BEGIN + INSERT INTO @CurrentAlterIndexWithClauseArguments (Argument) + SELECT CASE WHEN @Resumable = 'Y' AND @CurrentIndexType IN(1,2) AND @CurrentIsComputed = 0 AND @CurrentIsTimestamp = 0 THEN 'RESUMABLE = ON' ELSE 'RESUMABLE = OFF' END + END + + IF (@Version >= 14 OR SERVERPROPERTY('EngineEdition') IN (5,8)) AND @CurrentAction = 'INDEX_REBUILD_ONLINE' AND @CurrentResumableIndexOperation = 0 AND @Resumable = 'Y' AND @CurrentIndexType IN(1,2) AND @CurrentIsComputed = 0 AND @CurrentIsTimestamp = 0 AND @TimeLimit IS NOT NULL + BEGIN + INSERT INTO @CurrentAlterIndexWithClauseArguments (Argument) + SELECT 'MAX_DURATION = ' + CAST(DATEDIFF(MINUTE,SYSDATETIME(),DATEADD(SECOND,@TimeLimit,@StartTime)) AS nvarchar(max)) + END + + IF @CurrentAction IN('INDEX_REORGANIZE') AND @LOBCompaction = 'Y' + BEGIN + INSERT INTO @CurrentAlterIndexWithClauseArguments (Argument) + SELECT 'LOB_COMPACTION = ON' + END + + IF @CurrentAction IN('INDEX_REORGANIZE') AND @LOBCompaction = 'N' + BEGIN + INSERT INTO @CurrentAlterIndexWithClauseArguments (Argument) + SELECT 'LOB_COMPACTION = OFF' + END + + IF EXISTS (SELECT * FROM @CurrentAlterIndexWithClauseArguments) + BEGIN + SET @CurrentAlterIndexWithClause = ' WITH (' + + WHILE (1 = 1) + BEGIN + SELECT TOP 1 @CurrentAlterIndexArgumentID = ID, + @CurrentAlterIndexArgument = Argument + FROM @CurrentAlterIndexWithClauseArguments + WHERE Added = 0 + ORDER BY ID ASC + + IF @@ROWCOUNT = 0 + BEGIN + BREAK + END + + SET @CurrentAlterIndexWithClause += @CurrentAlterIndexArgument + ', ' + + UPDATE @CurrentAlterIndexWithClauseArguments + SET Added = 1 + WHERE [ID] = @CurrentAlterIndexArgumentID + END + + SET @CurrentAlterIndexWithClause = RTRIM(@CurrentAlterIndexWithClause) + + SET @CurrentAlterIndexWithClause = LEFT(@CurrentAlterIndexWithClause,LEN(@CurrentAlterIndexWithClause) - 1) + + SET @CurrentAlterIndexWithClause = @CurrentAlterIndexWithClause + ')' + END + + IF @CurrentAlterIndexWithClause IS NOT NULL SET @CurrentCommand += @CurrentAlterIndexWithClause + + EXECUTE @CurrentCommandOutput = dbo.CommandExecute @DatabaseContext = @CurrentDatabaseName, @Command = @CurrentCommand, @CommandType = @CurrentCommandType, @Mode = 2, @Comment = @CurrentComment, @DatabaseName = @CurrentDatabaseName, @SchemaName = @CurrentSchemaName, @ObjectName = @CurrentObjectName, @ObjectType = @CurrentObjectType, @IndexName = @CurrentIndexName, @IndexType = @CurrentIndexType, @PartitionNumber = @CurrentPartitionNumber, @ExtendedInfo = @CurrentExtendedInfo, @LockMessageSeverity = @LockMessageSeverity, @LogToTable = @LogToTable, @Execute = @Execute + SET @Error = @@ERROR + IF @Error <> 0 SET @CurrentCommandOutput = @Error + IF @CurrentCommandOutput <> 0 SET @ReturnCode = @CurrentCommandOutput + + IF @Delay > 0 + BEGIN + SET @CurrentDelay = DATEADD(ss,@Delay,'1900-01-01') + WAITFOR DELAY @CurrentDelay + END + END + + SET @CurrentMaxDOP = @MaxDOP + + -- Create statistics comment + IF @CurrentStatisticsID IS NOT NULL + BEGIN + SET @CurrentComment = 'ObjectType: ' + CASE WHEN @CurrentObjectType = 'U' THEN 'Table' WHEN @CurrentObjectType = 'V' THEN 'View' ELSE 'N/A' END + ', ' + SET @CurrentComment += 'IndexType: ' + CASE WHEN @CurrentIndexID IS NOT NULL THEN 'Index' ELSE 'Column' END + ', ' + IF @CurrentIndexID IS NOT NULL SET @CurrentComment += 'IndexType: ' + CASE WHEN @CurrentIndexType = 1 THEN 'Clustered' WHEN @CurrentIndexType = 2 THEN 'NonClustered' WHEN @CurrentIndexType = 3 THEN 'XML' WHEN @CurrentIndexType = 4 THEN 'Spatial' WHEN @CurrentIndexType = 5 THEN 'Clustered Columnstore' WHEN @CurrentIndexType = 6 THEN 'NonClustered Columnstore' WHEN @CurrentIndexType = 7 THEN 'NonClustered Hash' ELSE 'N/A' END + ', ' + SET @CurrentComment += 'Incremental: ' + CASE WHEN @CurrentIsIncremental = 1 THEN 'Y' WHEN @CurrentIsIncremental = 0 THEN 'N' ELSE 'N/A' END + ', ' + SET @CurrentComment += 'RowCount: ' + ISNULL(CAST(@CurrentRowCount AS nvarchar),'N/A') + ', ' + SET @CurrentComment += 'ModificationCounter: ' + ISNULL(CAST(@CurrentModificationCounter AS nvarchar),'N/A') + END + + IF @CurrentStatisticsID IS NOT NULL AND (@CurrentRowCount IS NOT NULL OR @CurrentModificationCounter IS NOT NULL) + BEGIN + SET @CurrentExtendedInfo = (SELECT * + FROM (SELECT CAST(@CurrentRowCount AS nvarchar) AS [RowCount], + CAST(@CurrentModificationCounter AS nvarchar) AS ModificationCounter + ) ExtendedInfo FOR XML RAW('ExtendedInfo'), ELEMENTS) + END + + IF @CurrentStatisticsID IS NOT NULL AND @CurrentUpdateStatistics = 'Y' AND (SYSDATETIME() < DATEADD(SECOND,@TimeLimit,@StartTime) OR @TimeLimit IS NULL) + BEGIN + SET @CurrentDatabaseContext = @CurrentDatabaseName + + SET @CurrentCommandType = 'UPDATE_STATISTICS' + + SET @CurrentCommand = '' + IF @LockTimeout IS NOT NULL SET @CurrentCommand = 'SET LOCK_TIMEOUT ' + CAST(@LockTimeout * 1000 AS nvarchar) + '; ' + SET @CurrentCommand += 'UPDATE STATISTICS ' + QUOTENAME(@CurrentSchemaName) + '.' + QUOTENAME(@CurrentObjectName) + ' ' + QUOTENAME(@CurrentStatisticsName) + + IF @CurrentMaxDOP IS NOT NULL AND ((@Version >= 12.06024 AND @Version < 13) OR (@Version >= 13.05026 AND @Version < 14) OR @Version >= 14.030154) + BEGIN + INSERT INTO @CurrentUpdateStatisticsWithClauseArguments (Argument) + SELECT 'MAXDOP = ' + CAST(@CurrentMaxDOP AS nvarchar) + END + + IF @CurrentStatisticsSample = 100 + BEGIN + INSERT INTO @CurrentUpdateStatisticsWithClauseArguments (Argument) + SELECT 'FULLSCAN' + END + + IF @CurrentStatisticsSample IS NOT NULL AND @CurrentStatisticsSample <> 100 + BEGIN + INSERT INTO @CurrentUpdateStatisticsWithClauseArguments (Argument) + SELECT 'SAMPLE ' + CAST(@CurrentStatisticsSample AS nvarchar) + ' PERCENT' + END + + IF @CurrentStatisticsResample = 'Y' + BEGIN + INSERT INTO @CurrentUpdateStatisticsWithClauseArguments (Argument) + SELECT 'RESAMPLE' + END + + IF @CurrentNoRecompute = 1 + BEGIN + INSERT INTO @CurrentUpdateStatisticsWithClauseArguments (Argument) + SELECT 'NORECOMPUTE' + END + + IF EXISTS (SELECT * FROM @CurrentUpdateStatisticsWithClauseArguments) + BEGIN + SET @CurrentUpdateStatisticsWithClause = ' WITH' + + WHILE (1 = 1) + BEGIN + SELECT TOP 1 @CurrentUpdateStatisticsArgumentID = ID, + @CurrentUpdateStatisticsArgument = Argument + FROM @CurrentUpdateStatisticsWithClauseArguments + WHERE Added = 0 + ORDER BY ID ASC + + IF @@ROWCOUNT = 0 + BEGIN + BREAK + END + + SET @CurrentUpdateStatisticsWithClause = @CurrentUpdateStatisticsWithClause + ' ' + @CurrentUpdateStatisticsArgument + ',' + + UPDATE @CurrentUpdateStatisticsWithClauseArguments + SET Added = 1 + WHERE [ID] = @CurrentUpdateStatisticsArgumentID + END + + SET @CurrentUpdateStatisticsWithClause = LEFT(@CurrentUpdateStatisticsWithClause,LEN(@CurrentUpdateStatisticsWithClause) - 1) + END + + IF @CurrentUpdateStatisticsWithClause IS NOT NULL SET @CurrentCommand += @CurrentUpdateStatisticsWithClause + + IF @PartitionLevelStatistics = 1 AND @CurrentIsIncremental = 1 AND @CurrentPartitionNumber IS NOT NULL SET @CurrentCommand += ' ON PARTITIONS(' + CAST(@CurrentPartitionNumber AS nvarchar(max)) + ')' + + EXECUTE @CurrentCommandOutput = dbo.CommandExecute @DatabaseContext = @CurrentDatabaseName, @Command = @CurrentCommand, @CommandType = @CurrentCommandType, @Mode = 2, @Comment = @CurrentComment, @DatabaseName = @CurrentDatabaseName, @SchemaName = @CurrentSchemaName, @ObjectName = @CurrentObjectName, @ObjectType = @CurrentObjectType, @IndexName = @CurrentIndexName, @IndexType = @CurrentIndexType, @StatisticsName = @CurrentStatisticsName, @ExtendedInfo = @CurrentExtendedInfo, @LockMessageSeverity = @LockMessageSeverity, @LogToTable = @LogToTable, @Execute = @Execute + SET @Error = @@ERROR + IF @Error <> 0 SET @CurrentCommandOutput = @Error + IF @CurrentCommandOutput <> 0 SET @ReturnCode = @CurrentCommandOutput + END + + NoAction: + + -- Update that the index or statistics is completed + UPDATE @tmpIndexesStatistics + SET Completed = 1 + WHERE Selected = 1 + AND Completed = 0 + AND [Order] = @CurrentIxOrder + AND ID = @CurrentIxID + + -- Clear variables + SET @CurrentDatabaseContext = NULL + + SET @CurrentCommand = NULL + SET @CurrentCommandOutput = NULL + SET @CurrentCommandType = NULL + SET @CurrentComment = NULL + SET @CurrentExtendedInfo = NULL + + SET @CurrentIxID = NULL + SET @CurrentIxOrder = NULL + SET @CurrentSchemaID = NULL + SET @CurrentSchemaName = NULL + SET @CurrentObjectID = NULL + SET @CurrentObjectName = NULL + SET @CurrentObjectType = NULL + SET @CurrentIsMemoryOptimized = NULL + SET @CurrentIndexID = NULL + SET @CurrentIndexName = NULL + SET @CurrentIndexType = NULL + SET @CurrentStatisticsID = NULL + SET @CurrentStatisticsName = NULL + SET @CurrentPartitionID = NULL + SET @CurrentPartitionNumber = NULL + SET @CurrentPartitionCount = NULL + SET @CurrentIsPartition = NULL + SET @CurrentIndexExists = NULL + SET @CurrentStatisticsExists = NULL + SET @CurrentIsImageText = NULL + SET @CurrentIsNewLOB = NULL + SET @CurrentIsFileStream = NULL + SET @CurrentIsColumnStore = NULL + SET @CurrentIsComputed = NULL + SET @CurrentIsTimestamp = NULL + SET @CurrentAllowPageLocks = NULL + SET @CurrentNoRecompute = NULL + SET @CurrentIsIncremental = NULL + SET @CurrentRowCount = NULL + SET @CurrentModificationCounter = NULL + SET @CurrentOnReadOnlyFileGroup = NULL + SET @CurrentResumableIndexOperation = NULL + SET @CurrentFragmentationLevel = NULL + SET @CurrentPageCount = NULL + SET @CurrentFragmentationGroup = NULL + SET @CurrentAction = NULL + SET @CurrentMaxDOP = NULL + SET @CurrentUpdateStatistics = NULL + SET @CurrentStatisticsSample = NULL + SET @CurrentStatisticsResample = NULL + SET @CurrentAlterIndexArgumentID = NULL + SET @CurrentAlterIndexArgument = NULL + SET @CurrentAlterIndexWithClause = NULL + SET @CurrentUpdateStatisticsArgumentID = NULL + SET @CurrentUpdateStatisticsArgument = NULL + SET @CurrentUpdateStatisticsWithClause = NULL + + DELETE FROM @CurrentActionsAllowed + DELETE FROM @CurrentAlterIndexWithClauseArguments + DELETE FROM @CurrentUpdateStatisticsWithClauseArguments + + END + + END + + IF @CurrentDatabaseState = 'SUSPECT' + BEGIN + SET @ErrorMessage = 'The database ' + QUOTENAME(@CurrentDatabaseName) + ' is in a SUSPECT state.' + RAISERROR('%s',16,1,@ErrorMessage) WITH NOWAIT + RAISERROR(@EmptyLine,10,1) WITH NOWAIT + SET @Error = @@ERROR + END + + -- Update that the database is completed + IF @DatabasesInParallel = 'Y' + BEGIN + UPDATE dbo.QueueDatabase + SET DatabaseEndTime = SYSDATETIME() + WHERE QueueID = @QueueID + AND DatabaseName = @CurrentDatabaseName + END + ELSE + BEGIN + UPDATE @tmpDatabases + SET Completed = 1 + WHERE Selected = 1 + AND Completed = 0 + AND ID = @CurrentDBID + END + + -- Clear variables + SET @CurrentDBID = NULL + SET @CurrentDatabaseName = NULL + + SET @CurrentDatabase_sp_executesql = NULL + + SET @CurrentUserAccess = NULL + SET @CurrentIsReadOnly = NULL + SET @CurrentDatabaseState = NULL + SET @CurrentInStandby = NULL + SET @CurrentRecoveryModel = NULL + + SET @CurrentIsDatabaseAccessible = NULL + SET @CurrentAvailabilityGroup = NULL + SET @CurrentAvailabilityGroupRole = NULL + SET @CurrentDatabaseMirroringRole = NULL + + SET @CurrentCommand = NULL + + DELETE FROM @tmpIndexesStatistics + + END + + ---------------------------------------------------------------------------------------------------- + --// Log completing information //-- + ---------------------------------------------------------------------------------------------------- + + Logging: + SET @EndMessage = 'Date and time: ' + CONVERT(nvarchar,SYSDATETIME(),120) + RAISERROR('%s',10,1,@EndMessage) WITH NOWAIT + + RAISERROR(@EmptyLine,10,1) WITH NOWAIT + + IF @ReturnCode <> 0 + BEGIN + RETURN @ReturnCode + END + + ---------------------------------------------------------------------------------------------------- + +END + +GO diff --git a/TPDT-268 - ACP in task sequence/dba_storedProcedures/dbo.get_Error_Info.sql b/TPDT-268 - ACP in task sequence/dba_storedProcedures/dbo.get_Error_Info.sql new file mode 100644 index 0000000..3cc043c --- /dev/null +++ b/TPDT-268 - ACP in task sequence/dba_storedProcedures/dbo.get_Error_Info.sql @@ -0,0 +1,102 @@ +USE [HCITools] +GO + +/****** Object: StoredProcedure [dbo].[get_Error_Info] Script Date: 10/31/2016 15:06:06 ******/ +IF EXISTS (SELECT * FROM sys.objects WHERE object_id = OBJECT_ID(N'[dbo].[get_Error_Info]') AND type in (N'P', N'PC')) +DROP PROCEDURE [dbo].[get_Error_Info] +GO + +USE [HCITools] +GO + +/****** Object: StoredProcedure [dbo].[get_Error_Info] Script Date: 10/31/2016 15:06:06 ******/ +SET ANSI_NULLS ON +GO + +SET QUOTED_IDENTIFIER ON +GO + + +CREATE PROCEDURE [dbo].[get_Error_Info] + @in_debug tinyint = 0, + @in_Recipients varchar(8000) = '', + @in_LogToTable tinyint = 0, + @in_Context tinyint = 1, -- 1 = SP, 2 = Job + @in_RaiseError tinyint = 1 +AS +/*============================================================================= + + Explication du traitement realise par la SP + ------------------------------------------- + La SP sert à gérer les erreurs remontées par SQL Server. + + Parametres + ---------- + @in_debug : non utilisé + @in_Recipients : Contient la liste des mails pour l'envoi de mail lors d'une erreur + @in_LogToTable : si 1, enregistre l'erreur dans la table SQL_Errors + @in_Context : Si 1, le contexte est une SP, si 2, le contexte est un job (pour la gestion du mail) + @in_RaiseError : Si 1, raise l'error + + Contexte d'utilisation + ---------------------- + Appelé depuis SP, Job, Trigger etc... + + Creation : 04.04.16 / FLA + + Modifications : + +=============================================================================*/ + +/*------------------- Declaration des variables --------------------*/ +declare @ErrorMessage nvarchar(4000) = ERROR_MESSAGE(), + @ErrorNumber int = ERROR_NUMBER(), + @ErrorSeverity int = ERROR_SEVERITY(), + @ErrorState int = ERROR_STATE(), + @ErrorLine int = ERROR_LINE(), + @ErrorProc nvarchar(128) = COALESCE(ERROR_PROCEDURE(), 'Not within procedure'), + @Error varchar(max) + + +BEGIN TRY +/*------------ Affectation des parametres aux variables ------------*/ +select @Error = 'Error Number: ' + CAST(@ErrorNumber AS varchar(10)) + CHAR(13) + + 'Error Message: ' + @ErrorMessage + CHAR(13) + + 'Error Severity: ' + CAST(@ErrorSeverity AS varchar(10)) + CHAR(13) + + 'Error State: ' + CAST(@ErrorState AS varchar(10)) + CHAR(13) + + 'Error Line: ' + CAST(@ErrorLine AS varchar(10)) + CHAR(13) + + 'Error Proc: ' + @ErrorProc + CHAR(13) + +/*-------------------------- Traitement ---------------------------*/ +IF @in_Recipients <> '' +BEGIN + IF @in_Context = 1 + exec dbo.aps_Send_Mail_with_template @in_job_type = 0,@in_param_message = @Error, @in_param_varchar_2 = @in_Recipients + ELSE + BEGIN + exec dbo.aps_Send_Mail_with_template @in_param_varchar_2 = @in_Recipients + END +END + +IF @in_LogToTable = 1 + INSERT INTO SQL_Errors VALUES (@@SERVERNAME,APP_NAME(),CURRENT_USER,@ErrorProc,GETDATE(),@in_Context,@Error) + +END TRY +BEGIN CATCH + + RAISERROR ('Erreur dans la SP [dbo].[get_Error_Info]',16,1) + RETURN + +END CATCH + + +IF @in_RaiseError = 1 + RAISERROR (@ErrorMessage, + @ErrorSeverity, + @ErrorState + ); + + +GO + + diff --git a/TPDT-268 - ACP in task sequence/dba_storedProcedures/get_Labels_List.sql b/TPDT-268 - ACP in task sequence/dba_storedProcedures/get_Labels_List.sql new file mode 100644 index 0000000..33d3b16 --- /dev/null +++ b/TPDT-268 - ACP in task sequence/dba_storedProcedures/get_Labels_List.sql @@ -0,0 +1,76 @@ +USE [HCITools] +GO + +IF EXISTS (SELECT * FROM sys.objects WHERE object_id = OBJECT_ID(N'[dbo].[get_Labels_List]') AND type in (N'P', N'PC')) +DROP PROCEDURE [dbo].[get_Labels_List] +GO + +USE [HCITools] +GO + +SET ANSI_NULLS ON +GO + +SET QUOTED_IDENTIFIER ON +GO + + + + + +CREATE PROCEDURE [dbo].[get_Labels_List] + @in_debug int = null + +AS +/*============================================================================= + + Explication du traitement realise par la SP + ------------------------------------------- + Cette SP sert à récuperer la liste des labels contenus dans le répertoire de la centrale + + Contexte d'utilisation + ---------------------- + Cette SP est appelée par le job D92080 - Backup Labels List + + Parametres + ---------- + @in_debug : affiche la liste des labels dans le répertoire + + Creation : 01.11.16 / FLA + + Modifications : + +=============================================================================*/ + +set nocount on; + +/*------------------- Declaration des variables --------------------*/ +declare @path varchar (4000) + +/*------------ Affectation des parametres aux variables ------------*/ +SELECT @path = HCIP_value FROM HCI_PARAMS WHERE HCIP_key = 'LBLPATH' + +/*-------------------------- Traitement ---------------------------*/ +BEGIN TRY + + insert into dbo.LabelsList + SELECT DirectoryName as [labels] + FROM [HCITools].[dbo].[aps_Directory_Get_Directories] (@path,null) dn + WHERE LEN(DirectoryName) = 17 + AND DirectoryName LIKE '20%' +AND NOT EXISTS (select LL_name from dbo.LabelsList ll WHERE ll.LL_Name = dn.DirectoryName) + +/*---------------------- Traitement des erreurs ----------------------*/ +END TRY +BEGIN CATCH + + /* Traitement des erreurs (avec RaiseError) */ + EXEC dbo.get_Error_Info @in_RaiseError = 1 + +END CATCH + + + +GO + + diff --git a/TPDT-268 - ACP in task sequence/dba_storedProcedures/mon_Aggregate_Stats_Index.sql b/TPDT-268 - ACP in task sequence/dba_storedProcedures/mon_Aggregate_Stats_Index.sql new file mode 100644 index 0000000..74d511a --- /dev/null +++ b/TPDT-268 - ACP in task sequence/dba_storedProcedures/mon_Aggregate_Stats_Index.sql @@ -0,0 +1,74 @@ +USE [HCITools] +GO + +IF EXISTS (SELECT * FROM sys.objects WHERE object_id = OBJECT_ID(N'[dbo].[mon_Aggregate_Stats_Index]') AND type in (N'P', N'PC')) +DROP PROCEDURE [dbo].[mon_Aggregate_Stats_Index] +GO + +USE [HCITools] +GO + +SET ANSI_NULLS ON +GO + +SET QUOTED_IDENTIFIER ON +GO + + + +CREATE PROCEDURE [dbo].[mon_Aggregate_Stats_Index] +AS +/*============================================================================= + + Explication du traitement realise par la SP + ------------------------------------------- + La SP va aggreger l'ensemble des statistiques des index contenues dans la table All_Stats_index + + Contexte d'utilisation + ---------------------- + Appelé depuis le job D92090 - Aggregate Stats Index + + Creation : 03.08.15 / FLA + + Modifications : 18.11.2015 / FLA : Ajout d'un try/catch dans le cas où les bases sont indisponibles et éviter ainsi de ne pas récuperer les stats des bases suivantes + 04.10.2017 / FLA : Ajout de la gestion des environnements + +=============================================================================*/ + +set nocount on; + + +/*------------------- Declaration des variables --------------------*/ + + +/*------------ Affectation des parametres aux variables ------------*/ + +IF EXISTS (SELECT type FROM master.cfg.InstanceContext WHERE type = 'PROD') +BEGIN + + /*-------------------------- Traitement ---------------------------*/ + BEGIN TRY + + truncate table Aggregate_Stats_index + + insert into Aggregate_Stats_index + SELECT SI_ServerName,SI_schemaname,SI_databasename,SI_tablename,SI_indexname, SI_indextype, SUM(isnull(SI_user_seeks,0)) NbSeeks, SUM(isnull(SI_user_scans,0)) NbScans, SUM(isnull(SI_user_lookups,0)) NbLookups, SUM(isnull(SI_user_updates,0)) NbUpdates, MIN(SI_updatedate) UpdateDate, MAX(SI_restartdate) restartdate + FROM dbo.All_Stats_index + WHERE SI_deletedate is null + GROUP BY SI_ServerName,SI_schemaname,SI_databasename,SI_tablename, SI_indexname, SI_indextype + + /*---------------------- Traitement des erreurs ----------------------*/ + END TRY + BEGIN CATCH + + /* Traitement des erreurs (avec RaiseError) */ + EXEC dbo.get_Error_Info @in_RaiseError = 1 + + END CATCH + +END + + +GO + + diff --git a/TPDT-268 - ACP in task sequence/dba_storedProcedures/mon_Aggregate_Stats_SP.sql b/TPDT-268 - ACP in task sequence/dba_storedProcedures/mon_Aggregate_Stats_SP.sql new file mode 100644 index 0000000..f73ccad --- /dev/null +++ b/TPDT-268 - ACP in task sequence/dba_storedProcedures/mon_Aggregate_Stats_SP.sql @@ -0,0 +1,69 @@ +USE [HCITools] +GO + +IF EXISTS (SELECT * FROM sys.objects WHERE object_id = OBJECT_ID(N'[dbo].[mon_Aggregate_Stats_SP]') AND type in (N'P', N'PC')) +DROP PROCEDURE [dbo].[mon_Aggregate_Stats_SP] +GO + +SET ANSI_NULLS ON +GO + +SET QUOTED_IDENTIFIER ON +GO + +CREATE PROCEDURE [dbo].[mon_Aggregate_Stats_SP] +AS +/*============================================================================= + + Explication du traitement realise par la SP + ------------------------------------------- + La SP va aggreger l'ensemble des statistiques des procédures stockées contenues dans la table All_Stats_SP + + Contexte d'utilisation + ---------------------- + Appelé depuis le job D92100 - Aggregate Stats SP + + Creation : 23.09.20 / FLA + + Modifications : + +=============================================================================*/ + +set nocount on; + + +/*------------------- Declaration des variables --------------------*/ + + +/*------------ Affectation des parametres aux variables ------------*/ + +IF EXISTS (SELECT type FROM master.cfg.InstanceContext WHERE type = 'PROD') +BEGIN + + /*-------------------------- Traitement ---------------------------*/ + BEGIN TRY + + truncate table Aggregate_Stats_SP + + insert into Aggregate_Stats_SP + SELECT SS_ServerName,SS_schemaname,SS_databasename,SS_name,SS_type,SUM(isnull(SS_execution_count,0)) NbExecution,MAX(SS_last_execution_time) LastExecutionTime,SUM(isnull(SS_total_worker_time,0)) TotalWorkerTime,SUM(isnull(SS_total_physical_reads,0)) TotalPhysicalReads,SUM(isnull(SS_total_logical_writes,0)) TotalLogicalWrites,SUM(isnull(SS_total_logical_reads,0)) TotalLogicalReads,SUM(isnull(SS_total_elapsed_time,0)) TotalElapsedTime,MIN(SS_updatedate) UpdateDate,MAX(SS_restartdate) RestartDate + FROM dbo.All_Stats_SP + WHERE SS_deletedate is null + GROUP BY SS_ServerName,SS_schemaname,SS_databasename,SS_name,SS_type + + /*---------------------- Traitement des erreurs ----------------------*/ + END TRY + BEGIN CATCH + + /* Traitement des erreurs (avec RaiseError) */ + EXEC dbo.get_Error_Info @in_RaiseError = 1 + + END CATCH + +END + + + +GO + + diff --git a/TPDT-268 - ACP in task sequence/dba_storedProcedures/mon_Change_Tracking.sql b/TPDT-268 - ACP in task sequence/dba_storedProcedures/mon_Change_Tracking.sql new file mode 100644 index 0000000..112f2fb --- /dev/null +++ b/TPDT-268 - ACP in task sequence/dba_storedProcedures/mon_Change_Tracking.sql @@ -0,0 +1,183 @@ +USE [HCITools]; +GO +IF EXISTS ( SELECT * + FROM sys.objects + WHERE object_id = OBJECT_ID(N'[dbo].[mon_Change_Tracking]') + AND OBJECTPROPERTY(object_id, N'IsProcedure') = 1) + DROP PROCEDURE [dbo].[mon_Change_Tracking]; +GO + +CREATE PROCEDURE [mon_Change_Tracking] + @in_threshold INT = 50000, + @in_debug INT = NULL +AS +/*=========================================================================================== + + Description + ----------- + This procedure is called by job DR92290 - Monitoring Change Tracking + + Parameters + ---------- + @in_threshold limit tolerate, over this limit a mail is sent to DBA + @in_debug display result per table and more infos + + Creation : 12.04.2023 / RTC + + Modifications + ------------- + + +================================================================================================*/ + +BEGIN + DECLARE @cvCurrentOrganizationalUnit INT, + @subsidiary_id INT, + @DWHVersion BIGINT, + @sqlstmt NVARCHAR(MAX), + @tableName NVARCHAR(128), + @out_default_value VARCHAR(60), + @format VARCHAR(4), + @schema VARCHAR(4), + @ou VARCHAR(3), + @total INT, + @message VARCHAR(MAX); + + /* Initialize variables */ + SELECT @sqlstmt = N'', + @cvCurrentOrganizationalUnit = NULL, + @subsidiary_id = NULL, + @total = 0; + + /* Temp table with amount of records */ + DECLARE @tableResult TABLE (ChangesCount INT NULL, + [Schema] VARCHAR(10) NULL, + TableName VARCHAR(800) NULL); + + /* Get the cvCurrentOrganizationalUnit */ + EXEC Arizona.dbo.sp_bmc_Bmc_Applic_Default @in_job_type = 3, + @in_param_int_1 = NULL, + @in_param_int_2 = NULL, + @in_param_varchar_1 = 'cvCurrentOrganizationalUnit', + @out_default_value = @out_default_value OUTPUT, + @out_param_int_1 = NULL; + + SELECT @cvCurrentOrganizationalUnit = CONVERT(INT, @out_default_value); + + /* Check if we have a value, if not leave this SP */ + IF @cvCurrentOrganizationalUnit IS NULL + BEGIN + RAISERROR('(APS) Error cvCurrentOrganizationalUnit does not exist!', 13, 13); + END; + + /* Get the subsidiary id and OU code */ + SELECT @subsidiary_id = ou.OU_subsidiary, + @ou = ou.OU_code + FROM Arizona.dbo.Organizational_unit ou + WHERE ou.Organizational_unit_ID = @cvCurrentOrganizationalUnit; + + /* Check if we have a value, if not leave this SP */ + IF @subsidiary_id IS NULL + BEGIN + RAISERROR('(APS) Error subsidiary_id does not exist!', 13, 13); + END; + + /* Get the current format */ + SELECT @format = sub.SUB_code + FROM Arizona.dbo.Subsidiary sub + WHERE sub.Subsidiary_ID = @subsidiary_id; + + /* Check if we have a value, if not leave this SP */ + IF @format IS NULL + BEGIN + RAISERROR('(APS) Error format does not exist!', 13, 13); + END; + + /* Change the value into a compatible format */ + IF @format = 'COOP' + BEGIN + SET @format = 'CVI'; + END; + + IF @format = 'CENT' + BEGIN + SET @format = 'SUN'; + END; + + IF @format = '000' + BEGIN + SET @format = 'AAI'; + END; + + SELECT @DWHVersion = DBACTD.DBACTD_DWH_version + FROM ARIZONACASH.Arizona.dbo.DBA_change_tracking_DWH DBACTD + WHERE DBACTD.DBACTD_format = @format + AND DBACTD.DBACTD_organizational_unit = @ou + AND DBACTD.DBACTD_update_date > GETDATE() - 3; /* Get only last 3 days */ + + /* Display Ou infos */ + IF @in_debug > 0 + SELECT @ou [OU], + @format [Format], + @DWHVersion [DWH_CT_Version]; + + DECLARE c_ct_table CURSOR READ_ONLY LOCAL FORWARD_ONLY STATIC FOR + SELECT st.name + FROM Arizona.sys.change_tracking_tables ct + JOIN Arizona.sys.tables st + ON ct.object_id = st.object_id; + OPEN c_ct_table; + FETCH NEXT FROM c_ct_table + INTO @tableName; + WHILE @@fetch_status = 0 + BEGIN + + SELECT @schema = sh.[name] + FROM Arizona.sys.tables st + JOIN Arizona.sys.schemas sh + ON st.schema_id = sh.schema_id + WHERE st.[name] = @tableName; + + SET @sqlstmt + = N'SELECT count(*),''' + @schema + N''',''' + @tableName + N''' FROM CHANGETABLE(CHANGES Arizona.' + + @schema + N'.' + @tableName + N', ' + CONVERT(VARCHAR(MAX), ISNULL(@DWHVersion, 0)) + N') AS CT'; + INSERT INTO @tableResult + EXEC (@sqlstmt); + + FETCH NEXT FROM c_ct_table + INTO @tableName; + END; + CLOSE c_ct_table; + DEALLOCATE c_ct_table; + + /* Display count details per table*/ + IF @in_debug > 0 + SELECT ChangesCount, + [Schema], + TableName + FROM @tableResult; + + SELECT @total = SUM(ChangesCount) + FROM @tableResult; + + /* The datamart truggles when there is more than 35000 lies for document line */ + IF (@total >= @in_threshold) + OR EXISTS ( SELECT 1 + FROM @tableResult + WHERE TableName = 'Document_line' + AND ChangesCount >= 35000) + BEGIN + SELECT @message = 'Total: ' + CONVERT(CHAR(9), @total) + CHAR(13) + CHAR(13); + SELECT @message = @message + '[Table Name] [Schema] [Changes Count]' + CHAR(13); + SELECT @message + = @message + TableName + ' ' + CONVERT(CHAR(9), ISNULL([Schema], '')) + + CONVERT(CHAR(9), ISNULL(ChangesCount, '')) + CHAR(13) + FROM @tableResult + WHERE ChangesCount > 1 + ORDER BY ChangesCount DESC; + + EXEC dbo.aps_Send_Mail_with_template @in_param_varchar_2 = 'DBA_operator', + @in_param_varchar_3 = @message, + @in_job_type = 3; /* 0:sans template; 1/NULL:echec; 2:succes; 3:warning; 4:message*/ + END; +END; \ No newline at end of file diff --git a/TPDT-268 - ACP in task sequence/dba_storedProcedures/mon_Check_Broker_queues.sql b/TPDT-268 - ACP in task sequence/dba_storedProcedures/mon_Check_Broker_queues.sql new file mode 100644 index 0000000..02fd952 --- /dev/null +++ b/TPDT-268 - ACP in task sequence/dba_storedProcedures/mon_Check_Broker_queues.sql @@ -0,0 +1,132 @@ +USE [HCITools] +GO + +IF EXISTS (SELECT * FROM sys.objects WHERE object_id = OBJECT_ID(N'[dbo].[mon_Check_Broker_queues]') AND type in (N'P', N'PC')) +DROP PROCEDURE [dbo].[mon_Check_Broker_queues] +GO + +USE [HCITools] +GO + +SET ANSI_NULLS ON +GO + +SET QUOTED_IDENTIFIER ON +GO + + + + + +CREATE PROCEDURE [dbo].[mon_Check_Broker_queues] + @in_debug tinyint = 0 +AS +/*============================================================================= + + Explication du traitement realise par la SP + ------------------------------------------- + La SP va vérifier si l'ensemble des queues du broker ne sont pas désactivées pour chaque base de données + + Contexte d'utilisation + ---------------------- + Appelé depuis le job DR92110 - Check Broker Queues + + Parametres + ---------- + @in_debug : non utilisé + + Creation : 31.10.16 / FLA + + Modifications : 17.03.2022 - FLA : Change DBA mail + +=============================================================================*/ + +set nocount on; + + +/*------------------- Declaration des variables --------------------*/ + +declare @DbName sysname, + @QueueName sysname, + @ErrorMsg varchar(2000), + @cmd varchar(5000) + +declare c_database_broker cursor local forward_only static for + select name from sys.databases + WHERE database_id > 4 + AND is_broker_enabled = 1 + +create table #ListBrokerQueues ( + DbName sysname, + QueueName sysname) + +/*------------ Affectation des parametres aux variables ------------*/ +SET @ErrorMsg = '' + +/*-------------------------- Traitement ---------------------------*/ +BEGIN TRY + open c_database_broker + + FETCH NEXT FROM c_database_broker + into @DbName + + WHILE @@fetch_status = 0 + BEGIN + + SET @cmd = 'INSERT INTO #ListBrokerQueues + SELECT '''+@DbName+''',name FROM '+ @DbName +'.sys.service_queues + WHERE name NOT IN (''QueryNotificationErrorsQueue'',''EventNotificationErrorsQueue'',''ServiceBrokerQueue'') + and (is_activation_enabled = 0 OR is_receive_enabled = 0 OR is_enqueue_enabled = 0)' + + exec (@cmd) + + FETCH NEXT FROM c_database_broker + into @DbName + END + + CLOSE c_database_broker + DEALLOCATE c_database_broker + + + declare c_queues cursor local forward_only static for + select DbName, QueueName from #ListBrokerQueues + + open c_queues + + FETCH NEXT FROM c_queues + into @DbName, @QueueName + + WHILE @@fetch_status = 0 + BEGIN + + SET @ErrorMsg = @ErrorMsg + 'Error in queue ' + @QueueName + ' of Database ' + @DbName + CHAR(13) + CHAR(10) + + FETCH NEXT FROM c_queues + into @DbName, @QueueName + END + + CLOSE c_queues + DEALLOCATE c_queues + + DROP TABLE #ListBrokerQueues + + /* S'il y a une erreur, on envoie un mail aux DBA */ + IF @ErrorMsg <> '' + BEGIN + exec aps_Send_Mail_with_template + @in_param_varchar_2 = 'DBA_operator;', + @in_job_type = 3, /* 3 = warning */ + @in_param_varchar_3 = @ErrorMsg + + RAISERROR ('Erreur dans la SP [dbo].[mon_Check_Broker_queues]',16,1) + END + +/*---------------------- Traitement des erreurs ----------------------*/ +END TRY +BEGIN CATCH + + /* Traitement des erreurs (avec RaiseError) */ + EXEC dbo.get_Error_Info @in_RaiseError = 1 + +END CATCH + diff --git a/TPDT-268 - ACP in task sequence/dba_storedProcedures/mon_Check_Long_Running_Jobs.sql b/TPDT-268 - ACP in task sequence/dba_storedProcedures/mon_Check_Long_Running_Jobs.sql new file mode 100644 index 0000000..30a4f8d --- /dev/null +++ b/TPDT-268 - ACP in task sequence/dba_storedProcedures/mon_Check_Long_Running_Jobs.sql @@ -0,0 +1,117 @@ +USE [HCITools] +GO + +IF EXISTS (SELECT * FROM sys.objects WHERE object_id = OBJECT_ID(N'[dbo].[mon_Check_Long_Running_Jobs]') AND type in (N'P', N'PC')) +DROP PROCEDURE [dbo].[mon_Check_Long_Running_Jobs] +GO + +USE [HCITools] +GO + +SET ANSI_NULLS ON +GO + +SET QUOTED_IDENTIFIER ON +GO + + +CREATE PROCEDURE [dbo].[mon_Check_Long_Running_Jobs] + @in_debug tinyint = 0 +AS +/*============================================================================= + + Explication du traitement realise par la SP + ------------------------------------------- + La SP va vérifier s'il y a des jobs qui tournent depuis plus de 2 heures + + Contexte d'utilisation + ---------------------- + Appelé depuis le job DR92050 - Long Running Jobs + + Parametres + ---------- + @in_debug : non utilisé + + Creation : 28.10.16 / FLA + + Modifications : 13.01.2017 / RTC Ignore REPL-Merge jobs for Pham index instances. + 21.04.2017 / FLA Ignore all jobs of replication + 17.03.2022 / FLA : Change DBA mail + 29.12.2023 / RTC : Ignore Datamart specific jobs + +=============================================================================*/ + +set nocount on; + + +/*------------------- Declaration des variables --------------------*/ +DECLARE @message VARCHAR(255) + +DECLARE @running_jobs TABLE + ( + [Job ID] uniqueidentifier, + [Last Run Date] INT, + [Last Run Time] INT, + [Next Run Date] INT, + [Next Run Time] INT, + [Next Run Schedule ID] INT, + [Requested To Run] INT, + [Request Source] INT, + [Request Source ID] NVARCHAR(128), + [Running] INT, + [Current Step] INT, + [Current Retry Attempt] INT, + [State] INT + ) + +/*------------ Affectation des parametres aux variables ------------*/ +SELECT @message = 'Jobs non terminés:' + CHAR(10) + '------------------------------' + char(10) + +/*-------------------------- Traitement ---------------------------*/ +BEGIN TRY + + INSERT INTO @running_jobs + EXEC master.dbo.xp_sqlagent_enum_jobs 1,'' + + SELECT @message = @message + sj.name + ' : ' + convert(VARCHAR(10),datediff( mi, ja.run_requested_date, getdate())) + ' minutes' + char(10) + FROM @running_jobs rj + JOIN msdb.dbo.sysjobs sj WITH (NOLOCK) + ON sj.job_id = rj.[Job ID] + JOIN msdb.dbo.sysjobactivity ja + ON ja.job_id = sj.job_id + AND ja.session_id = (SELECT TOP 1 + ja2.session_id + FROM msdb.dbo.sysjobactivity ja2 + WHERE ja2.job_id = sj.job_id + ORDER BY ja2.run_requested_date DESC) + JOIN msdb.dbo.syscategories c WITH (NOLOCK) + ON c.category_id = sj.category_id + AND c.name NOT LIKE 'REPL%' + AND sj.name NOT LIKE '%Datamart specific' + WHERE rj.[Running]=1 + AND ( DATEDIFF( mi, ja.run_requested_date, GETDATE()) > 5 and sj.name like 'DR%' + OR DATEDIFF( mi, ja.run_requested_date, GETDATE()) > 120 and sj.name not like 'DR%') + + IF @@ROWCOUNT > 0 + BEGIN + + EXEC aps_Send_Mail_with_template + @in_param_varchar_2 = 'DBA_operator;', + @in_param_message = @message; + + END + + +/*---------------------- Traitement des erreurs ----------------------*/ +END TRY +BEGIN CATCH + + /* Traitement des erreurs (avec RaiseError) */ + EXEC dbo.get_Error_Info @in_RaiseError = 1 + +END CATCH + + +GO + + diff --git a/TPDT-268 - ACP in task sequence/dba_storedProcedures/mon_Check_Open_Tran.sql b/TPDT-268 - ACP in task sequence/dba_storedProcedures/mon_Check_Open_Tran.sql new file mode 100644 index 0000000..f3d0340 --- /dev/null +++ b/TPDT-268 - ACP in task sequence/dba_storedProcedures/mon_Check_Open_Tran.sql @@ -0,0 +1,202 @@ +USE [HCITools] +GO + + +IF EXISTS (SELECT * FROM sys.objects WHERE object_id = OBJECT_ID(N'[dbo].[mon_Check_Open_Tran]') AND type in (N'P', N'PC')) +DROP PROCEDURE [dbo].[mon_Check_Open_Tran] +GO + +USE [HCITools] +GO + + +SET ANSI_NULLS ON +GO + +SET QUOTED_IDENTIFIER ON +GO + + + +CREATE PROCEDURE [dbo].[mon_Check_Open_Tran] + @in_debug tinyint = 0, + @in_Minutes smallint = 5 +AS +/*============================================================================= + + Explication du traitement realise par la SP + ------------------------------------------- + La SP va vérifier s'il n'y a pas des transactions restées ouvertes depuis X minutes + + Contexte d'utilisation + ---------------------- + Appelé depuis le job DR92030 - Lock controller + + Parametres + ---------- + @in_debug : non utilisé + @in_Minutes : nombre de minutes à partir desquelles on déclenche l'alerte + + Creation : 28.10.16 / FLA + + Modifications : 17.03.2022 - FLA : Change DBA mail + +=============================================================================*/ + +set nocount on; + + +/*------------------- Declaration des variables --------------------*/ +declare @programSQL varchar (255), + @cmdAlert varchar (255), + @maxToleranceTime int, + @name varchar (255), + @result_sp int, + @spid sql_variant, + @message varchar (8000), + @subject varchar (8000), + @machine varchar (100), + @cmd varchar (8000) + +/*------------ Affectation des parametres aux variables ------------*/ + +select @maxToleranceTime = @in_Minutes, /* minutes */ + @programSQL = '%Microsoft SQL Server Management Studio - Query%', + @cmdAlert = '%AWAITING COMMAND%' + +/*-------------------------- Traitement ---------------------------*/ +BEGIN TRY + + /* ON PARCOURT TOUTES LES BASES */ + CREATE TABLE #Open_transaction ( + OPTR_key varchar(25), + OPTR_value sql_variant + ) + + declare c_databases cursor local forward_only static for + SELECT name + FROM sys.databases + WHERE state = 0 + + open c_databases + + FETCH NEXT FROM c_databases + into @name + + while @@fetch_status <> -1 + begin + if @@fetch_status <> -2 + begin + select @cmd = 'DBCC OPENTRAN ([' + @name + ']) WITH TABLERESULTS, NO_INFOMSGS' + + INSERT INTO #Open_transaction + EXEC (@cmd) + + end /* if @@fetch_status <> -2 */ + + FETCH NEXT FROM c_databases + into @name + + end /* while @@fetch_status <> -1 */ + + close c_databases + deallocate c_databases + + /* Retrieve SPID. */ + declare c_transactions cursor local forward_only static for + select optr_value + from #open_transaction + where optr_key like '%spid%' + + open c_transactions + + FETCH NEXT FROM c_transactions + into @spid + + while @@fetch_status <> -1 + begin + if @@fetch_status <> -2 + begin + select @message = null + + + select @machine = '[' + ltrim(rtrim(p.hostname)) + ']', + @subject = 'Commit/rollback qui a été oublié ?', + @message = 'Commit/rollback qui a été oublié ? + + La session [' + + convert (varchar (10), p.spid) + + '], lancée depuis le programme [' + + ltrim(rtrim(p.program_name)) + + '] a une transaction ouverte depuis au moins [' + + convert (varchar (10), datediff (mi, p.last_batch, getdate ())) + + '] minutes, à partir du poste [' + + ltrim(rtrim(p.hostname)) + + '] en tant qu''utilisateur [' + + ltrim(rtrim(p.loginame)) + + '] sur la base [' + + ltrim(rtrim(db.name)) + + ']. + + La connection est dans l''état [' + + ltrim(rtrim(p.cmd)) + + ']. + + Faire un commit/rollback dès que possible, pour éviter que d''autres sessions SQL se retrouvent bloquées (si ce n''est pas déjà le cas).' + from master..sysprocesses p with (nolock) + left join master..sysdatabases db with (nolock) + on db.dbid = p.dbid + left join master..sysusers usr with (nolock) + on usr.uid = p.uid + left join master..sysprocesses p2 with (nolock) + on p2.spid = p.blocked + left join master..sysdatabases db2 with (nolock) + on db2.dbid = p2.dbid + left join master..sysusers usr2 with (nolock) + on usr2.uid = p2.uid + where convert (varchar, p.spid) = @spid + and p.program_name like @programSQL + and datediff (mi, p.last_batch, getdate ()) >= @maxToleranceTime + and p.cmd like @cmdAlert + + if @message is not null + begin + declare @sendTo varchar (8000) + + select @sendTo = 'DBA_operator;' + isnull (@machine, '') + + exec aps_Send_Mail_with_template + @in_param_subject = @subject, + @in_param_varchar_2 = @sendTo, + @in_param_varchar_3 = @message, + @in_param_priority = 'HIGH', + @in_job_type = 0 /* 0 = pas de template */ + + end + + end /* if @@fetch_status <> -2 */ + + FETCH NEXT FROM c_transactions + into @spid + + end /* while @@fetch_status <> -1 */ + + close c_transactions + deallocate c_transactions + + drop table #Open_transaction + +/*---------------------- Traitement des erreurs ----------------------*/ +END TRY +BEGIN CATCH + + /* Traitement des erreurs (avec RaiseError) */ + EXEC dbo.get_Error_Info @in_RaiseError = 1 + +END CATCH + + + +GO + + diff --git a/TPDT-268 - ACP in task sequence/dba_storedProcedures/mon_Check_Performance_Issue.sql b/TPDT-268 - ACP in task sequence/dba_storedProcedures/mon_Check_Performance_Issue.sql new file mode 100644 index 0000000..f31c385 --- /dev/null +++ b/TPDT-268 - ACP in task sequence/dba_storedProcedures/mon_Check_Performance_Issue.sql @@ -0,0 +1,174 @@ +USE [HCITools] +GO + +/****** Object: StoredProcedure [dbo].[mon_Check_Performance_Issue] Script Date: 11/09/2018 10:48:38 ******/ +IF EXISTS (SELECT * FROM sys.objects WHERE object_id = OBJECT_ID(N'[dbo].[mon_Check_Performance_Issue]') AND type in (N'P', N'PC')) +DROP PROCEDURE [dbo].[mon_Check_Performance_Issue] +GO + +USE [HCITools] +GO + +/****** Object: StoredProcedure [dbo].[mon_Check_Performance_Issue] Script Date: 11/09/2018 10:48:38 ******/ +SET ANSI_NULLS ON +GO + +SET QUOTED_IDENTIFIER ON +GO + + + + +CREATE PROCEDURE [dbo].[mon_Check_Performance_Issue] + @in_debug tinyint = 0, + @in_NbHours tinyint = 3 +AS +/*============================================================================= + + Explication du traitement realise par la SP + ------------------------------------------- + La SP va check un ensemble de point de performance sur l'instance + + Contexte d'utilisation + ---------------------- + Appelé depuis le job DR92180 - Check Performance Issue + + Parametres + ---------- + @in_debug : non utilisé + @in_NbHours : plage horaire d'analyse en heure + + Creation : 09.11.18 / FLA + + Modifications : 12.11.18 / FLA Correction envoi de mail avec message d'erreur + 17.03.22 / FLA Change DBA mail + 07.04.22 / RTC optimize perf + +=============================================================================*/ + +set nocount on; + + +/*------------------- Declaration des variables --------------------*/ + +declare @PLE int, + @NbCount smallint, + @messageError varchar (8000), + @errno int, + @errmsg varchar(255), + @ou_code varchar (15) + +/*------------ Affectation des parametres aux variables ------------*/ + +select @errno = 0 + +SET @messageError = '' +SET @errmsg = '' + +/*-------------------------- Traitement ---------------------------*/ +BEGIN TRY + select @ou_code = ou.OU_code + from Arizona.dbo.Bmc_application_key bapk with (nolock) + join Arizona.dbo.Bmc_application_default bapd with (nolock) + on bapd.BAPD_bmc_application_key = bapk.Bmc_application_key_ID + join Arizona.dbo.Organizational_unit ou with (nolock) + on convert (varchar, ou.organizational_unit_id) = bapd.BAPD_value + where bapk.BAPK_key = 'cvCurrentOrganizationalUnit' + + /* RETRIEVE HH:MI OF WORKING HOURS */ + declare @Hour_start varchar (5), + @Hour_end varchar (5) + ; + select @Hour_start = isnull(dwoho.DWOHO_start_time_earliest, '07:00'), + @Hour_end = isnull(dwoho.DWOHO_end_time_latest, '21:00') + from Arizona.dbo.DBA_Working_hours dwoho with (nolock) + join Arizona.dbo.Organizational_unit ou with (nolock) + on ou.Organizational_unit_id = dwoho.DWOHO_organizational_unit + where ou.ou_code = @ou_code + ; + + select @PLE = CAST((CAST([value_in_use] AS INT) / 1024.0) / 4.0 * 300.0 AS INT) + from sys.configurations + WHERE name = 'max server memory (MB)' + + select @NbCount = COUNT(*) from dbo.Monitoring_counter MC + inner join dbo.Monitoring_history MH + ON MH.MH_monitoring_counter = MC.Monitoring_counter_ID + where MC_name = 'Free list stalls/sec' + AND MH_datetime >= DATEADD(hour,-@in_NbHours,GETDATE()) + AND MH_value >= 2 + AND MH_datetime >= @Hour_start + AND MH_datetime <= @Hour_end + + IF @NbCount > 5 + SET @messageError = @messageError + 'WARNING Free list stalls/sec'+CHAR(13)+CHAR(10) + + select @NbCount = COUNT(*) from dbo.Monitoring_counter MC + inner join dbo.Monitoring_history MH + ON MH.MH_monitoring_counter = MC.Monitoring_counter_ID + where MC_name = 'Lazy writes/sec' + AND MH_datetime >= DATEADD(hour,-@in_NbHours,GETDATE()) + AND MH_value >= 20 + AND MH_datetime >= @Hour_start + AND MH_datetime <= @Hour_end + + IF @NbCount > 5 + SET @messageError = @messageError + 'WARNING Lazy writes/sec'+CHAR(13)+CHAR(10) + + select @NbCount = COUNT(*) from dbo.Monitoring_counter MC + inner join dbo.Monitoring_history MH + ON MH.MH_monitoring_counter = MC.Monitoring_counter_ID + where MC_name = 'Page reads/sec' + AND MH_datetime >= DATEADD(hour,-@in_NbHours,GETDATE()) + AND MH_value >= 90 + AND MH_datetime >= @Hour_start + AND MH_datetime <= @Hour_end + + IF @NbCount > 15 + SET @messageError = @messageError + 'WARNING Page reads/sec'+CHAR(13)+CHAR(10) + + select @NbCount = COUNT(*) from dbo.Monitoring_counter MC + inner join dbo.Monitoring_history MH + ON MH.MH_monitoring_counter = MC.Monitoring_counter_ID + where MC_name = 'Page life expectancy' + AND MH_datetime >= DATEADD(hour,-@in_NbHours,GETDATE()) + AND MH_value <= @PLE + AND MH_datetime >= @Hour_start + AND MH_datetime <= @Hour_end + + IF @NbCount > 20 + SET @messageError = @messageError + 'WARNING Page life expectancy'+CHAR(13)+CHAR(10) + + select @NbCount = COUNT(*) from dbo.Monitoring_counter MC + inner join dbo.Monitoring_history MH + ON MH.MH_monitoring_counter = MC.Monitoring_counter_ID + where MC_name = 'Memory Grants Pending' + AND MH_datetime >= DATEADD(hour,-@in_NbHours,GETDATE()) + AND MH_value >= 1 + AND MH_datetime >= @Hour_start + AND MH_datetime <= @Hour_end + + IF @NbCount > 5 + SET @messageError = @messageError + 'WARNING Memory Grants Pending'+CHAR(13)+CHAR(10) + + + IF @messageError <> '' + BEGIN + exec aps_Send_Mail_with_template + @in_param_varchar_2 = 'DBA_operator;', + @in_job_type = 3, /* 3 = warning */ + @in_param_varchar_3 = @messageError + END + +/*---------------------- Traitement des erreurs ----------------------*/ +END TRY +BEGIN CATCH + + /* Traitement des erreurs (avec RaiseError) */ + EXEC dbo.get_Error_Info @in_RaiseError = 1 + +END CATCH + +GO + + diff --git a/TPDT-268 - ACP in task sequence/dba_storedProcedures/mon_Collect_Stats_Index.sql b/TPDT-268 - ACP in task sequence/dba_storedProcedures/mon_Collect_Stats_Index.sql new file mode 100644 index 0000000..ef41a0b Binary files /dev/null and b/TPDT-268 - ACP in task sequence/dba_storedProcedures/mon_Collect_Stats_Index.sql differ diff --git a/TPDT-268 - ACP in task sequence/dba_storedProcedures/mon_Collect_Stats_SP.sql b/TPDT-268 - ACP in task sequence/dba_storedProcedures/mon_Collect_Stats_SP.sql new file mode 100644 index 0000000..299cc2b --- /dev/null +++ b/TPDT-268 - ACP in task sequence/dba_storedProcedures/mon_Collect_Stats_SP.sql @@ -0,0 +1,171 @@ +USE [HCITools] +GO + +/****** Object: StoredProcedure [dbo].[mon_Collect_Stats_SP] Script Date: 23.09.2020 14:15:00 ******/ +IF EXISTS (SELECT * FROM sys.objects WHERE object_id = OBJECT_ID(N'[dbo].[mon_Collect_Stats_SP]') AND type in (N'P', N'PC')) +DROP PROCEDURE [dbo].[mon_Collect_Stats_SP] +GO + +/****** Object: StoredProcedure [dbo].[mon_Collect_Stats_SP] Script Date: 23.09.2020 14:15:00 ******/ +SET ANSI_NULLS ON +GO + +SET QUOTED_IDENTIFIER ON +GO + +IF NOT EXISTS (SELECT * FROM sys.objects WHERE object_id = OBJECT_ID(N'[dbo].[mon_Collect_Stats_SP]') AND type in (N'P', N'PC')) +BEGIN +EXEC dbo.sp_executesql @statement = N'CREATE PROCEDURE [dbo].[mon_Collect_Stats_SP] AS' +END +GO + + + +ALTER PROCEDURE [dbo].[mon_Collect_Stats_SP] +AS +/*============================================================================= + + Explication du traitement realise par la SP + ------------------------------------------- + La SP va stocker l'ensemble des statistiques des procédures stockées contenues dans la DMV [sys].[dm_exec_procedure_stats] et créer un historique pour chaque redémarrage du serveur + + Contexte d'utilisation + ---------------------- + Appelé depuis le job D92030 - Collect Stats SP + + Creation : 23.09.20 / FLA + + Modifications : 17.03.2022 - FLA : Change DBA mail + +=============================================================================*/ + +set nocount on; + + +/*------------------- Declaration des variables --------------------*/ + +declare @databaseID smallint, + @databasename sysname, + @restartdate datetime, + @actualdate datetime, + @sql nvarchar(4000), + @messageError varchar (8000), + @errno int, + @errmsg varchar(255) + +/*------------ Affectation des parametres aux variables ------------*/ + +select @RestartDate = MIN(login_time) + from sys.sysprocesses + +select @actualdate = GETDATE() +select @errno = 0 + +SET @messageError = '' +SET @errmsg = '' + +IF EXISTS (SELECT type FROM master.cfg.InstanceContext WHERE type = 'PROD') +BEGIN + + /*-------------------------- Traitement ---------------------------*/ + BEGIN TRY + DECLARE c_databases CURSOR FAST_FORWARD FOR + select database_id, name + from sys.databases + where database_id > 4 + + open c_databases + + FETCH NEXT FROM c_databases + into @databaseID, @databasename + + /* On parcourt chaque base de données pour récuperer les informations des index */ + WHILE @@FETCH_STATUS = 0 + BEGIN + + BEGIN TRY + + SET @sql = 'insert into dbo.Stats_SP (SS_schemaname,SS_databasename,SS_name,SS_type,SS_execution_count,SS_last_execution_time,SS_total_worker_time,SS_total_physical_reads,SS_total_logical_writes,SS_total_logical_reads,SS_total_elapsed_time,SS_updatedate,SS_restartdate) + select OBJECT_SCHEMA_NAME(sp.object_id,'+ CAST(@databaseID AS nvarchar(4)) +'),'''+ @databasename +''',sp.name,sp.type_desc, null, null, null ,null ,null ,null, null, CAST('''+ CONVERT(nvarchar(30),@actualdate,126) +''' as datetime), CAST('''+ CONVERT(nvarchar(30),@RestartDate,126) +''' as datetime) + from '+ @databasename +'.sys.procedures sp + WHERE NOT EXISTS (select * + from dbo.Stats_SP as SS + where ISNULL(SS.SS_name,'''') COLLATE SQL_Latin1_General_CP1_CI_AS = ISNULL(sp.name,'''') COLLATE SQL_Latin1_General_CP1_CI_AS + and SS.SS_databasename COLLATE SQL_Latin1_General_CP1_CI_AS = '''+ @databasename +''' COLLATE SQL_Latin1_General_CP1_CI_AS + and SS.SS_schemaname COLLATE SQL_Latin1_General_CP1_CI_AS = OBJECT_SCHEMA_NAME(sp.object_id,'+ CAST(@databaseID AS nvarchar(4)) +') COLLATE SQL_Latin1_General_CP1_CI_AS + and SS_updatedate > CAST('''+ CONVERT(nvarchar(30),@RestartDate,126) +''' as datetime))' + + EXEC(@sql) + + /* On met à jour les stats des SP dans la table dbo.Stats_SP */ + SET @sql = N'UPDATE dbo.Stats_SP SET SS_execution_count = eps.execution_count, + SS_last_execution_time = eps.last_execution_time, + SS_total_worker_time = eps.total_worker_time, + SS_total_physical_reads = eps.total_physical_reads, + SS_total_logical_writes = eps.total_logical_writes, + SS_total_logical_reads = eps.total_logical_reads, + SS_total_elapsed_time = eps.total_elapsed_time, + SS_updatedate = CAST('''+ CONVERT(nvarchar(30),@actualdate,126) +''' as datetime) + FROM (SELECT sp.object_id,sp.name,SUM(eps.execution_count) execution_count, + MAX(eps.last_execution_time) last_execution_time, + SUM(eps.total_worker_time) total_worker_time, + SUM(eps.total_physical_reads) total_physical_reads, + SUM(eps.total_logical_writes) total_logical_writes, + SUM(eps.total_logical_reads) total_logical_reads, + SUM(eps.total_elapsed_time) total_elapsed_time + FROM [sys].[dm_exec_procedure_stats] eps + INNER JOIN '+ @databasename + '.sys.procedures sp + ON sp.object_id = eps.object_id + AND eps.database_id = '+ CAST(@databaseID AS nvarchar(4)) +' + GROUP BY sp.object_id,sp.name) as eps + WHERE ISNULL(SS_name,'''') COLLATE SQL_Latin1_General_CP1_CI_AS = ISNULL(eps.name,'''') COLLATE SQL_Latin1_General_CP1_CI_AS + AND SS_databasename COLLATE SQL_Latin1_General_CP1_CI_AS = '''+ @databasename +''' COLLATE SQL_Latin1_General_CP1_CI_AS + AND SS_schemaname COLLATE SQL_Latin1_General_CP1_CI_AS = OBJECT_SCHEMA_NAME(eps.object_id,'+ CAST(@databaseID AS nvarchar(4)) +') COLLATE SQL_Latin1_General_CP1_CI_AS + AND SS_updatedate > CAST('''+ CONVERT(nvarchar(30),@RestartDate,126) +''' as datetime)' + + EXEC(@sql) + + + END TRY + BEGIN CATCH + + select @messageError = @messageError + 'Collect_Stats_SP failed : ' + @databasename + ' ' + ERROR_MESSAGE() + CHAR(13) + SET @errno = @errno + 1 + + END CATCH + + FETCH NEXT FROM c_databases + into @databaseID, @databasename + END + + CLOSE c_databases + DEALLOCATE c_databases + + /* S'il y a une erreur, on envoie un mail aux DBA */ + IF @messageError <> '' + BEGIN + exec aps_Send_Mail_with_template + @in_param_varchar_2 = 'DBA_operator;', + @in_job_type = 3, /* 3 = warning */ + @in_param_varchar_3 = @messageError + + RAISERROR ('Erreur dans la SP [dbo].[mon_Collect_Stats_SP]',16,1) + END + + /*---------------------- Traitement des erreurs ----------------------*/ + END TRY + BEGIN CATCH + + /* Traitement des erreurs (avec RaiseError) */ + EXEC dbo.get_Error_Info @in_RaiseError = 1 + + END CATCH + +END + + + + +GO + + diff --git a/TPDT-268 - ACP in task sequence/dba_storedProcedures/mon_DDL_Audit_Alerts.sql b/TPDT-268 - ACP in task sequence/dba_storedProcedures/mon_DDL_Audit_Alerts.sql new file mode 100644 index 0000000..aca2255 --- /dev/null +++ b/TPDT-268 - ACP in task sequence/dba_storedProcedures/mon_DDL_Audit_Alerts.sql @@ -0,0 +1,129 @@ +USE [HCITools] +GO + +IF EXISTS (SELECT * FROM sys.objects WHERE object_id = OBJECT_ID(N'[dbo].[mon_DDL_Audit_Alerts]') AND type in (N'P', N'PC')) +DROP PROCEDURE [dbo].[mon_DDL_Audit_Alerts] +GO + + +USE [HCITools] +GO + +SET ANSI_NULLS ON +GO + +CREATE PROCEDURE [dbo].[mon_DDL_Audit_Alerts] + @in_debug tinyint = 0 +AS +/*============================================================================= + + Explication du traitement realise par la SP + ------------------------------------------- + La SP va rechercher les modifications de DDL dans [master].[dba].[DDL_audit] + + Contexte d'utilisation + ---------------------- + Appelé depuis le job D92120 - DDL Audit Alerts + + Parametres + ---------- + @in_debug : non utilisé + + Creation : 13.04.21 / RTC + + Modifications : 11.08.2021 / spe : #TFS65583# Migrate personal email address from [hcisolutions.ch] to [galenica.com] + +=============================================================================*/ +SET QUOTED_IDENTIFIER ON + +DECLARE @subject NVARCHAR(MAX), + @html_msg NVARCHAR(MAX), + @html_table NVARCHAR(MAX) + +/* Run only on centrals Validation and Dev */ +IF NOT EXISTS (SELECT 1 FROM [master].[cfg].[InstanceContext] WHERE [Business] = 'TPCENT' AND [TYPE] in ('DEVE','VALI')) +RETURN + +BEGIN TRY +/* Formatage du message et envoi */ +SELECT @subject = @@SERVERNAME + ' - DDL Audit' +SET @html_table = N'' + +SELECT @html_table = @html_table + '' + + '' + DA_Host_Name + '' + + '' + ISNULL(SPID,'') + '' + + '' + ISNULL(DatabaseName,'') + '' + + '' + ISNULL(SchemaName,'') + '' + + '' + ISNULL(ObjectName,'') + '' + + '' + ISNULL(EventType,'') + '' + + '' + DA_App_Name + '' + + '' + CONVERT(NVARCHAR(25),PostTime) + '' + + '' + FROM (SELECT DA_Host_Name, + DA_Event_Xml.value('(./EVENT_INSTANCE/SPID)[1]','NVARCHAR(MAX)') AS SPID, + DA_Event_Xml.value('(./EVENT_INSTANCE/PostTime)[1]','NVARCHAR(MAX)') AS PostTime, + DA_App_Name, + DA_Event_Xml.value('(./EVENT_INSTANCE/EventType)[1]','NVARCHAR(MAX)') AS EventType, + DA_Event_Xml.value('(./EVENT_INSTANCE/DatabaseName)[1]','NVARCHAR(MAX)') AS DatabaseName, + DA_Event_Xml.value('(./EVENT_INSTANCE/SchemaName)[1]','NVARCHAR(MAX)') AS SchemaName, + DA_Event_Xml.value('(./EVENT_INSTANCE/ObjectName)[1]','NVARCHAR(MAX)') AS ObjectName + FROM [master].[dba].[DDL_audit] + WHERE ISNULL(DA_App_Name,'') NOT IN ('SQLCMD','.Net SqlClient Data Provider', + 'ActivePharmacy.ArizonaServerService', + 'ActivePharmacy.ActivePosClientService', + 'ActivePharmacyStock', + 'Microsoft® Windows® Operating System', + 'SQLAgent - Initial Boot Probe', + 'SQLAgent - Enabling/disabling Agent XPs', + 'Microsoft SQL Server', + 'APS® TriaOne-Cash' + ) + AND DA_App_Name not like 'SQLAgent - TSQL%' + AND ISNULL(DA_Event_Xml.value('(./EVENT_INSTANCE/DatabaseName)[1]','NVARCHAR(MAX)'),'') NOT IN ('tempdb','ArizonaCUST','master','PharmIndexTP') + AND DA_Event_Xml.value('(./EVENT_INSTANCE/PostTime)[1]','NVARCHAR(MAX)') > GETDATE()-1 + ) AS myEventsTable + GROUP BY DA_Host_Name, + SPID, + DA_App_Name, + EventType, + DatabaseName, + SchemaName, + ObjectName, + PostTime + ORDER BY DA_Host_Name, + DatabaseName, + SchemaName, + ObjectName, + PostTime ASC + +IF @@ROWCOUNT > 0 +BEGIN + + SET @html_msg = + N'

DDL Audit by SQL operators

' + + N'' + + N' + + + + + + + + + ' + @html_table + N'
Host NameSPIDDatabase NameSchema NameObject NameEvent TypeApplication NamePost Time
' + + EXEC msdb.dbo.sp_send_dbmail @recipients= 'laurent.perroud@galenica.com;raphael.mognetti@galenica.com', + @subject = @subject, + @body = @html_msg, + @body_format = 'HTML' ; + +END + +END TRY +BEGIN CATCH + + /* Traitement des erreurs (avec RaiseError) */ + EXEC dbo.get_Error_Info @in_RaiseError = 1 + +END CATCH \ No newline at end of file diff --git a/TPDT-268 - ACP in task sequence/dba_storedProcedures/mon_DML_PH_insurance.sql b/TPDT-268 - ACP in task sequence/dba_storedProcedures/mon_DML_PH_insurance.sql new file mode 100644 index 0000000..fd9f008 --- /dev/null +++ b/TPDT-268 - ACP in task sequence/dba_storedProcedures/mon_DML_PH_insurance.sql @@ -0,0 +1,115 @@ +USE [HCITools] +GO + +IF EXISTS (SELECT * FROM sys.objects WHERE object_id = OBJECT_ID(N'[dbo].[mon_DML_PH_insurance]') AND type in (N'P', N'PC')) +DROP PROCEDURE [dbo].[mon_DML_PH_insurance] +GO + +SET ANSI_NULLS ON +GO + +SET QUOTED_IDENTIFIER ON +GO + +CREATE PROCEDURE [dbo].[mon_DML_PH_insurance] + @in_debug tinyint = 0 +AS +/*============================================================================= + + Explication du traitement realise par la SP + ------------------------------------------- + La SP va rechercher les modifications de DML pour la table PH insurance les derniers 4h + + Contexte d'utilisation + ---------------------- + Appelé depuis le job DR90010 - Central Track PH Insurance DML Alerts + + Parametres + ---------- + @in_debug : non utilisé + + Creation : 10.03.21 / RTC + + Modifications : 11.08.2021 / spe : #TFS65583# Migrate personal email address from [hcisolutions.ch] to [galenica.com] + 07.08.2021 / spe : #TFS65583# Migrate personal email address from [hcisolutions.ch] to [galenica.com] - Corrections + 16.03.2022 / FLA : Standardisation des mails + 23.10.2023 / tsc : #OCTPDBA-792 remove occurences of christophe.dorion@galenicare.com from mailing lists +=============================================================================*/ + +set nocount on; + + +/*------------------- Declaration des variables --------------------*/ + +DECLARE @subject NVARCHAR(MAX), + @html_msg NVARCHAR(MAX), + @html_table NVARCHAR(MAX), + @currentDate DATETIME + +/*------------ Affectation des parametres aux variables ------------*/ + +SET @currentDate = GETDATE() + +/*-------------------------- Traitement ---------------------------*/ + +BEGIN TRY + SET QUOTED_IDENTIFIER ON + +/* Run only on centrals for GCM format */ +IF NOT EXISTS (SELECT 1 FROM [master].[cfg].[InstanceContext] WHERE [Business] = 'TPCENT') +RETURN + +IF NOT EXISTS (SELECT 1 FROM [master].[cfg].[Identity] WHERE Format = 'GCM') +RETURN + + +/* Formatage du message et envoi */ +SELECT @subject = @@SERVERNAME + ' - DML audit PH_insurance' +SET @html_table = N'' + +SELECT @html_table = @html_table + '' + + '' + ISNULL(DMA_Host_Name,'') + '' + + '' + ISNULL(convert(varchar(10), DMA_SPID),'') + '' + + '' + ISNULL(DMA_Event_Info,'') + '' + + '' + DMA_App_Name + '' + + '' + CONVERT(NVARCHAR(25),DMA_Datetime) + '' + + '' + FROM [master].[dba].[DML_audit] + WHERE dma_table_name = 'ph_insurance' + AND (@currentDate <= DATEADD(MI,250,DMA_Datetime)) + --ORDER BY DMA_Datetime ASC + +IF @@ROWCOUNT > 0 +BEGIN + + SET @html_msg = + N'

PH Insurance DML Audit

' + + N'' + + N' + + + + + + ' + @html_table + N'
Host NameSPIDDMA_Event_InfoApplication NameUpdate Time
' + + EXEC Arizona.[dbo].[aps_Send_Mail_with_template] @in_job_type = 0, + @in_param_varchar_2 = 'DBA_operator', + @in_param_subject = @subject, + @in_param_message = @html_msg; +END + +/*---------------------- Traitement des erreurs ----------------------*/ +END TRY +BEGIN CATCH + + /* Traitement des erreurs (avec RaiseError) */ + EXEC dbo.get_Error_Info @in_RaiseError = 1 + +END CATCH + + +GO + + + diff --git a/TPDT-268 - ACP in task sequence/dba_storedProcedures/mon_Dereserve_SQL_Server_Memory.sql b/TPDT-268 - ACP in task sequence/dba_storedProcedures/mon_Dereserve_SQL_Server_Memory.sql new file mode 100644 index 0000000..29822ba --- /dev/null +++ b/TPDT-268 - ACP in task sequence/dba_storedProcedures/mon_Dereserve_SQL_Server_Memory.sql @@ -0,0 +1,114 @@ +USE [HCITools] +GO + +/****** Object: StoredProcedure [dbo].[mon_Dereserve_SQL_Server_Memory] Script Date: 11/09/2018 12:07:00 ******/ +IF EXISTS (SELECT * FROM sys.objects WHERE object_id = OBJECT_ID(N'[dbo].[mon_Dereserve_SQL_Server_Memory]') AND type in (N'P', N'PC')) +DROP PROCEDURE [dbo].[mon_Dereserve_SQL_Server_Memory] +GO + +USE [HCITools] +GO + +/****** Object: StoredProcedure [dbo].[mon_Dereserve_SQL_Server_Memory] Script Date: 11/09/2018 12:07:00 ******/ +SET ANSI_NULLS ON +GO + +SET QUOTED_IDENTIFIER ON +GO + +CREATE PROCEDURE [dbo].[mon_Dereserve_SQL_Server_Memory] + @in_debug tinyint = 0 +AS +/*============================================================================= + + Explication du traitement realise par la SP + ------------------------------------------- + La SP va déreserver la mémoire allouée par SQL Server + + Contexte d'utilisation + ---------------------- + Appelé depuis le job D92190 - Dereserve SQL Server Memory + + Parametres + ---------- + @in_debug : non utilisé + + Creation : 09.11.18 / FLA + + Modifications : 25.01.2019 / FLA : Utilisation du max server memory dans HCI_PARAMS + 30.01.2019 / FLA : Ajout d'un check du MaxServerMemory + 03.05.2019 / FLA : Modification de l'initialisation du max server memory + +=============================================================================*/ + +set nocount on; + + +/*------------------- Declaration des variables --------------------*/ + +declare @MaxServerMemory int, + @ActualServerMemory int, + @errno int, + @errmsg varchar(255) + +/*------------ Affectation des parametres aux variables ------------*/ + +select @errno = 0 + +SET @errmsg = '' + +/*-------------------------- Traitement ---------------------------*/ +BEGIN TRY + + IF(Arizona.dbo.aps_fn_Is_working_hour (dateadd (mi, 15, getdate()), null, null) = 1 and Arizona.dbo.aps_fn_Is_working_hour (getdate(), null, null) = 0) + BEGIN + SELECT @MaxServerMemory = HCIP_value FROM [HCITools].[dbo].[HCI_PARAMS] WHERE [HCIP_key] = 'MAXSRVMEM' + + SET @ActualServerMemory = @MaxServerMemory + + exec master.dbo.sp_configure 'show advanced option', 1; + RECONFIGURE WITH OVERRIDE + exec master.dbo.sp_configure 'max server memory (MB)',6144 + exec master.dbo.sp_configure 'show advanced option', 0; + RECONFIGURE WITH OVERRIDE + + WHILE(@ActualServerMemory <> 6144) + BEGIN + SELECT @ActualServerMemory = cntr_value/1024 FROM sys.dm_os_performance_counters WHERE counter_name = 'Total Server Memory (KB)' + WAITFOR DELAY '00:00:15' + END + + exec master.dbo.sp_configure 'show advanced option', 1; + RECONFIGURE WITH OVERRIDE + exec master.dbo.sp_configure 'max server memory (MB)',@MaxServerMemory + exec master.dbo.sp_configure 'show advanced option', 0; + RECONFIGURE WITH OVERRIDE + END + ELSE IF (Arizona.dbo.aps_fn_Is_working_hour (getdate(), null, null) = 1) + BEGIN + SELECT @ActualServerMemory = CAST(value_in_use as INT) FROM sys.configurations WHERE [name] = 'max server memory (MB)' + SELECT @MaxServerMemory = HCIP_value FROM [HCITools].[dbo].[HCI_PARAMS] WHERE [HCIP_key] = 'MAXSRVMEM' + + IF (@ActualServerMemory <> @MaxServerMemory) + BEGIN + exec master.dbo.sp_configure 'show advanced option', 1; + RECONFIGURE WITH OVERRIDE + exec master.dbo.sp_configure 'max server memory (MB)',@MaxServerMemory + exec master.dbo.sp_configure 'show advanced option', 0; + RECONFIGURE WITH OVERRIDE + END + END + +/*---------------------- Traitement des erreurs ----------------------*/ +END TRY +BEGIN CATCH + + /* Traitement des erreurs (avec RaiseError) */ + EXEC dbo.get_Error_Info @in_RaiseError = 1 + +END CATCH + + +GO + + diff --git a/TPDT-268 - ACP in task sequence/dba_storedProcedures/mon_Purge_All_Stats_Index.sql b/TPDT-268 - ACP in task sequence/dba_storedProcedures/mon_Purge_All_Stats_Index.sql new file mode 100644 index 0000000..5555fcd --- /dev/null +++ b/TPDT-268 - ACP in task sequence/dba_storedProcedures/mon_Purge_All_Stats_Index.sql @@ -0,0 +1,67 @@ +USE [HCITools] +GO + +IF EXISTS (SELECT * FROM sys.objects WHERE object_id = OBJECT_ID(N'[dbo].[mon_Purge_All_Stats_Index]') AND type in (N'P', N'PC')) +DROP PROCEDURE [dbo].[mon_Purge_All_Stats_Index] +GO + +USE [HCITools] +GO + +SET ANSI_NULLS ON +GO + +SET QUOTED_IDENTIFIER ON +GO + + +CREATE PROCEDURE [dbo].[mon_Purge_All_Stats_Index] + @in_debug tinyint = null +AS +/*============================================================================= + + Explication du traitement realise par la SP + ------------------------------------------- + Cette SP sert à supprimer les données des statistiques des indexes de plus de 12 mois + + Contexte d'utilisation + ---------------------- + Cette SP est appelée par le job D93150 - Purge All Stats Index + + Parametres + ---------- + @in_debug : non utilisé + + + Creation : 04.10.18 / SPE + + Modifications : + + 26.02.2019 - SPE - #TFS51645# Reduce history retention on table [HCITools].[dbo].[All_Stats_index] + +=============================================================================*/ + +set nocount on; + +/*-------------------------- Traitement ---------------------------*/ +BEGIN TRY + +/* suppression de l'historique des indexes plus vieux de 12 mois */ +DELETE [HCITools].[dbo].[All_Stats_index] + WHERE SI_updatedate <= dateadd(month, -12, getdate()) + + +/*---------------------- Traitement des erreurs ----------------------*/ +END TRY +BEGIN CATCH + + /* Traitement des erreurs (avec RaiseError) */ + EXEC dbo.get_Error_Info @in_RaiseError = 1 + +END CATCH + + + +GO + + diff --git a/TPDT-268 - ACP in task sequence/dba_storedProcedures/mon_Purge_All_Stats_SP.sql b/TPDT-268 - ACP in task sequence/dba_storedProcedures/mon_Purge_All_Stats_SP.sql new file mode 100644 index 0000000..ccec4f2 --- /dev/null +++ b/TPDT-268 - ACP in task sequence/dba_storedProcedures/mon_Purge_All_Stats_SP.sql @@ -0,0 +1,67 @@ +USE [HCITools] +GO + +IF EXISTS (SELECT * FROM sys.objects WHERE object_id = OBJECT_ID(N'[dbo].[mon_Purge_All_Stats_SP]') AND type in (N'P', N'PC')) +DROP PROCEDURE [dbo].[mon_Purge_All_Stats_SP] +GO + +USE [HCITools] +GO + +SET ANSI_NULLS ON +GO + +SET QUOTED_IDENTIFIER ON +GO + + +CREATE PROCEDURE [dbo].[mon_Purge_All_Stats_SP] + @in_debug tinyint = null +AS +/*============================================================================= + + Explication du traitement realise par la SP + ------------------------------------------- + Cette SP sert à supprimer les données des statistiques des procédure stockées de plus de 12 mois + + Contexte d'utilisation + ---------------------- + Cette SP est appelée par le job D93140 - Purge All Stats SP + + Parametres + ---------- + @in_debug : non utilisé + + + Creation : 23.09.20 / FLA + + Modifications : + + + +=============================================================================*/ + +set nocount on; + +/*-------------------------- Traitement ---------------------------*/ +BEGIN TRY + +/* suppression de l'historique des SP plus vieux de 12 mois */ +DELETE [HCITools].[dbo].[All_Stats_SP] + WHERE SS_updatedate <= dateadd(month, -12, getdate()) + + +/*---------------------- Traitement des erreurs ----------------------*/ +END TRY +BEGIN CATCH + + /* Traitement des erreurs (avec RaiseError) */ + EXEC dbo.get_Error_Info @in_RaiseError = 1 + +END CATCH + + + +GO + + diff --git a/TPDT-268 - ACP in task sequence/dba_storedProcedures/mon_Purge_Stats_Index.sql b/TPDT-268 - ACP in task sequence/dba_storedProcedures/mon_Purge_Stats_Index.sql new file mode 100644 index 0000000..73a8e8a --- /dev/null +++ b/TPDT-268 - ACP in task sequence/dba_storedProcedures/mon_Purge_Stats_Index.sql @@ -0,0 +1,70 @@ +USE [HCITools] +GO + +IF EXISTS (SELECT * FROM sys.objects WHERE object_id = OBJECT_ID(N'[dbo].[mon_Purge_Stats_Index]') AND type in (N'P', N'PC')) +DROP PROCEDURE [dbo].[mon_Purge_Stats_Index] +GO + +USE [HCITools] +GO + +SET ANSI_NULLS ON +GO + +SET QUOTED_IDENTIFIER ON +GO + + +CREATE PROCEDURE [dbo].[mon_Purge_Stats_Index] + @in_debug tinyint = 0 +AS +/*============================================================================= + + Explication du traitement realise par la SP + ------------------------------------------- + La SP va purger l'ensemble des traces contenues dans la table HCITools.dbo.Stats_index datant d'avant le redémarrage du serveur + + Contexte d'utilisation + ---------------------- + Appelé depuis le job D9207X - Transfert Stats Index + + Parametres + ---------- + @in_debug : non utilisé + + Creation : 27.10.16 / FLA + + Modifications : 28.10.2016 / FLA : Standardisation de la gestion des erreurs + 24.09.2018 / FLA : Remove references to undocumented system tables + +=============================================================================*/ + +set nocount on; + + +/*------------------- Declaration des variables --------------------*/ + +declare @restartdate datetime, + @errno int, + @errmsg varchar(255) + +/*------------ Affectation des parametres aux variables ------------*/ + +select @RestartDate = MIN(login_time) from sys.dm_exec_sessions + +/*-------------------------- Traitement ---------------------------*/ +BEGIN TRY + DELETE si FROM [HCITools].[dbo].[Stats_index] si + WHERE SI_updatedate < CAST(CONVERT(nvarchar(30),@RestartDate,126) as datetime) + +/*---------------------- Traitement des erreurs ----------------------*/ +END TRY +BEGIN CATCH + + /* Traitement des erreurs (avec RaiseError) */ + EXEC dbo.get_Error_Info @in_RaiseError = 1 + +END CATCH + +GO + diff --git a/TPDT-268 - ACP in task sequence/dba_storedProcedures/mon_Purge_Stats_SP.sql b/TPDT-268 - ACP in task sequence/dba_storedProcedures/mon_Purge_Stats_SP.sql new file mode 100644 index 0000000..020a3ac --- /dev/null +++ b/TPDT-268 - ACP in task sequence/dba_storedProcedures/mon_Purge_Stats_SP.sql @@ -0,0 +1,68 @@ +USE [HCITools] +GO + +IF EXISTS (SELECT * FROM sys.objects WHERE object_id = OBJECT_ID(N'[dbo].[mon_Purge_Stats_SP]') AND type in (N'P', N'PC')) +DROP PROCEDURE [dbo].[mon_Purge_Stats_SP] +GO + +SET ANSI_NULLS ON +GO + +SET QUOTED_IDENTIFIER ON +GO + +CREATE PROCEDURE [dbo].[mon_Purge_Stats_SP] + @in_debug tinyint = 0 +AS +/*============================================================================= + + Explication du traitement realise par la SP + ------------------------------------------- + La SP va purger l'ensemble des traces contenues dans la table HCITools.dbo.Stats_SP datant d'avant le redémarrage du serveur + + Contexte d'utilisation + ---------------------- + Appelé depuis le job D9208X - Transfert Stats Index + + Parametres + ---------- + @in_debug : non utilisé + + Creation : 23.09.20 / FLA + + Modifications : + +=============================================================================*/ + +set nocount on; + + +/*------------------- Declaration des variables --------------------*/ + +declare @restartdate datetime, + @errno int, + @errmsg varchar(255) + +/*------------ Affectation des parametres aux variables ------------*/ + +select @RestartDate = MIN(login_time) from sys.sysprocesses + +/*-------------------------- Traitement ---------------------------*/ +BEGIN TRY + DELETE sp FROM [HCITools].[dbo].[Stats_SP] sp + WHERE SS_updatedate < CAST(CONVERT(nvarchar(30),@RestartDate,126) as datetime) + +/*---------------------- Traitement des erreurs ----------------------*/ +END TRY +BEGIN CATCH + + /* Traitement des erreurs (avec RaiseError) */ + EXEC dbo.get_Error_Info @in_RaiseError = 1 + +END CATCH + + +GO + + + diff --git a/TPDT-268 - ACP in task sequence/dba_storedProcedures/mon_Transfert_Stats_Index.sql b/TPDT-268 - ACP in task sequence/dba_storedProcedures/mon_Transfert_Stats_Index.sql new file mode 100644 index 0000000..1cd61c3 --- /dev/null +++ b/TPDT-268 - ACP in task sequence/dba_storedProcedures/mon_Transfert_Stats_Index.sql @@ -0,0 +1,145 @@ +USE [HCITools] +GO + +IF EXISTS (SELECT * FROM sys.objects WHERE object_id = OBJECT_ID(N'[dbo].[mon_Transfert_Stats_Index]') AND type in (N'P', N'PC')) +DROP PROCEDURE [dbo].[mon_Transfert_Stats_Index] +GO + +USE [HCITools] +GO + +SET ANSI_NULLS ON +GO + +SET QUOTED_IDENTIFIER ON +GO + + + +CREATE PROCEDURE [dbo].[mon_Transfert_Stats_Index] + @in_debug tinyint = 0 +AS +/*============================================================================= + + Explication du traitement realise par la SP + ------------------------------------------- + La SP va transferer l'ensemble des statistiques des index contenues dans la table HCITools.dbo.Stats_index vers la table HCITools.dbo.All_Stats_Index de la centrale + + Contexte d'utilisation + ---------------------- + Appelé depuis le job D92070 - Transfert Stats Index + + Parametres + ---------- + @in_debug : non utilisé + + Creation : 27.10.16 / FLA + + Modifications : 28.10.2016 / FLA : Standardisation de la gestion des erreurs + 04.10.2017 / FLA : Ajout de la gestion des environnements + 24.09.2018 / FLA : Remove references to undocumented system tables + 20.12.2018 / SPE : #TFS49408# Migrate identification table [master].[cfg].[Identity] + 04.08.2023 / TSC : Added a WHERE NOT EXISTS to avoid duplicate key errors during upload + +=============================================================================*/ + +set nocount on; + + +/*------------------- Declaration des variables --------------------*/ + +declare @cvCurrentOrganizationalUnit int, + @CV_OUT_value varchar(8000), + @ou_code varchar(10), + @ServerName varchar(20), + @restartdate datetime, + @errno int, + @errmsg varchar(255), + @LnkSrv varchar(15), + @cmd varchar(8000), + @Entity varchar(4) + +/*------------ Affectation des parametres aux variables ------------*/ + +select @cvCurrentOrganizationalUnit = null ; + +/*-------------------------- Traitement ---------------------------*/ + + +IF EXISTS (SELECT type FROM master.cfg.InstanceContext WHERE type = 'PROD') +BEGIN + + BEGIN TRY + + exec arizona.dbo.sp_bmc_Bmc_Applic_Default + @in_job_type = 3, + @in_param_int_1 = null, + @in_param_int_2 = null, + @in_param_varchar_1 = 'cvCurrentOrganizationalUnit', + @out_default_value = @CV_out_value output, + @out_param_int_1 = null; + select @cvCurrentOrganizationalUnit = convert(int,@CV_out_value) + + select @ou_code = ou.ou_code + from arizona.dbo.Organizational_unit ou (nolock) + where ou.Organizational_unit_ID = @cvCurrentOrganizationalUnit + + SELECT @Entity = [Customer] FROM [master].[cfg].[Identity] + + IF @Entity = 'RUEG' + BEGIN + SET @Entity = 'AAI' + END + + SET @ServerName = @Entity+isnull(@ou_code,'')+'APS' + + select @RestartDate = MIN(login_time) + from sys.dm_exec_sessions + + IF @Entity = 'AAI' + SET @LnkSrv = 'CENTRALEDATA' + ELSE + SET @LnkSrv = 'ARIZONACASH' + + SET @cmd = 'INSERT INTO '+@LnkSrv+'.HCITools.dbo.All_Stats_Index + SELECT TOP 50000 '''+@ServerName+''',[Stats_index_ID] + ,[SI_schemaname] + ,[SI_databasename] + ,[SI_tablename] + ,[SI_indexname] + ,[SI_indextype] + ,[SI_user_seeks] + ,[SI_user_scans] + ,[SI_user_lookups] + ,[SI_user_updates] + ,[SI_last_user_seek] + ,[SI_last_user_scan] + ,[SI_last_user_lookup] + ,[SI_last_user_update] + ,[SI_updatedate] + ,[SI_restartdate] + ,NULL + FROM [HCITools].[dbo].[Stats_index] si WITH (NOLOCK) + WHERE SI_updatedate < CAST('''+CONVERT(nvarchar(30),@RestartDate,126)+''' as datetime) + AND NOT EXISTS( + SELECT 1 + FROM '+@LnkSrv+'.HCITools.dbo.All_Stats_Index t + WHERE t.[SI_ServerName] = '''+@ServerName+''' + AND t.[Stats_index_ID] = si.[Stats_index_ID] + ) + ' + + EXEC (@cmd) + + /*---------------------- Traitement des erreurs ----------------------*/ + END TRY + BEGIN CATCH + + /* Traitement des erreurs (avec RaiseError) */ + EXEC dbo.get_Error_Info @in_RaiseError = 1 + + END CATCH + +END + +GO diff --git a/TPDT-268 - ACP in task sequence/dba_storedProcedures/mon_Transfert_Stats_SP.sql b/TPDT-268 - ACP in task sequence/dba_storedProcedures/mon_Transfert_Stats_SP.sql new file mode 100644 index 0000000..414b765 --- /dev/null +++ b/TPDT-268 - ACP in task sequence/dba_storedProcedures/mon_Transfert_Stats_SP.sql @@ -0,0 +1,140 @@ +USE [HCITools] +GO + +IF EXISTS (SELECT * FROM sys.objects WHERE object_id = OBJECT_ID(N'[dbo].[mon_Transfert_Stats_SP]') AND type in (N'P', N'PC')) +DROP PROCEDURE [dbo].[mon_Transfert_Stats_SP] +GO + +SET ANSI_NULLS ON +GO + +SET QUOTED_IDENTIFIER ON +GO + +IF NOT EXISTS (SELECT * FROM sys.objects WHERE object_id = OBJECT_ID(N'[dbo].[mon_Transfert_Stats_SP]') AND type in (N'P', N'PC')) +BEGIN +EXEC dbo.sp_executesql @statement = N'CREATE PROCEDURE [dbo].[mon_Transfert_Stats_SP] AS' +END +GO + + + +ALTER PROCEDURE [dbo].[mon_Transfert_Stats_SP] + @in_debug tinyint = 0 +AS +/*============================================================================= + + Explication du traitement realise par la SP + ------------------------------------------- + La SP va transferer l'ensemble des statistiques des procédures stockées contenues dans la table HCITools.dbo.Stats_SP vers la table HCITools.dbo.All_Stats_SP de la centrale + + Contexte d'utilisation + ---------------------- + Appelé depuis le job D9208X - Transfert Stats SP + + Parametres + ---------- + @in_debug : non utilisé + + Creation : 23.09.20 / FLA + + Modifications : + +=============================================================================*/ + +set nocount on; + + +/*------------------- Declaration des variables --------------------*/ + +declare @cvCurrentOrganizationalUnit int, + @CV_OUT_value varchar(8000), + @ou_code varchar(10), + @ServerName varchar(20), + @restartdate datetime, + @errno int, + @errmsg varchar(255), + @LnkSrv varchar(15), + @cmd varchar(8000), + @Entity varchar(4) + +/*------------ Affectation des parametres aux variables ------------*/ + +select @cvCurrentOrganizationalUnit = null ; + +/*-------------------------- Traitement ---------------------------*/ + + +IF EXISTS (SELECT type FROM master.cfg.InstanceContext WHERE type = 'PROD') +BEGIN + + BEGIN TRY + + exec arizona.dbo.sp_bmc_Bmc_Applic_Default + @in_job_type = 3, + @in_param_int_1 = null, + @in_param_int_2 = null, + @in_param_varchar_1 = 'cvCurrentOrganizationalUnit', + @out_default_value = @CV_out_value output, + @out_param_int_1 = null; + select @cvCurrentOrganizationalUnit = convert(int,@CV_out_value) + + select @ou_code = ou.ou_code + from arizona.dbo.Organizational_unit ou (nolock) + where ou.Organizational_unit_ID = @cvCurrentOrganizationalUnit + + SELECT @Entity = [Customer] FROM [master].[cfg].[Identity] + + IF @Entity = 'RUEG' + BEGIN + SET @Entity = 'AAI' + END + + SET @ServerName = @Entity+isnull(@ou_code,'')+'APS' + + select @RestartDate = MIN(login_time) + from sys.sysprocesses + + IF @Entity = 'AAI' + SET @LnkSrv = 'CENTRALEDATA' + ELSE + SET @LnkSrv = 'ARIZONACASH' + + SET @cmd = 'INSERT INTO '+@LnkSrv+'.HCITools.dbo.All_Stats_SP + SELECT TOP 50000 '''+@ServerName+''',[Stats_SP_ID] + ,[SS_schemaname] + ,[SS_databasename] + ,[SS_name] [sysname] + ,[SS_type] [nvarchar] + ,[SS_execution_count] + ,[SS_last_execution_time] + ,[SS_total_worker_time] + ,[SS_total_physical_reads] + ,[SS_total_logical_writes] + ,[SS_total_logical_reads] + ,[SS_total_elapsed_time] + ,[SS_updatedate] + ,[SS_restartdate] + ,NULL + FROM [HCITools].[dbo].[Stats_SP] sp WITH (NOLOCK) + WHERE SS_updatedate < CAST('''+CONVERT(nvarchar(30),@RestartDate,126)+''' as datetime)' + + EXEC (@cmd) + + /*---------------------- Traitement des erreurs ----------------------*/ + END TRY + BEGIN CATCH + + /* Traitement des erreurs (avec RaiseError) */ + EXEC dbo.get_Error_Info @in_RaiseError = 1 + + END CATCH + +END + + + + +GO + + diff --git a/TPDT-268 - ACP in task sequence/dba_storedProcedures/perf.Get_Performance_Status.sql b/TPDT-268 - ACP in task sequence/dba_storedProcedures/perf.Get_Performance_Status.sql new file mode 100644 index 0000000..d2afa7d --- /dev/null +++ b/TPDT-268 - ACP in task sequence/dba_storedProcedures/perf.Get_Performance_Status.sql @@ -0,0 +1,201 @@ +USE [HCITools] +GO + +/****** Object: StoredProcedure [perf].[Get_Performance_Status] Script Date: 02/01/2016 16:15:59 ******/ +IF EXISTS (SELECT * FROM sys.objects WHERE object_id = OBJECT_ID(N'[perf].[Get_Performance_Status]') AND type in (N'P', N'PC')) +DROP PROCEDURE [perf].[Get_Performance_Status] +GO + +USE [HCITools] +GO + +/****** Object: StoredProcedure [perf].[Get_Performance_Status] Script Date: 02/01/2016 16:15:59 ******/ +SET ANSI_NULLS ON +GO + +SET QUOTED_IDENTIFIER ON +GO + + + + + + + + + + + +CREATE PROCEDURE [perf].[Get_Performance_Status] + @in_debug tinyint = 0, + @in_Recipients varchar(8000) = '', + @in_SendInConsole tinyint = 1, + @in_CheckList varchar(14) = '11111111111111' +AS +/*============================================================================= + + Explication du traitement realise par la SP + ------------------------------------------- + Cette SP sert à appeler les SP d'analyse de performance pour la capture des traces et collecte les résultats pour leur traitement + + Contexte d'utilisation + ---------------------- + Cette SP est appelée manuellement en cas de besoin + + Parametres + ---------- + @in_debug : si 1, affichage de la liste des SP contenues dans la SP principale + @in_Recipients : Si vide, pas d'envoi de mail sinon contient le code ou les mails destinataires du mail + @in_SendInConsole : si 1, affichage dans la console + @in_CheckList : Contient la liste des checks à effectuer. 0 pour désactivé, 1 pour premier niveau, 2 pour 2ème niveau etc.. + La position défini la SP à appeler. Ex : 11111111111111 appelle toutes les SP en niveau 1 + + Creation : 10.11.15 / FLA + + Modifications : 17.08.2023 / SPE : OCTPDBA-726: Replace mail profile name APSSQL_MAIL_PROFILE into AzureManagedInstance_dbmail_profile to be SQL managed instances compatible + +=============================================================================*/ + +set nocount on; + +/*------------------- Declaration des variables --------------------*/ +declare @html nvarchar(max), + @TableHTML nvarchar(max), + @i tinyint, + @cmd varchar(500), + @Title varchar(50), + @Details tinyint, + @in_SendInMail tinyint + + +declare @SPList table ( + ID tinyint, + SPName varchar(50), + SPTitle varchar(50), + Details tinyint NULL) + +CREATE TABLE #HTMLResult ( + ID tinyint, + Result nvarchar(max) + ) + + +/*------------ Affectation des parametres aux variables ------------*/ +SET @html = '' + +/* Déclaration des SP disponibles pour l'analyse des performances */ +insert into @SPList VALUES (1,'Check_RAM','RAM', NULL) +insert into @SPList VALUES (2,'Check_CPU','CPU', NULL) +insert into @SPList VALUES (3,'Check_Disk','DISK', NULL) +insert into @SPList VALUES (4,'Check_Locks','LOCKS', NULL) +insert into @SPList VALUES (5,'Check_Replication','REPLICATION', NULL) +insert into @SPList VALUES (6,'Check_Jobs','JOBS', NULL) +insert into @SPList VALUES (7,'Check_Process','PROCESS', NULL) +insert into @SPList VALUES (8,'Check_If_Error','ERRORS', NULL) +insert into @SPList VALUES (9,'Check_Statistics','STATISTICS', NULL) +insert into @SPList VALUES (10,'Check_Index','INDEX', NULL) +insert into @SPList VALUES (11,'Check_Trace','TRACE', NULL) +insert into @SPList VALUES (12,'Check_Query','QUERY', NULL) +insert into @SPList VALUES (13,'Check_TempDB','TEMPDB', NULL) +insert into @SPList VALUES (14,'Check_Waits','WAITS', NULL) + +SET @i = 1 + +/*-------------------------- Traitement ---------------------------*/ + + +BEGIN TRY + + /* Si @in_Recipients alors on n'envoie pas de mail */ + IF @in_Recipients = '' + SET @in_SendInMail = 0 + ELSE + SET @in_SendInMail = 1 + + /* Si mode debug, alors on affiche la liste des SP appelées */ + IF @in_debug = 1 + SELECT CAST(ID as varchar(2)) + ' - ' + SPName FROM @SPList ORDER BY ID + ELSE + BEGIN + + /* On parcour l'ensemble des SP à traiter */ + WHILE @i <> LEN(@in_CheckList)+1 + BEGIN + + /* Mise à jour du niveau de détails voulu par SP */ + UPDATE @SPList SET Details = CAST(SUBSTRING(@in_CheckList,@i,1) as int) WHERE ID = @i + + /* Récupération du titre à afficher dans la SP et du niveau de détails voulu */ + SELECT @Title = SPTitle, @Details = Details FROM @SPList WHERE ID = @i + + if @Details > 0 + BEGIN + + /* Si mode console, on affiche le titre */ + IF @in_SendInConsole = 1 + SELECT @Title + + /* Si détail > 0 execution de chaque SP */ + SELECT @cmd='EXEC [perf].'+ SPName + ' @in_SendInMail ='+CAST(@in_SendInMail as CHAR) +', @in_SendInConsole = '+CAST(@in_SendInConsole as CHAR)+', @in_Details = '+CAST(Details as CHAR)+', @in_ID = '+CAST(ID as varchar(3))+';' FROM @SPList WHERE ID = @i + EXEC(@cmd) + + /* Préparation du titre en mode HTML en cas d'envoi par mail */ + SET @html = @html + '' + + SELECT @html = @html + Result from #HTMLResult WHERE ID = @i + END + + SET @i = @i+1 + END + + /* Envoi de mail */ + if @in_SendInMail = 1 + BEGIN + + /* Get default mailbox profile name */ + DECLARE @defaultprofilname varchar(100) + SELECT DISTINCT @defaultprofilname = p.name FROM msdb.dbo.sysmail_profile p JOIN msdb.dbo.sysmail_principalprofile pp ON pp.profile_id = p.profile_id AND pp.is_default = 1 + + EXEC msdb.dbo.sp_send_dbmail @recipients=@in_Recipients, + @subject = 'Compte rendu de performance', + @body = @html, + @body_format = 'HTML', + @profile_name = @defaultprofilname + END + + DROP TABLE #HTMLResult + END + +END TRY +BEGIN CATCH + DROP TABLE #HTMLResult + + /* Traitement des erreurs (avec RaiseError) */ + EXEC dbo.get_Error_Info + +END CATCH +; + +/*------------------ Retour au programme appelant -----------------*/ + +return(@@error); + + + + + + + + + + + + + + + + + + +GO + diff --git a/TPDT-268 - ACP in task sequence/dba_storedProcedures/sp_Monitor_AMR_Central.sql b/TPDT-268 - ACP in task sequence/dba_storedProcedures/sp_Monitor_AMR_Central.sql new file mode 100644 index 0000000..8a74a6c --- /dev/null +++ b/TPDT-268 - ACP in task sequence/dba_storedProcedures/sp_Monitor_AMR_Central.sql @@ -0,0 +1,338 @@ + +USE [HCITOOLS] +GO + +IF EXISTS (SELECT * FROM sys.objects o JOIN sys.schemas s ON o.schema_id = s.schema_id WHERE o.name = 'sp_Monitor_AMR_Central' AND OBJECTPROPERTY(object_id,N'IsProcedure') = 1 AND s.name = 'dba') + DROP PROCEDURE [dba].[sp_Monitor_AMR_Central] +GO + +SET ANSI_NULLS ON +SET QUOTED_IDENTIFIER ON +GO + + + +CREATE PROCEDURE [dba].[sp_Monitor_AMR_Central] + +AS +/*============================================================================= + + Explication du traitement realise par la SP + ------------------------------------------- + Monitoring du nombre d'AMR sur une pharmacie et d'envoi d'alertes mails et/ou sms selon le total. + Cette SP est exécutée depuis le job _D90290 - SYNC - Monitor AMR - Central + + Parametres + ---------- + + Creation : 01.05.2019 / SPE + + Modifications : 05.02.2020 / SPE - Modification of bmcarizona password + 16.08.2021 / SPE : Replace hardcoded password in sp and scripts + 17.03.2022 / FLA : Change DBA mail + 30.11.2022 / FLA : keep SMS alert only for production environment + +=============================================================================*/ + +SET ANSI_NULLS ON; +SET QUOTED_IDENTIFIER ON; +SET CONCAT_NULL_YIELDS_NULL ON; +SET ANSI_WARNINGS ON; +SET ANSI_PADDING ON; +SET NOCOUNT ON; + +/*------------------- Declaration des variables --------------------*/ +DECLARE @errno int, + @niveau_alerte_AMR int, + @niveau_alerte_AMR_Med int, + @niveau_alerte_AMR_Sup int, + @amr_count_total int, + @amr_count_total_limit int, + @current_max int, + @AMT_table_name_LEN int, + @Today varchar(10), + @pharmacy varchar(21), + @errmsg varchar(255), + @email varchar(255), + @SMSPiket varchar(255), + @password varchar(255), + @Result_as_string varchar(max), + @message varchar(max), + @sqlstmt varchar(max), + @Type VARCHAR(5) + + + + +/*------------ Affectation des parametres aux variables ------------*/ + +/* A partir de cette valeur pour une table une alerte mail prioritaire est envoyée*/ +SET @niveau_alerte_AMR = 5000 +SET @niveau_alerte_AMR_Med = 10000 + +/* A partir de cette valeur pour une table une alerte sms est envoyée*/ +SET @niveau_alerte_AMR_Sup = 50000 + +/* Si le total des amr atteint cette valeur, une alerte sms est envoyée */ +SET @amr_count_total_limit = 100000; + +/* La date d'aujourd'hui en format YYYY-MM-DD */ +SET @Today = convert(varchar(10), getdate(), 121); + +/* Set current pharmacy from customer */ +SELECT @pharmacy = CASE + WHEN customer = 'AMA' THEN 'ama004aps.amavita.ch' + WHEN customer = 'SUN' THEN 'sun111aps.sunstore.ch' + WHEN customer = 'AAI' THEN 'aai002aps.aai.local' + WHEN customer = 'RUEG' THEN 'aai003aps.aai.local' END + from master.cfg.[Identity] + +/* Set email list from customer */ +SELECT @email = CASE + WHEN customer = 'AMA' THEN 'DBA_operator;HCI_Dev_DataMonitoring_Operators;[HCI_Connectic_Managers];HCI_Consultants_Centrale_GaleniCare' + WHEN customer = 'SUN' THEN 'DBA_operator;HCI_Dev_DataMonitoring_Operators;[HCI_Connectic_Managers];HCI_Consultants_Centrale_GaleniCare' + WHEN customer = 'AAI' THEN 'DBA_operator;HCI_Dev_DataMonitoring_Operators' + WHEN customer = 'RUEG' THEN 'DBA_operator;HCI_Dev_DataMonitoring_Operators' END + from master.cfg.[Identity] + + SELECT @SMSPiket = DML_Recipients FROM [Arizona].[dbo].[DBA_Mailing_list] WHERE DML_Code = 'HCI_SMS' + + SELECT @Type = type FROM [master].[cfg].[InstanceContext] + +/*-------------------------- Traitement ---------------------------*/ + +BEGIN TRY + + /******************************/ + /* EN PHARMACIE : Recupere les tables monitorees en pharmacie pour APOS */ + /******************************/ + + /* Create temp table */ + IF NOT EXISTS (select 1 from tempdb.dbo.sysobjects o where o.xtype in ('U') and o.id = object_id(N'tempdb..#aps_monitor_table_MAG')) + BEGIN + CREATE TABLE #aps_monitor_table_MAG ( + AMT_table_name varchar(255) NULL, + AMT_monitoring_type smallint NULL, + AMT_vertical_synchronization bit NOT NULL, + AMT_horizontal_synchronization bit NOT NULL); + END + + /* Set pharmacy from Identity table */ + SELECT @password = dbo.fn_Decrypt(0x01000000CB57766E65B2870616508D6B1E3996D8AA04932A5637822356196C4D3D7523A36EB5277FE69D2C21661533909D6AEDBA4E287822DEAD22C59FF2B5F5CE313BE0) + + SET @sqlstmt = 'INSERT INTO #aps_monitor_table_MAG +SELECT AMT_table_name, + AMT_monitoring_type, + AMT_vertical_synchronization, + AMT_horizontal_synchronization + FROM OPENROWSET(''SQLOLEDB'', + ''' + @pharmacy + '''; + ''bmcarizona''; + ''' + @password + ''', + ''SELECT AMT_table_name, AMT_monitoring_type, AMT_vertical_synchronization, AMT_horizontal_synchronization FROM Arizona.dbo.APS_monitor_table WHERE AMT_monitoring_type > 1'');' + + EXEC (@sqlstmt) + + + /******************************/ + /* A LA CENTRALE : COMPTAGE DES AMR EN ATTENTE DE SYNCHRONISATION */ + /******************************/ + DECLARE @aps_monitor_row_CENTRAL table ( + AMT_table_name varchar(255) NULL, + AMR_count int, + AMR_APS_TS_min datetime, + AMR_APS_TS_max datetime, + AMR_count_00_08 int, + AMR_count_08_10 int, + AMR_count_10_12 int, + AMR_count_12_14 int, + AMR_count_14_16 int, + AMR_count_16_18 int, + AMR_count_18_20 int, + AMR_count_20_00 int); + + INSERT INTO @aps_monitor_row_CENTRAL + SELECT PivotTable.amt_table_name, + [<8] + [8..10] + [10..12] + [12..14] + [14..16] + [16..18] + [18..20] + [>20] 'Total AMR en attente', + min(AMR_APS_TS), + max(AMR_APS_TS), + [<8], + [8..10], + [10..12], + [12..14], + [14..16], + [16..18], + [18..20], + [>20] + FROM ( SELECT DISTINCT amr.amr_row_guid, + amr.amr_aps_monitor_table, + amt.amt_table_name, + CASE + WHEN amr.amr_aps_ts < @Today + ' 08:00' THEN '<8' + WHEN amr.amr_aps_ts < @Today + ' 10:00' THEN '8..10' + WHEN amr.amr_aps_ts < @Today + ' 12:00' THEN '10..12' + WHEN amr.amr_aps_ts < @Today + ' 14:00' THEN '12..14' + WHEN amr.amr_aps_ts < @Today + ' 16:00' THEN '14..16' + WHEN amr.amr_aps_ts < @Today + ' 18:00' THEN '16..18' + WHEN amr.amr_aps_ts < @Today + ' 20:00' THEN '18..20' + ELSE '>20' END 'AMR_Period' + FROM [Arizona].[dbo].aps_monitor_row amr (nolock) + JOIN [Arizona].[dbo].aps_monitor_table amt (nolock) + ON aps_monitor_table_id = amr_aps_monitor_table + AND AMT_monitoring_type > 1 + AND AMT_vertical_synchronization = 1 + JOIN #aps_monitor_table_MAG amtM + ON amtM.amt_table_name = amt.amt_table_name + WHERE amr.amr_extraction_timestamp is null) AS SourceTable + PIVOT ( count(amr_row_guid) + FOR AMR_Period in ([<8], [8..10], [10..12], [12..14], [14..16], [16..18], [18..20], [>20])) AS PivotTable + JOIN [Arizona].[dbo].aps_monitor_row amr (nolock) + ON amr.amr_aps_monitor_table = PivotTable.amr_aps_monitor_table + AND amr_extraction_timestamp is null + GROUP BY PivotTable.amt_table_name, + [<8], + [8..10], + [10..12], + [12..14], + [14..16], + [16..18], + [18..20], + [>20] + ORDER BY [<8] + [8..10] + [10..12] + [12..14] + [14..16] + [16..18] + [18..20] + [>20] desc, + PivotTable.amt_table_name; + + SELECT @current_max = MAX(AMR_count) FROM @aps_monitor_row_CENTRAL + SELECT @amr_count_total = SUM(AMR_count) FROM @aps_monitor_row_CENTRAL + + /* DROP Temp table */ + IF EXISTS (select 1 from tempdb.dbo.sysobjects o where o.xtype in ('U') and o.id = object_id(N'tempdb..#aps_monitor_table_MAG')) + BEGIN + DROP TABLE #aps_monitor_table_MAG + END + + /* bloc alertes mail normal */ + IF @current_max >= @niveau_alerte_AMR AND @current_max < @niveau_alerte_AMR_Med + BEGIN + + SELECT @AMT_table_name_LEN = 2 + max(len(AMT_table_name)) + FROM @aps_monitor_row_CENTRAL; + SELECT @Result_as_string + = '' + convert(char(10), 'Nb_AMR') + left(convert(char(100), 'Table'), @AMT_table_name_LEN) + + convert(char(10), '<8h') + convert(char(10), '8h-10h') + convert(char(10), '10h-12h') + + convert(char(10), '12h-14h') + convert(char(10), '14h-16h') + convert(char(10), '16h-18h') + + convert(char(10), '18h-20h') + convert(char(10), '>20h') + convert(char(18), 'MIN amr_aps_ts') + + convert(char(18), 'MAX amr_aps_ts') + + ' + ------------------------------------------------------------------------------------------------------------------------------------------------- + ' ; + SELECT @Result_as_string + = @Result_as_string + convert(char(10), AMR_count) + + left(convert(char(100), AMT_table_name), @AMT_table_name_LEN) + convert(char(10), AMR_count_00_08) + + convert(char(10), AMR_count_08_10) + convert(char(10), AMR_count_10_12) + + convert(char(10), AMR_count_12_14) + convert(char(10), AMR_count_14_16) + + convert(char(10), AMR_count_16_18) + convert(char(10), AMR_count_18_20) + + convert(char(10), AMR_count_20_00) + convert(char(18), convert(varchar(16), AMR_APS_TS_min, 121)) + + convert(char(18), convert(varchar(16), AMR_APS_TS_max, 121)) + ' + ' + FROM @aps_monitor_row_CENTRAL + ORDER BY AMR_count desc, + AMT_table_name; + SELECT @Result_as_string + = @Result_as_string + + '------------------------------------------------------------------------------------------------------------------------------------------------- + ' ; + SET @message + = 'AMR en attente de synchronisation verticale, et synchronisation ensuite par la connectique ! + + ' + @Result_as_string; + EXEC [Arizona].[dbo].aps_Send_Mail_with_template @in_param_varchar_2 = @email, + @in_param_varchar_3 = @message, + @in_job_type = 0; + END + + /* bloc alertes mail prioritaire */ + IF @current_max >= @niveau_alerte_AMR_Med + or @amr_count_total >= @amr_count_total_limit + BEGIN + + SELECT @AMT_table_name_LEN = 2 + max(len(AMT_table_name)) + FROM @aps_monitor_row_CENTRAL; + SELECT @Result_as_string + = '' + convert(char(10), 'Nb_AMR') + left(convert(char(100), 'Table'), @AMT_table_name_LEN) + + convert(char(10), '<8h') + convert(char(10), '8h-10h') + convert(char(10), '10h-12h') + + convert(char(10), '12h-14h') + convert(char(10), '14h-16h') + convert(char(10), '16h-18h') + + convert(char(10), '18h-20h') + convert(char(10), '>20h') + convert(char(18), 'MIN amr_aps_ts') + + convert(char(18), 'MAX amr_aps_ts') + + ' + ------------------------------------------------------------------------------------------------------------------------------------------------- + ' ; + SELECT @Result_as_string + = @Result_as_string + convert(char(10), AMR_count) + + left(convert(char(100), AMT_table_name), @AMT_table_name_LEN) + convert(char(10), AMR_count_00_08) + + convert(char(10), AMR_count_08_10) + convert(char(10), AMR_count_10_12) + + convert(char(10), AMR_count_12_14) + convert(char(10), AMR_count_14_16) + + convert(char(10), AMR_count_16_18) + convert(char(10), AMR_count_18_20) + + convert(char(10), AMR_count_20_00) + convert(char(18), convert(varchar(16), AMR_APS_TS_min, 121)) + + convert(char(18), convert(varchar(16), AMR_APS_TS_max, 121)) + ' + ' + FROM @aps_monitor_row_CENTRAL + ORDER BY AMR_count desc, + AMT_table_name; + SELECT @Result_as_string + = @Result_as_string + + '------------------------------------------------------------------------------------------------------------------------------------------------- + ' ; + SELECT @message + = 'AMR en attente de synchronisation verticale, et synchronisation ensuite par la connectique ! + + ' + @Result_as_string; + EXEC [Arizona].[dbo].aps_Send_Mail_with_template @in_param_varchar_2 = @email, + @in_param_varchar_3 = @message, + @in_job_type = 3; + END + + IF @Type = 'PROD' + BEGIN + + /* bloc rajouté pour les alertes sms */ + IF @current_max >= @niveau_alerte_AMR_Sup + OR @amr_count_total >= @amr_count_total_limit + BEGIN + + DECLARE @subject varchar(20); + SELECT @subject = 'AMR alert:' + cast(SERVERPROPERTY('machinename') as varchar(20)) + SELECT @AMT_table_name_LEN = 2 + max(len(AMT_table_name)) + FROM @aps_monitor_row_CENTRAL; + SELECT @Result_as_string = 'Total ' + convert(varchar(10), @amr_count_total); + SELECT TOP 5 @Result_as_string + = @Result_as_string + +CHAR(13) + CHAR(10) + + left(convert(varchar(30), AMT_table_name), @AMT_table_name_LEN) + ' ' + + convert(varchar(10), AMR_count) + '' + FROM @aps_monitor_row_CENTRAL + ORDER BY AMR_count desc, + AMT_table_name; + SELECT @Result_as_string = @Result_as_string; + SELECT @message = left(@Result_as_string, 100); + EXEC [Arizona].[dbo].aps_Send_Mail_with_template @in_param_recipient = @SMSPiket, + @in_param_subject = @subject, + @in_param_message = @message, + @in_job_type = 40; + END + END +END TRY +BEGIN CATCH + SELECT @errno = 70003, + @errmsg = 'Monitoring AMR Central error!' + goto error_99 +END CATCH; + +/*------------------ Retour au programme appelant -----------------*/ + +RETURN(@@error); + +/*---------------------- Traitement des erreurs ----------------------*/ +error_99: + RAISERROR (@errmsg, 16, 1); + RETURN(@errno); + +GO diff --git a/TPDT-268 - ACP in task sequence/dba_storedProcedures/sp_Monitor_PharmIndex_row_changes.sql b/TPDT-268 - ACP in task sequence/dba_storedProcedures/sp_Monitor_PharmIndex_row_changes.sql new file mode 100644 index 0000000..c88c190 --- /dev/null +++ b/TPDT-268 - ACP in task sequence/dba_storedProcedures/sp_Monitor_PharmIndex_row_changes.sql @@ -0,0 +1,145 @@ +USE [HCITools] +GO + +IF EXISTS (SELECT * FROM sys.objects WHERE object_id = OBJECT_ID(N'[dba].[sp_Monitor_PharmIndex_row_changes]') AND type in (N'P', N'PC')) +DROP PROCEDURE [dba].[sp_Monitor_PharmIndex_row_changes] +GO + +USE [HCITools] +GO + +SET ANSI_NULLS ON +GO + +SET QUOTED_IDENTIFIER ON +GO + + +CREATE PROCEDURE [dba].[sp_Monitor_PharmIndex_row_changes] + +AS +/*============================================================================= + + + Monitoring PharmIndex records changes + + Parameters + ---------- + + Creation : 11.05.2021 / RTC + Modification : 16.12.2021 / RTC TFS 67094 Skip on ama, update subsidiary id + 17.03.2022 / FLA : Change DBA mail + +=============================================================================*/ + + +/* Check download from Pharmindex is finished */ + +DECLARE @today datetime, + @pharmIndexOk bit, + @message varchar(max), + @count int, + @subsidiary int, + @customer varchar(5) +SET @pharmIndexOk = 0 +set @count = 210 /* 210 minutes max run time */ +SET @today = convert(datetime, convert(varchar(20), getdate(),102)) + +select top 1 @customer = customer from master.cfg.[Identity] + +/* Avoid running job on AMA */ +if @customer in ('AMA', 'RUEGG') + return + +if @customer = 'AAI' + set @subsidiary = 1000 +if @customer = 'SUN' + SET @subsidiary = 100 + + if exists (select top 1 * from [PharmIndexTP].dbo.BatchImportHistory bih where bih.Success = 1 and bih.EndImportDate > @today) /* Download OK */ + set @pharmIndexOk = 1; + + /* WAIT UNTIL PHARMINDEX HAS FINISHED */ +while (@pharmIndexOk = 0 and @count <> 0) +begin +/* WAIT 5 SECONDS */ + WAITFOR DELAY '00:01:00' + select @count = @Count -1; + + /* BREAK LOOP IF PHarmIndex Download OK */ + if exists (select top 1 * from [PharmIndexTP].dbo.BatchImportHistory bih where bih.Success = 1 and bih.EndImportDate > @today) + set @pharmIndexOk = 1; + +end + +/* Exit job if Pharmindex not ready at 19h30 */ +if (@count = 0) +begin + select @message = 'PharmIndex still not ready : Exit job monitor amr PharmIndex' + exec aps_Send_Mail_with_template + @in_param_varchar_2 = 'DBA_operator;HCI_Consultants_pharmINDEX', + @in_param_varchar_3 = @message, + @in_job_type = 3 /* 0:sans template; 1/NULL:echec; 2:succes; 3:warning; 4:message*/ + return + end +/*------------- + Lancer le traitement PharmIndex avec Job_type = 10 + Job_type = 10 indique Check Only : GBA +---------------*/ + + +declare @out_param_int_1 int + +execute PharmIndexTP.[dbo].[pdx_loading] + @in_job_type = 10 + ,@skip_mapping = 0 + ,@in_subsidiary = @subsidiary + ,@in_table_name = null + ,@in_debug = 0 + ,@out_param_int_1 = @out_param_int_1 output + +/* Récupération du résultat 0?Check Only' qui vient de tourner + afin de controler que le traitement pourra tout traiter dans la soirée + + Le contrôle est sur les Insert ainsi que les Updates + + ---------------------------*/ + +/* Insert dans une table #TT */ + +select [PLR_execution_date] + ,[PLR_table_name] + ,[PLR_load_sequence] + ,[PLR_limit_insert] + ,[PLR_check_to_insert] + ,[PLR_limit_update] + ,[PLR_check_to_update] + ,[PLR_limit_delete] + ,[PLR_check_to_delete] + ,[PLR_check_only], + ROW_NUMBER() OVER( partition by plr_table_name order BY plr_execution_date desc) as RowNumber + into #TT_result + from [PharmIndexTP].[dbo].[pdx_loading_result] + where [PLR_check_only] = 1 + and ([PLR_check_to_insert] > [PLR_limit_insert] + or [PLR_check_to_update] > [PLR_limit_update] + ) + + order by [PLR_load_sequence], plr_execution_date + +/* Ne tient compte que du dernier traitement */ + +select * from #TT_result where Rownumber = 1 order by [PLR_load_sequence] +select @message = 'Table Name Sequence Limit_insert Check Insert Limit_update Check_update Limit_delete Check_delete' + char(13) +select @message = @message + PLR_table_name + ' ' + convert(char(9), isnull(PLR_Load_sequence,'')) + + convert(char(9), isnull(PLR_limit_insert,'')) + convert(char(9), isnull(PLR_check_to_insert, '')) + + convert(char(9), isnull(PLR_limit_update, '') ) + convert(char(9), isnull(PLR_check_to_update,'') ) + + convert(char(9), isnull(PLR_check_to_delete,'') ) + char(13) + from #TT_result where Rownumber = 1 order by [PLR_load_sequence] +exec aps_Send_Mail_with_template + @in_param_varchar_2 = 'DBA_operator;HCI_Consultants_pharmINDEX', + @in_param_varchar_3 = @message, + @in_job_type = 4 /* 0:sans template; 1/NULL:echec; 2:succes; 3:warning; 4:message*/ + +drop table #TT_result + diff --git a/TPDT-268 - ACP in task sequence/dba_storedProcedures/sp_audit_login.sql b/TPDT-268 - ACP in task sequence/dba_storedProcedures/sp_audit_login.sql new file mode 100644 index 0000000..042ad15 --- /dev/null +++ b/TPDT-268 - ACP in task sequence/dba_storedProcedures/sp_audit_login.sql @@ -0,0 +1,144 @@ +USE [HCITools] +GO + +IF EXISTS (SELECT * FROM sys.objects o JOIN sys.schemas s ON o.schema_id = s.schema_id WHERE o.name = 'sp_audit_login' AND OBJECTPROPERTY(object_id,N'IsProcedure') = 1 AND s.name = 'dba') + DROP PROCEDURE [dba].[sp_audit_login] +GO + +SET ANSI_NULLS ON +GO + +SET QUOTED_IDENTIFIER ON +GO + + + +CREATE PROCEDURE [dba].[sp_audit_login] + @in_ApplicationName NVARCHAR(255), + @in_client_process_id INT, + @in_host_name NVARCHAR(255), + @in_login_name NVARCHAR(255), + @in_NT_domain_name NVARCHAR(255), + @in_NT_user_name NVARCHAR(255), + @in_session_login_name NVARCHAR(255), + @in_spid INT, + @in_event_time NVARCHAR(255), + @in_audit_login_text TINYINT, + @in_text_data NVARCHAR(MAX) + +AS +/*============================================================================= + + Explication du traitement realise par la SP + ------------------------------------------- + Cette SP permets de faire le lien entre l'alerte WMI [Audit login] et la table de logs [HCITools].[dba].[Audit_login]. + Tous les événements de connexions comportant des problèmes sont enregistrés. + + Parametres + ---------- + + Creation : 27.02.2019 / SPE + + Modifications : + + +=============================================================================*/ + +SET NOCOUNT ON; + +/*------------------- Declaration des variables --------------------*/ +DECLARE @errno int, + @errmsg varchar(255) + +/*-------------------------- Vérifications des variables d'entrée ---------------------------*/ +IF @in_ApplicationName is null +BEGIN + SELECT @errno = 70003, + @errmsg = 'You must provide the parameter @in_ApplicationName!' + goto error_99 +END + +IF @in_client_process_id is null +BEGIN + SELECT @errno = 70003, + @errmsg = 'You must provide the parameter @in_client_process_id!' + goto error_99 +END + +IF @in_host_name is null +BEGIN + SELECT @errno = 70003, + @errmsg = 'You must provide the parameter @in_host_name!' + goto error_99 +END + +IF @in_spid is null +BEGIN + SELECT @errno = 70003, + @errmsg = 'You must provide the parameter @in_spid!' + goto error_99 +END + +IF @in_event_time is null +BEGIN + SELECT @errno = 70003, + @errmsg = 'You must provide the parameter @in_event_time!' + goto error_99 +END + +/*------------ Affectation des parametres aux variables ------------*/ + +SET @in_event_time = substring(@in_event_time,0,5) + '-' + substring(@in_event_time,5,2) + '-' + substring(@in_event_time,7,2) + ' ' + substring(@in_event_time,9,2) + ':' + substring(@in_event_time,11,2) + ':' + substring(@in_event_time,13,2) + +/*-------------------------- Traitement ---------------------------*/ +BEGIN TRY + + /* Check if ID is missing on text table */ + IF NOT EXISTS(SELECT 1 FROM dba.Audit_login_text WHERE Audit_login_text_ID = @in_audit_login_text) + BEGIN + INSERT INTO dba.Audit_login_text(Audit_login_text_ID,ALT_text,ALT_short_text,ALT_level) + VALUES (@in_audit_login_text,'Unknown','Unknown',2) + END + + INSERT INTO [dba].[audit_login] ( + [AL_application_name], + [AL_client_process_id], + [AL_host_name], + [AL_login_name], + [AL_NT_domain_name], + [AL_NT_user_name], + [AL_session_login_name], + [AL_spid], + [AL_event_time], + [AL_audit_login_text_id], + [AL_text_data]) + + VALUES (@in_ApplicationName, + @in_client_process_id, + @in_host_name, + @in_login_name, + @in_NT_domain_name, + @in_NT_user_name, + @in_session_login_name, + @in_spid, + @in_event_time, + @in_audit_login_text, + @in_text_data) + +END TRY +BEGIN CATCH + SELECT @errno = 70003, + @errmsg = 'Audit login INSERT error!' + goto error_99 +END CATCH; + +/*------------------ Retour au programme appelant -----------------*/ + +RETURN(@@error); + +/*---------------------- Traitement des erreurs ----------------------*/ +error_99: + RAISERROR (@errmsg, 16, 1); + RETURN(@errno); + +GO diff --git a/TPDT-268 - ACP in task sequence/dba_storedProcedures/sp_audit_login_control.sql b/TPDT-268 - ACP in task sequence/dba_storedProcedures/sp_audit_login_control.sql new file mode 100644 index 0000000..ff962db --- /dev/null +++ b/TPDT-268 - ACP in task sequence/dba_storedProcedures/sp_audit_login_control.sql @@ -0,0 +1,371 @@ +USE [HCITools] +GO + +IF EXISTS (SELECT * FROM sys.objects o JOIN sys.schemas s ON o.schema_id = s.schema_id WHERE o.name = 'sp_audit_login_control' AND OBJECTPROPERTY(object_id,N'IsProcedure') = 1 AND s.name = 'dba') + DROP PROCEDURE [dba].[sp_audit_login_control] +GO + +SET ANSI_NULLS ON +GO + +SET QUOTED_IDENTIFIER ON +GO + + + + + +CREATE PROCEDURE [dba].[sp_audit_login_control] + +AS +/*============================================================================= + + Explication du traitement realise par la SP + ------------------------------------------- + Cette SP est exécutée toute les 5 minutes et check l'état de l'audit des connexions utilisateurs. + Selon le type de problème et le nombre, un mail est envoyé. Si cela est un cas urgent, une alerte SMS est envoyée. + + 1 : COUNT TOTAL ALERTS LAST 5 / 60 MIN + 2 : RETRIEVE FORMAT AND OU CODE + 3 : SEND MAIL & SMS ALERTS + + Parametres + ---------- + + Creation : 27.02.2019 / SPE + + Modifications : + 03.02.2020 / LPE : modify sqlMonDBACalendar password + 27.10.2020 / RTC : Migrate DBACC to HCIMON + 09.02.2021 / SPE : #TFS62610# - Update all mail configurations to avoid SPAM + 16.08.2021 / SPE : Replace hardcoded password in sp and scripts + 17.03.2022 / FLA : Change DBA mail + 17.08.2023 / SPE : OCTPDBA-726: Replace mail profile name APSSQL_MAIL_PROFILE into AzureManagedInstance_dbmail_profile to be SQL managed instances compatible +=============================================================================*/ + +SET NOCOUNT ON; + +/*------------------- Declaration des variables --------------------*/ +DECLARE @errno int, + @cvCurrentOrganizationalUnit int, + @subsidiary_id int, + @totalCount int, + @totalCountPiket int, + @total int, + @querywidth int, + @html nvarchar(max), + @queryDetails nvarchar(max), + @errmsg varchar(255), + @category varchar(255), + @event varchar(255), + @email varchar(255), + @piket varchar(255), + @attachFileName varchar(255), + @subject varchar(255), + @Audit_login_ID varchar(60), + @out_default_value varchar(60), + @format varchar(60), + @mailImportance varchar(6), + @ou varchar(3), + @queryseparator varchar(3), + @attachFile bit, + @queryheader bit, + @querynopadding bit + + + + +/*------------ Affectation des parametres aux variables ------------*/ + +SET @cvCurrentOrganizationalUnit = null +SET @subsidiary_id = null +SET @attachFileName = null +SET @queryheader = 1 +SET @querywidth = 600 +SET @queryseparator = ',' +SET @querynopadding = 1 +SET @attachFile = 1 +SET @mailImportance = 'Normal' +SET @html = '' +SET @ou = '' +SET @Audit_login_ID = '[sep=,' + CHAR(13) + CHAR(10) + 'ID]' +SET @queryDetails = 'SET NOCOUNT ON; SELECT Audit_login_ID AS '+@Audit_login_ID+', AL_application_name as [Application], AL_client_process_id as [Client PID], AL_host_name as [Hostname], AL_login_name as [SQL login], AL_NT_domain_name as [NT Domain], AL_NT_user_name as [NT Login], AL_session_login_name as [Session Login], AL_spid as [SPID], AL_event_time as [Event time], AL_text_data as [Message], ALT_text as [Category], ALT_level as [Critical] + FROM hcitools.dba.Audit_login AL + JOIN hcitools.dba.Audit_login_text ALT ON ALT.Audit_login_text_ID = AL.AL_audit_login_text_id +WHERE AL.AL_event_time > dateadd(minute, -5, GetDate())' + + + +/*-------------------------- Traitement ---------------------------*/ +BEGIN TRY + +/* ------------------------------------------------------------------------------------------------------------------------------------- */ +/* \\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\ 1 : COUNT TOTAL ALERTS LAST 5 / 10 MIN //////////////////////////////////////////// */ +/* ------------------------------------------------------------------------------------------------------------------------------------- */ + + /* COUNT TOTAL ERRORS < 5 MIN */ + SELECT @totalCount = count(*) + FROM hcitools.dba.audit_login AL + JOIN hcitools.dba.audit_login_text ALT ON ALT.audit_login_text_ID = AL.AL_audit_login_text_id + WHERE AL.AL_event_time > dateadd(minute, -5, GetDate()) + + /* COUNT TOTAL ERRORS < 60 MIN ONLY CRITICAL ONE */ + SELECT @totalCountPiket = count(*) + FROM hcitools.dba.audit_login AL + JOIN hcitools.dba.audit_login_text ALT ON ALT.audit_login_text_ID = AL.AL_audit_login_text_id + WHERE AL.AL_event_time > dateadd(hour, -1, GetDate()) AND ALT.ALT_level = 1 + + /* More than 5 in normal mode or 30 for piket alert */ + IF ((@totalCount >= 5) or (@totalCountPiket >= 30)) + BEGIN + + + +/* ------------------------------------------------------------------------------------------------------------------------------------- */ +/* \\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\ 2 : RETRIEVE FORMAT AND OU CODE /////////////////////////////////////////////////// */ +/* ------------------------------------------------------------------------------------------------------------------------------------- */ + + IF EXISTS(SELECT 1 FROM [master].[cfg].[InstanceContext] WHERE Business = 'TPPHAR') + BEGIN + /* Get the cvCurrentOrganizationalUnit */ + EXEC arizona.dbo.sp_bmc_Bmc_Applic_Default + @in_job_type = 3, + @in_param_int_1 = null, + @in_param_int_2 = null, + @in_param_varchar_1 = 'cvCurrentOrganizationalUnit', + @out_default_value = @out_default_value OUTPUT, + @out_param_int_1 = null; + + SELECT @cvCurrentOrganizationalUnit = convert(int,@out_default_value); + + /* Check if we have a value, if not leave this SP */ + IF @cvCurrentOrganizationalUnit is null + BEGIN + SELECT @errno = 70001, + @errmsg = '(APS) Error cvCurrentOrganizationalUnit does not exist!'; + goto error_99; + END + + /* Get the subsidiary id and OU code */ + SELECT @subsidiary_id = ou.OU_subsidiary, @ou = ou.OU_Code + FROM arizona.dbo.Organizational_unit ou with (nolock) + WHERE ou.Organizational_unit_ID = @cvCurrentOrganizationalUnit; + + /* Check if we have a value, if not leave this SP */ + IF @subsidiary_id is null + BEGIN + SELECT @errno = 70001, + @errmsg = '(APS) Error subsidiary_id does not exist!'; + goto error_99; + END + + /* Get the current format */ + SELECT @format = sub.SUB_code + FROM arizona.dbo.Subsidiary sub with (nolock) + WHERE sub.Subsidiary_ID = @subsidiary_id; + + /* Check if we have a value, if not leave this SP */ + IF @format is null + BEGIN + SELECT @errno = 70001, + @errmsg = '(APS) Error format does not exist!'; + goto error_99; + END + + /* Change the value into a compatible format */ + IF @format = 'COOP' + BEGIN + SET @format = 'CVI' + END + + IF @format = 'CENT' + BEGIN + SET @format = 'SUN' + END + + IF @format = '000' + BEGIN + SET @format = 'AAI' + END + END + ELSE + BEGIN + SELECT @format = DnsAlias FROM [master].[cfg].[Identity] + END + + + +/* ------------------------------------------------------------------------------------------------------------------------------------- */ +/* \\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\ 3 : SEND MAIL & SMS ALERTS //////////////////////////////////////////////////////// */ +/* ------------------------------------------------------------------------------------------------------------------------------------- */ + /* Get default mailbox profile name */ + DECLARE @defaultprofilname varchar(100) + SELECT DISTINCT @defaultprofilname = p.name FROM msdb.dbo.sysmail_profile p JOIN msdb.dbo.sysmail_principalprofile pp ON pp.profile_id = p.profile_id AND pp.is_default = 1 + + /* SET Mail & Picket list */ + SELECT @email = DML_Recipients + FROM HCITools.dbo.DBA_Mailing_list + WHERE DML_Code = 'DBA_operator' + + IF @totalCount >= 5 + BEGIN + + /* Set export file name */ + SET @attachFileName = @format+@ou+'_AuditLogin.csv' + SET @html = 'Pharmacy: '+@format+@ou+'
List of all login events for the last 5 minutes: '+convert(varchar,@totalCount)+'


'+@Title+'

' + + DECLARE c_events CURSOR LOCAL FORWARD_ONLY STATIC FOR + SELECT count(*) as 'Total', ALT.ALT_text as 'Event type' + FROM hcitools.dba.audit_login AL + JOIN hcitools.dba.audit_login_text ALT ON ALT.audit_login_text_ID = AL.AL_audit_login_text_id + WHERE AL.AL_event_time > dateadd(minute, -5, GetDate()) + GROUP BY ALT.ALT_text + ORDER BY count(*) DESC + ; + OPEN c_events + ; + FETCH NEXT FROM c_events + INTO @total,@event + ; + WHILE @@fetch_status = 0 + BEGIN + + SET @html = @html + ' + + ' + + FETCH NEXT FROM c_events + INTO @total,@event + ; + END + ; + CLOSE c_events + ; + DEALLOCATE c_events + + SET @html = @html + '
'+convert(varchar,@total)+' '+@event+'
' + SET @subject = @format+@ou+': Audit Login Alert - [' + @@SERVERNAME + ']' + + /* SEND MAIL */ + EXEC msdb.dbo.sp_send_dbmail + @profile_name = @defaultprofilname, + @recipients = @email, + @body = @html, + @importance = @mailImportance, + @subject = @subject, + @body_format = 'HTML', + @query = @queryDetails, + @query_attachment_filename = @attachFileName, + @attach_query_result_as_file = @attachFile, + @query_result_header = @queryheader, + @query_result_width = @querywidth, + @query_result_separator = @queryseparator, + @query_result_no_padding = @querynopadding; + END + + /* More than 30 events -> Send SMS */ + IF @totalCountPiket >= 30 + BEGIN + + /* Check if already send this alert */ + IF NOT EXISTS(SELECT 1 FROM hcitools.dba.audit_login_history WHERE ALH_create_date > dateadd(hour, -1, GetDate())) + BEGIN + + SET @piket = @email + + SELECT @piket = @piket /* +';' +ORS.DML_Recipients + FROM OPENROWSET('SQLNCLI', 'DRIVER={SQL Server};SERVER=SWTPMON01.centralinfra.net;UID=sqlMonDBACalendar;PWD=', + 'SELECT DML.DML_Recipients + FROM HCITools.[mon].[SMSCalendar] SC + INNER JOIN HCITools.[mon].[SMSCalendarDBAMailingListLink] SCDMLL + ON SC.SMSCalendarID = SCDMLL.SCDMLLCalendarID + INNER JOIN HCITools.dbo.DBA_Mailing_list DML + ON DML.DBA_Mailing_list_ID = SCDMLL.SCDMLLDBAMailingListID + WHERE GETDATE() BETWEEN SC.SCStartDate AND SC.SCEndDate') as ORS */ + + SET @email = @piket + SET @queryDetails = null + SET @attachFile = 0 + SET @attachFileName = null + SET @queryheader = 0 + SET @querywidth = null + SET @queryseparator = 0 + SET @querynopadding = null + SET @mailImportance = 'High' + SET @html = 'Pharmacy: '+@format+@ou+' - Total events (last hour): '+convert(varchar,@totalCountPiket)+'
' + + DECLARE c_events CURSOR LOCAL FORWARD_ONLY STATIC FOR + SELECT count(*) as 'Total', ALT.ALT_short_text as 'Event type' + FROM hcitools.dba.audit_login AL + JOIN hcitools.dba.audit_login_text ALT ON ALT.audit_login_text_ID = AL.AL_audit_login_text_id + WHERE AL.AL_event_time > dateadd(minute, -60, GetDate()) + GROUP BY ALT.ALT_short_text + ORDER BY count(*) DESC + ; + OPEN c_events + ; + FETCH NEXT FROM c_events + INTO @total,@event + ; + WHILE @@fetch_status = 0 + BEGIN + + SET @html = @html + ' + + ' + + FETCH NEXT FROM c_events + INTO @total,@event + ; + END + ; + CLOSE c_events + ; + DEALLOCATE c_events + + SET @html = @html + '
'+convert(varchar,@total)+' '+@event+'
' + SET @subject = '[' + @@SERVERNAME + '] - ' + @format+@ou+': CRITICAL Audit Login Alert' + + /* SEND MAIL PIKET */ + EXEC msdb.dbo.sp_send_dbmail + @profile_name = @defaultprofilname, + @recipients = @email, + @body = @html, + @importance = @mailImportance, + @subject = @subject, + @body_format = 'HTML', + @query = @queryDetails, + @query_attachment_filename = @attachFileName, + @attach_query_result_as_file = @attachFile, + @query_result_header = @queryheader, + @query_result_width = @querywidth, + @query_result_separator = @queryseparator, + @query_result_no_padding = @querynopadding; + + /* INSERT History into Security_audit_history table */ + INSERT INTO hcitools.dba.audit_login_history(ALH_create_date,ALH_total_count) + SELECT SYSDATETIME(),@totalCountPiket + + END + END + END +END TRY +BEGIN CATCH + SELECT @errno = 70003, + @errmsg = 'error on sp_audit_login_control!' + goto error_99 +END CATCH; + +/*------------------ Retour au programme appelant -----------------*/ + +RETURN(@@error); + +/*---------------------- Traitement des erreurs ----------------------*/ +error_99: + RAISERROR (@errmsg, 16, 1); + RETURN(@errno); + + +GO + + diff --git a/TPDT-268 - ACP in task sequence/dba_storedProcedures/sp_ddl_alerts.sql b/TPDT-268 - ACP in task sequence/dba_storedProcedures/sp_ddl_alerts.sql new file mode 100644 index 0000000..e67f4ac --- /dev/null +++ b/TPDT-268 - ACP in task sequence/dba_storedProcedures/sp_ddl_alerts.sql @@ -0,0 +1,275 @@ +USE [HCITools] +GO + +IF EXISTS (SELECT * FROM sys.objects o JOIN sys.schemas s ON o.schema_id = s.schema_id WHERE o.name = 'sp_ddl_alerts' AND OBJECTPROPERTY(object_id,N'IsProcedure') = 1 AND s.name = 'dba') + DROP PROCEDURE [dba].[sp_ddl_alerts] +GO + +SET ANSI_NULLS ON +GO + +SET QUOTED_IDENTIFIER ON +GO + + + + + +CREATE PROCEDURE [dba].[sp_ddl_alerts] + +AS +/*============================================================================= + + Explication du traitement realise par la SP + ------------------------------------------- + Cette SP est exécutée toute les jours et check les modifications sur les paramètres des bases. + Les résultats sont envoyés par mail + + Parametres + ---------- + + Creation : 22.08.2019 / SPE + + Modifications : 06.09.19 / SPE : SQL 2014 compatibility modifications + 27.09.19 / SPE : Temporary remove trustworth check + 09.02.21 / SPE : #TFS62610# - Update all mail configurations to avoid SPAM + 17.03.22 - FLA : Change DBA mail + 17.08.23 / SPE : OCTPDBA-726: Replace mail profile name APSSQL_MAIL_PROFILE into AzureManagedInstance_dbmail_profile to be SQL managed instances compatible + +=============================================================================*/ + +SET NOCOUNT ON; + +/*------------------- Declaration des variables --------------------*/ + + DECLARE @errno int, + @cvCurrentOrganizationalUnit int, + @subsidiary_id int, + @totAlerts int, + @totDDL int, + @html nvarchar(max), + @errmsg varchar(255), + @email varchar(255), + @subject varchar(255), + @out_default_value varchar(60), + @format varchar(60), + @mailImportance varchar(6), + @ou varchar(3) + + + +/*-------------------------- Traitement ---------------------------*/ +BEGIN TRY + +/* ------------------------------------------------------------------------------------------------------------------------------------- */ +/* \\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\ 1 : RETRIEVE FORMAT AND OU CODE /////////////////////////////////////////////////// */ +/* ------------------------------------------------------------------------------------------------------------------------------------- */ + + IF EXISTS(SELECT 1 FROM [master].[cfg].[InstanceContext] WHERE Business = 'TPPHAR') + BEGIN + /* Get the cvCurrentOrganizationalUnit */ + EXEC arizona.dbo.sp_bmc_Bmc_Applic_Default + @in_job_type = 3, + @in_param_int_1 = null, + @in_param_int_2 = null, + @in_param_varchar_1 = 'cvCurrentOrganizationalUnit', + @out_default_value = @out_default_value OUTPUT, + @out_param_int_1 = null; + + SELECT @cvCurrentOrganizationalUnit = convert(int,@out_default_value); + + /* Check if we have a value, if not leave this SP */ + IF @cvCurrentOrganizationalUnit is null + BEGIN + SELECT @errno = 70001, + @errmsg = '(APS) Error cvCurrentOrganizationalUnit does not exist!'; + goto error_99; + END + + /* Get the subsidiary id and OU code */ + SELECT @subsidiary_id = ou.OU_subsidiary, @ou = ou.OU_Code + FROM arizona.dbo.Organizational_unit ou with (nolock) + WHERE ou.Organizational_unit_ID = @cvCurrentOrganizationalUnit; + + /* Check if we have a value, if not leave this SP */ + IF @subsidiary_id is null + BEGIN + SELECT @errno = 70001, + @errmsg = '(APS) Error subsidiary_id does not exist!'; + goto error_99; + END + + /* Get the current format */ + SELECT @format = sub.SUB_code + FROM arizona.dbo.Subsidiary sub with (nolock) + WHERE sub.Subsidiary_ID = @subsidiary_id; + + /* Check if we have a value, if not leave this SP */ + IF @format is null + BEGIN + SELECT @errno = 70001, + @errmsg = '(APS) Error format does not exist!'; + goto error_99; + END + + /* Change the value into a compatible format */ + IF @format = 'COOP' + BEGIN + SET @format = 'CVI' + END + + IF @format = 'CENT' + BEGIN + SET @format = 'SUN' + END + + IF @format = '000' + BEGIN + SET @format = 'AAI' + END + END + ELSE + BEGIN + SELECT @format = DnsAlias FROM [master].[cfg].[Identity] + SET @ou = '' + END + + +/* ------------------------------------------------------------------------------------------------------------------------------------- */ +/* \\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\ 2 : RETRIEVE DDL EVENTS /////////////////////////////////////////////////// */ +/* ------------------------------------------------------------------------------------------------------------------------------------- */ + + /* Temp table #AlterRules with alerts template */ + CREATE TABLE #AlterRules(AlertRule varchar(100)) + + /* Template with all DO NOT settings */ + INSERT INTO #AlterRules(AlertRule) + VALUES ('AUTO_CLOSE ON'),('AUTO_CREATE_STATISTICS OFF'),('AUTO_SHRINK ON'),('ALLOW_SNAPSHOT_ISOLATION ON'),('ANSI_NULL_DEFAULT OFF'),('ANSI_NULL OFF'),('ANSI_PADDING ON'), + ('ANSI_WARNINGS ON'),('ARITHABORT OFF'),('CONCAT_NULL_YIELDS_NULL OFF'),('DB_CHAINING ON'),('DATE_CORRELATION_OPTIMIZATION ON'),('READ_COMMITTED_SNAPSHOT ON'),('NUMERIC_ROUNDABORT OFF'), + ('PARAMETERIZATION FORCED'),('QUOTED_IDENTIFIER OFF'),('RECURSIVE_TRIGGERS ON'),('TRUSTWORTHY ON'),('PAGE_VERIFY NONE'),('PAGE_VERIFY TORN_PAGE_DETECTION'),('ENCRYPTION ON') + + /* Insert into #DDLAlertLog temp table all DDL events of type alter database for the last 24 hours */ + SELECT DA_App_Name, + DA_Host_Name, + DA_Event_Xml.value('(./EVENT_INSTANCE/PostTime)[1]','NVARCHAR(MAX)') AS PostTime, + DA_Event_Xml.value('(./EVENT_INSTANCE/SPID)[1]','NVARCHAR(MAX)') AS SPID, + DA_Event_Xml.value('(./EVENT_INSTANCE/ServerName)[1]','NVARCHAR(MAX)') AS ServerName, + DA_Event_Xml.value('(./EVENT_INSTANCE/LoginName)[1]','NVARCHAR(MAX)') AS LoginName, + DA_Event_Xml.value('(./EVENT_INSTANCE/UserName)[1]','NVARCHAR(MAX)') AS UserName, + DA_Event_Xml.value('(./EVENT_INSTANCE/DatabaseName)[1]','NVARCHAR(MAX)') AS DatabaseName, + DA_Event_Xml.value('(./EVENT_INSTANCE/SchemaName)[1]','NVARCHAR(MAX)') AS SchemaName, + DA_Event_Xml.value('(./EVENT_INSTANCE/ObjectName)[1]','NVARCHAR(MAX)') AS ObjectName, + DA_Event_Xml.value('(./EVENT_INSTANCE/ObjectType)[1]','NVARCHAR(MAX)') AS ObjectType, + DA_Event_Xml.value('(./EVENT_INSTANCE/TSQLCommand/CommandText)[1]','NVARCHAR(MAX)') AS CommandText, + REPLACE(REPLACE(REPLACE(SUBSTRING(LTRIM(RTRIM(REPLACE(REPLACE(REPLACE(REPLACE(DA_Event_Xml.value('(./EVENT_INSTANCE/TSQLCommand/CommandText)[1]','NVARCHAR(MAX)'), CHAR(10), CHAR(32)),CHAR(13), CHAR(32)),CHAR(160), CHAR(32)),CHAR(9),CHAR(32)))), CHARINDEX('SET', REPLACE(DA_Event_Xml.value('(./EVENT_INSTANCE/TSQLCommand/CommandText)[1]','NVARCHAR(MAX)'),' ','')) + 6, LEN(REPLACE(DA_Event_Xml.value('(./EVENT_INSTANCE/TSQLCommand/CommandText)[1]','NVARCHAR(MAX)'),' ',''))),'WITHNO_WAIT',''),'WITHROLLBACKIMMEDIATE',''),' ','') AS CommandAction + INTO #DDLAlertLog + FROM [master].[dba].[DDL_audit] + WHERE DA_Event_Xml.value('(./EVENT_INSTANCE/EventType)[1]','NVARCHAR(MAX)') = 'ALTER_DATABASE' + AND DA_Event_Xml.value('(./EVENT_INSTANCE/PostTime)[1]','NVARCHAR(MAX)') > GETDATE()-1 + AND DA_App_Name <> '.Net SqlClient Data Provider' + AND DA_Event_Xml.value('(./EVENT_INSTANCE/TSQLCommand/CommandText)[1]','NVARCHAR(MAX)') not like '%TRUSTWORTHY%' + UNION ALL + SELECT DA_App_Name, + DA_Host_Name, + DA_Event_Xml.value('(./EVENT_INSTANCE/PostTime)[1]','NVARCHAR(MAX)') AS PostTime, + DA_Event_Xml.value('(./EVENT_INSTANCE/SPID)[1]','NVARCHAR(MAX)') AS SPID, + DA_Event_Xml.value('(./EVENT_INSTANCE/ServerName)[1]','NVARCHAR(MAX)') AS ServerName, + DA_Event_Xml.value('(./EVENT_INSTANCE/LoginName)[1]','NVARCHAR(MAX)') AS LoginName, + DA_Event_Xml.value('(./EVENT_INSTANCE/UserName)[1]','NVARCHAR(MAX)') AS UserName, + DA_Event_Xml.value('(./EVENT_INSTANCE/DatabaseName)[1]','NVARCHAR(MAX)') AS DatabaseName, + DA_Event_Xml.value('(./EVENT_INSTANCE/SchemaName)[1]','NVARCHAR(MAX)') AS SchemaName, + DA_Event_Xml.value('(./EVENT_INSTANCE/ObjectName)[1]','NVARCHAR(MAX)') AS ObjectName, + DA_Event_Xml.value('(./EVENT_INSTANCE/ObjectType)[1]','NVARCHAR(MAX)') AS ObjectType, + DA_Event_Xml.value('(./EVENT_INSTANCE/TSQLCommand/CommandText)[1]','NVARCHAR(MAX)') AS CommandText, + '' AS CommandAction + FROM [master].[dba].[DDL_audit] + WHERE DA_Event_Xml.value('(./EVENT_INSTANCE/EventType)[1]','NVARCHAR(MAX)') = 'ALTER_AUTHORIZATION_DATABASE' + AND replace(DA_Event_Xml.value('(./EVENT_INSTANCE/TSQLCommand/CommandText)[1]','NVARCHAR(MAX)'),'[','!') not like '%!sa%' + AND DA_Event_Xml.value('(./EVENT_INSTANCE/PostTime)[1]','NVARCHAR(MAX)') > GETDATE()-1 + AND DA_App_Name <> '.Net SqlClient Data Provider' + ORDER BY DA_App_Name DESC + + +/* ------------------------------------------------------------------------------------------------------------------------------------- */ +/* \\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\ 3 : CREATE AND SEND MAIL /////////////////////////////////////////////////// */ +/* ------------------------------------------------------------------------------------------------------------------------------------- */ + + /* Count total critical alerts and set mail level */ + SELECT @totDDL = COUNT(*) FROM #DDLAlertLog AL + SELECT @totAlerts = COUNT(*) FROM #DDLAlertLog AL LEFT JOIN #AlterRules AR ON AL.CommandAction = replace(AR.AlertRule,' ','') WHERE AR.AlertRule is not null OR AL.CommandText like 'alter authorization%' + IF @totAlerts > 0 + BEGIN + SET @mailImportance = 'High' + END + ELSE + BEGIN + SET @mailImportance = 'Normal' + END + + IF @totDDL > 0 + BEGIN + + SELECT @email = DML_Recipients + FROM HCITools.dbo.DBA_Mailing_list + WHERE DML_Code = 'DBA_operator' + + SET @subject = @format+@ou+': ' + convert(varchar,@totDDL) + ' DDL audit found: Database settings modified! - [' + @@SERVERNAME + ']' + SET @HTML = + N'Server: ' + @format+@ou+'
List of all DDL audit events (ALTER DATABASE) for the last day:

' + + N'' + + CAST(( SELECT CASE WHEN AR.AlertRule is null AND UPPER(AL.CommandText) not like 'ALTER AUTHORIZATION%' THEN 'INFO' ELSE 'CRITICAL' END AS 'td','',AL.DA_App_Name AS 'td','', + DA_Host_Name AS 'td','', + PostTime AS 'td','', + SPID AS 'td','', + ServerName AS 'td','', + isnull(LoginName,'') AS 'td','', + isnull(UserName,'') AS 'td','', + isnull(DatabaseName,'') AS 'td','', + isnull(SchemaName,'') AS 'td','', + isnull(ObjectName,'') AS 'td','', + isnull(ObjectType,'') AS 'td','', + CommandText AS 'td' + FROM #DDLAlertLog AL + LEFT JOIN #AlterRules AR + ON AL.CommandAction = replace(AR.AlertRule,' ','') + FOR XML PATH('tr'), ELEMENTS ) AS NVARCHAR(MAX)) + + N'
AlertLevelApplication NameHost NameModified dateSPIDServer NameLogin NameUser NameDatabase NameSchemaObjectTypeCommand
' ; + + /* Get default mailbox profile name */ + DECLARE @defaultprofilname varchar(100) + SELECT DISTINCT @defaultprofilname = p.name FROM msdb.dbo.sysmail_profile p JOIN msdb.dbo.sysmail_principalprofile pp ON pp.profile_id = p.profile_id AND pp.is_default = 1 + + /* SEND MAIL */ + EXEC msdb.dbo.sp_send_dbmail + @profile_name = @defaultprofilname, + @recipients = @email, + @body = @html, + @importance = @mailImportance, + @subject = @subject, + @body_format = 'HTML'; + END + + /* Drop temp tables */ + DROP TABLE #DDLAlertLog + DROP TABLE #AlterRules + +END TRY +BEGIN CATCH + SELECT @errno = 70003, + @errmsg = 'error on sp_ddl_alerts! ' + error_message() + goto error_99 +END CATCH; + +/*------------------ Retour au programme appelant -----------------*/ + +RETURN(@@error); + +/*---------------------- Traitement des erreurs ----------------------*/ +error_99: + RAISERROR (@errmsg, 16, 1); + RETURN(@errno); + + +GO + + diff --git a/TPDT-268 - ACP in task sequence/dba_storedProcedures/sp_ddl_sysadmin.sql b/TPDT-268 - ACP in task sequence/dba_storedProcedures/sp_ddl_sysadmin.sql new file mode 100644 index 0000000..40835d8 --- /dev/null +++ b/TPDT-268 - ACP in task sequence/dba_storedProcedures/sp_ddl_sysadmin.sql @@ -0,0 +1,224 @@ +USE [HCITools] +GO + +IF EXISTS (SELECT * FROM sys.objects o JOIN sys.schemas s ON o.schema_id = s.schema_id WHERE o.name = 'sp_ddl_sysadmin' AND OBJECTPROPERTY(object_id,N'IsProcedure') = 1 AND s.name = 'dba') + DROP PROCEDURE [dba].[sp_ddl_sysadmin] +GO + +SET ANSI_NULLS ON +GO + +SET QUOTED_IDENTIFIER ON +GO + + + + + +CREATE PROCEDURE [dba].[sp_ddl_sysadmin] + +AS +/*============================================================================= + + Explication du traitement realise par la SP + ------------------------------------------- + Cette SP est exécutée toute les jours et check les modifications sur l'ajout ou la création du un login sysadmin. + Les résultats sont envoyés par mail + + Parametres + ---------- + + Creation : 17.09.2019 / SPE + + Modifications : 21.10.2020 / SPE: Exclude dba login from resultset + 09.02.2021 / SPE : #TFS62610# - Update all mail configurations to avoid SPAM + 17.03.2022 / FLA : Change DBA mail + 17.08.2023 / SPE : OCTPDBA-726: Replace mail profile name APSSQL_MAIL_PROFILE into AzureManagedInstance_dbmail_profile to be SQL managed instances compatible + +=============================================================================*/ + +SET NOCOUNT ON; + +/*------------------- Declaration des variables --------------------*/ + + DECLARE @errno int, + @cvCurrentOrganizationalUnit int, + @subsidiary_id int, + @totAlerts int, + @totDDL int, + @html nvarchar(max), + @errmsg varchar(255), + @email varchar(255), + @subject varchar(255), + @out_default_value varchar(60), + @format varchar(60), + @mailImportance varchar(6), + @ou varchar(3) + + + +/*-------------------------- Traitement ---------------------------*/ +BEGIN TRY + +/* ------------------------------------------------------------------------------------------------------------------------------------- */ +/* \\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\ 1 : RETRIEVE FORMAT AND OU CODE /////////////////////////////////////////////////// */ +/* ------------------------------------------------------------------------------------------------------------------------------------- */ + + IF EXISTS(SELECT 1 FROM [master].[cfg].[InstanceContext] WHERE Business = 'TPPHAR') + BEGIN + /* Get the cvCurrentOrganizationalUnit */ + EXEC arizona.dbo.sp_bmc_Bmc_Applic_Default + @in_job_type = 3, + @in_param_int_1 = null, + @in_param_int_2 = null, + @in_param_varchar_1 = 'cvCurrentOrganizationalUnit', + @out_default_value = @out_default_value OUTPUT, + @out_param_int_1 = null; + + SELECT @cvCurrentOrganizationalUnit = convert(int,@out_default_value); + + /* Check if we have a value, if not leave this SP */ + IF @cvCurrentOrganizationalUnit is null + BEGIN + SELECT @errno = 70001, + @errmsg = '(APS) Error cvCurrentOrganizationalUnit does not exist!'; + goto error_99; + END + + /* Get the subsidiary id and OU code */ + SELECT @subsidiary_id = ou.OU_subsidiary, @ou = ou.OU_Code + FROM arizona.dbo.Organizational_unit ou with (nolock) + WHERE ou.Organizational_unit_ID = @cvCurrentOrganizationalUnit; + + /* Check if we have a value, if not leave this SP */ + IF @subsidiary_id is null + BEGIN + SELECT @errno = 70001, + @errmsg = '(APS) Error subsidiary_id does not exist!'; + goto error_99; + END + + /* Get the current format */ + SELECT @format = sub.SUB_code + FROM arizona.dbo.Subsidiary sub with (nolock) + WHERE sub.Subsidiary_ID = @subsidiary_id; + + /* Check if we have a value, if not leave this SP */ + IF @format is null + BEGIN + SELECT @errno = 70001, + @errmsg = '(APS) Error format does not exist!'; + goto error_99; + END + + /* Change the value into a compatible format */ + IF @format = 'COOP' + BEGIN + SET @format = 'CVI' + END + + IF @format = 'CENT' + BEGIN + SET @format = 'SUN' + END + + IF @format = '000' + BEGIN + SET @format = 'AAI' + END + END + ELSE + BEGIN + SELECT @format = DnsAlias FROM [master].[cfg].[Identity] + SET @ou = '' + END + + +/* ------------------------------------------------------------------------------------------------------------------------------------- */ +/* \\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\ 2 : RETRIEVE DDL EVENTS /////////////////////////////////////////////////// */ +/* ------------------------------------------------------------------------------------------------------------------------------------- */ + + /* Insert into #DDLSysadminLog temp table all DDL events of type LOGIN (SYSADMIN) for the last 24 hours */ + SELECT DA_App_Name, + DA_Host_Name, + DA_Event_Xml.value('(./EVENT_INSTANCE/PostTime)[1]','NVARCHAR(MAX)') AS PostTime, + DA_Event_Xml.value('(./EVENT_INSTANCE/SPID)[1]','NVARCHAR(MAX)') AS SPID, + DA_Event_Xml.value('(./EVENT_INSTANCE/ServerName)[1]','NVARCHAR(MAX)') AS ServerName, + DA_Event_Xml.value('(./EVENT_INSTANCE/LoginName)[1]','NVARCHAR(MAX)') AS LoginName, + DA_Event_Xml.value('(./EVENT_INSTANCE/ObjectName)[1]','NVARCHAR(MAX)') AS ObjectName + INTO #DDLSysadminLog + FROM [master].[dba].[DDL_audit] + WHERE DA_Event_Xml.value('(./EVENT_INSTANCE/ObjectType)[1]','NVARCHAR(MAX)') = 'LOGIN' + AND DA_Event_Xml.value('(./EVENT_INSTANCE/TSQLCommand/CommandText)[1]','NVARCHAR(MAX)') like '%sysadmin%add%' + AND DA_Event_Xml.value('(./EVENT_INSTANCE/PostTime)[1]','NVARCHAR(MAX)') > GETDATE()-1 + AND DA_Event_Xml.value('(./EVENT_INSTANCE/LoginName)[1]','NVARCHAR(MAX)') <> 'dba' + ORDER BY DA_Event_Xml.value('(./EVENT_INSTANCE/PostTime)[1]','NVARCHAR(MAX)') DESC + + +/* ------------------------------------------------------------------------------------------------------------------------------------- */ +/* \\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\ 3 : CREATE AND SEND MAIL /////////////////////////////////////////////////// */ +/* ------------------------------------------------------------------------------------------------------------------------------------- */ + + /* Count total critical alerts and set mail level */ + SELECT @totDDL = COUNT(*) FROM #DDLSysadminLog AL + SET @mailImportance = 'High' + + IF @totDDL > 0 + BEGIN + + SELECT @email = DML_Recipients + FROM HCITools.dbo.DBA_Mailing_list + WHERE DML_Code = 'DBA_operator' + + SET @subject = @format+@ou+': ' + convert(varchar,@totDDL) + ' sysadmin account granted!!! - [' + @@SERVERNAME + ']' + SET @HTML = + N'Server: ' + @format+@ou+'
List of all sysadmin accounts granted for the last day:

' + + N'' + + CAST(( SELECT 'CRITICAL' AS 'td','',AL.DA_App_Name AS 'td','', + DA_Host_Name AS 'td','', + PostTime AS 'td','', + SPID AS 'td','', + ServerName AS 'td','', + isnull(LoginName,'') AS 'td','', + isnull(ObjectName,'') AS 'td','' + FROM #DDLSysadminLog AL + FOR XML PATH('tr'), ELEMENTS ) AS NVARCHAR(MAX)) + + N'
AlertLevelApplication NameHost NameModified dateSPIDServer NameLogin NameObject set as SYSADMIN
' ; + + /* Get default mailbox profile name */ + DECLARE @defaultprofilname varchar(100) + SELECT DISTINCT @defaultprofilname = p.name FROM msdb.dbo.sysmail_profile p JOIN msdb.dbo.sysmail_principalprofile pp ON pp.profile_id = p.profile_id AND pp.is_default = 1 + + /* SEND MAIL */ + EXEC msdb.dbo.sp_send_dbmail + @profile_name = @defaultprofilname, + @recipients = @email, + @body = @html, + @importance = @mailImportance, + @subject = @subject, + @body_format = 'HTML'; + END + + /* Drop temp tables */ + DROP TABLE #DDLSysadminLog + +END TRY +BEGIN CATCH + SELECT @errno = 70003, + @errmsg = 'error on sp_ddl_sysadmin! ' + error_message() + goto error_99 +END CATCH; + +/*------------------ Retour au programme appelant -----------------*/ + +RETURN(@@error); + +/*---------------------- Traitement des erreurs ----------------------*/ +error_99: + RAISERROR (@errmsg, 16, 1); + RETURN(@errno); + + +GO + + diff --git a/TPDT-268 - ACP in task sequence/dba_structure/Aggregate_Stats_SP.sql b/TPDT-268 - ACP in task sequence/dba_structure/Aggregate_Stats_SP.sql new file mode 100644 index 0000000..d162c70 --- /dev/null +++ b/TPDT-268 - ACP in task sequence/dba_structure/Aggregate_Stats_SP.sql @@ -0,0 +1,34 @@ +USE [HCITools] +GO + +SET ANSI_NULLS ON +GO + +SET QUOTED_IDENTIFIER ON +GO + +IF NOT EXISTS (SELECT * FROM sys.objects WHERE object_id = OBJECT_ID(N'[dbo].[Aggregate_Stats_SP]') AND type in (N'U')) +BEGIN +CREATE TABLE [dbo].[Aggregate_Stats_SP]( + [ASS_ServerName] [sysname] NOT NULL, + [ASS_schemaname] [sysname] NOT NULL, + [ASS_databasename] [sysname] NOT NULL, + [ASS_name] [sysname] NULL, + [ASS_type] [nvarchar](60) NULL, + [ASS_execution_count] [bigint] NULL, + [ASS_last_execution_time] [datetime] NULL, + [ASS_total_worker_time] [bigint] NULL, + [ASS_total_physical_reads] [bigint] NULL, + [ASS_total_logical_writes] [bigint] NULL, + [ASS_total_logical_reads] [bigint] NULL, + [ASS_total_elapsed_time] [bigint] NULL, + [ASS_updatedate] [datetime] NULL, + [ASS_restartdate] [datetime] NULL +) ON [PRIMARY] +END +GO + +GRANT SELECT ON [dbo].[Aggregate_Stats_SP] TO [sqlMonPerfUsr] AS [dbo] +GO + + diff --git a/TPDT-268 - ACP in task sequence/dba_structure/Aggregate_Stats_index.sql b/TPDT-268 - ACP in task sequence/dba_structure/Aggregate_Stats_index.sql new file mode 100644 index 0000000..e2808c7 --- /dev/null +++ b/TPDT-268 - ACP in task sequence/dba_structure/Aggregate_Stats_index.sql @@ -0,0 +1,48 @@ +USE [HCITools] +GO + +SET ANSI_NULLS ON +GO + +SET QUOTED_IDENTIFIER ON +GO + +IF EXISTS (SELECT 1 FROM master.cfg.InstanceContext where Business = 'TPCENT') +BEGIN + + IF NOT EXISTS (SELECT 1 + FROM sys.objects o WITH (NOLOCK) + JOIN sys.schemas s WITH (NOLOCK) ON o.schema_id = s.schema_id + WHERE o.name = 'Aggregate_Stats_index' + AND o.type IN (N'U') + AND s.name = 'dbo') + BEGIN + CREATE TABLE [dbo].[Aggregate_Stats_index]( + [ASI_ServerName] [sysname] NOT NULL, + [ASI_schemaname] [sysname] NOT NULL, + [ASI_databasename] [sysname] NOT NULL, + [ASI_tablename] [sysname] NOT NULL, + [ASI_indexname] [sysname] NULL, + [ASI_indextype] [nvarchar](60) NULL, + [ASI_user_seeks] [bigint] NULL, + [ASI_user_scans] [bigint] NULL, + [ASI_user_lookups] [bigint] NULL, + [ASI_user_updates] [bigint] NULL, + [ASI_updatedate] [datetime] NULL, + [ASI_restartdate] [datetime] NULL + ) ON [PRIMARY] + END + + IF NOT EXISTS (SELECT 1 FROM sys.indexes WHERE object_id = OBJECT_ID(N'[dbo].[Aggregate_Stats_index]') AND name = N'IDX_ASI') + BEGIN + CREATE NONCLUSTERED INDEX [IDX_ASI] ON [dbo].[Aggregate_Stats_index] + ( + [ASI_databasename] ASC, + [ASI_tablename] 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 = ON) ON [PRIMARY] + END + +END +GO + + diff --git a/TPDT-268 - ACP in task sequence/dba_structure/All_Stats_SP.sql b/TPDT-268 - ACP in task sequence/dba_structure/All_Stats_SP.sql new file mode 100644 index 0000000..e62cfde --- /dev/null +++ b/TPDT-268 - ACP in task sequence/dba_structure/All_Stats_SP.sql @@ -0,0 +1,39 @@ +USE [HCITools] +GO + +SET ANSI_NULLS ON +GO + +SET QUOTED_IDENTIFIER ON +GO + +IF NOT EXISTS (SELECT * FROM sys.objects WHERE object_id = OBJECT_ID(N'[dbo].[All_Stats_SP]') AND type in (N'U')) +BEGIN +CREATE TABLE [dbo].[All_Stats_SP]( + [SS_ServerName] [sysname] NOT NULL, + [Stats_SP_ID] [int] NOT NULL, + [SS_schemaname] [sysname] NOT NULL, + [SS_databasename] [sysname] NOT NULL, + [SS_name] [sysname] NULL, + [SS_type] [nvarchar](60) NULL, + [SS_execution_count] [bigint] NULL, + [SS_last_execution_time] [datetime] NULL, + [SS_total_worker_time] [bigint] NULL, + [SS_total_physical_reads] [bigint] NULL, + [SS_total_logical_writes] [bigint] NULL, + [SS_total_logical_reads] [bigint] NULL, + [SS_total_elapsed_time] [bigint] NULL, + [SS_updatedate] [datetime] NULL, + [SS_restartdate] [datetime] NULL, + [SS_deletedate] [datetime] NULL, + CONSTRAINT [PK_All_Stats_SP_1] PRIMARY KEY CLUSTERED +( + [SS_ServerName] ASC, + [Stats_SP_ID] ASC +)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY] +) ON [PRIMARY] +END +GO + + + diff --git a/TPDT-268 - ACP in task sequence/dba_structure/All_Stats_index.sql b/TPDT-268 - ACP in task sequence/dba_structure/All_Stats_index.sql new file mode 100644 index 0000000..efdc52d --- /dev/null +++ b/TPDT-268 - ACP in task sequence/dba_structure/All_Stats_index.sql @@ -0,0 +1,61 @@ +USE [HCITools] +GO + + +SET ANSI_NULLS ON +GO + +SET QUOTED_IDENTIFIER ON +GO +IF EXISTS (SELECT 1 FROM master.cfg.InstanceContext where Business = 'TPCENT') +BEGIN + + IF NOT EXISTS (SELECT 1 + FROM sys.objects o WITH (NOLOCK) + JOIN sys.schemas s WITH (NOLOCK) ON o.schema_id = s.schema_id + WHERE o.name = 'All_Stats_index' + AND o.type IN (N'U') + AND s.name = 'dbo') + BEGIN + + CREATE TABLE [dbo].[All_Stats_index]( + [SI_ServerName] [sysname] NOT NULL, + [Stats_index_ID] [int] NOT NULL, + [SI_schemaname] [sysname] NOT NULL, + [SI_databasename] [sysname] NOT NULL, + [SI_tablename] [sysname] NOT NULL, + [SI_indexname] [sysname] NULL, + [SI_indextype] [nvarchar](60) NULL, + [SI_user_seeks] [bigint] NULL, + [SI_user_scans] [bigint] NULL, + [SI_user_lookups] [bigint] NULL, + [SI_user_updates] [bigint] NULL, + [SI_last_user_seek] [datetime] NULL, + [SI_last_user_scan] [datetime] NULL, + [SI_last_user_lookup] [datetime] NULL, + [SI_last_user_update] [datetime] NULL, + [SI_updatedate] [datetime] NULL, + [SI_restartdate] [datetime] NULL, + [SI_deletedate] [datetime] NULL, + CONSTRAINT [PK_All_Stats_index_1] PRIMARY KEY CLUSTERED + ( + [SI_ServerName] ASC, + [Stats_index_ID] ASC + )WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY] + ) ON [PRIMARY] + END + + IF NOT EXISTS (SELECT 1 FROM sys.indexes WHERE object_id = OBJECT_ID(N'[dbo].[All_Stats_index]') AND name = N'IDX_SI') + BEGIN + CREATE NONCLUSTERED INDEX [IDX_SI] ON [dbo].[All_Stats_index] + ( + [SI_databasename] ASC, + [SI_tablename] ASC + ) + INCLUDE ( [SI_ServerName], + [Stats_index_ID]) 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 = ON) ON [PRIMARY] + END +END +GO + + diff --git a/TPDT-268 - ACP in task sequence/dba_structure/Audit_login.sql b/TPDT-268 - ACP in task sequence/dba_structure/Audit_login.sql new file mode 100644 index 0000000..0536003 --- /dev/null +++ b/TPDT-268 - ACP in task sequence/dba_structure/Audit_login.sql @@ -0,0 +1,117 @@ +USE [HCITools] +GO + +IF NOT EXISTS (SELECT 1 + FROM sys.objects o WITH (NOLOCK) + JOIN sys.schemas s WITH (NOLOCK) ON o.schema_id = s.schema_id + WHERE o.name = 'Audit_login_text' + AND o.type IN (N'U') + AND s.name = 'dba') +BEGIN + PRINT 'Create table [Audit_login_text]' + CREATE TABLE [dba].[Audit_login_text]( + [Audit_login_text_ID] TINYINT NOT NULL, + [ALT_text] VARCHAR(MAX) NOT NULL, + [ALT_short_text] VARCHAR(30) NOT NULL, + [ALT_level] TINYINT NOT NULL + CONSTRAINT [PK_Audit_login_text_ID] PRIMARY KEY CLUSTERED + ( + [Audit_login_text_ID] ASC + )WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON, FILLFACTOR = 90) ON [PRIMARY] + ) ON [PRIMARY] + + INSERT INTO [dba].[Audit_login_text] + VALUES + (1,'Account is locked out (or password has recently been changed and user has not restarted the connecting application)','Account is locked out',1), + (2,'User id is not valid','User id is not valid',1), + (3,'Undocumented','Undocumented',2), + (4,'Undocumented','Undocumented',2), + (5,'Login not found; sometimes a connecting application is incorrectly set to specify connection via SQL Authentication for a Windows account','Login not found',1), + (6,'Undocumented','Undocumented',2), + (7,'The login being used is disabled','Login is disabled',2), + (8,'Incorrect password','Incorrect password',1), + (9,'Invalid password','Invalid password',1), + (10,'Related to a SQL login being bound to Windows domain password policy enforcement. See KB925744.','Login bound to Windows error',2), + (11,'Login valid but server access failed','Server access failed',2), + (12,'Login valid but server access failed','Server access failed',2), + (16,'Login valid, but not permissioned to use the target database','Wrong DB permission',2), + (18,'Password expired','Password expired',2), + (27,'Initial database could not be found','Initial DB not found',2), + (38,'Login valid but database unavailable (or login not permissioned)','DB unavailable or user denied',2) + + EXEC sys.sp_addextendedproperty @name=N'1', @value=N'Critical alert' , @level0type=N'SCHEMA',@level0name=N'dba', @level1type=N'TABLE',@level1name=N'Audit_login_text', @level2type=N'COLUMN',@level2name=N'ALT_level' + EXEC sys.sp_addextendedproperty @name=N'2', @value=N'Warning alert' , @level0type=N'SCHEMA',@level0name=N'dba', @level1type=N'TABLE',@level1name=N'Audit_login_text', @level2type=N'COLUMN',@level2name=N'ALT_level' + +END +GO + +IF NOT EXISTS (SELECT 1 FROM sys.check_constraints WHERE object_id = OBJECT_ID(N'dba.CKALT_level') AND parent_object_id = OBJECT_ID(N'[dba].[Audit_login_text]')) +BEGIN + PRINT 'Add constraint [CKALT_level] on table [Audit_login_text]' + ALTER TABLE [dba].[Audit_login_text] WITH CHECK ADD CONSTRAINT [CKALT_level] CHECK (([ALT_level] IN (1,2))) + + PRINT 'Activation of CONSTRAINT [CKALT_level] on table [Audit_login_text]' + ALTER TABLE [dba].[Audit_login_text] CHECK CONSTRAINT [CKALT_level] +END +GO + +IF NOT EXISTS (SELECT 1 + FROM sys.objects o WITH (NOLOCK) + JOIN sys.schemas s WITH (NOLOCK) ON o.schema_id = s.schema_id + WHERE o.name = 'Audit_login' + AND o.type IN (N'U') + AND s.name = 'dba') +BEGIN + + PRINT 'Create table [Audit_login]' + CREATE TABLE [dba].[Audit_login]( + [Audit_login_ID] INT IDENTITY NOT NULL, + [AL_application_name] NVARCHAR(255) NOT NULL, + [AL_client_process_id] INT NOT NULL, + [AL_host_name] NVARCHAR(255) NOT NULL, + [AL_login_name] NVARCHAR(255) NULL, + [AL_NT_domain_name] NVARCHAR(255) NULL, + [AL_NT_user_name] NVARCHAR(255) NULL, + [AL_session_login_name] NVARCHAR(255) NULL, + [AL_spid] INT NOT NULL, + [AL_event_time] DATETIME2(0) NOT NULL, + [AL_audit_login_text_id] TINYINT NULL, + [AL_text_data] NVARCHAR(MAX) NULL, + CONSTRAINT [PK_Audit_login_ID] PRIMARY KEY CLUSTERED + ( + [Audit_login_ID] ASC + )WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON, FILLFACTOR = 90) ON [PRIMARY] + ) ON [PRIMARY] + +END +GO + +/* Add foreign key constraint for Security_audit_text */ +IF NOT EXISTS (SELECT 1 FROM sys.foreign_keys WHERE object_id = OBJECT_ID(N'[dba].[FKAuditlogintext]') AND parent_object_id = OBJECT_ID(N'[dba].[Audit_login]')) +BEGIN + PRINT 'Create FK [FKAuditlogintext] into table [Audit_login]' + ALTER TABLE [dba].[Audit_login] WITH CHECK ADD CONSTRAINT [FKAuditlogintext] FOREIGN KEY(AL_audit_login_text_id) + REFERENCES [dba].[Audit_login_text] ([Audit_login_text_id]) +END +GO + +IF NOT EXISTS (SELECT 1 + FROM sys.objects o WITH (NOLOCK) + JOIN sys.schemas s WITH (NOLOCK) ON o.schema_id = s.schema_id + WHERE o.name = 'Audit_login_history' + AND o.type IN (N'U') + AND s.name = 'dba') +BEGIN + + CREATE TABLE [dba].[Audit_login_history]( + [Audit_login_history_ID] INT IDENTITY NOT NULL, + [ALH_create_date] DATETIME2(0) NOT NULL, + [ALH_total_count] INT NOT NULL + CONSTRAINT [PK_Audit_login_history_ID] PRIMARY KEY CLUSTERED + ( + [Audit_login_history_ID] ASC + )WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON, FILLFACTOR = 90) ON [PRIMARY] + ) ON [PRIMARY] + +END +GO diff --git a/TPDT-268 - ACP in task sequence/dba_structure/Critical Jobs.sql b/TPDT-268 - ACP in task sequence/dba_structure/Critical Jobs.sql new file mode 100644 index 0000000..c6ad06b --- /dev/null +++ b/TPDT-268 - ACP in task sequence/dba_structure/Critical Jobs.sql @@ -0,0 +1,14 @@ +USE [HCITools] +GO +IF NOT EXISTS (SELECT * FROM sys.objects WHERE object_id = OBJECT_ID(N'[mon].[SMSJobCheck]') AND type in (N'U')) +BEGIN + + CREATE TABLE [mon].[SMSJobCheck]( + [SMSJobCheckID] [int] IDENTITY(1,1) NOT NULL, + [SJCFormat] [varchar](4) NOT NULL, + [SJCJobName] [varchar](100) NOT NULL, + [SJCJobDescription] [varchar](100) NOT NULL, + [SJCNextExecution] [datetime] NULL + ) ON [PRIMARY] +END +GO diff --git a/TPDT-268 - ACP in task sequence/dba_structure/DBA_monitoring.sql b/TPDT-268 - ACP in task sequence/dba_structure/DBA_monitoring.sql new file mode 100644 index 0000000..d4a6562 --- /dev/null +++ b/TPDT-268 - ACP in task sequence/dba_structure/DBA_monitoring.sql @@ -0,0 +1,126 @@ +USE [HCITools] +GO + +SET ANSI_NULLS ON +GO + +SET QUOTED_IDENTIFIER ON +GO + +IF NOT EXISTS (SELECT 1 + FROM sys.objects o WITH (NOLOCK) + JOIN sys.schemas s WITH (NOLOCK) ON o.schema_id = s.schema_id + WHERE o.name = 'DBA_monitoring_alerts' + AND o.type IN (N'U') + AND s.name = 'mon') +BEGIN + + PRINT 'Create new table [DBA_monitoring_alerts]' + CREATE TABLE [mon].[DBA_monitoring_alerts]( + [DBA_monitoring_alerts_ID] int IDENTITY(1,1) NOT NULL, + [DBAMA_monitoring_alerts_type] int NOT NULL, + [DBAMA_short_message] varchar(40) NOT NULL, + [DBAMA_key] varchar(20) NOT NULL + CONSTRAINT [PK_DBA_monitoring_alerts] PRIMARY KEY CLUSTERED + ( + [DBA_monitoring_alerts_ID] ASC + )WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON, FILLFACTOR = 100) ON [PRIMARY] + ) ON [PRIMARY] + +END +GO + +IF NOT EXISTS (SELECT 1 + FROM sys.objects o WITH (NOLOCK) + JOIN sys.schemas s WITH (NOLOCK) ON o.schema_id = s.schema_id + WHERE o.name = 'DBA_monitoring_alerts_type' + AND o.type IN (N'U') + AND s.name = 'mon') +BEGIN + + PRINT 'Create new table [DBA_monitoring_alerts_type]' + CREATE TABLE [mon].[DBA_monitoring_alerts_type]( + [DBA_monitoring_alerts_type_ID] int IDENTITY(1,1) NOT NULL, + [DBAMAT_name] varchar(100) NOT NULL, + [DBAMAT_key] varchar(20) NOT NULL + CONSTRAINT [PK_DBA_monitoring_alerts_type] PRIMARY KEY CLUSTERED + ( + [DBA_monitoring_alerts_type_ID] ASC + )WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON, FILLFACTOR = 100) ON [PRIMARY] + ) ON [PRIMARY] + +END +GO + +IF NOT EXISTS (SELECT 1 + FROM sys.objects o WITH (NOLOCK) + JOIN sys.schemas s WITH (NOLOCK) ON o.schema_id = s.schema_id + WHERE o.name = 'DBA_monitoring_alerts_history' + AND o.type IN (N'U') + AND s.name = 'mon') +BEGIN + + PRINT 'Create new table [DBA_monitoring_alerts_history]' + CREATE TABLE [mon].[DBA_monitoring_alerts_history]( + [DBA_monitoring_alerts_history_ID] int IDENTITY(1,1) NOT NULL, + [DBAMAH_monitoring_alerts] int NOT NULL, + [DBAMAH_criticity_level] tinyint NOT NULL CONSTRAINT [CKDBAMAH_criticity_level] CHECK (([DBAMAH_criticity_level] IN (0,1,2))), + [DBAMAH_event_date] datetime2(0) NOT NULL CONSTRAINT DF_DBAMAH_event_date DEFAULT getdate(), + [DBAMAH_long_message] varchar(max) NOT NULL + CONSTRAINT [PK_DBA_monitoring_alerts_history] PRIMARY KEY CLUSTERED + ( + [DBA_monitoring_alerts_history_ID] ASC + )WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON, FILLFACTOR = 100) ON [PRIMARY] + ) ON [PRIMARY] + + + EXEC sys.sp_addextendedproperty @name=N'0', @value=N'OK' , @level0type=N'SCHEMA',@level0name=N'mon', @level1type=N'TABLE',@level1name=N'DBA_monitoring_alerts_history', @level2type=N'COLUMN',@level2name=N'DBAMAH_criticity_level' + EXEC sys.sp_addextendedproperty @name=N'1', @value=N'Warning' , @level0type=N'SCHEMA',@level0name=N'mon', @level1type=N'TABLE',@level1name=N'DBA_monitoring_alerts_history', @level2type=N'COLUMN',@level2name=N'DBAMAH_criticity_level' + EXEC sys.sp_addextendedproperty @name=N'2', @value=N'Critical' , @level0type=N'SCHEMA',@level0name=N'mon', @level1type=N'TABLE',@level1name=N'DBA_monitoring_alerts_history', @level2type=N'COLUMN',@level2name=N'DBAMAH_criticity_level' + +END +GO + +IF NOT EXISTS (SELECT 1 + FROM sys.foreign_keys fk + WHERE fk.object_id = OBJECT_ID(N'[mon].[FKDBAMAHmonitoringalerts]') + AND fk.parent_object_id = OBJECT_ID(N'[mon].[DBA_monitoring_alerts_history]')) +BEGIN + PRINT 'Create foreign key [FKDBAMAHmonitoringalerts] on table [DBA_monitoring_alerts_history]' + ALTER TABLE [mon].[DBA_monitoring_alerts_history] WITH CHECK ADD CONSTRAINT [FKDBAMAHmonitoringalerts] FOREIGN KEY([DBAMAH_monitoring_alerts]) + REFERENCES [mon].[DBA_monitoring_alerts] ([DBA_monitoring_alerts_ID]) +END +GO + +IF NOT EXISTS (SELECT 1 + FROM sys.foreign_keys fk + WHERE fk.object_id = OBJECT_ID(N'[mon].[FKDBAMAmonitoringtype]') + AND fk.parent_object_id = OBJECT_ID(N'[mon].[DBA_monitoring_alerts]')) +BEGIN + PRINT 'Create foreign key [FKDBAMAmonitoringtype] on table [DBA_monitoring_alerts]' + ALTER TABLE [mon].[DBA_monitoring_alerts] WITH CHECK ADD CONSTRAINT [FKDBAMAmonitoringtype] FOREIGN KEY([DBAMA_monitoring_alerts_type]) + REFERENCES [mon].[DBA_monitoring_alerts_type] ([DBA_monitoring_alerts_type_ID]) +END +GO + + + +/* INIT +INSERT INTO [HCITools].[mon].[DBA_monitoring_alerts_type] (DBAMAT_name,DBAMAT_key) +VALUES ('SQL Replications','REPL') + +INSERT INTO [HCITools].[mon].[DBA_monitoring_alerts] (DBAMA_monitoring_alerts_type, DBAMA_short_message, DBAMA_key) +VALUES +(1,'OK','OK'), +(1,'Maintenance jobs','MaintJobs'), +(1,'Missing articles','MissArt'), +(1,'POS linked server','POSLinked'), +(1,'POS Missed in subscription','SubMiss'), +(1,'Replinibackup share','Replini'), +(1,'Authentification Windows','Auth'), +(1,'POS subscription','SubCheck'), +(1,'Snapshot agent','SnapAgt'), +(1,'Log reader agent','LogReadAgt'), +(1,'Duplicate jobs','DuplicJobs'), +(1,'Undistributed','UndistCmd') +*/ \ No newline at end of file diff --git a/TPDT-268 - ACP in task sequence/dba_structure/HCI_PARAMS.sql b/TPDT-268 - ACP in task sequence/dba_structure/HCI_PARAMS.sql new file mode 100644 index 0000000..19b7d59 --- /dev/null +++ b/TPDT-268 - ACP in task sequence/dba_structure/HCI_PARAMS.sql @@ -0,0 +1,21 @@ + +USE [HCITools] +GO +IF NOT EXISTS (SELECT * FROM sys.objects WHERE object_id = OBJECT_ID(N'[dbo].[HCI_PARAMS]') AND type in (N'U')) +BEGIN + +CREATE TABLE [dbo].[HCI_PARAMS]( + [HCIP_id] [int] IDENTITY(1,1) NOT NULL, + [HCIP_key] [varchar](50) NULL, + [HCIP_value] [varchar](1000) NULL, + [HCIP_remark] [varchar](2000) NULL, + CONSTRAINT [PK_HCI_PARAMS] PRIMARY KEY CLUSTERED +( + [HCIP_id] ASC +)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON, FILLFACTOR = 100) ON [PRIMARY] +) ON [PRIMARY] + + +end +GO + diff --git a/TPDT-268 - ACP in task sequence/dba_structure/LabelsList.sql b/TPDT-268 - ACP in task sequence/dba_structure/LabelsList.sql new file mode 100644 index 0000000..3b2cd9f --- /dev/null +++ b/TPDT-268 - ACP in task sequence/dba_structure/LabelsList.sql @@ -0,0 +1,35 @@ +USE [HCITools] +GO + +IF EXISTS (SELECT * FROM sys.objects WHERE object_id = OBJECT_ID(N'[dbo].[LabelsList]') AND type in (N'U')) +DROP TABLE [dbo].[LabelsList] +GO + +SET ANSI_NULLS ON +GO + +SET QUOTED_IDENTIFIER ON +GO + +SET ANSI_PADDING ON +GO + +IF NOT EXISTS (SELECT 1 + FROM sys.objects o WITH (NOLOCK) + JOIN sys.schemas s WITH (NOLOCK) ON o.schema_id = s.schema_id + WHERE o.name = 'LabelsList' + AND o.type IN (N'U') + AND s.name = 'dbo') +BEGIN + + CREATE TABLE [dbo].[LabelsList]( + [LL_Name] [varchar](17) NULL + ) ON [PRIMARY] + +END +GO + +SET ANSI_PADDING OFF +GO + + diff --git a/TPDT-268 - ACP in task sequence/dba_structure/MonitoringAMR.sql b/TPDT-268 - ACP in task sequence/dba_structure/MonitoringAMR.sql new file mode 100644 index 0000000..27f8145 --- /dev/null +++ b/TPDT-268 - ACP in task sequence/dba_structure/MonitoringAMR.sql @@ -0,0 +1,17 @@ +USE [HCITools] +GO + +IF NOT EXISTS (SELECT * FROM sys.objects WHERE object_id = OBJECT_ID(N'[dbo].[MonitoringAMR]') AND type in (N'U')) +BEGIN + + CREATE TABLE [dbo].[MonitoringAMR]( + [MA_Date] [datetime] NOT NULL, + [MA_Database] [sysname] NOT NULL, + [MA_Table] [sysname] NOT NULL, + [MA_RowsPrioToDo] [int] NOT NULL, + [MA_RowsPrioDone] [int] NOT NULL, + [MA_RowsToDo] [int] NOT NULL, + [MA_RowsDone] [int] NOT NULL + ) ON [PRIMARY] +END +GO \ No newline at end of file diff --git a/TPDT-268 - ACP in task sequence/dba_structure/Principal_Permission.sql b/TPDT-268 - ACP in task sequence/dba_structure/Principal_Permission.sql new file mode 100644 index 0000000..8ede628 --- /dev/null +++ b/TPDT-268 - ACP in task sequence/dba_structure/Principal_Permission.sql @@ -0,0 +1,33 @@ + +USE HCITools +GO + +IF NOT EXISTS (SELECT 1 + FROM sys.objects o WITH (NOLOCK) + JOIN sys.schemas s WITH (NOLOCK) ON o.schema_id = s.schema_id + WHERE o.name = 'Principal_Permission' + AND o.type IN (N'U') + AND s.name = 'dba') +BEGIN + + /* 17.11.2016 /RTC : Objects security backup store in HCI Tools database */ + CREATE TABLE [dba].[Principal_Permission]( + [PP_database_name] [varchar](18) NOT NULL, + [PP_schema] [nvarchar](258) NULL, + [PP_object] [sysname] NOT NULL, + [PP_user_name] [nvarchar](258) NULL, + [PP_permission_type] [char](4) NOT NULL, + [PP_permission_name] [nvarchar](128) NULL, + [PP_permission_state] [char](1) NOT NULL, + [PP_state_desc] [nvarchar](60) NULL, + [PP_apply_permission_command] [nvarchar](1251) NULL, + [PP_timestamp] [datetime] NOT NULL + ) ON [PRIMARY] + +END +GO + + + + + diff --git a/TPDT-268 - ACP in task sequence/dba_structure/SMSCalendar.sql b/TPDT-268 - ACP in task sequence/dba_structure/SMSCalendar.sql new file mode 100644 index 0000000..4a0a40f --- /dev/null +++ b/TPDT-268 - ACP in task sequence/dba_structure/SMSCalendar.sql @@ -0,0 +1,47 @@ +/*----------------------------------------------------------------------------------------------------------------------------------------------------------------------*/ +/* Script pour la création des tables du calendrier DBA. */ +/* Ces objects doivent uniquement être créés sur le serveur SCINBDEVMON01 c'est pourquoi le script est commenté. Merci de ne pas l'installer sur d'autres systèmes. */ +/* 19.03.2019 / SPE */ +/* */ +/* Modifications */ +/* */ +/*----------------------------------------------------------------------------------------------------------------------------------------------------------------------*/ + +/* <-- Remove this to uncomment + +USE [HCITools] + +IF NOT EXISTS (SELECT 1 + FROM sys.objects o WITH (NOLOCK) + JOIN sys.schemas s WITH (NOLOCK) ON o.schema_id = s.schema_id + WHERE o.name = 'SMSCalendar' + AND o.type IN (N'U') + AND s.name = 'mon') +BEGIN + + CREATE TABLE [mon].[SMSCalendar]( + [SMSCalendarID] [int] IDENTITY(1,1) NOT NULL, + [SCStartDate] [datetime] NOT NULL, + [SCEndDate] [datetime] NOT NULL, + [SCType] [tinyint] NOT NULL + ) ON [PRIMARY] + +END + +IF NOT EXISTS (SELECT 1 + FROM sys.objects o WITH (NOLOCK) + JOIN sys.schemas s WITH (NOLOCK) ON o.schema_id = s.schema_id + WHERE o.name = 'SMSCalendarDBAMailingListLink' + AND o.type IN (N'U') + AND s.name = 'mon') +BEGIN + + CREATE TABLE [mon].[SMSCalendarDBAMailingListLink]( + [SMSCalendarDBAMailingListLinkID] [int] IDENTITY(1,1) NOT NULL, + [SCDMLLCalendarID] [int] NOT NULL, + [SCDMLLDBAMailingListID] [int] NOT NULL + ) ON [PRIMARY] + +END + +Remove this to uncomment --> */ \ No newline at end of file diff --git a/TPDT-268 - ACP in task sequence/dba_structure/SQL_Errors.sql b/TPDT-268 - ACP in task sequence/dba_structure/SQL_Errors.sql new file mode 100644 index 0000000..1f486b5 --- /dev/null +++ b/TPDT-268 - ACP in task sequence/dba_structure/SQL_Errors.sql @@ -0,0 +1,43 @@ +USE [HCITools] +GO + +/****** Object: Table [dbo].[SQL_Errors] Script Date: 03/07/2016 15:58:29 ******/ +IF EXISTS (SELECT * FROM sys.objects WHERE object_id = OBJECT_ID(N'[dbo].[SQL_Errors]') AND type in (N'U')) +DROP TABLE [dbo].[SQL_Errors] +GO + +/****** Object: Table [dbo].[SQL_Errors] Script Date: 03/07/2016 15:58:29 ******/ +SET ANSI_NULLS ON +GO + +SET QUOTED_IDENTIFIER ON +GO + +SET ANSI_PADDING ON +GO + +IF NOT EXISTS (SELECT 1 + FROM sys.objects o WITH (NOLOCK) + JOIN sys.schemas s WITH (NOLOCK) ON o.schema_id = s.schema_id + WHERE o.name = 'SQL_Errors' + AND o.type IN (N'U') + AND s.name = 'dbo') +BEGIN + + CREATE TABLE [dbo].[SQL_Errors]( + [ServerName] [nvarchar](50) NULL, + [AppName] [nvarchar](128) NULL, + [UserName] [sysname] NULL, + [ObjectName] [sysname] NULL, + [Date] [datetime] NULL, + [SourceType] [tinyint] NULL, + [ErrorMessage] [varchar](max) NULL + ) ON [PRIMARY] TEXTIMAGE_ON [PRIMARY] + +END +GO + +SET ANSI_PADDING ON +GO + + diff --git a/TPDT-268 - ACP in task sequence/dba_structure/Stats_SP.sql b/TPDT-268 - ACP in task sequence/dba_structure/Stats_SP.sql new file mode 100644 index 0000000..7abd6e5 --- /dev/null +++ b/TPDT-268 - ACP in task sequence/dba_structure/Stats_SP.sql @@ -0,0 +1,36 @@ +USE [HCITools] +GO + +SET ANSI_NULLS ON +GO + +SET QUOTED_IDENTIFIER ON +GO + +IF NOT EXISTS (SELECT * FROM sys.objects WHERE object_id = OBJECT_ID(N'[dbo].[Stats_SP]') AND type in (N'U')) +BEGIN + + + CREATE TABLE [dbo].[Stats_SP]( + [Stats_SP_ID] [int] IDENTITY(1,1) NOT NULL, + [SS_schemaname] [sysname] NOT NULL, + [SS_databasename] [sysname] NOT NULL, + [SS_name] [sysname] NULL, + [SS_type] [nvarchar](60) NULL, + [SS_execution_count] [bigint] NULL, + [SS_last_execution_time] [datetime] NULL, + [SS_total_worker_time] [bigint] NULL, + [SS_total_physical_reads] [bigint] NULL, + [SS_total_logical_writes] [bigint] NULL, + [SS_total_logical_reads] [bigint] NULL, + [SS_total_elapsed_time] [bigint] NULL, + [SS_updatedate] [datetime] NULL, + [SS_restartdate] [datetime] NULL, + CONSTRAINT [PK_Stats_SP_1] PRIMARY KEY CLUSTERED + ( + [Stats_SP_ID] ASC + )WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON, FILLFACTOR = 90) ON [PRIMARY] + ) ON [PRIMARY] + +END +GO diff --git a/TPDT-268 - ACP in task sequence/dba_structure/Stats_index.sql b/TPDT-268 - ACP in task sequence/dba_structure/Stats_index.sql new file mode 100644 index 0000000..c9b709e --- /dev/null +++ b/TPDT-268 - ACP in task sequence/dba_structure/Stats_index.sql @@ -0,0 +1,43 @@ +USE [HCITools] +GO + +/****** Object: Table [dbo].[Stats_index] Script Date: 05/10/2016 12:40:31 ******/ +SET ANSI_NULLS ON +GO + +SET QUOTED_IDENTIFIER ON +GO + +IF NOT EXISTS (SELECT 1 + FROM sys.objects o WITH (NOLOCK) + JOIN sys.schemas s WITH (NOLOCK) ON o.schema_id = s.schema_id + WHERE o.name = 'Stats_index' + AND o.type IN (N'U') + AND s.name = 'dbo') +BEGIN + + CREATE TABLE [dbo].[Stats_index]( + [Stats_index_ID] [int] IDENTITY(1,1) NOT NULL, + [SI_schemaname] [sysname] NOT NULL, + [SI_databasename] [sysname] NOT NULL, + [SI_tablename] [sysname] NOT NULL, + [SI_indexname] [sysname] NULL, + [SI_indextype] [nvarchar](60) NULL, + [SI_user_seeks] [bigint] NULL, + [SI_user_scans] [bigint] NULL, + [SI_user_lookups] [bigint] NULL, + [SI_user_updates] [bigint] NULL, + [SI_last_user_seek] [datetime] NULL, + [SI_last_user_scan] [datetime] NULL, + [SI_last_user_lookup] [datetime] NULL, + [SI_last_user_update] [datetime] NULL, + [SI_updatedate] [datetime] NULL, + [SI_restartdate] [datetime] NULL, + CONSTRAINT [PK_Stats_index_1] PRIMARY KEY CLUSTERED + ( + [Stats_index_ID] ASC + )WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY] + ) ON [PRIMARY] + +END +GO diff --git a/TPDT-268 - ACP in task sequence/dba_structure/schema_dba.sql b/TPDT-268 - ACP in task sequence/dba_structure/schema_dba.sql new file mode 100644 index 0000000..cf4c0af --- /dev/null +++ b/TPDT-268 - ACP in task sequence/dba_structure/schema_dba.sql @@ -0,0 +1,8 @@ +USE [HCITools] +GO + +IF NOT EXISTS (SELECT 1 FROM sys.schemas WHERE name = 'dba') +BEGIN + EXEC('CREATE SCHEMA [dba] AUTHORIZATION [dbo]') +END +GO diff --git a/TPDT-268 - ACP in task sequence/dba_structure/schema_perf.sql b/TPDT-268 - ACP in task sequence/dba_structure/schema_perf.sql new file mode 100644 index 0000000..83e60cf --- /dev/null +++ b/TPDT-268 - ACP in task sequence/dba_structure/schema_perf.sql @@ -0,0 +1,8 @@ +USE [HCITools] +GO + +IF NOT EXISTS (SELECT 1 FROM sys.schemas WHERE name = 'perf') +BEGIN + EXEC('CREATE SCHEMA [perf] AUTHORIZATION [dbo]') +END +GO diff --git a/TPDT-268 - ACP in task sequence/update_central_system_site.ps1 b/TPDT-268 - ACP in task sequence/update_central_system_site.ps1 new file mode 100644 index 0000000..e69de29