Как проверить, изменились ли данные в базе данных - PullRequest
0 голосов
/ 31 января 2019

Чтобы создать Dashboard, мне нужно работать с базой данных, о которой у меня нет информации.Данные в базе данных обновляются через определенный интерфейс управления, и я не знаю, где они обновляются в БД.Есть ли способ проверить наличие обновлений данных без имен таблиц или столбцов?

Спасибо

1 Ответ

0 голосов
/ 31 января 2019

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

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