Я согласен, что ничего не зная о базе данных, вы не сможете продвинуться далеко вперед, но вы можете получить некоторую информацию об обновлениях таблиц, не зная, что вы ищете.Полезно это или нет - это другой вопрос.
Включенный код усиливает 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