为了创建仪表板,我需要在一个我没有信息的数据库上工作。数据库中的数据是通过特定的管理界面更新的,我不知道它在数据库中的更新位置。没有表名或列名,有没有办法检查数据更新?
谢谢
答案 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时间点以来,这不会让您知道更新是什么或发生了多少更新,但可以让您知道表的最后更新时间。 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