[英]Tracking changes in a SQL database
我花了很多时间在Google上搜索,并找到了对更简单的表的可能解决方案。
我公司虔诚地使用BGInfo来跟踪200多个Web服务器上的约80个属性。 这些字段是服务器状态(IP地址,OSVer,HyperV主机)和各种已安装软件组件的版本的混合。 计划任务每天将所有Web服务器的此信息写入一个数据库(当前记录> 300K)。 我们需要一个查询(最终将其输入到报告中),以便给我们提供时间,以了解任何给定的Web服务器上发生了什么更改。 如果可以的话,这是一种自动变更控制。
示例:WebSvr_XYZ自创建以来就拥有2G的RAM,然后在几个月后分配了额外的RAM。 然后一年后,它被赋予了一个新的IP地址。
Server Time_stamp Host IP RAM
-------------------------------------------------------
WebSvr_XYZ June 1, 2016 Virt5a 192.168.10.45 2G
WebSvr_XYZ June 2, 2016 Virt5a 192.168.10.45 2G
WebSvr_XYZ Aug 20, 2016 Virt5a 192.168.10.45 4G
WebSvr_XYZ Aug 21, 2016 Virt5a 192.168.10.45 4G
WebSvr_XYZ July 18, 2017 Virt5a 192.168.20.105 4G
WebSvr_XYZ July 19, 2017 Virt5a 192.168.20.105 4G
WebSvr_XYZ July 20, 2017 Virt5a 192.168.20.105 4G
当针对WebSvr_XYZ
运行时,针对540多个记录的输出将是
June 1, 2016 Virt5a 192.168.10.45 2G
Aug 20, 2016 Virt5a 192.168.10.45 4G
July 18, 2017 Virt5a 192.168.20.105 4G
我已经尝试过将选择与表分离,将它们与整个表连接起来,在所有相关列上进行连接,并使用MIN(Timestamp)
来获得第一个。 但是我要么得到不好的时间戳,要么根本没有结果。
使用row_number()
作为事件序列。 之后,您可以INNER JOIN返回自身的数据,以比较之前的时间戳和当前的时间戳
; with cte as
(
select *, rn = row_number() over (partition by Server order by Time_stamp)
from yourtable
)
select *
from cte c1
inner join c2 on c1.Server = c2.Server
and c1.rn = c2.rn - 1
where c1.IP <> c2.IP
or c1.RAM <> c2.RAM
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.