2016-07-11 60 views
0

我需要知道表中的數據何時最後修改(數據插入,創建,刪除)。常見的答案是從sys.dm_db_index_usage_stats中提取數據,但我沒有訪問該表的權限,據我所知,訪問權限是服務器級權限,因爲這是在企業共享服務器上,所以IT部門授予我訪問權限的機率與豬羣在一起。SQL Server - 獲取表的最後更新時間

有沒有辦法獲得這些信息,那不需要大大提升權限?


更新#1

一些額外的信息:我在做什麼,是緩存該表的內容在本地,並且需要知道何時更新我的​​本地緩存。這意味着:

  1. 我並不需要一個實際的時間戳,只是任何價值,我可以比較一個本地緩存值,它告訴我:「事情已經改變,更新緩存」
  2. 如果該值發生變化過於頻繁(如得到重置每次重新啓動,這是非常罕見的服務器時間),它是確定的,它只是意味着我這樣做,我其實沒有需要做

更新#額外的緩存更新2

我應該儘早做到這一點,但我只是假設我可以根據需要創建表格......但我不是。未授予權限。所以,無論是提出的方法將工作:-(

這是我的新想法:我可以打電話

select checksum_agg(binary_checksum(*)) 

,並獲得對整個遠程表的校驗之後,如果校驗和的變化,我知道了。我已經看到了problems with checksum,但是使用HASHBYTES聽起來好像會更加複雜和慢得多。

這是行得通的,問題是當校驗和改變時,我必須重新加載整個緩存。我的表有很多行,返回每行的校驗和需要一個無法接受的長時間e,有沒有辦法使用「OVER」子句並獲得10個校驗和,第一個十分之一的第一個校驗和等等?

+0

我假設你的表沒有任何像'LastModified'列? – Siyual

+0

正確!而且,這是一個由第三方產品創建和維護的表格,所以雖然我可以修改他們的模式以添加這樣的列,但我沒有辦法修改他們的代碼來維護這樣的列。 –

+0

那麼如果你很高興修改模式,你可以添加一個觸發器來記錄這些操作。 –

回答

1

如果你可以修改他們的模式,那麼你應該可以添加一個觸發器。

一旦你添加上次更改時間列,您可以使用此觸發得到隨時更新的記錄更改時間:

CREATE trigger [dbo].[TR_TheirTable_Timestamp] 
on [dbo].[TheirTable] for update 
as 
begin 
    update 
     dbo.TheirTable 
    set 
     lastmodified=getdate() 
    from 
     Inserted 
    where 
     dbo.TheirTable.UniqueID=Inserted.UniqueKey 
end 

我之所以這樣做只爲更新,而不是插入是因爲我可以看到新記錄,而且我不需要時間戳,但是我可以比較上次更新記錄的時間。如果你想要一個INSERT,UPDATE,然後

on [dbo].[TheirTable] for insert,update 

會工作

如果你只是想知道什麼時候該表進行了更新,則觸發可以寫與表名和日期另一個表,而你止跌'不得不修改他們的模式

相關問題