【发布时间】:2016-11-13 14:07:56
【问题描述】:
我需要知道上次修改表中数据的时间(插入、创建、删除数据)。常见的答案是从 sys.dm_db_index_usage_stats 中提取数据,但我无权访问该表,据我了解,访问该表是服务器级别的权限,因为这是在公司共享服务器上,所以IT 部门授予我访问权限的几率很高。
有没有不需要大大提升权限的方法来获取这些信息?
更新 #1
一些附加信息:我正在做的,是在本地缓存这个表的内容,并且需要知道什么时候更新我的本地缓存。这意味着:
- 我不需要实际的时间戳,只要我可以与本地缓存的值进行比较即可告诉我“事情发生了变化,更新缓存”
- 如果此值更改太频繁(例如,每次重启服务器时都会重置,这种情况极少发生)没关系,这只是意味着我做了一个我实际上不需要做的额外缓存更新
更新 #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