Estou trabalhando em um banco de dados SQL server, contendo ordens e máquinas, executando essas ordens. Não mais de um pedido ativo pode ser atribuído a uma máquina ao mesmo tempo. Em outras palavras: esta solicitação SQL nunca pode produzir um resultado:
SELECT MachineId
FROM Orders
WHERE (Orders.Status=1)
GROUP BY MachineId
HAVING COUNT(Id)>1
Eu tenho essa solicitação SQL aberta em um ambiente Microsoft SQL Server Management Studio e, toda vez que pressiono F5, não vejo resultados.
No entanto, tenho certeza de que houve momentos em que essa consulta SQL produziu resultados, e estou interessado nesses momentos e nos resultados dessa consulta nesses momentos.
Alguém tem alguma ideia de como posso descobrir isso? (A tag "archive-log" é apenas uma ideia)
desde já, obrigado
Eu criaria um índice filtrado exclusivo e rastrearia as violações de restrição exclusivas. Ele evita os dados errados em primeiro lugar e, ao contrário de pesquisar periodicamente a tabela, você não perderá a ocorrência.
A definição seria
Então eu usaria o
error_reported
evento Extended para rastrear o número do erro específico, que provavelmente será:e pegue algumas informações adicionais como
app_name
,host_name
,tsql_stack
etc. para encontrar a causa raiz.Eu blog sobre erros de depuração com os eventos estendidos aqui
https://straightforwardsql.com/posts/investigating-errors-with-extended-events/
Crie uma tabela de log. Altere sua consulta para
Use o SQL Agent para executar essa consulta conforme necessário. (O intervalo mínimo é de 1 minuto.)
O problema é que você só vê erros que existem por alguns milissegundos em que a consulta é executada a cada poucos minutos - uma fração de um por cento do tempo em que o sistema está em execução. Se você adicionar rastreamento temporal aos Pedidos, poderá ver todas as alterações ocorridas. Você pode então executar uma consulta de análise sobre esse histórico para detectar erros. O histórico pode ser copiado para um banco de dados de arquivo separado, se desejado, e removido do banco de dados operacional quando não for mais necessário, para manter esse banco de dados enxuto.