0

次のようなストアドプロシージャがあります。

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ます。DeletedOnNOT NULL

この時点で、さまざまなケース ロジックをストアド プロシージャにハード コードしたため、保守性が難しくなり、ODataTaskResultテーブルに正しい初期エントリがない限り、これが適切に機能しなくなると感じています。

ODataTaskResult_Createプロシージャで結果のみを作成し、別のプロシージャとODataTask_Finish別のプロシージャを呼び出す必要がありODataTask_Deleteますか?

一般的に維持しやすいこの問題への別のアプローチはありますか?

エントリを完全に削除することはなく、論理的な削除のみを行います。

4

1 に答える 1