簡體   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