2016-07-11 6 views
0

Мне нужно знать, когда данные в таблице были в последний раз модифицированы (данные вставлены, созданы, удалены). Общий ответ заключается в извлечении данных из sys.dm_db_index_usage_stats, но у меня нет доступа к этой таблице, и, насколько я понимаю, доступ к этому разрешению на уровне сервера, и поскольку это находится на корпоративном общем сервере, шансы отдела ИТ, предоставляющего мне доступ, там, где свиней летают.SQL Server - получить последнее обновленное время для таблицы

Есть ли способ получить эту информацию, которая не требует значительно повышенных привилегий?


Update # 1

Некоторая дополнительная информация: То, что я делаю, кэширование содержимого этой таблицы локально, и нужно знать, когда, чтобы обновить свой локальный кэш. Это означает:

  1. мне не нужно фактический штамп время, просто любое значение, которое я могу сравнить с локально кэшированным значением, которое говорит мне, «все изменилось, обновите кэш»
  2. Если это значение изменяется слишком часто (например, получает сбрасываться каждый раз, когда они перезагружать сервер, который крайне редко) это нормально, это просто означает, что я могу сделать дополнительные обновления кэша, что я не на самом деле нужно сделать

Update # 2

Я должен был сделать это на ранней стадии, но я просто предположил, что смогу создавать таблицы по мере необходимости ... но я не уверен. Разрешение не предоставляется. Поэтому ни один из предложенных методов будут работать :-(

Вот моя новая мысль: я могу назвать

select checksum_agg(binary_checksum(*)) 

и получить контрольную сумму по всей удаленной таблице Затем, если изменения контрольной суммы, я знаю. таблица изменилась, и я могу обновить свой локальный кеш. Я видел problems with checksum, но использование HASHBYTES звучит, как будто было бы намного сложнее и намного медленнее.

Это работает, проблема в том, что при изменении контрольной суммы, Мне нужно перезагрузить весь кеш. В моей таблице столько строк, что возвращает контрольную сумму в строке, занимает недопустимо длинный тайм e, есть ли способ использовать предложение «OVER» и получить, может быть, 10 контрольных сумм, первую контрольную сумму для первой десятой строк и т. д.?

+0

Я предполагаю, что ваша таблица не имеет ничего похожего на столбе «LastModified»? – Siyual

+0

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

+0

Хорошо, если вы счастливы изменить схему, вы можете добавить триггер для регистрации этих операций. –

ответ

1

Если вы можете изменить свою схему, то вы сможете добавить триггер.

После добавления LastModified колонки, вы можете использовать этот триггер, чтобы получить время обновляется каждый раз, записывающие изменения:

CREATE trigger [dbo].[TR_TheirTable_Timestamp] 
on [dbo].[TheirTable] for update 
as 
begin 
    update 
     dbo.TheirTable 
    set 
     lastmodified=getdate() 
    from 
     Inserted 
    where 
     dbo.TheirTable.UniqueID=Inserted.UniqueKey 
end 

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

on [dbo].[TheirTable] for insert,update 

будет работать

Если вы просто хотели бы знать, когда таблица была обновлена, то триггер может написать в другую таблицу с именем таблицы и даты, и вы Wouldn 't должны изменить свою схему

Смежные вопросы