次のようなストアドプロシージャがあります。
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
ますか?
一般的に維持しやすいこの問題への別のアプローチはありますか?
エントリを完全に削除することはなく、論理的な削除のみを行います。