Dom*_*que 7 sql-server scheduled-tasks archive-log
我正在开发一个 SQL Server 数据库,其中包含订单和执行这些订单的机器。一台机器不能同时分配多个有效订单。换句话说:这个 SQL 请求永远不会产生结果:
SELECT MachineId
FROM Orders
WHERE (Orders.Status=1)
GROUP BY MachineId
HAVING COUNT(Id)>1
Run Code Online (Sandbox Code Playgroud)
我在 Microsoft SQL Server Management Studio 环境中打开此 SQL 请求,每次按 时F5,我确实看不到任何结果。
但是,我确信 SQL 查询有时确实会产生结果,并且我对那些时间以及当时查询的结果很感兴趣。
有人知道我如何找到这个吗?(“archive-log”标签只是一个想法)
提前致谢
Zik*_*ato 10
我将创建一个唯一的过滤索引并跟踪唯一约束违规。它首先可以防止错误数据,并且与定期轮询表不同,您不会错过错误的发生。
定义是
CREATE UNIQUE NONCLUSTERED INDEX IX_Orders_StatusPerMachine
ON dbo.Orders(MachineId)
WHERE (Status = 1)
Run Code Online (Sandbox Code Playgroud)
然后我将使用error_reported扩展事件来跟踪特定的错误号,这可能是:
消息 2601
无法在具有唯一索引“%.*ls”的对象“%.*ls”中插入重复的键行。重复的键值是 %ls。
并获取一些附加信息,例如app_name,host_name等tsql_stack以查找根本原因。
我在博客中介绍了有关扩展事件调试错误的信息
https://straightforwardsql.com/posts/investigating-errors-with-extended-events/
创建一个日志表。将您的查询更改为
INSERT LoggingTable(...)
SELECT MachineId, SYSUTCDATETIME()
...
Run Code Online (Sandbox Code Playgroud)
根据需要使用 SQL 代理运行此查询。(最短间隔为 1 分钟。)
问题是您只能看到每隔几分钟执行一次查询的几毫秒内存在的错误 - 占系统运行时间的一小部分。如果您向订单添加时间跟踪,您可以看到发生的每一个变化。然后,您可以对此历史记录运行分析查询以检测错误。如果需要,可以将历史记录复制到单独的存档数据库,并在不再需要时从操作数据库中删除,以保持该数据库的精简。