Есть ли способ использовать представления DBC, чтобы найти дату и время последнего изменения схемы базы данных?

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

Причина, по которой мне это нужно, заключается в том, что я пишу утилиту .NET, которая сильно зависит от данных, возвращаемых из dbc.tables, dbc.columns и dbc.indices. Поскольку запрос этих представлений может быть очень дорогостоящей операцией, я хочу прочитать все это в пользовательские бизнес-объекты, а затем сериализовать объекты в XML-файл, хранящийся на диске. Таким образом, я могу просто десериализовать данные, когда они мне нужны, если только метка current_timestamp базы данных не больше или не равна дате и времени последнего изменения схемы, после чего я обновлю локальный файл XML с обновленной схемой.


person oscilatingcretin    schedule 03.12.2012    source источник


Ответы (1)


LastAlterTimestamp — если он равен CreateTimestamp, то объект не изменялся с момента создания или замены. Он обновляется при обновлении атрибута, специфичного для этого объекта словаря данных.

Например, DBC.Databases.LastAlterTimestamp не обновляется при добавлении, удалении или изменении дочернего объекта (таблицы, представления, макроса, хранимой процедуры, функции и т. д.). Он обновляется в таких ситуациях, как изменение пароля, роли по умолчанию, профиля или учетной записи.

person Rob Paller    schedule 03.12.2012
comment
Я только что подтвердил, что добавление таблиц и изменение столбцов и даже индексов изменило max(LastAlterTimestamp). Однако удаление таблицы, по-видимому, влияет на агрегирование, возвращая значение LastAlterTimestamp объекта со следующим наивысшим значением LastAlterTimestamp только что удаленной таблицы. Я проверил LastAlterTimestamp базы данных dbc.databases, но, похоже, он не меняется при удалении таблицы. Есть идеи? - person oscilatingcretin; 03.12.2012
comment
Я полагаю, я мог бы сохранить LastAlterTimestamp в файл, а затем проверить, изменилось ли это значение, а не выполнять проверку больше/равно. Тем не менее, я хотел бы знать, почему это влияет на LastAlterTimestamp. - person oscilatingcretin; 03.12.2012
comment
Добавлено дополнительное пояснение к области действия LastAlterTimestamp. - person Rob Paller; 03.12.2012
comment
Спасибо за это. Каковы ваши комментарии к моему ответу относительно агрегирования значения LastAlterTimestamp в dbc.tables при удалении таблицы? - person oscilatingcretin; 03.12.2012
comment
DBC.Databases.LastAlterTimestamp не изменится при удалении таблицы. MAX(DBC.TVM.LastAlterTimestamp) может измениться при удалении таблицы. Когда вы удаляете таблицу, строка в DBC.TVM удаляется. Следовательно, если отброшенная таблица была последней измененной, у вас будет новая последняя измененная таблица. - person Rob Paller; 03.12.2012