SQL Server - 获取表

时间:2016-07-11 14:57:50

标签: sql sql-server

我需要知道表格中的数据上次修改的时间(插入,创建,删除数据)。常见的答案是从sys.dm_db_index_usage_stats中提取数据,但我无法访问该表,据我所知,访问该表是服务器级权限,因为这是在公司共享服务器上,允许我访问的IT部门的可能性随着猪的飞行而增加。

有没有办法获取这些信息,不需要大幅提升权限?

更新#1

一些其他信息:我正在做的是在本地缓存此表的内容,并且需要知道何时更新我的​​本地缓存。这意味着:

  1. 我不需要实际的时间戳,只需要我可以与本地缓存的值进行比较的任何值,告诉我"事情已经发生变化,更新缓存"
  2. 如果此值经常更改(例如,每次重启服务器时都会重置非常少),那就可以了,这只是意味着我进行了额外的缓存更新,而我实际上并不需要这样做做
  3. 更新#2

    我应该尽早做到这一点,但我只是假设我可以根据需要创建表格......但我不是。许可未获批准。所以提出的方法都不会起作用: - (

    这是我的新想法:我可以致电

    select checksum_agg(binary_checksum(*))
    

    并获取整个远程表的校验和。然后,如果校验和发生更改,我知道表已更改,我可以更新本地缓存。我已经看过problems with checksum,但使用HASHBYTES听起来会更复杂,也更慢。

    这是有效的,问题是当校验和发生变化时,我必须重新加载整个缓存。我的表有很多行,每行返回校验和需要一个不可接受的长时间,有没有办法使用" OVER"子句并得到10个校验和,第一行的第一个校验和等等?

1 个答案:

答案 0 :(得分:1)

If you can modify their schema, then you should be able to add a trigger.

Once you add a lastmodified column, you can use this trigger to get the time updated any time the record changes:

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

The reason I do it only for update, and not insert is because I can see a new record, and I don't need a timestamp, but a modified record I can compare the time I last updated the record. if you want an insert update, then

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

would work

If you just wanted to know when the table was updated, then the trigger could write to another table with the tablename and date, and you wouldn't have to modify their schema