我有一个存储过程如下:
CREATE PROCEDURE [ODataTaskResult_Create]
@ODataTaskId BIGINT,
@ODataTaskResultTypeId INTEGER,
@Details CHARACTER VARYING(MAX)
AS
BEGIN TRANSACTION
INSERT INTO [ODataTaskResult] WITH (ROWLOCK, XLOCK) ([ODataTaskId], [ODataTaskResultTypeId], [Details], [CreatedOn])
VALUES (@ODataTaskId, @ODataTaskResultTypeId, @Details, SYSDATETIMEOFFSET())
DECLARE @ODataTaskResultTypeName CHARACTER VARYING(255)
SET @ODataTaskResultTypeName = (
SELECT TOP 1 [ODataTaskType].[Name] FROM [ODataTaskType]
WHERE [ODataTaskType].[Id] = @ODataTaskResultTypeId)
IF (@ODataTaskResultTypeName = 'Finish')
BEGIN
UPDATE [ODataTask]
SET [ODataTask].[FinishedOn] = SYSDATETIMEOFFSET()
WHERE [ODataTask].[Id] = @ODataTaskId
END ELSE IF (@ODataTaskResultTypeName = 'Delete')
BEGIN
UPDATE [ODataTask]
SET [ODataTask].[DeletedOn] = SYSDATETIMEOFFSET()
WHERE [ODataTask].[Id] = @ODataTaskId
END ELSE
RAISERROR('Invalid result type', 16, 1)
COMMIT TRANSACTION
GO
这个过程应该查看传入的@ODataTaskResultTypeId
参数,从另一个表中拉出结果类型,并根据Name
该记录中的列做一些事情。
基本上,当针对任务输入结果时,它定义了它是如何完成的。如果任务完成,我需要修改FinishedOn
父任务记录上的列,而不是更改DeletedOn
列。我们有一个约束表明FinishedOn
并且DeletedOn
可能不都是NOT NULL
。
在这一点上感觉,由于我已经将不同的案例逻辑硬编码到存储过程中,这使得可维护性变得困难并且阻止它正常工作,除非ODataTaskResult
表具有正确的初始条目。
我是否应该使该ODataTaskResult_Create
过程仅创建结果,然后调用另一个过程ODataTask_Finish
以及另一个过程ODataTask_Delete
?
是否有解决这个问题的不同方法通常更容易维护?
我们从不硬删除条目,只有软删除。