diff --git a/EXPLOIT - Triafin messages sent per day from gaia server.sql b/EXPLOIT - Triafin messages sent per day from gaia server.sql new file mode 100644 index 0000000..e226a81 --- /dev/null +++ b/EXPLOIT - Triafin messages sent per day from gaia server.sql @@ -0,0 +1,38 @@ +USE [Gaia] +SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTED +GO +DECLARE @date_separator CHAR(1)='-' +SELECT + COUNT(1) AS cnt + --, DATEPART(DAY, [c].[StartConversationDate]) AS [day] + --, DATEPART(MONTH, [c].[StartConversationDate]) AS [month] + , RIGHT('0000'+CAST(DATEPART(YEAR, [c].[StartConversationDate]) AS VARCHAR(4)),4)+@date_separator + +RIGHT('00'+CAST(DATEPART(MONTH, [c].[StartConversationDate]) AS VARCHAR(2)), 2)+@date_separator + +RIGHT('00'+CAST(DATEPART(DAY, [c].[StartConversationDate]) AS VARCHAR(2)), 2) AS [date] + , r.[requestType] + , c.[PharmacyCode] +FROM [crs].[Conversation] c + OUTER APPLY ( + SELECT req.value('@RequestType', 'nvarchar(50)') AS requestType + FROM [crs].[Conversation] x + OUTER APPLY x.[Request].nodes('Request') xx(req) + WHERE x.[ConversationId] = c.[ConversationId] + ) r +WHERE [c].[StartConversationDate] > '20251201' +AND [c].[PharmacyCode]='ama553' +GROUP BY + DATEPART(DAY, [c].[StartConversationDate]) + , DATEPART(MONTH, [c].[StartConversationDate]) + , DATEPART(YEAR, [c].[StartConversationDate]) + , r.[requestType] + , c.[PharmacyCode] +ORDER BY + DATEPART(YEAR, [c].[StartConversationDate]) ASC + , DATEPART(MONTH, [c].[StartConversationDate]) ASC + , DATEPART(DAY, [c].[StartConversationDate]) ASC + , [c].[PharmacyCode] ASC + , COUNT(1) DESC +; + + +--137'131 conversations since 1st of december 2025 diff --git a/EXPLOIT - disk usage and db size.sql b/EXPLOIT - disk usage and db size.sql index 789ecf9..e6ebfa2 100644 --- a/EXPLOIT - disk usage and db size.sql +++ b/EXPLOIT - disk usage and db size.sql @@ -1,4 +1,6 @@ ---databases space +--how much data we pad when we shrink, and the min disk size to start a shrink +DECLARE @limit INT=512; + IF OBJECT_ID('tempdb..#dbs')IS NOT NULL BEGIN; DROP TABLE #dbs; END; @@ -7,12 +9,12 @@ CREATE TABLE #dbs ( [database_name] NVARCHAR(128), [log_size_mb] DECIMAL(18,2), INSERT INTO [#dbs] ([database_name], [log_size_mb], [row_size_mb], [total_size_mb]) 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)) + database_name = DB_NAME([F].[database_id]) + , log_size_mb = CAST(SUM(CASE WHEN [F].[type_desc] = 'LOG' THEN [F].[size] END) * 8. / 1024 AS DECIMAL(18,2)) + , row_size_mb = CAST(SUM(CASE WHEN [F].[type_desc] = 'ROWS' THEN [F].[size] END) * 8. / 1024 AS DECIMAL(18,2)) + , total_size_mb = CAST(SUM([F].[size]) * 8. / 1024 AS DECIMAL(18,2)) FROM sys.master_files F WITH(NOWAIT) -GROUP BY F.database_id +GROUP BY [F].[database_id] ORDER BY [total_size_mb] DESC IF OBJECT_ID('tempdb..#FileSize')IS NOT NULL BEGIN; @@ -26,7 +28,7 @@ CREATE TABLE #FileSize( FreeSpaceMB DECIMAL(10,2) NULL ) INSERT INTO #FileSize(dbName, FileName, type_desc, CurrentSizeMB, FreeSpaceMB) -exec sp_msforeachdb +exec [sys].[sp_MSforeachdb] 'use [?]; SELECT DB_NAME() AS DbName, name AS FileName, @@ -41,19 +43,25 @@ SELECT * FROM #FileSize */ +--details SELECT d.[name] AS dbName - ,f.[physical_name] AS physicalFileName + ,[F].[physical_name] AS physicalFileName ,f.[name] AS logicalFileName --,d2.[log_size_mb] --,d2.[row_size_mb] + ,[d].[recovery_model_desc] ,'-----' AS separator - ,CAST(f.size * 8.0 / 1024 AS DECIMAL(18,2)) AS fileSizeMB - ,fs.[FreeSpaceMB] AS FreeSpaceInFileMB - ,fs.[CurrentSizeMB] - fs.[FreeSpaceMB] AS SpaceUsedMB - ,CAST((fs.[CurrentSizeMB] - fs.[FreeSpaceMB]) * 100 / (CAST(f.size * 8. / 1024 AS DECIMAL(18,2))) AS NUMERIC(6,2)) AS fileSpaceUsedPercent + --,CAST(f.size * 8.0 / 1024 AS DECIMAL(18,2)) AS fileSizeMB + ,REPLACE(REPLACE(CONVERT(VARCHAR(100), CONVERT(MONEY, CAST([F].[size] * 8.0 / 1024 AS DECIMAL(18,2))), 1),',',''''),'.00','') as fileSizeMB + --,fs.[FreeSpaceMB] AS FreeSpaceInFileMB + ,REPLACE(REPLACE(CONVERT(VARCHAR(100), CONVERT(MONEY, [fs].[FreeSpaceMB]), 1),',',''''),'.00','') as FreeSpaceInFileMB + --,(CAST(fs.[CurrentSizeMB] - fs.[FreeSpaceMB] AS MONEY))AS SpaceUsedMB + ,REPLACE(REPLACE(CONVERT(VARCHAR(100), CONVERT(MONEY, [fs].[CurrentSizeMB] - [fs].[FreeSpaceMB]), 1),',',''''),'.00','') as SpaceUsedMB + ,CAST(([fs].[CurrentSizeMB] - [fs].[FreeSpaceMB]) * 100 / (CAST([F].[size] * 8. / 1024 AS DECIMAL(18,2))) AS NUMERIC(6,2)) AS fileSpaceUsedPercent ,'-----' AS separator - ,d2.[total_size_mb] AS totalDbSizeMB + --,d2.[total_size_mb] AS totalDbSizeMB + ,REPLACE(REPLACE(CONVERT(VARCHAR(100), CONVERT(MONEY, [d2].[total_size_mb]), 1),',',''''),'.00','') as totalDbSizeMB ,'USE '+d.name+'; DBCC SHRINKFILE (N'''+f.[name]+''' , 0, TRUNCATEONLY); GO @@ -65,28 +73,31 @@ GO ' AS reorganizeData ,'USE '+d.name+'; -IF 1024 < '+CAST(CAST(f.size * 8.0 / 1024 AS DECIMAL(18,2)) AS VARCHAR(15))+' --file is above 1Go - AND 95 > '+CAST(CAST((fs.[CurrentSizeMB] - fs.[FreeSpaceMB]) * 100 / (CAST(f.size * 8.0 / 1024 AS DECIMAL(18,2))) AS DECIMAL(6,2))AS VARCHAR(15))+' --and usage below 95% - AND 0 < '+CAST(CAST(fs.[CurrentSizeMB] - fs.[FreeSpaceMB] AS DECIMAL(16,2))AS VARCHAR(15))+' --and data are present +IF '+CAST(@limit AS VARCHAR(10))+' < '+CAST(CAST([F].[size] * 8.0 / 1024 AS DECIMAL(18,2)) AS VARCHAR(15))+' --file is above limit + AND 95 > '+CAST(CAST(([fs].[CurrentSizeMB] - [fs].[FreeSpaceMB]) * 100 / (CAST([F].[size] * 8.0 / 1024 AS DECIMAL(18,2))) AS DECIMAL(6,2))AS VARCHAR(15))+' --and file container usage below 95% + AND 0 < '+CAST(CAST([fs].[CurrentSizeMB] - [fs].[FreeSpaceMB] AS DECIMAL(16,2))AS VARCHAR(15))+' --and data are present + AND '+CAST(CAST([fs].[CurrentSizeMB] - [fs].[FreeSpaceMB] + @limit AS DECIMAL(18,0)) AS VARCHAR(15))+' < '+CAST(CAST([fs].[CurrentSizeMB] AS DECIMAL(18,0)) AS VARCHAR(15))+' --target size is smaller than current size BEGIN --print ''Reorganize '+d.name+'.'+f.name+' '' RAISERROR(''Reorganize '+d.name+'.'+f.name+' '',0,0) WITH NOWAIT - DBCC SHRINKFILE (N'''+f.[name]+''' , '+CAST(CAST(fs.[CurrentSizeMB] - fs.[FreeSpaceMB] + 1024 AS DECIMAL(18,0)) AS VARCHAR(15))+'); + DBCC SHRINKFILE (N'''+f.[name]+''' , '+CAST(CAST([fs].[CurrentSizeMB] - [fs].[FreeSpaceMB] + @limit AS DECIMAL(18,0)) AS VARCHAR(15))+'); RAISERROR(''Done'',0,0) WITH NOWAIT END GO ' AS auto_action FROM sys.master_files F JOIN sys.databases d ON d.[database_id] = f.[database_id] - JOIN [#dbs] [d2] ON d2.[database_name] = d.[name] - LEFT JOIN [#FileSize] fs ON fs.[FileName] = f.name AND fs.[dbName] = d.[name] + JOIN [#dbs] [d2] ON [d2].[database_name] = d.[name] + LEFT JOIN [#FileSize] fs ON [fs].[FileName] = f.name AND [fs].[dbName] = d.[name] WHERE f.type_desc IN ( 'ROWS' --mdf - --,'LOG' + --, + --'LOG' ) ---AND f.[physical_name] LIKE 'f%' ---AND d.[is_read_only] = 0 +--AND [F].[physical_name] LIKE 'd:%' +AND d.[is_read_only] = 0 +AND [d].[source_database_id] IS NULL --AND d.[is_auto_shrink_on] = 0 --AND d.name='sl2007' AND d.name NOT IN ( @@ -96,6 +107,7 @@ AND d.name NOT IN ( ,'msdb' ) ORDER BY [d2].[row_size_mb] DESC, d.name DESC, f.name ASC ; +--ORDER BY [fileSpaceUsedPercent] ASC; --free disk space SELECT diff --git a/EXPLOIT - recent file grow events.sql b/EXPLOIT - recent file grow events.sql new file mode 100644 index 0000000..0d262b9 --- /dev/null +++ b/EXPLOIT - recent file grow events.sql @@ -0,0 +1,16 @@ +DECLARE @path nvarchar(260) = ( + SELECT REVERSE(SUBSTRING(REVERSE(path), CHARINDEX('\', REVERSE(path)), 260)) +'log.trc' + FROM sys.traces + WHERE is_default = 1) + +SELECT gt.DatabaseID, + gt.FileName, + COUNT(*) AS NumberOfEvents, + CASE WHEN te.name LIKE'%Grow' THEN 1 ELSE 0 END AS is_growth_event +FROM sys.fn_trace_gettable(@path, DEFAULT) gt +JOIN sys.trace_events te ON gt.EventClass = te.trace_event_id +WHERE te.name in ('Data File Auto Grow','Log File Auto Grow','Data File Auto Shrink','Log File Auto Shrink') +GROUP BY gt.DatabaseID, + gt.FileName, + te.name +ORDER BY COUNT(1) DESC \ No newline at end of file diff --git a/HCI - cds restore columnstore reorganize.sql b/HCI - cds restore columnstore reorganize.sql new file mode 100644 index 0000000..42348a2 --- /dev/null +++ b/HCI - cds restore columnstore reorganize.sql @@ -0,0 +1,43 @@ +USE [sandbox] + +SELECT + OBJECT_NAME([OBJECT_ID]) AS [object_name], + [object_id], + [index_id], + [partition_number], + [row_group_id], + [delta_store_hobt_id], + [state], + [state_desc], + [total_rows], + [deleted_rows], + [size_in_bytes], + [size_in_bytes]/1024.0/1024.0 AS size_in_mb, + + [trim_reason], + [trim_reason_desc], + [transition_to_compressed_state], + [transition_to_compressed_state_desc], + [has_vertipaq_optimization], + [generation], + [created_time], + [closed_time] + FROM sys.dm_db_column_store_row_group_physical_stats + WHERE 1=1 + --AND object_id = OBJECT_ID('logcheck_products') + AND [state] IN ( + 1, --open + 2 --closed + ) + ; + +RETURN + +USE sandbox + +ALTER INDEX ALL ON cds_log REORGANIZE; +ALTER INDEX ALL ON logcheck REORGANIZE; +ALTER INDEX ALL ON logcheck_products REORGANIZE; +ALTER INDEX ALL ON logcheck_interactions REORGANIZE; +ALTER INDEX ALL ON patient_risk REORGANIZE; + diff --git a/HCI - setup new dataProtectionKeys permissions.sql b/HCI - setup new dataProtectionKeys permissions.sql new file mode 100644 index 0000000..af29371 --- /dev/null +++ b/HCI - setup new dataProtectionKeys permissions.sql @@ -0,0 +1,161 @@ +/* +PharmaceuticalSpecialties_Superset + +Wire the database Users to these new AD groups + + DEV L-CI-AP-SQL-D-HCI-DataProtectionKeys_R and L-CI-AP-SQL-D-HCI-DataProtectionKeys_RW + INT L-CI-AP-SQL-I-HCI-DataProtectionKeys_R and L-CI-AP-SQL-I-HCI-DataProtectionKeys_RW + PROD L-CI-AP-SQL-P-HCI-DataProtectionKeys_R and L-CI-AP-SQL-P-HCI-DataProtectionKeys_RW + +01.10.2025, TSC +*/ + +BEGIN TRANSACTION + +SET XACT_ABORT ON; +SET NOCOUNT ON; + +DECLARE @q NVARCHAR(MAX)=''; +DECLARE @db sysname='DataProtectionKeys'; +DECLARE @env VARCHAR(111); +DECLARE @groups TABLE(env VARCHAR(111) NOT NULL, grp_name VARCHAR(111) NOT NULL); +SELECT @env = CASE + WHEN @@SERVERNAME='SWMDATASQLDEV01' THEN 'dev' + WHEN @@SERVERNAME='SWMDATASQLINT01' THEN 'int' + WHEN @@SERVERNAME='SWMDATASQLPRD01' THEN 'prod' + WHEN @@SERVERNAME='SWSQLMDQAS05' THEN 'prod' + ELSE 'unknown' +END; +DECLARE @tplLogins NVARCHAR(MAX)=' +IF NOT EXISTS ( + SELECT 1 + FROM sys.server_principals + WHERE name = ''@grp@'' +) +BEGIN + SET @sql = + N''CREATE LOGIN [@grp@] '' + + N''FROM WINDOWS '' + + N''WITH DEFAULT_DATABASE=[master];''; + EXEC (@sql); + + PRINT ''created login [@grp@]''; +END + +'; +DECLARE @tplUser NVARCHAR(MAX)=' +IF NOT EXISTS ( + SELECT 1 + FROM sys.database_principals + WHERE name = N''@grp@'' +) +BEGIN + CREATE USER [@grp@] + FOR LOGIN [@grp@]; + PRINT ''Added user [@grp@]''; +END + +IF EXISTS ( + SELECT 1 + FROM sys.database_principals + WHERE name = N''@grp@'' +) +BEGIN + GRANT EXECUTE TO [@grp@]; + --PRINT ''Granted EXECUTE to [@grp@]''; + + ALTER ROLE [db_datareader] ADD MEMBER [@grp@] + --PRINT ''Granted db_datareader to [@grp@]''; + + PRINT ''Granted read and execute permissions to [@grp@]''; + IF ''@grp@'' like ''%[_]RW'' + BEGIN + ALTER ROLE [db_datawriter] ADD MEMBER [@grp@]; + PRINT ''Granted db_datawriter to [@grp@]''; + END + + +END + +' + +INSERT INTO @groups ([env],[grp_name]) +VALUES('dev', 'CENTRALINFRA\L-CI-AP-SQL-D-HCI-DataProtectionKeys_R') + ,('dev', 'CENTRALINFRA\L-CI-AP-SQL-D-HCI-DataProtectionKeys_RW') + ,('int', 'CENTRALINFRA\L-CI-AP-SQL-I-HCI-DataProtectionKeys_R') + ,('int', 'CENTRALINFRA\L-CI-AP-SQL-I-HCI-DataProtectionKeys_RW') + ,('prod', 'CENTRALINFRA\L-CI-AP-SQL-P-HCI-DataProtectionKeys_R') + ,('prod', 'CENTRALINFRA\L-CI-AP-SQL-P-HCI-DataProtectionKeys_RW') + +; +SELECT @env +IF @env IN ('dev','int','prod') +BEGIN + SET @q='use master +go +BEGIN TRANSACTION +SET XACT_ABORT ON; +SET NOCOUNT ON; + +IF NOT EXISTS ( + SELECT 1 + FROM sys.databases d + WHERE name='''+@db+''' +) +BEGIN + RAISERROR(''The target db %s does not exists (yet?)'',16,5,'''+@db+'''); + RETURN +END + + +DECLARE @sql nvarchar(MAX)=''''; +'; + + --#region login + SELECT @q = @q + REPLACE(@tplLogins, '@grp@',g.[grp_name]) + FROM @groups g + WHERE [g].[env] = @env + AND g.[grp_name] LIKE '%\%'; + --#endregion login + + --#region users + SET @q = @q +' +use '+@db+' +GO + '; + + SELECT @q = @q + REPLACE(@tplUser,'@grp@', g.[grp_name]) + FROM @groups g + WHERE g.[env] = @env; + --#endregion users + + SET @q = @q +' +ROLLBACK TRANSACTION +' + PRINT '' + + --#region print whole dyn sql + DECLARE @String NVARCHAR(MAX) = @q + DECLARE @CurrentEnd BIGINT; /* track the length of the next substring */ + DECLARE @offset tinyint; /*tracks the amount of offset needed */ + set @string = replace( replace(@string, char(13) + char(10), char(10)) , char(13), char(10)) + + WHILE LEN(@String) > 1 + BEGIN + IF CHARINDEX(CHAR(10), @String) between 1 AND 4000 + BEGIN + SET @CurrentEnd = CHARINDEX(char(10), @String) -1 + set @offset = 2 + END + ELSE + BEGIN + SET @CurrentEnd = 4000 + set @offset = 1 + END + PRINT SUBSTRING(@String, 1, @CurrentEnd) + set @string = SUBSTRING(@String, @CurrentEnd+@offset, LEN(@String)) + END /*End While loop*/ + --#endregion print whole dyn sql +END + +ROLLBACK TRANSACTION \ No newline at end of file diff --git a/MDDOC-878 - purge logdb/documedisLogs-cleanup-Documedis_ClinicalDecisionSupport_LogData.sql b/MDDOC-878 - purge logdb/documedisLogs-cleanup-Documedis_ClinicalDecisionSupport_LogData.sql index c84a243..e17e7c9 100644 --- a/MDDOC-878 - purge logdb/documedisLogs-cleanup-Documedis_ClinicalDecisionSupport_LogData.sql +++ b/MDDOC-878 - purge logdb/documedisLogs-cleanup-Documedis_ClinicalDecisionSupport_LogData.sql @@ -27,7 +27,7 @@ BEGIN SELECT TOP (@batch) [s].[DocumedisClinicalDecisionSupportLogData_PK] FROM [dbo].[Documedis_ClinicalDecisionSupport_LogData] [s] - WHERE [s].[LogDateTime] > @cutoff + WHERE [s].[LogDateTime] < @cutoff AND EXISTS( SELECT 1 FROM [archivedRowsJournal] [a] diff --git a/MDDOC-878 - purge logdb/documedisLogs-cleanup-documedisSecurityLogs.sql b/MDDOC-878 - purge logdb/documedisLogs-cleanup-documedisSecurityLogs.sql index 72e9655..56ccbbe 100644 --- a/MDDOC-878 - purge logdb/documedisLogs-cleanup-documedisSecurityLogs.sql +++ b/MDDOC-878 - purge logdb/documedisLogs-cleanup-documedisSecurityLogs.sql @@ -26,7 +26,7 @@ BEGIN SELECT TOP (@batch) [s].[DocumedisSecurityLogId] FROM [DocumedisSecurityLogs] [s] - WHERE [s].[LogDateTime] > @cutoff + WHERE [s].[LogDateTime] < @cutoff AND EXISTS( SELECT 1 FROM [archivedRowsJournal] [j] diff --git a/MDDOC-878 - purge logdb/documedisLogs-cleanup-documedis_vaccinationCheck_logData.sql b/MDDOC-878 - purge logdb/documedisLogs-cleanup-documedis_vaccinationCheck_logData.sql index 53a1cfa..992aa95 100644 --- a/MDDOC-878 - purge logdb/documedisLogs-cleanup-documedis_vaccinationCheck_logData.sql +++ b/MDDOC-878 - purge logdb/documedisLogs-cleanup-documedis_vaccinationCheck_logData.sql @@ -26,7 +26,7 @@ BEGIN SELECT TOP (@batch) [s].[DocumedisVaccinationCheckLogData_PK] FROM [dbo].[Documedis_VaccinationCheck_LogData] [s] - WHERE [s].[LogDateTime] > @cutoff + WHERE [s].[LogDateTime] < @cutoff AND EXISTS( SELECT 1 FROM [archivedRowsJournal] [a]