【问题标题】:SQL Server - get last updated time for tableSQL Server - 获取表的最后更新时间
【发布时间】:2016-11-13 14:07:56
【问题描述】:

我需要知道上次修改表中数据的时间(插入、创建、删除数据)。常见的答案是从 sys.dm_db_index_usage_stats 中提取数据,但我无权访问该表,据我了解,访问该表是服务器级别的权限,因为这是在公司共享服务器上,所以IT 部门授予我访问权限的几率很高。

有没有不需要大大提升权限的方法来获取这些信息?


更新 #1

一些附加信息:我正在做的,是在本地缓存这个表的内容,并且需要知道什么时候更新我的本地缓存。这意味着:

  1. 我不需要实际的时间戳,只要我可以与本地缓存的值进行比较即可告诉我“事情发生了变化,更新缓存”
  2. 如果此值更改太频繁(例如,每次重启服务器时都会重置,这种情况极少发生)没关系,这只是意味着我做了一个我实际上不需要做的额外缓存更新

更新 #2

我应该早点这样做,但我只是假设我能够根据需要创建表......但我不是。未授予权限。所以建议的方法都不起作用:-(

这是我的新想法:我可以打电话

select checksum_agg(binary_checksum(*))

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

这是有效的,问题是当校验和改变时,我必须重新加载整个缓存。我的表有这么多行,以至于返回每行的校验和需要很长时间,有没有办法使用“OVER”子句并获得可能 10 个校验和,前十分之一行的第一个校验和等等?

【问题讨论】:

  • 我假设您的表没有类似 LastModified 列的内容?
  • 正确!而且,它是由第三方产品创建和维护的表,因此虽然我可以修改他们的架构以添加这样的列,但我没有办法修改他们的代码来维护这样的列。
  • 如果您愿意修改架构,您可以添加触发器来记录这些操作。
  • 我当时在想……很有可能我可以添加这样的触发器而不会弄乱第三方产品的操作,但这让我有点紧张。如果我找不到任何其他可能是唯一解决方案的方法......
  • @BettyCrokker 该表当前是否包含 ant TimeStamp(或 RowVersion)列?此列还可以帮助您实现相同的结果。如果没有,您可以添加一个。阅读有关此数据类型的更多信息:msdn.microsoft.com/en-us/library/ms182776.aspx

标签: sql sql-server


【解决方案1】:

如果您可以修改他们的架构,那么您应该可以添加触发器。

添加 lastmodified 列后,您可以使用此触发器在记录更改时随时更新时间:

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

我只为 update 而不是 insert 这样做的原因是因为我可以看到一条新记录,我不需要时间戳,而是修改记录我可以比较我上次更新记录的时间。如果你想要插入更新,那么

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

会工作

如果您只想知道表何时更新,那么触发器可以使用表名和日期写入另一个表,而您不必修改其架构

【讨论】:

    猜你喜欢
    • 2018-08-30
    • 2020-07-10
    • 2012-12-21
    • 1970-01-01
    • 2019-07-01
    • 1970-01-01
    • 1970-01-01
    • 2013-12-09
    • 2012-07-15
    相关资源
    最近更新 更多