8
0
Files
Skriptentwickung/current/[DD_ECM]-Database/ReC/[PRREC_DELETE_OBJECT].sql
2026-04-13 12:08:30 +02:00

245 lines
11 KiB
Transact-SQL

SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
-- [PRREC_DELETE_OBJECT]
-- =================================================================
-- Deletes one or more data in a given Entity
--
-- 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: 22.12.2025 / MK
-- Version Date / Editor: 22.12.2025 / MK
-- Version Number: 1.0.0.0
-- =================================================================
-- History:
-- 22.12.2025 / MK - First Version
CREATE OR ALTER PROCEDURE [dbo].[PRREC_DELETE_OBJECT] (
@pENTITY NVARCHAR(25) = 'RESULT', -- Target entity: ACTION, ENDPOINT, ENDPOINT_AUTH, ENDPOINT_PARAMS, PROFILE, RESULT
@pSTART NVARCHAR(25) = '0', -- Start GUID/ID (inclusive), numeric text
@pEND NVARCHAR(25) = '0', -- End GUID/ID (inclusive), numeric text
@pFORCE BIT = 0 -- 1 = delete even if dependent data exists
)
AS
BEGIN
SET NOCOUNT ON;
SET XACT_ABORT ON;
-- declare new vars because of parameter sniffing
DECLARE @ENTITY NVARCHAR(25) = UPPER(LTRIM(RTRIM(ISNULL(@pENTITY, 'RESULT')))),
@START_VAL NVARCHAR(25) = LTRIM(RTRIM(ISNULL(@pSTART, '0'))),
@END_VAL NVARCHAR(25) = LTRIM(RTRIM(ISNULL(@pEND, '0'))),
@FORCE BIT = ISNULL(@pFORCE, 0);
-- declare runtime vars
DECLARE @MY_PROCEDURE_NAME NVARCHAR(128) = OBJECT_NAME(@@PROCID);
DECLARE @START_ID BIGINT = TRY_CAST(@START_VAL AS BIGINT),
@END_ID BIGINT = TRY_CAST(@END_VAL AS BIGINT),
@END_ID_TMP BIGINT = 0,
@RETURN_STATUS INT = 0,
@RETURN_STATUS_TEXT NVARCHAR(MAX) = 'START PROCEDURE [' + @MY_PROCEDURE_NAME + '] @ ' + CONVERT(VARCHAR(50), GETDATE(), 120);
----------------------------------------------------------------------------------------------------------------------------
--=================================================-- Output parameters --================================================--
PRINT '====================================================================================================';
PRINT @RETURN_STATUS_TEXT;
PRINT '';
PRINT 'PARAMETER01 - @ENTITY: ' + ISNULL(CONVERT(NVARCHAR(25), @ENTITY), 'NULL');
PRINT 'PARAMETER02 - @START: ' + ISNULL(CONVERT(NVARCHAR(25), @START_VAL), 'NULL');
PRINT 'PARAMETER03 - @END: ' + ISNULL(CONVERT(NVARCHAR(25), @END_VAL), 'NULL');
PRINT 'PARAMETER04 - @FORCE: ' + ISNULL(CONVERT(NVARCHAR(1), @FORCE), 'NULL');
PRINT '';
-----------------------------------------------------------------------------------------------------------------------------
--================================================-- Validation --=======================================================--
IF (@ENTITY NOT IN ('ACTION', 'ENDPOINT', 'ENDPOINT_AUTH', 'ENDPOINT_PARAMS', 'PROFILE', 'RESULT')) BEGIN
SET @RETURN_STATUS = 50301;
SET @RETURN_STATUS_TEXT = 'ERROR: Unknown entity "' + @ENTITY + '". Allowed: ACTION, ENDPOINT, ENDPOINT_AUTH, ENDPOINT_PARAMS, PROFILE, RESULT.';
RAISERROR(@RETURN_STATUS_TEXT,16,1);
RETURN @RETURN_STATUS;
END;
IF (@START_ID IS NULL OR @END_ID IS NULL) BEGIN
SET @RETURN_STATUS = 50302;
SET @RETURN_STATUS_TEXT = 'ERROR: @START and @END must be convertible to BIGINT.';
RAISERROR(@RETURN_STATUS_TEXT,16,1);
RETURN @RETURN_STATUS;
END;
-- normalize range
IF (@END_ID = 0) BEGIN
SET @END_ID = @START_ID;
END;
IF (@START_ID = 0) BEGIN
SET @START_ID = @END_ID;
END;
IF (@START_ID > @END_ID) BEGIN
SET @END_ID_TMP = @START_ID;
SET @START_ID = @END_ID;
SET @END_ID = @END_ID_TMP;
END;
PRINT 'INFO: Normalized deletion range from ' + CONVERT(NVARCHAR(25), @START_ID) + ' to ' + CONVERT(NVARCHAR(25), @END_ID);
-----------------------------------------------------------------------------------------------------------------------------
--===============================================-- Main Processing --===================================================--
BEGIN TRY
BEGIN TRANSACTION;
-- Delete selected entities respecting dependencies
IF (@ENTITY = 'ACTION' AND @RETURN_STATUS = 0) BEGIN
PRINT 'INFO: Deleting ACTION records...';
IF (@FORCE = 0 AND EXISTS (SELECT 1 FROM [dbo].[TBREC_OUT_RESULT] WHERE [ACTION_ID] BETWEEN @START_ID AND @END_ID)) BEGIN
SET @RETURN_STATUS = 50303;
SET @RETURN_STATUS_TEXT = 'ERROR: Dependent results exist for ACTION. Set @pFORCE=1 to delete anyway.';
RAISERROR(@RETURN_STATUS_TEXT,16,1);
RETURN @RETURN_STATUS;
END; ELSE BEGIN
DELETE FROM [dbo].[TBREC_OUT_RESULT] WHERE [ACTION_ID] BETWEEN @START_ID AND @END_ID;
DELETE FROM [dbo].[TBREC_CFG_ACTION] WHERE [GUID] BETWEEN @START_ID AND @END_ID;
SET @RETURN_STATUS_TEXT = 'INFO: ACTION and related RESULT records deleted.';
PRINT @RETURN_STATUS_TEXT;
END;
END;
ELSE IF (@ENTITY = 'ENDPOINT' AND @RETURN_STATUS = 0) BEGIN
PRINT 'INFO: Deleting ENDPOINT records...';
IF (@FORCE = 0 AND EXISTS (SELECT 1 FROM [dbo].[TBREC_CFG_ACTION] WHERE [ENDPOINT_ID] BETWEEN @START_ID AND @END_ID)) BEGIN
SET @RETURN_STATUS = 50304;
SET @RETURN_STATUS_TEXT = 'ERROR: ENDPOINT is used by ACTION. Set @pFORCE=1 to delete anyway.';
RAISERROR(@RETURN_STATUS_TEXT,16,1);
RETURN @RETURN_STATUS;
END; ELSE BEGIN
DECLARE @ActionIdsForEndpoint TABLE (GUID BIGINT PRIMARY KEY);
INSERT INTO @ActionIdsForEndpoint(GUID)
SELECT [GUID] FROM [dbo].[TBREC_CFG_ACTION] WHERE [ENDPOINT_ID] BETWEEN @START_ID AND @END_ID;
DELETE FROM [dbo].[TBREC_OUT_RESULT] WHERE [ACTION_ID] IN (SELECT GUID FROM @ActionIdsForEndpoint);
DELETE FROM [dbo].[TBREC_CFG_ACTION] WHERE [GUID] IN (SELECT GUID FROM @ActionIdsForEndpoint);
DELETE FROM [dbo].[TBREC_CFG_ENDPOINT] WHERE [GUID] BETWEEN @START_ID AND @END_ID;
SET @RETURN_STATUS_TEXT = 'INFO: ENDPOINT, related ACTION and RESULT records deleted.';
PRINT @RETURN_STATUS_TEXT;
END;
END;
ELSE IF (@ENTITY = 'ENDPOINT_AUTH' AND @RETURN_STATUS = 0) BEGIN
PRINT 'INFO: Deleting ENDPOINT_AUTH records...';
IF (@FORCE = 0 AND EXISTS (SELECT 1 FROM [dbo].[TBREC_CFG_ACTION] WHERE [ENDPOINT_AUTH_ID] BETWEEN @START_ID AND @END_ID)) BEGIN
SET @RETURN_STATUS = 50305;
SET @RETURN_STATUS_TEXT = 'ERROR: ENDPOINT_AUTH is used by ACTION. Set @pFORCE=1 to delete anyway.';
RAISERROR(@RETURN_STATUS_TEXT,16,1);
RETURN @RETURN_STATUS;
END; ELSE BEGIN
DECLARE @ActionIdsForAuth TABLE (GUID BIGINT PRIMARY KEY);
INSERT INTO @ActionIdsForAuth(GUID)
SELECT [GUID] FROM [dbo].[TBREC_CFG_ACTION] WHERE [ENDPOINT_AUTH_ID] BETWEEN @START_ID AND @END_ID;
DELETE FROM [dbo].[TBREC_OUT_RESULT] WHERE [ACTION_ID] IN (SELECT GUID FROM @ActionIdsForAuth);
DELETE FROM [dbo].[TBREC_CFG_ACTION] WHERE [GUID] IN (SELECT GUID FROM @ActionIdsForAuth);
DELETE FROM [dbo].[TBREC_CFG_ENDPOINT_AUTH] WHERE [GUID] BETWEEN @START_ID AND @END_ID;
SET @RETURN_STATUS_TEXT = 'INFO: ENDPOINT_AUTH, related ACTION and RESULT records deleted.';
PRINT @RETURN_STATUS_TEXT;
END;
END;
ELSE IF (@ENTITY = 'ENDPOINT_PARAMS' AND @RETURN_STATUS = 0) BEGIN
PRINT 'INFO: Deleting ENDPOINT_PARAMS records...';
IF (@FORCE = 0 AND EXISTS (SELECT 1 FROM [dbo].[TBREC_CFG_ACTION] WHERE [ENDPOINT_PARAMS_ID] BETWEEN @START_ID AND @END_ID)) BEGIN
SET @RETURN_STATUS = 50306;
SET @RETURN_STATUS_TEXT = 'ERROR: ENDPOINT_PARAMS is used by ACTION. Set @pFORCE=1 to delete anyway.';
RAISERROR(@RETURN_STATUS_TEXT,16,1);
RETURN @RETURN_STATUS;
END; ELSE BEGIN
DECLARE @ActionIdsForParams TABLE (GUID BIGINT PRIMARY KEY);
INSERT INTO @ActionIdsForParams(GUID)
SELECT [GUID] FROM [dbo].[TBREC_CFG_ACTION] WHERE [ENDPOINT_PARAMS_ID] BETWEEN @START_ID AND @END_ID;
DELETE FROM [dbo].[TBREC_OUT_RESULT] WHERE [ACTION_ID] IN (SELECT GUID FROM @ActionIdsForParams);
DELETE FROM [dbo].[TBREC_CFG_ACTION] WHERE [GUID] IN (SELECT GUID FROM @ActionIdsForParams);
DELETE FROM [dbo].[TBREC_CFG_ENDPOINT_PARAMS] WHERE [GUID] BETWEEN @START_ID AND @END_ID;
SET @RETURN_STATUS_TEXT = 'INFO: ENDPOINT_PARAMS, related ACTION and RESULT records deleted.';
PRINT @RETURN_STATUS_TEXT;
END;
END;
ELSE IF (@ENTITY = 'PROFILE' AND @RETURN_STATUS = 0) BEGIN
PRINT 'INFO: Deleting PROFILE records...';
IF (@FORCE = 0 AND EXISTS (SELECT 1 FROM [dbo].[TBREC_CFG_ACTION] WHERE [PROFILE_ID] BETWEEN @START_ID AND @END_ID)) BEGIN
SET @RETURN_STATUS = 50307;
SET @RETURN_STATUS_TEXT = 'ERROR: PROFILE is used by ACTION. Set @pFORCE=1 to delete anyway.';
RAISERROR(@RETURN_STATUS_TEXT,16,1);
RETURN @RETURN_STATUS;
END; ELSE BEGIN
DECLARE @ActionIdsForProfile TABLE (GUID BIGINT PRIMARY KEY);
INSERT INTO @ActionIdsForProfile(GUID)
SELECT [GUID] FROM [dbo].[TBREC_CFG_ACTION] WHERE [PROFILE_ID] BETWEEN @START_ID AND @END_ID;
DELETE FROM [dbo].[TBREC_OUT_RESULT] WHERE [ACTION_ID] IN (SELECT GUID FROM @ActionIdsForProfile);
DELETE FROM [dbo].[TBREC_CFG_ACTION] WHERE [GUID] IN (SELECT GUID FROM @ActionIdsForProfile);
DELETE FROM [dbo].[TBREC_RUN_PROFILE] WHERE [PROFILE_ID] BETWEEN @START_ID AND @END_ID;
DELETE FROM [dbo].[TBREC_CFG_PROFILE] WHERE [GUID] BETWEEN @START_ID AND @END_ID;
SET @RETURN_STATUS_TEXT = 'INFO: PROFILE, related ACTION, RESULT and RUN records deleted.';
PRINT @RETURN_STATUS_TEXT;
END;
END;
ELSE IF (@ENTITY = 'RESULT' AND @RETURN_STATUS = 0) BEGIN
PRINT 'INFO: Deleting RESULT records...';
DELETE FROM [dbo].[TBREC_OUT_RESULT] WHERE [GUID] BETWEEN @START_ID AND @END_ID;
SET @RETURN_STATUS_TEXT = 'INFO: RESULT records deleted.';
PRINT @RETURN_STATUS_TEXT;
END;
IF (@RETURN_STATUS > 0) BEGIN
IF (XACT_STATE() <> 0) ROLLBACK TRANSACTION;
END; ELSE BEGIN
COMMIT TRANSACTION;
END;
--======================================================-- Output result --======================================================--
SET @RETURN_STATUS_TEXT = 'END PROCEDURE [' + @MY_PROCEDURE_NAME + '] @ ' + CONVERT(VARCHAR(50), GETDATE(), 120);
PRINT '';
PRINT @RETURN_STATUS_TEXT;
PRINT '====================================================================================================';
-----------------------------------------------------------------------------------------------------------------------------------
RETURN @RETURN_STATUS;
END TRY BEGIN CATCH
IF (XACT_STATE() <> 0) ROLLBACK TRANSACTION;
--======================================================-- Output result --======================================================--
SET @RETURN_STATUS_TEXT = 'ERROR: ' + ERROR_MESSAGE();
RAISERROR(@RETURN_STATUS_TEXT,16,1);
SET @RETURN_STATUS_TEXT = 'END PROCEDURE [' + @MY_PROCEDURE_NAME + '] @ ' + CONVERT(VARCHAR(50), GETDATE(), 120);
PRINT '';
PRINT @RETURN_STATUS_TEXT;
PRINT '====================================================================================================';
-----------------------------------------------------------------------------------------------------------------------------------
RETURN @RETURN_STATUS;
END CATCH;
-----------------------------------------------------------------------------------------------------------------------------
END;
GO