8
0

The complete folder structure has been changed or updated

This commit is contained in:
2025-09-19 18:24:40 +02:00
parent 796473a8c9
commit 1f0d1613a5
216 changed files with 330971 additions and 809 deletions

View File

@@ -0,0 +1,107 @@
*/5 7-20 * * 1-5
/*#####################################
### Suche in aktueller Datenbank #
### um Suchbegriff zu finden ###
#######################################*/
DECLARE @SEARCHVALUE NVARCHAR(250)
-- Den Suchbegriff festlegen
SELECT @SEARCHVALUE = 'Sent'
SELECT type, *
FROM master.sys.objects
WHERE OBJECT_DEFINITION(object_id) LIKE '%'+ @SEARCHVALUE + '%'
ORDER BY name;
SELECT
ROUTINE_NAME, ROUTINE_DEFINITION
FROM INFORMATION_SCHEMA.ROUTINES
WHERE ROUTINE_DEFINITION LIKE '%windream60%'
[NTSERP\NTSSUITE].[NTSsuite2015].[dbo]
[NTSTEST\NTSSUITE].[NTSsuite_Test].[dbo]
--- wd rechte funktion
DECLARE @OBJ_NAME VARCHAR(50)
SET @OBJ_NAME = 'DEV'
SELECT 'DD_ECM' as DB, [type], [name], modify_date, create_date
FROM DD_ECM.sys.objects
WHERE type in ('FN','P', 'TF', 'V', 'TR')
AND [name] LIKE '%' + @OBJ_NAME + '%'
UNION
SELECT 'IDB' as DB, [type], [name], modify_date, create_date
FROM IDB.sys.objects
WHERE type in ('FN','P', 'TF', 'V', 'TR')
AND [name] LIKE '%' + @OBJ_NAME + '%'
UNION
SELECT 'DD_ECM_REF' as DB, [type], [name], modify_date, create_date
FROM DD_ECM_REF.sys.objects
WHERE type in ('FN','P', 'TF', 'V', 'TR')
AND [name] LIKE '%' + @OBJ_NAME + '%'
ORDER BY modify_date DESC
DECLARE @OldServerName NVARCHAR(MAX) = 'windream60';
DECLARE @NewServerName NVARCHAR(MAX) = 'windreamDB';
DECLARE @sql NVARCHAR(MAX) = N'';
SELECT @sql = @sql + N'
UPDATE ' + QUOTENAME(SCHEMA_NAME(t.schema_id)) + '.' + QUOTENAME(t.name) + '
SET ' + QUOTENAME(c.name) + ' = REPLACE(' + QUOTENAME(c.name) + ', @OldServerName, @NewServerName)
WHERE ' + QUOTENAME(c.name) + ' LIKE ''%' + @OldServerName + '%'';'
FROM sys.tables AS t
JOIN sys.columns AS c ON t.object_id = c.object_id
JOIN sys.types AS ty ON c.user_type_id = ty.user_type_id
WHERE ty.name IN (N'nvarchar', N'varchar', N'char', N'nchar');
EXEC sp_executesql @sql, N'@OldServerName NVARCHAR(MAX), @NewServerName NVARCHAR(MAX)', @OldServerName, @NewServerName;
DECLARE @SearchTerm NVARCHAR(MAX) = 'vhm-digitaldata';
DECLARE @sql NVARCHAR(MAX) = N'';
SELECT @sql = @sql + N'
SELECT ''' + QUOTENAME(SCHEMA_NAME(t.schema_id)) + '.' + QUOTENAME(t.name) + ''' AS TableName, ''' + QUOTENAME(c.name) + ''' AS ColumnName
FROM ' + QUOTENAME(SCHEMA_NAME(t.schema_id)) + '.' + QUOTENAME(t.name) + '
WHERE ' + QUOTENAME(c.name) + ' LIKE ''%' + @SearchTerm + '%'';'
FROM sys.tables AS t
JOIN sys.columns AS c ON t.object_id = c.object_id
JOIN sys.types AS ty ON c.user_type_id = ty.user_type_id
WHERE ty.name IN (N'nvarchar', N'varchar', N'char', N'nchar');
EXEC sp_executesql @sql, N'@SearchTerm NVARCHAR(MAX)', @SearchTerm;

View File

