繁体   English   中英

跟踪SQL数据库中的更改

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM