diff --git a/src/SQLInsight.Repository/InsightRepository.InstanceConfiguration.cs b/src/SQLInsight.Repository/InsightRepository.InstanceConfiguration.cs
index 1394e18..b03a29d 100644
--- a/src/SQLInsight.Repository/InsightRepository.InstanceConfiguration.cs
+++ b/src/SQLInsight.Repository/InsightRepository.InstanceConfiguration.cs
@@ -307,15 +307,27 @@ public sealed partial class InsightRepository
return unknown;
}
- /// Queues a request for the agent (SQLInsight Web: INSERT only).
+ ///
+ /// Queues a request for the agent (SQLInsight Web: INSERT only). The same request still waiting for the agent is
+ /// returned instead of a new one, so pressing the button again (or a script in a loop) does not grow the queue.
+ ///
public async Task AddAgentRequestAsync(string kind, int? configuredInstanceId, string? parameters, string? by, DateTimeOffset now,
CancellationToken cancellationToken = default)
{
await using var connection = await OpenAsync(cancellationToken).ConfigureAwait(false);
return await connection.ExecuteScalarAsync("""
- INSERT insight.AgentRequests (Kind, ConfiguredInstanceId, Parameters, Status, RequestedBy, RequestedAt)
- OUTPUT INSERTED.RequestId
- VALUES (@kind, @configuredInstanceId, @parameters, 'Pending', @by, @now);
+ DECLARE @id bigint = (SELECT TOP (1) RequestId FROM insight.AgentRequests
+ WHERE Status = 'Pending' AND Kind = @kind
+ AND (ConfiguredInstanceId = @configuredInstanceId OR (@configuredInstanceId IS NULL AND ConfiguredInstanceId IS NULL))
+ AND ISNULL(Parameters, N'') = ISNULL(@parameters, N'')
+ ORDER BY RequestId DESC);
+ IF @id IS NULL
+ BEGIN
+ INSERT insight.AgentRequests (Kind, ConfiguredInstanceId, Parameters, Status, RequestedBy, RequestedAt)
+ VALUES (@kind, @configuredInstanceId, @parameters, 'Pending', @by, @now);
+ SET @id = SCOPE_IDENTITY();
+ END
+ SELECT @id;
""", new { kind, configuredInstanceId, parameters, by, now = Utc(now) }).ConfigureAwait(false);
}