如何检查数据库中的数据是否已更改

时间:2019-01-31 16:40:42

标签: sql-server database

为了创建仪表板,我需要在一个我没有信息的数据库上工作。数据库中的数据是通过特定的管理界面更新的,我不知道它在数据库中的更新位置。没有表名或列名,有没有办法检查数据更新?

谢谢

1 个答案:

答案 0 :(得分:1)

我同意,对数据库一无所知不会使您走得太远,但是您可以在不知道要查找什么的情况下获得一些有关表更新的信息。它是否有用是另一个问题。

所包含的代码利用sys.dm_db_index_usage_stats来标识上一次在表上执行用户更新的时间。这适用于堆以及索引表,并且user_update值包括插入,删除和更新。 sys.dm_db_index_usage_stats视图将仅包含有关已交互表的信息。为了解决这个问题,我用第二个查询UNION ALL来获取sys.dm_db_index_usage_stats中找不到的表的相关对象信息。这将提供表对象的完整视图,无论自服务启动以来是否使用过它们。您可能根本不在乎,可以将其删除。

同样,这可能无济于事,但是您的问题只是“是否有一种方法可以在没有表名或列名的情况下检查数据更新?”而这个特定问题的答案是肯定的。

注意事项:

  • user_update值只是更新操作的递增计数器。自从X时间点以来,这不会让您知道更新是什么或发生了多少更新,但可以让您知道表的最后更新时间。
  • 此信息不会在服务重启后持续存在,因此,如果在重启前就更新了表,您将不会知道。
  • 提供的脚本是特定于数据库的,这意味着它仅返回有关其运行的datbase的信息。您可以使用sp_MSforeachdb之类的东西来对所有数据库进行运行。

还有代码...

SELECT * FROM 
(
    SELECT 
        @@servername as servername 
        , DB_NAME(database_id) as DatabaseName
        , u.object_id
        , SchemaName = OBJECT_SCHEMA_NAME(u.object_id, database_Id)  
        , TableName = OBJECT_NAME(u.object_id, database_id) 
        , Writes =  SUM(user_updates)
        , LastUpdate = CASE WHEN MAX(u.last_user_update) IS NULL THEN CAST('17530101' AS DATETIME) ELSE MAX(u.last_user_update) END
    FROM sys.dm_db_index_usage_stats u
    JOIN sys.indexes i
    ON u.index_id = i.index_id
    AND u.object_id = i.object_id
    WHERE u.database_id = DB_ID()
    GROUP BY database_id, u.object_id
    UNION ALL 
    SELECT 
        @@servername as servername
        , DB_NAME() as DatabaseName 
        , o.object_id
        , OBJECT_SCHEMA_NAME(o.object_id, db_id())
        , object_name(o.object_id, db_id())
        , 0
        , CAST('17530101' AS DATETIME) 
    FROM sys.indexes i
    JOIN sys.objects o ON i.object_id = o.object_id
    WHERE o.type_desc in ('user_table')
    and i.index_id NOT IN (select s.index_id from sys.dm_db_index_usage_stats s where s.object_id=i.object_id 
    and i.index_id=s.index_id and database_id = db_id(db_name()) )
) AS temp 
ORDER BY writes DESC