CREATE OR ALTER PROCEDURE [dbo].[Grant_Save]
    @Key NVARCHAR(200),
    @Type NVARCHAR(50),
    @SubjectId NVARCHAR(200),
    @SessionId NVARCHAR(100),
    @ClientId NVARCHAR(200),
    @Description NVARCHAR(200),
    @CreationDate DATETIME2,
    @ExpirationDate DATETIME2,
    @ConsumedDate DATETIME2,
    @Data NVARCHAR(MAX)
AS
BEGIN
    SET NOCOUNT ON

    -- First, try to update the existing row
    UPDATE [dbo].[Grant]
    SET
        [Type] = @Type,
        [SubjectId] = @SubjectId,
        [SessionId] = @SessionId,
        [ClientId] = @ClientId,
        [Description] = @Description,
        [CreationDate] = @CreationDate,
        [ExpirationDate] = @ExpirationDate,
        [ConsumedDate] = @ConsumedDate,
        [Data] = @Data
    WHERE
        [Key] = @Key

    -- If no row was updated, insert a new one
    IF @@ROWCOUNT = 0
    BEGIN
        INSERT INTO [dbo].[Grant]
            (
            [Key],
            [Type],
            [SubjectId],
            [SessionId],
            [ClientId],
            [Description],
            [CreationDate],
            [ExpirationDate],
            [ConsumedDate],
            [Data]
            )
        VALUES
            (
                @Key,
                @Type,
                @SubjectId,
                @SessionId,
                @ClientId,
                @Description,
                @CreationDate,
                @ExpirationDate,
                @ConsumedDate,
                @Data
            )
    END
END