8
0

Maintain and add new SQL Procedures

This commit is contained in:
2025-03-05 09:06:56 +01:00
parent 6b3d9e010f
commit 97aa6cf5f8
7 changed files with 1565 additions and 65 deletions

View File

@@ -0,0 +1,207 @@
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
-- [PRDD_ENABLE_MEMORY_OPTIMIZED_SUPPORT]
-- =================================================================
-- Enable memory optimization to a specific database
-- Minimum requirement: MS SQL Server 2014
--
-- Returns: INT Value - 0 = Everything worked well
-- =================================================================
-- Copyright (c) 2025 by Digital Data GmbH
--
-- Digital Data GmbH • Ludwig-Rinn-Strasse 16 • D-35452 Heuchelheim
-- Tel.: 0641/202360 • E-Mail: info-flow@digitaldata.works
-- =================================================================
-- Creation Date / Author: 05.03.2025 / MK
-- Version Date / Editor: 05.03.2025 / MK
-- Version Number: 1.0.0.0
-- =================================================================
-- History:
-- 05.03.2025 / MK - First Version
CREATE OR ALTER PROCEDURE [dbo].[PRDD_ENABLE_MEMORY_OPTIMIZED_SUPPORT] (
@pDATABASE_NAME SYSNAME = 'DD_ECM', -- Give the db name on which the memory optimized feature should be enabled. Default and Failsafe is "DD_ECM".
@pELEVATE_TO_SNAPSHOT NVARCHAR(3) = 'ON' -- Set 'ON' or 'OFF'. See help text at the end of the file. Default is 'ON', Failsafe is 'unset'.
)
AS
BEGIN TRY
SET NOCOUNT ON;
-- declare new vars because of parameter sniffing
DECLARE @DATABASE_NAME SYSNAME = ISNULL(@pDATABASE_NAME,'DD_ECM'),
@ELEVATE_TO_SNAPSHOT NVARCHAR(3) = ISNULL(@pELEVATE_TO_SNAPSHOT,'unset');
-- declare runtime vars
DECLARE @MyProcedureName NVARCHAR(128) = OBJECT_NAME(@@PROCID);
DECLARE @IsSysAdmin TINYINT = 0,
@CompatibilityLevel SMALLINT = 0,
@Counter TINYINT = 0,
@MemoryOptimizedFileGroupName SYSNAME = CONCAT(@DATABASE_NAME,'_MOFG'),
@MemoryOptimizedFileName SYSNAME = CONCAT(@DATABASE_NAME,'_MOF'),
@MemoryOptimizedFilePath NVARCHAR(255) = NULL,
@SQLCommand NVARCHAR(500) = NULL,
@return_status NVARCHAR(50) = 0,
@return_status_text NVARCHAR(MAX) = 'START ' + @MyProcedureName + ' @ ' + CONVERT(varchar(50),GETDATE(),120),
@return_error_text NVARCHAR(MAX) = NULL;
PRINT '==============================='
PRINT 'PROCEDURE - ' + @return_status_text;
PRINT 'PARAMETER01 - @DATABASE_NAME: ' + CONVERT(NVARCHAR(200),@DATABASE_NAME);
PRINT 'PARAMETER02 - @ELEVATE_TO_SNAPSHOT: ' + CONVERT(NVARCHAR(200),@ELEVATE_TO_SNAPSHOT);
-- Check if the current user is a sysadmin
SET @IsSysAdmin = IS_SRVROLEMEMBER('sysadmin');
IF (@IsSysAdmin = 1) BEGIN
--===================================================-- Check requirements --====================================================--
-- Check the database compatibility level
SET @CompatibilityLevel = (SELECT [compatibility_level] FROM [sys].[databases] WHERE [name] = @DATABASE_NAME);
PRINT char(10) + 'The database compatibility level must be 120 (SQL Server 2014) or higher to use MEMORY_OPTIMIZED_DATA filegroup.';
PRINT 'The current level of the [' + @DATABASE_NAME + '] database is: ' + convert(varchar,@CompatibilityLevel);
-----------------------------------------------------------------------------------------------------------------------------------
-- Verify if compatibility level is 120 (SQL Server 2014) or higher
IF (@CompatibilityLevel >= 120) BEGIN
--======================================================-- Add filegroup --======================================================--
-- Check if MEMORY_OPTIMIZED_DATA filegroup already exists
SET @Counter = (SELECT COUNT(*)
FROM [sys].[filegroups]
WHERE [name] = @MemoryOptimizedFileGroupName);
IF (@Counter = 0) BEGIN
-- Add MEMORY_OPTIMIZED_DATA filegroup to the database
SET @SQLCommand = 'ALTER DATABASE [' + @DATABASE_NAME + '] ADD FILEGROUP [' + @MemoryOptimizedFileGroupName + '] CONTAINS MEMORY_OPTIMIZED_DATA;';
PRINT char(10) + 'Executing @SQLCommand for filegroup creation: ' + char(13) + @SQLCommand;
BEGIN TRY
EXEC(@SQLCommand);
PRINT 'Filegroup ' + @MemoryOptimizedFileGroupName + ' created successfully!';
END TRY
BEGIN CATCH
PRINT 'Filegroup cannot be created!';
RETURN;
END CATCH
END; ELSE BEGIN
PRINT char(10) + 'Filegroup ' + @MemoryOptimizedFileGroupName + ' already exists!';
END;
-----------------------------------------------------------------------------------------------------------------------------------
-- Determ current storage path of the mdf file, and use this path as default location for the memory optimized file
SET @MemoryOptimizedFilePath = (SELECT DISTINCT concat(LEFT(physical_name, LEN(physical_name) - CHARINDEX('\', REVERSE(physical_name)) + 1),@MemoryOptimizedFileName) AS 'File Location'
FROM [sys].[master_files]
WHERE [database_id] = DB_ID(@DATABASE_NAME) and [type_desc] = 'ROWS');
--==================================================-- Add file to filegroup --==================================================--
-- Check if the file already exists
SET @Counter = (SELECT COUNT(*)
FROM [sys].[master_files]
WHERE [name] = @MemoryOptimizedFileName
AND [physical_name] = @MemoryOptimizedFilePath);
IF (@Counter = 0) BEGIN
-- Add file to the MEMORY_OPTIMIZED_DATA filegroup
SET @SQLCommand = 'ALTER DATABASE [' + @DATABASE_NAME + '] ADD FILE ( NAME = [' + @MemoryOptimizedFileName + '],
FILENAME = N''' + @MemoryOptimizedFilePath + ''')
TO FILEGROUP [' + @MemoryOptimizedFileGroupName + '] ';
PRINT char(10) + 'Executing @SQLCommand for file creation: ' + char(13) + @SQLCommand;
BEGIN TRY
EXEC(@SQLCommand);
PRINT 'File ' + @MemoryOptimizedFileName + ' created successfully!';
END TRY
BEGIN CATCH
PRINT 'File cannot be created!';
RETURN;
END CATCH
END; ELSE BEGIN
PRINT char(10) + 'File ' + @MemoryOptimizedFileName + ' already exists!';
END;
-----------------------------------------------------------------------------------------------------------------------------------
--===================================================-- Change working mode --===================================================--
IF (@ELEVATE_TO_SNAPSHOT in ('ON','OFF')) BEGIN
SET @SQLCommand = 'ALTER DATABASE [' + @DATABASE_NAME + '] SET MEMORY_OPTIMIZED_ELEVATE_TO_SNAPSHOT ' + @ELEVATE_TO_SNAPSHOT + ';';
PRINT char(10) + 'Executing @SQLCommand to change working mode: ' + char(13) + @SQLCommand;
BEGIN TRY
EXEC(@SQLCommand);
PRINT 'Working mode "MEMORY_OPTIMIZED_ELEVATE_TO_SNAPSHOT" has been set to ' + @ELEVATE_TO_SNAPSHOT + '!';
END TRY
BEGIN CATCH
PRINT 'Working mode "MEMORY_OPTIMIZED_ELEVATE_TO_SNAPSHOT" cannot be set to ' + @ELEVATE_TO_SNAPSHOT + '!';
RETURN;
END CATCH
END; ELSE BEGIN
PRINT char(10) + 'Working mode "MEMORY_OPTIMIZED_ELEVATE_TO_SNAPSHOT" keeps untouched!';
END;
-----------------------------------------------------------------------------------------------------------------------------------
END; ELSE BEGIN
PRINT 'Cannot proceed!' + char(10) + 'Compatibility level does not fit!';
END;
END; ELSE BEGIN
PRINT 'Cannot proceed!' + char(10) + 'The current user must be a member of the sysadmin fixed server role to execute this script!';
END;
-----------------------------------------------------------------------------------------------------------------------------------
SET @return_status = 0;
SET @return_status_text = 'END ' + @MyProcedureName + ' @ ' + CONVERT(varchar(50),GETDATE(),120);
PRINT '';
PRINT 'PROCEDURE - ' + @return_status_text;
PRINT '===============================';
END TRY
BEGIN CATCH
--======================================================-- Output result --======================================================--
SET @return_status = 1;
SET @return_status_text = 'END ' + @MyProcedureName + ' @ ' + CONVERT(varchar(50),GETDATE(),120);
SET @return_error_text = 'ERROR MESSAGE: ' + CONVERT(VARCHAR(500),ERROR_MESSAGE());
PRINT '';
PRINT 'ERROR IN PROCEDURE: ' + @MyProcedureName;
PRINT @return_error_text;
PRINT '';
PRINT 'PROCEDURE - ' + @return_status_text;
PRINT '===============================';
-----------------------------------------------------------------------------------------------------------------------------------
RETURN @return_status;
END CATCH
GO
-- German help text for "@pELEVATE_TO_SNAPSHOT":
-- Der Befehl ALTER DATABASE SET MEMORY_OPTIMIZED_ELEVATE_TO_SNAPSHOT ON wird in SQL Server verwendet, um die Funktion Memory-Optimized Elevate to Snapshot Isolation zu aktivieren. Dies bedeutet, dass Transaktionen, die speicheroptimierte Tabellen verwenden, standardmäßig das Snapshot-Isolationslevel nutzen, selbst wenn sie ohne explizite Angabe eines Isolationslevels gestartet werden.
-- Das Isolationslevel "Snapshot" ermöglicht es, Daten zu lesen, ohne dabei Schreibvorgänge von anderen Transaktionen zu blockieren, und es sorgt dafür, dass jede Transaktion eine konsistente Ansicht der Daten zum Zeitpunkt ihres Beginns erhält.
-- Vorteile:
-- Automatische Snapshot-Isolation: Transaktionen, die speicheroptimierte Tabellen verwenden, profitieren direkt von der Snapshot-Isolation, ohne dass dies explizit festgelegt werden muss. Das kann Fehler vermeiden und den Entwicklungsprozess vereinfachen.
-- Konsistente Datenansicht: Die Snapshot-Isolation ermöglicht es, Daten zu lesen, ohne andere Schreibvorgänge zu blockieren. Das verbessert die Parallelität und reduziert Deadlocks.
-- Geeignet für leselastige Anwendungen: Anwendungen, die viele Lesevorgänge durchführen und keine strengen Anforderungen an die Konsistenz von Schreibvorgängen stellen, können hiervon profitieren.
-- Nachteile:
-- Speicherverbrauch: Da die Snapshot-Isolation auf Versionierung basiert, kann es zu einem höheren Speicherverbrauch kommen, vor allem bei vielen parallelen Transaktionen oder großen Datenmengen.
-- Komplexität bei Schreiblasten: Bei stark schreibintensiven Anwendungen kann die Snapshot-Isolation möglicherweise zu Konflikten führen, da Änderungen zu einem Konfliktfehler führen, wenn zwei Transaktionen denselben Datensatz gleichzeitig ändern.
-- Eventuelle Performanceeinbußen: In bestimmten Szenarien könnten zusätzliche Abfragen zur Versionierung die Performance leicht beeinträchtigen.
-- Empfehlung:
-- Für leselastige, speicheroptimierte Anwendungen kann dies eine gute Option sein.
-- Wenn deine Anwendung stark schreibintensiv ist oder spezifische Isolationseinstellungen erfordert, solltest du die Auswirkungen dieser Einstellung genauer testen.