@@ -0,0 +1,699 @@
USE [DD_SYS]
GO
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
-- [PRDD_BACKUP_DATABASES]
-- =================================================================
-- Saving database to LOCAL (!!) backup folder
-- Minimum requirement: MS SQL Server 2016
--
-- 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: 13.12.2024 / MK
-- Version Date / Editor: 30.05.2025 / MK
-- Version Number: 1.2.0.1
-- =================================================================
-- History:
-- 13.12.2024 / MK - First Version
-- 28.05.2025 / MP - Missing variables declared
-- 30.05.2025 / MK - Minor corrections
CREATE OR ALTER PROCEDURE [dbo].[PRDD_BACKUP_DATABASES] (
@pCOMPRESSION BIT = 0, -- Set to 1 to compress the database backup file (This option is not available in SQL Express Versions!). Otherwise set to 0.
@pSHRINKLOG BIT = 1, -- Set to 1 to shrink the log file after backup. Otherwise set to 0.
@pLOCALBACKUPPATH NVARCHAR(200) = 'F:\Sicherung', -- Set the LOCAL Backup path. If path doesnt exist, it will be created.
@pSUBDIRECTORY NVARCHAR(50) = 'Date_YYYYMMDD', -- Set 'Date_YYYYMMDD' (which is Failsafe) for a backup subdir like '\path\20241213'. Every other value will used a static subdirectory name for creation.
@pFORCE BIT = 0, -- Set to 1 to force the shrinking, it will cut all current sessens. In combination with @pCHECKDB it trys the soft reapair dbs. Otherwise set to 0.
@pINCLUDEDB NVARCHAR(1000) = 'DD_ECM', -- Set a list of included databases. IF <> NULL, it will override the @pEXCLUDEDB Parameter.
@pEXCLUDEDB NVARCHAR(1000) = 'master,model,msdb,tempdb', -- Set a list of exluded databases. Default exclusen are the system databases.
@pLOGLEVEL NVARCHAR(25) = 'ERROR' -- Set to 'INFO','WARN' OR 'ERROR' (or NULL to disable), logging to table: [TBDD_BACKUP_DATABASES_LOG].
-- 'INFO' includes Infos, Warnings and Errors, 'WARN' only warnings and Errors and 'ERROR' only Errors.
)
AS
BEGIN
SET NOCOUNT ON;
-- declare new vars because of parameter sniffing
DECLARE @COMPRESSION BIT = ISNULL(@pCOMPRESSION,0),
@SHRINKLOG BIT = ISNULL(@pSHRINKLOG,1),
@LOCALBACKUPPATH NVARCHAR(255) = LTRIM(RTRIM(ISNULL(@pLOCALBACKUPPATH,''))),
@SUBDIRECTORY NVARCHAR(50) = LTRIM(RTRIM(ISNULL(@pSUBDIRECTORY,'Date_YYYYMMDD'))),
@FORCE BIT = ISNULL(@pFORCE,0),
@INCLUDEDB NVARCHAR(1000) = LTRIM(RTRIM(ISNULL(@pINCLUDEDB,DB_NAME()))),
@EXCLUDEDB NVARCHAR(1000) = LTRIM(RTRIM(ISNULL(@pEXCLUDEDB,'master,model,msdb,tempdb'))),
@LOGLEVEL NVARCHAR(25) = LTRIM(RTRIM(ISNULL(@pLOGLEVEL,'ERROR')));
-- declare runtime vars
DECLARE @MyProcedureName NVARCHAR(128) = OBJECT_NAME(@@PROCID);
DECLARE @DBName NVARCHAR(100),
@DBNameCount INT,
@LogFileName NVARCHAR(100),
@FULLLOCALBACKUPPATH NVARCHAR(255),
@CurrentLogFileSizeInMB INT,
@MinimumLogFileSizeInMB INT,
@MaximumLogFileSizeInMB INT,
@TargetLogFileSizeInMB INT,
@ProductVersion sql_variant,
@ProductMainVersion INT,
@ProductLevel sql_variant,
@ProductEdition sql_variant,
@ProductEditionSimpleString NVARCHAR(50),
@MySessionID NVARCHAR(50) = @@SPID,
@Date_YYYYMMDD NVARCHAR(20) = CONVERT(NVARCHAR(20),GETDATE(),112),
@sysconfigurations INT = 0,
@SQLCommand NVARCHAR(1000) = NULL,
@CMDCommand NVARCHAR(1000) = NULL,
@CMDCommandResult INT = 0,
@return_status NVARCHAR(50) = 0,
@return_status_text NVARCHAR(MAX) = 'START ' + @MyProcedureName + ' @ ' + CONVERT(NVARCHAR(50),GETDATE(),120);
PRINT '==============================='
PRINT 'PROCEDURE - ' + @return_status_text;
PRINT 'PARAMETER01 - @COMPRESSION: ' + CONVERT(NVARCHAR(1),@COMPRESSION);
PRINT 'PARAMETER02 - @SHRINKLOG: ' + CONVERT(NVARCHAR(1),@SHRINKLOG);
PRINT 'PARAMETER03 - @LOCALBACKUPPATH: ' + CONVERT(NVARCHAR(50),@LOCALBACKUPPATH);
PRINT 'PARAMETER04 - @SUBDIRECTORY: ' + CONVERT(NVARCHAR(1),@SUBDIRECTORY);
PRINT 'PARAMETER05 - @FORCE: ' + CONVERT(NVARCHAR(1),@FORCE);
PRINT 'PARAMETER06 - @INCLUDEDB: ' + CONVERT(NVARCHAR(1000),@INCLUDEDB);
PRINT 'PARAMETER07 - @EXCLUDEDB: ' + CONVERT(NVARCHAR(1000),@EXCLUDEDB);
PRINT 'PARAMETER08 - @LOGLEVEL: ' + CONVERT(NVARCHAR(25),@LOGLEVEL);
--=================================================-- Get server infos --==================================================--
SELECT @ProductVersion = SERVERPROPERTY('productversion'), @ProductLevel = SERVERPROPERTY ('productlevel'), @ProductEdition = SERVERPROPERTY ('edition');
SET @ProductMainVersion = ISNULL(LEFT(convert(NVARCHAR(100),@ProductVersion), CHARINDEX('.', convert(NVARCHAR(100),@ProductVersion)) - 1),0);
PRINT '';
PRINT 'Informations about this Server:';
PRINT '@MySessionID: ' + CONVERT(NVARCHAR(100),@MySessionID);
PRINT '@ProductVersion: ' + CONVERT(NVARCHAR(100),@ProductVersion);
PRINT '@ProductMainVersion: ' + CONVERT(NVARCHAR(100),@ProductMainVersion);
PRINT '@ProductLevel: ' + CONVERT(NVARCHAR(100),@ProductLevel);
PRINT '@ProductEdition: ' + CONVERT(NVARCHAR(100),@ProductEdition);
-----------------------------------------------------------------------------------------------------------------------------
--==============================================-- Prepare the log table --================================================--
IF (@LOGLEVEL is not NULL) BEGIN
PRINT '';
IF EXISTS (SELECT * FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_NAME = N'TBDD_BACKUP_DATABASES_LOG') BEGIN
PRINT 'Log table already exists';
END; ELSE BEGIN
PRINT 'Log table does not exists, trying to create...';
CREATE TABLE [dbo].[TBDD_BACKUP_DATABASES_LOG](
[GUID] [bigint] IDENTITY(1,1) NOT NULL,
[LOG_LEVEL] [varchar](25) NOT NULL,
[MESSAGE1] [varchar](max) NOT NULL,
[MESSAGE2] [varchar](max) NULL,
[MESSAGE3] [varchar](max) NULL,
[MESSAGE4] [varchar](max) NULL,
[MESSAGE5] [varchar](max) NULL,
[COMMENT] [varchar](max) NULL,
[ADDED_WHO] [varchar](50) NOT NULL,
[ADDED_WHEN] [datetime] NOT NULL,
CONSTRAINT [PK_TBDD_BACKUP_DATABASES_LOG] PRIMARY KEY CLUSTERED
(
[GUID] 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];
ALTER TABLE [dbo].[TBDD_BACKUP_DATABASES_LOG] ADD CONSTRAINT [DF_TBDD_BACKUP_DATABASES_LOG_ADDED_WHO] DEFAULT ('DEFAULT') FOR [ADDED_WHO];
ALTER TABLE [dbo].[TBDD_BACKUP_DATABASES_LOG] ADD CONSTRAINT [DF_TBDD_BACKUP_DATABASES_LOG_ADDED_WHEN] DEFAULT (getdate()) FOR [ADDED_WHEN];
END;
END; ELSE BEGIN
PRINT '';
PRINT 'Skipping Logging to log table!';
END;
-----------------------------------------------------------------------------------------------------------------------------
--===============================================-- Log start to table --=================================================--
IF ((@LOGLEVEL in ('INFO')) and (@return_status is not null) and (@return_status_text is not null)) BEGIN
IF EXISTS (SELECT * FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_NAME = N'TBDD_BACKUP_DATABASES_LOG') BEGIN
INSERT INTO [TBDD_BACKUP_DATABASES_LOG]([LOG_LEVEL],[MESSAGE1], [MESSAGE2], [MESSAGE3], [MESSAGE4], [ADDED_WHO], [ADDED_WHEN])
VALUES (@LOGLEVEL,'preparing', 'procedure', @return_status, @return_status_text, @MyProcedureName, GetDate());
END;
END;
-----------------------------------------------------------------------------------------------------------------------------
--================================================-- Check sql edition --=================================================--
IF (CONVERT(NVARCHAR(100),@ProductEdition) like '%express%') BEGIN
SET @return_status_text = 'This is an Express Version of the SQL Server, so backup COMPRESSION is not available!';
SET @ProductEditionSimpleString = 'Express';
END; ELSE BEGIN
SET @return_status_text = 'This is not an Express Version of the SQL Server, so backup COMPRESSION is available!';
SET @ProductEditionSimpleString = 'Standard/Datacenter';
END;
-----------------------------------------------------------------------------------------------------------------------------
--===================================================-- Log to table --====================================================--
IF ((@LOGLEVEL in ('INFO')) and (@return_status is not null) and (@return_status_text is not null)) BEGIN
IF EXISTS (SELECT * FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_NAME = N'TBDD_BACKUP_DATABASES_LOG') BEGIN
INSERT INTO [TBDD_BACKUP_DATABASES_LOG]([LOG_LEVEL],[MESSAGE1], [MESSAGE2], [MESSAGE3], [MESSAGE4], [ADDED_WHO], [ADDED_WHEN])
VALUES (@LOGLEVEL,'preparing', 'procedure', @return_status, 'Found SQL Edition: ' + @ProductEditionSimpleString, @MyProcedureName, GetDate());
END;
END;
-----------------------------------------------------------------------------------------------------------------------------
--=============================================-- Get the dbs for the loop --==============================================--
-- Create a temporary table to hold the table names
CREATE TABLE #DBList (DBName NVARCHAR(256));
IF (@ProductMainVersion >= 13) BEGIN
IF (@INCLUDEDB is not NULL) BEGIN
INSERT INTO #DBList(DBName)
SELECT [name] as 'DBName'
FROM [master].[sys].[databases]
WHERE [name] IN (SELECT [value] FROM STRING_SPLIT(@INCLUDEDB, ',')) -- include these databases
AND [state] = 0 -- database is online
AND [is_in_standby] = 0; -- database is not read only for log shipping
END; ELSE BEGIN
INSERT INTO #DBList(DBName)
SELECT [name] as 'DBName'
FROM [master].[sys].[databases]
WHERE [name] NOT IN (SELECT [value] FROM STRING_SPLIT(@EXCLUDEDB, ',')) -- exclude these databases
AND [state] = 0 -- database is online
AND [is_in_standby] = 0; -- database is not read only for log shipping
END;
END; ELSE BEGIN
PRINT 'Because of the SQL Version only one DB can be processed!'
INSERT INTO #DBList(DBName)
SELECT [name] as 'DBName'
FROM [master].[sys].[databases]
WHERE [name] = @INCLUDEDB -- use only this database
AND [state] = 0 -- database is online
AND [is_in_standby] = 0; -- database is not read only for log shipping
END;
SELECT @DBNameCount = COUNT(*) FROM #DBList;
-----------------------------------------------------------------------------------------------------------------------------
SET @return_status_text = 'Found ' + convert(NVARCHAR,@DBNameCount) + ' database(s) to process!';
PRINT @return_status_text;
--===============================================-- Log result to table --=================================================--
IF (@LOGLEVEL in ('INFO','WARN')) BEGIN
IF EXISTS (SELECT * FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_NAME = N'TBDD_BACKUP_DATABASES_LOG') BEGIN
INSERT INTO [TBDD_BACKUP_DATABASES_LOG]([LOG_LEVEL],[MESSAGE1], [MESSAGE2], [MESSAGE3], [MESSAGE4], [ADDED_WHO], [ADDED_WHEN])
VALUES (@LOGLEVEL, 'db_list', 'count', @return_status, @return_status_text, @MyProcedureName, GetDate());
END;
END;
-----------------------------------------------------------------------------------------------------------------------------
--==========================================-- Create the main loop (cursor) --============================================--
IF (@DBNameCount > 0) BEGIN
IF LEN(@LOCALBACKUPPATH) > 0 and (@LOCALBACKUPPATH like '%\%') BEGIN
--==========================================-- Checking system configuration --============================================--
PRINT 'Checking system configuration';
SELECT @sysconfigurations = SUM(CAST([value] AS INT))
FROM [master].[sys].[configurations]
WHERE [name] in ('show advanced options','Ole Automation Procedures','xp_cmdshell');
If (@sysconfigurations = 3) BEGIN
SET @return_status = 0;
SET @return_status_text = 'System configuration does fit! (' + CONVERT(NVARCHAR,@sysconfigurations) + ')';
PRINT @return_status_text;
END; ELSE BEGIN
PRINT 'System configuration does NOT fit! Try to reconfigure... (' + CONVERT(NVARCHAR,@sysconfigurations) + ')';
EXEC sp_configure 'show advanced options', 1;
RECONFIGURE WITH OVERRIDE;
EXEC sp_configure 'Ole Automation Procedures', 1;
RECONFIGURE WITH OVERRIDE;
EXEC sp_configure 'xp_cmdshell', 1;
RECONFIGURE WITH OVERRIDE;
-- Check again
SELECT @sysconfigurations = SUM(CAST(value AS INT))
FROM [master].[sys].[configurations]
WHERE [name] in ('show advanced options','Ole Automation Procedures','xp_cmdshell');
If (@sysconfigurations = 3) BEGIN
SET @return_status = 0;
SET @return_status_text = 'System configuration does fit, now! (' + CONVERT(NVARCHAR,@sysconfigurations) + ')';
PRINT @return_status_text;
END; ELSE BEGIN
SET @return_status = 1;
SET @return_status_text = 'System configuration does NOT fit! (' + CONVERT(NVARCHAR,@sysconfigurations) + ')';
PRINT @return_status_text;
END;
END;
-----------------------------------------------------------------------------------------------------------------------------
--===============================================-- Log result to table --=================================================--
IF (@LOGLEVEL in ('INFO','WARN')) BEGIN
IF EXISTS (SELECT * FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_NAME = N'TBDD_BACKUP_DATABASES_LOG') BEGIN
INSERT INTO [TBDD_BACKUP_DATABASES_LOG]([LOG_LEVEL],[MESSAGE1], [MESSAGE2], [MESSAGE3], [MESSAGE4], [ADDED_WHO], [ADDED_WHEN])
VALUES (@LOGLEVEL, 'server_check', 'filesystem_config',@return_status, @return_status_text, @MyProcedureName, GetDate());
END;
END;
-----------------------------------------------------------------------------------------------------------------------------
If (@return_status = 0) BEGIN
DECLARE db_cursor CURSOR STATIC LOCAL FOR
SELECT [DBName] as 'DBName' FROM #DBList;
OPEN db_cursor
FETCH NEXT FROM db_cursor INTO @DBName
WHILE @@FETCH_STATUS = 0 BEGIN
BEGIN TRY
PRINT ' ';
PRINT '-------------------------------';
PRINT 'Now processing: ' + CONVERT(NVARCHAR(100),@DBName);
--==============================================-- Preparing backup path --================================================--
-- Chekc if base path exits
SET @CMDCommand = 'IF EXIST "' + @LOCALBACKUPPATH + '" (echo 1) ELSE (echo 0)';
CREATE TABLE #CMDCommandResult (Output NVARCHAR(255));
INSERT INTO #CMDCommandResult (Output)
EXEC xp_cmdshell @CMDCommand;
SELECT @CMDCommandResult = CAST(Output AS INT) FROM #CMDCommandResult WHERE Output IS NOT NULL;
DROP TABLE #CMDCommandResult;
IF (@CMDCommandResult = 1) BEGIN
SET @return_status = 0;
SET @return_status_text = 'Directory (' + @LOCALBACKUPPATH + ') does exist!';
PRINT @return_status_text;
--===============================================-- Log result to table --=================================================--
IF ((@LOGLEVEL in ('INFO','WARN')) and (@return_status is not null) and (@return_status_text is not null)) BEGIN
IF EXISTS (SELECT * FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_NAME = N'TBDD_BACKUP_DATABASES_LOG') BEGIN
INSERT INTO [TBDD_BACKUP_DATABASES_LOG]([LOG_LEVEL],[MESSAGE1], [MESSAGE2], [MESSAGE3], [MESSAGE4], [ADDED_WHO], [ADDED_WHEN])
VALUES (@LOGLEVEL, 'db_cursor', @DBName, @return_status, @return_status_text, @MyProcedureName, GetDate());
END;
END;
-----------------------------------------------------------------------------------------------------------------------------
IF (@SUBDIRECTORY like '%Date_YYYYMMDD%') BEGIN
SELECT @FULLLOCALBACKUPPATH = @LOCALBACKUPPATH + '\' + @Date_YYYYMMDD + '\';
END; ELSE IF (LEN(@SUBDIRECTORY) >= 1) BEGIN
SELECT @FULLLOCALBACKUPPATH = @LOCALBACKUPPATH + '\' + @SUBDIRECTORY + '\';
END; ELSE BEGIN
SELECT @FULLLOCALBACKUPPATH = @LOCALBACKUPPATH + '\';
END;
SET @FULLLOCALBACKUPPATH = REPLACE(@FULLLOCALBACKUPPATH,'\\','\');
PRINT 'Final backup path set: ' + @FULLLOCALBACKUPPATH;
EXECUTE @return_status = master.dbo.xp_create_subdir @FULLLOCALBACKUPPATH;
IF (@return_status = 0) BEGIN
SET @return_status_text = 'Creating database backup path successfully completed!';
PRINT @return_status_text;
END; ELSE BEGIN
SET @return_status_text = 'Creating database backup path returns warnings or has failed, check the access rights!';
PRINT @return_status_text;
END;
--===============================================-- Log result to table --=================================================--
IF ((@LOGLEVEL in ('INFO','WARN')) and (@return_status is not null) and (@return_status_text is not null)) BEGIN
IF EXISTS (SELECT * FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_NAME = N'TBDD_BACKUP_DATABASES_LOG') BEGIN
INSERT INTO [TBDD_BACKUP_DATABASES_LOG]([LOG_LEVEL],[MESSAGE1], [MESSAGE2], [MESSAGE3], [MESSAGE4], [ADDED_WHO], [ADDED_WHEN])
VALUES (@LOGLEVEL, 'db_cursor', @DBName, @return_status, @return_status_text, @MyProcedureName, GetDate());
END;
END;
-----------------------------------------------------------------------------------------------------------------------------
IF (@return_status = 0) BEGIN
SET @FULLLOCALBACKUPPATH += @DBName + '.BAK';
SET @return_status_text = 'Starting backup to: ' + @FULLLOCALBACKUPPATH;
PRINT @return_status_text;
--===============================================-- Log result to table --=================================================--
IF ((@LOGLEVEL in ('INFO','WARN')) and (@return_status is not null) and (@return_status_text is not null)) BEGIN
IF EXISTS (SELECT * FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_NAME = N'TBDD_BACKUP_DATABASES_LOG') BEGIN
INSERT INTO [TBDD_BACKUP_DATABASES_LOG]([LOG_LEVEL],[MESSAGE1], [MESSAGE2], [MESSAGE3], [MESSAGE4], [ADDED_WHO], [ADDED_WHEN])
VALUES (@LOGLEVEL, 'db_cursor', @DBName, @return_status, @return_status_text, @MyProcedureName, GetDate());
END;
END;
-----------------------------------------------------------------------------------------------------------------------------
IF (@ProductEditionSimpleString = 'Express') BEGIN
SET @SQLCommand = 'BACKUP DATABASE [' + @DBName + '] TO DISK = ''' + @FULLLOCALBACKUPPATH + ''' WITH FORMAT, CHECKSUM;';
END; ELSE BEGIN
SET @SQLCommand = 'BACKUP DATABASE [' + @DBName + '] TO DISK = ''' + @FULLLOCALBACKUPPATH + ''' WITH FORMAT, COMPRESSION, CHECKSUM;';
END;
--===============================================-- Log result to table --=================================================--
IF ((@LOGLEVEL in ('INFO','WARN')) and (@return_status is not null) and (@return_status_text is not null)) BEGIN
IF EXISTS (SELECT * FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_NAME = N'TBDD_BACKUP_DATABASES_LOG') BEGIN
INSERT INTO [TBDD_BACKUP_DATABASES_LOG]([LOG_LEVEL],[MESSAGE1], [MESSAGE2], [MESSAGE3], [MESSAGE4], [ADDED_WHO], [ADDED_WHEN])
VALUES (@LOGLEVEL, 'db_cursor', @DBName, @return_status, @SQLCommand, @MyProcedureName, GetDate());
END;
END;
-----------------------------------------------------------------------------------------------------------------------------
BEGIN TRY
EXEC sp_executesql @SQLCommand;
SET @return_status = 0;
SET @return_status_text = 'Backup successful!';
END TRY
BEGIN CATCH
-- Handle any errors that occur during the process.
SELECT ERROR_MESSAGE() AS ErrorMessage;
SET @return_status = 1;
SET @return_status_text = 'Backup failed!';
END CATCH;
--===============================================-- Log result to table --=================================================--
IF ((@LOGLEVEL in ('INFO','WARN')) and (@return_status is not null) and (@return_status_text is not null)) BEGIN
IF EXISTS (SELECT * FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_NAME = N'TBDD_BACKUP_DATABASES_LOG') BEGIN
INSERT INTO [TBDD_BACKUP_DATABASES_LOG]([LOG_LEVEL],[MESSAGE1], [MESSAGE2], [MESSAGE3], [MESSAGE4], [ADDED_WHO], [ADDED_WHEN])
VALUES (@LOGLEVEL, 'db_cursor', @DBName, @return_status, @return_status_text, @MyProcedureName, GetDate());
END;
END;
-----------------------------------------------------------------------------------------------------------------------------
--============================================-- Prepare shrinking the log--===============================================--
IF (@SHRINKLOG = 1) BEGIN
--===========================================-- Get infos about the log file --============================================--
PRINT 'Get the current and minimum size of the log file in MB.';
SET @SQLCommand = N'SELECT TOP 1 @LogFileName = [name], @CurrentLogFileSizeInMB = ([size] / 128), @MinimumLogFileSizeInMB = ([growth] / 128), @MaximumLogFileSizeInMB = ([max_size] / 128)
FROM [master].[sys].[master_files] (NOLOCK)
WHERE [database_id] = DB_ID(''' + @DBName + ''') AND [STATE_DESC] = ''ONLINE'' AND [type_desc] = ''LOG''';
EXEC @return_status = sp_executesql @SQLCommand, N'@LogFileName VARCHAR(100) OUTPUT, @CurrentLogFileSizeInMB INT OUTPUT, @MinimumLogFileSizeInMB INT OUTPUT, @MaximumLogFileSizeInMB INT OUTPUT',
@LogFileName OUTPUT, @CurrentLogFileSizeInMB OUTPUT, @MinimumLogFileSizeInMB OUTPUT, @MaximumLogFileSizeInMB OUTPUT;
IF ((@LOGLEVEL in ('INFO')) and (@return_status = 0)) BEGIN
SET @return_status_text = 'Getting log file settings was successfully completed!';
PRINT @return_status_text;
END; ELSE IF ((@LOGLEVEL in ('WARN')) and (@return_status <> 0)) BEGIN
SET @return_status_text = 'Getting log file settings returns warnings or has failed, check the ID!';
PRINT @return_status_text;
END;
-----------------------------------------------------------------------------------------------------------------------------
--===============================================-- Log result to table --=================================================--
IF ((@LOGLEVEL in ('INFO','WARN')) and (@return_status is not null) and (@return_status_text is not null)) BEGIN
IF EXISTS (SELECT * FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_NAME = N'TBDD_MAINTAIN_DATABASES_LOG') BEGIN
INSERT INTO [TBDD_MAINTAIN_DATABASES_LOG]([LOG_LEVEL],[MESSAGE1], [MESSAGE2], [MESSAGE3], [MESSAGE4], [ADDED_WHO], [ADDED_WHEN])
VALUES (@LOGLEVEL, 'db_cursor', @DBName, @return_status, @return_status_text, @MyProcedureName, GetDate());
END;
END;
-----------------------------------------------------------------------------------------------------------------------------
--===========================================-- Calculate target file size --==============================================--
PRINT 'The @CurrentLogFileSizeInMB is: ' + CONVERT(NVARCHAR(1000),@CurrentLogFileSizeInMB);
PRINT 'The @MinimumLogFileSizeInMB is: ' + CONVERT(NVARCHAR(1000),@MinimumLogFileSizeInMB);
PRINT 'The @MaximumLogFileSizeInMB is: ' + CONVERT(NVARCHAR(1000),@MaximumLogFileSizeInMB);
SET @TargetLogFileSizeInMB = CASE WHEN (@MinimumLogFileSizeInMB < @CurrentLogFileSizeInMB) AND (@MinimumLogFileSizeInMB < @MaximumLogFileSizeInMB)
THEN @MinimumLogFileSizeInMB
ELSE @CurrentLogFileSizeInMB
END;
PRINT 'The @TargetLogFileSizeInMB is: ' + CONVERT(NVARCHAR(1000),@TargetLogFileSizeInMB);
-----------------------------------------------------------------------------------------------------------------------------
--=================================================-- Schrink db logs --===================================================--
IF (@CurrentLogFileSizeInMB > @TargetLogFileSizeInMB) BEGIN
--=============================================-- Change db recovery mode --===============================================--
PRINT 'Truncating the log needs to change the database recovery model to SIMPLE.';
SET @SQLCommand = N'ALTER DATABASE [' + @DBName + '] SET RECOVERY SIMPLE';
EXEC @return_status = sp_executesql @SQLCommand;
IF ((@LOGLEVEL in ('INFO')) and (@return_status = 0)) BEGIN
SET @return_status_text = 'Setting database to the simple recovery model was successfully completed!';
PRINT @return_status_text;
END; ELSE IF ((@LOGLEVEL in ('WARN')) and (@return_status <> 0)) BEGIN
SET @return_status_text = 'Setting database to the simple recovery model returns warnings or has failed, check the ID!';
PRINT @return_status_text;
END;
-----------------------------------------------------------------------------------------------------------------------------
--===============================================-- Log result to table --=================================================--
IF ((@LOGLEVEL in ('INFO','WARN')) and (@return_status is not null) and (@return_status_text is not null)) BEGIN
IF EXISTS (SELECT * FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_NAME = N'TBDD_MAINTAIN_DATABASES_LOG') BEGIN
INSERT INTO [TBDD_MAINTAIN_DATABASES_LOG]([LOG_LEVEL],[MESSAGE1], [MESSAGE2], [MESSAGE3], [MESSAGE4], [ADDED_WHO], [ADDED_WHEN])
VALUES (@LOGLEVEL, 'db_cursor', @DBName, @return_status, @return_status_text, @MyProcedureName, GetDate());
END;
END;
-----------------------------------------------------------------------------------------------------------------------------
--===================================================-- Now, do it! --=====================================================--
IF (@return_status = 0) BEGIN
PRINT 'Shrink the truncated log file to 10% of its current size or the minimum size, whichever is larger.';
IF (@ProductMainVersion >= 16) BEGIN
IF (@FORCE = 1) BEGIN
SET @SQLCommand = N'USE [' + @DBName + ']; DBCC SHRINKFILE (''' + @LogFileName + ''', ' + CAST(@TargetLogFileSizeInMB AS VARCHAR) + ') WITH WAIT_AT_LOW_PRIORITY (ABORT_AFTER_WAIT = BLOCKERS), NO_INFOMSGS;';
END; ELSE BEGIN
SET @SQLCommand = N'USE [' + @DBName + ']; DBCC SHRINKFILE (''' + @LogFileName + ''', ' + CAST(@TargetLogFileSizeInMB AS VARCHAR) + ') WITH WAIT_AT_LOW_PRIORITY (ABORT_AFTER_WAIT = SELF), NO_INFOMSGS;';
END;
END; ELSE BEGIN
PRINT 'Because of the sql server version, DBCC SHRINKFILE is not applicable with the FORCE parameter!';
SET @SQLCommand = N'USE [' + @DBName + ']; DBCC SHRINKFILE (''' + @LogFileName + ''', ' + CAST(@TargetLogFileSizeInMB AS VARCHAR) + ') WITH NO_INFOMSGS;';
END;
EXEC @return_status = sp_executesql @SQLCommand;
IF ((@LOGLEVEL in ('INFO')) and (@return_status = 0)) BEGIN
SET @return_status_text = 'Shrinking the database log file was successfully completed!';
PRINT @return_status_text;
END; ELSE IF ((@LOGLEVEL in ('WARN')) and (@return_status <> 0)) BEGIN
SET @return_status_text = 'Shrinking the database log file returns warnings or has failed, check the ID!';
PRINT @return_status_text;
END;
END; ELSE BEGIN
SET @return_status_text = 'Shrinking the database log was skipped because of previouse error(s)!';
END;
-----------------------------------------------------------------------------------------------------------------------------
--===============================================-- Log result to table --=================================================--
IF ((@LOGLEVEL in ('INFO','WARN')) and (@return_status is not null) and (@return_status_text is not null)) BEGIN
IF EXISTS (SELECT * FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_NAME = N'TBDD_MAINTAIN_DATABASES_LOG') BEGIN
INSERT INTO [TBDD_MAINTAIN_DATABASES_LOG]([LOG_LEVEL],[MESSAGE1], [MESSAGE2], [MESSAGE3], [MESSAGE4], [ADDED_WHO], [ADDED_WHEN])
VALUES (@LOGLEVEL, 'db_cursor', @DBName, @return_status, @return_status_text, @MyProcedureName, GetDate());
END;
END;
-----------------------------------------------------------------------------------------------------------------------------
--=============================================-- Change db recovery mode --===============================================--
PRINT 'Reset the database recovery model.'
SET @SQLCommand = N'ALTER DATABASE [' + @DBName + '] SET RECOVERY FULL';
EXEC @return_status = sp_executesql @SQLCommand;
IF ((@LOGLEVEL in ('INFO')) and (@return_status = 0)) BEGIN
SET @return_status_text = 'Setting database back to the full recovery model was successfully completed!';
PRINT @return_status_text;
END; ELSE IF ((@LOGLEVEL in ('WARN')) and (@return_status <> 0)) BEGIN
SET @return_status_text = 'Setting database back to the full recovery model returns warnings or has failed, check the ID!';
PRINT @return_status_text;
END;
-----------------------------------------------------------------------------------------------------------------------------
--===============================================-- Log result to table --=================================================--
IF ((@LOGLEVEL in ('INFO','WARN')) and (@return_status is not null) and (@return_status_text is not null)) BEGIN
IF EXISTS (SELECT * FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_NAME = N'TBDD_MAINTAIN_DATABASES_LOG') BEGIN
INSERT INTO [TBDD_MAINTAIN_DATABASES_LOG]([LOG_LEVEL],[MESSAGE1], [MESSAGE2], [MESSAGE3], [MESSAGE4], [ADDED_WHO], [ADDED_WHEN])
VALUES (@LOGLEVEL, 'db_cursor', @DBName, @return_status, @return_status_text, @MyProcedureName, GetDate());
END;
END;
-----------------------------------------------------------------------------------------------------------------------------
END; ELSE BEGIN
PRINT 'No shrink action neccessary!';
END;
-----------------------------------------------------------------------------------------------------------------------------
END; ELSE BEGIN
PRINT 'Skipping to shrink the log file!';
END;
-----------------------------------------------------------------------------------------------------------------------------
END; ELSE BEGIN
SET @return_status_text = 'Cannot backup database because of the previous error!';
PRINT @return_status_text;
--===============================================-- Log result to table --=================================================--
IF ((@LOGLEVEL in ('INFO','WARN','ERROR')) and (@return_status is not null) and (@return_status_text is not null)) BEGIN
IF EXISTS (SELECT * FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_NAME = N'TBDD_BACKUP_DATABASES_LOG') BEGIN
INSERT INTO [TBDD_BACKUP_DATABASES_LOG]([LOG_LEVEL],[MESSAGE1], [MESSAGE2], [MESSAGE3], [MESSAGE4], [ADDED_WHO], [ADDED_WHEN])
VALUES ('ERROR', 'db_cursor', @DBName, @return_status, @return_status_text, @MyProcedureName, GetDate());
END;
END;
-----------------------------------------------------------------------------------------------------------------------------
END;
-----------------------------------------------------------------------------------------------------------------------------
END; ELSE BEGIN
SET @return_status = 1;
SET @return_status_text = 'Directory (' + @LOCALBACKUPPATH + ') does not exist!';
PRINT @return_status_text;
--===============================================-- Log result to table --=================================================--
IF ((@LOGLEVEL in ('INFO','WARN','ERROR')) and (@return_status is not null) and (@return_status_text is not null)) BEGIN
IF EXISTS (SELECT * FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_NAME = N'TBDD_BACKUP_DATABASES_LOG') BEGIN
INSERT INTO [TBDD_BACKUP_DATABASES_LOG]([LOG_LEVEL],[MESSAGE1], [MESSAGE2], [MESSAGE3], [MESSAGE4], [ADDED_WHO], [ADDED_WHEN])
VALUES ('ERROR', 'db_cursor', @DBName, @return_status, @return_status_text, @MyProcedureName, GetDate());
END;
END;
-----------------------------------------------------------------------------------------------------------------------------
END;
END TRY
BEGIN CATCH
-- Handle any errors that occur during the process.
SELECT ERROR_MESSAGE() AS ErrorMessage;
--================================================-- Log error to table --=================================================--
IF (@LOGLEVEL in ('INFO','WARN','ERROR')) BEGIN
IF EXISTS (SELECT * FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_NAME = N'TBDD_BACKUP_DATABASES_LOG') BEGIN
INSERT INTO [TBDD_BACKUP_DATABASES_LOG]([LOG_LEVEL],[MESSAGE1], [MESSAGE2], [MESSAGE3], [ADDED_WHO], [ADDED_WHEN])
VALUES ('ERROR', 'db_cursor', @DBName, ERROR_MESSAGE(),@MyProcedureName,GetDate());
END;
END;
-----------------------------------------------------------------------------------------------------------------------------
BEGIN TRY
DROP TABLE #CMDCommandResult;
END TRY
BEGIN CATCH
PRINT '#CMDCommandResult Temp table is already gone...';
END CATCH;
END CATCH;
FETCH NEXT FROM db_cursor INTO @DBName;
END;
CLOSE db_cursor;
DEALLOCATE db_cursor;
END; ELSE BEGIN
SET @return_status = 1;
SET @return_status_text = 'Cannot backup database, because of system configuration!';
PRINT @return_status_text;
--===============================================-- Log result to table --=================================================--
IF ((@LOGLEVEL in ('INFO','WARN','ERROR')) and (@return_status is not null) and (@return_status_text is not null)) BEGIN
IF EXISTS (SELECT * FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_NAME = N'TBDD_BACKUP_DATABASES_LOG') BEGIN
INSERT INTO [TBDD_BACKUP_DATABASES_LOG]([LOG_LEVEL],[MESSAGE1], [MESSAGE2], [MESSAGE3], [MESSAGE4], [ADDED_WHO], [ADDED_WHEN])
VALUES ('ERROR', 'server_check', 'filesystem_config', @return_status, @return_status_text, @MyProcedureName, GetDate());
END;
END;
-----------------------------------------------------------------------------------------------------------------------------
END;
-- Ensure temp table is droped and cursor is closed
BEGIN TRY
DROP TABLE #DBList;
END TRY
BEGIN CATCH
PRINT '#DBList Temp table is already gone...';
END CATCH;
BEGIN TRY
DROP TABLE #CMDCommandResult;
END TRY
BEGIN CATCH
PRINT '#CMDCommandResult Temp table is already gone...';
END CATCH;
END; ELSE BEGIN
SET @return_status = 1;
SET @return_status_text = 'Invalid LOCALBACKUPPATH!';
PRINT @return_status_text;
--===============================================-- Log result to table --=================================================--
IF ((@LOGLEVEL in ('INFO','WARN','ERROR')) and (@return_status is not null) and (@return_status_text is not null)) BEGIN
IF EXISTS (SELECT * FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_NAME = N'TBDD_BACKUP_DATABASES_LOG') BEGIN
INSERT INTO [TBDD_BACKUP_DATABASES_LOG]([LOG_LEVEL],[MESSAGE1], [MESSAGE2], [MESSAGE3], [MESSAGE4], [ADDED_WHO], [ADDED_WHEN])
VALUES ('ERROR', 'server_check', 'filesystem_config', @return_status, @return_status_text, @MyProcedureName, GetDate());
END;
END;
-----------------------------------------------------------------------------------------------------------------------------
END;
END; ELSE BEGIN
SET @return_status = 0;
SET @return_status_text = 'So there is nothing to do...';
PRINT @return_status_text;
--===============================================-- Log result to table --=================================================--
IF ((@LOGLEVEL in ('INFO','WARN','ERROR')) and (@return_status is not null) and (@return_status_text is not null)) BEGIN
IF EXISTS (SELECT * FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_NAME = N'TBDD_BACKUP_DATABASES_LOG') BEGIN
INSERT INTO [TBDD_BACKUP_DATABASES_LOG]([LOG_LEVEL],[MESSAGE1], [MESSAGE2], [MESSAGE3], [MESSAGE4], [ADDED_WHO], [ADDED_WHEN])
VALUES ('WARN', 'db_list', 'count', @return_status, @return_status_text, @MyProcedureName, GetDate());
END;
END;
-----------------------------------------------------------------------------------------------------------------------------
END;
-----------------------------------------------------------------------------------------------------------------------------
SET @return_status_text = 'END ' + @MyProcedureName + ' @ ' + CONVERT(NVARCHAR(50),GETDATE(),120);
--================================================-- Log end to table --===================================================--
IF ((@LOGLEVEL in ('INFO')) and (@return_status is not null) and (@return_status_text is not null)) BEGIN
IF EXISTS (SELECT * FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_NAME = N'TBDD_BACKUP_DATABASES_LOG') BEGIN
INSERT INTO [TBDD_BACKUP_DATABASES_LOG]([LOG_LEVEL],[MESSAGE1], [MESSAGE2], [MESSAGE3], [MESSAGE4], [ADDED_WHO], [ADDED_WHEN])
VALUES (@LOGLEVEL, 'closing', 'procedure', @return_status, @return_status_text, @MyProcedureName, GetDate());
END;
END;
-----------------------------------------------------------------------------------------------------------------------------
PRINT '';
PRINT 'PROCEDURE - ' + @return_status_text;
PRINT '===============================';
Return @return_status;
END;

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.

View File

@@ -0,0 +1,116 @@
USE [DD_SYS]
GO
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
-- [PRDD_GET_DB_DEADLOCKS]
-- =================================================================
-- Gets db deadlock victims
-- Minimum requirement: MS SQL Server 2016
--
-- Returns: table
-- =================================================================
-- 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: 26.03.2025 / MK
-- Version Date / Editor: 26.03.2025 / MK
-- Version Number: 1.0.0.0
-- =================================================================
-- History:
-- 26.03.2025 / MK - First Version
CREATE OR ALTER PROCEDURE [dbo].[PRDD_GET_DB_DEADLOCKS](
pKILL_DEADLOCK_SESSIONS BIT = NULL
)
AS
BEGIN
SET NOCOUNT ON;
-- declare new vars because of parameter sniffing
DECLARE @KILL_DEADLOCK_SESSIONS BIT = ISNULL(@pKILL_DEADLOCK_SESSIONS,0);
DECLARE @DEADLOCK_SESSIONS TABLE ([GUID] [INT] IDENTITY(1,1) NOT NULL,
[SessionID] [INT]) NOT NULL,
[blocking_session_id] [INT] NOT NULL,
[database_id] [INT] NOT NULL,
[blocking_statement] [NVARCHAR](MAX) NULL,
[blocked_statement] [NVARCHAR](MAX) NULL);
-- declare runtime vars
DECLARE @MyProcedureName NVARCHAR(128) = OBJECT_NAME(@@PROCID);
DECLARE @GUID BIGINT,
@SessionID INT,
@blocking_session_id INT,
@database_id INT,
@blocking_statement NVARCHAR(MAX),
@blocked_statement NVARCHAR(MAX),
@return_status NVARCHAR(50) = 0,
@return_status_text NVARCHAR(MAX) = 'START ' + @MyProcedureName + ' @ ' + CONVERT(varchar(50),GETDATE(),120);
PRINT '==============================='
PRINT 'PROCEDURE - ' + @return_status_text;
PRINT 'PARAMETER01 - @KILL_DEADLOCK_SESSIONS: ' + CONVERT(VARCHAR(1),@KILL_DEADLOCK_SESSIONS);
INSERT INTO @DEADLOCK_SESSIONS([SessionID],[blocking_session_id],[database_id],[blocking_statement],[blocked_statement])
WITH XMLNAMESPACES ('http://schemas.microsoft.com/sqlserver/2004/07/showplan' AS sp)
SELECT
[requests].[session_id],
[requests].[blocking_session_id],
[requests].[database_id],
[sql_text1].[text] AS blocking_statement,
[sql_text2].[text] AS blocked_statement
FROM [master].[sys].[dm_exec_requests] as [requests]
CROSS APPLY [master].[sys].[dm_exec_sql_text]([requests].[sql_handle]) [sql_text1]
JOIN [master].[sys].[dm_exec_connections] as [connections] ON [requests].[blocking_session_id] = [connections].[session_id]
CROSS APPLY [master].[sys].[dm_exec_sql_text]([connections].[most_recent_sql_handle]) [sql_text2]
ORDER BY [requests].[database_id] ASC;
SELECT * FROM @DEADLOCK_SESSIONS ORDER BY [SessionID];
SELECT
[database_id],
CONVERT(NVARCHAR(5), [session_id]) as 'SessionID',
CONVERT(NVARCHAR(50), [login_name]) as 'LoginName',
CONVERT(NVARCHAR(50), [host_name]) as 'HostName'
FROM [master].[sys].[dm_exec_sessions] (NOLOCK)
WHERE [is_user_process] = 1
AND [database_id] IN (SELECT DISTINCT [SessionID] FROM @DEADLOCK_SESSIONS ORDER BY [SessionID]);
--==========================================-- Create the main loop (cursor) --============================================--
IF (SELECT COUNT(*) FROM @DEADLOCK_SESSIONS > 0) AND (@KILL_DEADLOCK_SESSIONS = 1) BEGIN
DECLARE CURSOR_KILL_SESSIONS CURSOR STATIC LOCAL FOR
SELECT [SessionID] FROM @DEADLOCK_SESSIONS;
OPEN CURSOR_KILL_SESSIONS
FETCH NEXT FROM CURSOR_KILL_SESSIONS INTO @SessionID
WHILE @@FETCH_STATUS = 0 BEGIN
BEGIN
PRINT ' ';
PRINT '-------------------------------';
PRINT 'Now processing: ' + CONVERT(varchar(100),@SessionID);
KILL @SessionID
-----------------------------------------------------------------------------------------------------------------------------
END;
FETCH NEXT FROM CURSOR_KILL_SESSIONS INTO @SessionID;
END;
CLOSE CURSOR_KILL_SESSIONS;
DEALLOCATE CURSOR_KILL_SESSIONS;
END; ELSE BEGIN
PRINT '';
PRINT 'There are no deadlocks, or deadlock kill is disabled!';
END;

File diff suppressed because it is too large Load Diff

View File

@@ -0,0 +1,24 @@
SELECT name, physical_name AS CurrentLocation, state_desc
FROM sys.master_files
WHERE database_id = DB_ID(N'DD_ECM');
USE master; --do this all from the master
ALTER DATABASE DD_ECM
MODIFY FILE (name='DD_ECM',filename='E:\MSSQL\DD_ECM.mdf'); --Filename is new location
ALTER DATABASE DD_ECM
MODIFY FILE (name='DD_ECM_log',filename='E:\MSSQL\DD_ECM_log.ldf'); --Filename is new location
ALTER DATABASE DD_ECM SET OFFLINE WITH ROLLBACK IMMEDIATE
-- Check NTFS rights!
-- NT Service\MSSQL$<Instanz>
-- then
-- COPY the physical files !!!
ALTER DATABASE DD_ECM SET ONLINE;
SELECT name, physical_name AS CurrentLocation, state_desc
FROM sys.master_files
WHERE database_id = DB_ID(N'DD_ECM');