Как я могу сказать, получают ли к таблице базы данных доступ еще? Хочу что-то как “ИЗБРАННЫЙ триггер”

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

Единственная вещь, о которой я могу думать, состоит в том, чтобы создать кластерный индекс на таблицах процентов и затем контролировать sys.dm_db_index_usage_stats чтобы видеть, существуют ли, любой ищет или сканирует на кластерном индексе, подразумевая, что данные из таблицы были загружены. Однако добавление кластерного индекса на каждой таблице является плохой идеей (для всевозможных причин), поскольку не действительно выполнимо.

Есть ли другие опции, которые я имею? Я всегда хотел функцию как "ИЗБРАННЫЙ триггер", но существуют, вероятно, другие причины, почему SQL Server не имеет той функции также.

РЕШЕНИЕ:

Спасибо, Remus, для указания на меня в правильном направлении. Используя те столбцы, я создал следующий ВЫБОР, который делает точно, что я хочу.

  WITH LastActivity (ObjectID, LastAction) AS 
  (
       SELECT object_id AS TableName,
              last_user_seek as LastAction
         FROM sys.dm_db_index_usage_stats u
        WHERE database_id = db_id(db_name())
        UNION 
       SELECT object_id AS TableName,
              last_user_scan as LastAction
         FROM sys.dm_db_index_usage_stats u
        WHERE database_id = db_id(db_name())
        UNION
       SELECT object_id AS TableName,
              last_user_lookup as LastAction
         FROM sys.dm_db_index_usage_stats u
        WHERE database_id = db_id(db_name())
  )
  SELECT OBJECT_NAME(so.object_id) AS TableName,
         MAX(la.LastAction) as LastSelect
    FROM sys.objects so
    LEFT
    JOIN LastActivity la
      on so.object_id = la.ObjectID
   WHERE so.type = 'U'
     AND so.object_id > 100
GROUP BY OBJECT_NAME(so.object_id)
ORDER BY OBJECT_NAME(so.object_id)
58
задан SqlRyan 28 January 2010 в 18:20
поделиться

5 ответов

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

42
ответ дан 24 November 2019 в 19:09
поделиться

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

0
ответ дан 24 November 2019 в 19:09
поделиться

Re: Profiler, если вы мониторируете для SP: STMTCompleted , который будет зафиксировать все операторы, выполняемые в хранимой процедуре, так что это будет ловить доступ к таблице внутри SPROC. Если не все проходит через сохраненные процедуры, вам также может понадобиться SQL: STMTCompleted событие.

Будет большое количество событий, поэтому, вероятно, все еще не практично, чтобы проследить в течение длительного времени из-за размера следа. Однако вы можете применить фильтр - например, Где TextData содержит имя вашей таблицы, на которую вы хотите проверить. Вы можете дать список названий таблиц для фильтрации в любое время и постепенно работать через них. Таким образом, вы не должны получать никаких следовых событий, если ни один из этих таблиц не доступен.

Даже если вы чувствуете, что это не подходящий / жизнеспособный подход для вас, я думал, что стоит расширить.

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

6
ответ дан 24 November 2019 в 19:09
поделиться

Я имел в виду поиграть с разрешениями пользователей для разных таблиц, но потом вспомнил, что вы можете включить трассировку с триггером ON LOGON, вам это может пригодиться:

CREATE OR REPLACE TRIGGER SYS.ON_LOGON_ALL

AFTER LOGON ON DATABASE
WHEN (

USER 'MAX'

)
BEGIN

EXECUTE IMMEDIATE 'ALTER SESSION SET SQL_TRACE TRUE';

--EXECUTE IMMEDIATE 'alter session set events ''10046 trace name context forever level 12''';

EXCEPTION

WHEN OTHERS THEN

NULL;

END;

/

Тогда вы сможете проверять файлы трассировок.

0
ответ дан 24 November 2019 в 19:09
поделиться

Короче говоря: Для GUID, созданного в соответствии с опубликованными стандартами и спецификациями, просто не может произойти. GUID имеет структуру, и некоторые поля фактически имеют значение. Более того, .NET генерирует GUID версии 4, где это абсолютно невозможно. Они определяются путь, что такого GUID не будет. Подробнее см. ниже; -)


Существует от пяти до семи битов, которые являются основным препятствием здесь. Это идентификатор версии (первые четыре бита третьей части) и поле варианта , указывающее, какой это вариант GUID.

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

Давайте немного рассмотрим версии :

  1. MAC-адрес и метка времени. Оба, вероятно, трудно объединить в все-1 цифры.
  2. MAC-адрес и метка времени, а также идентификаторы пользователей. То же, что и для версии 1.
  3. MD5 хэш. Может ли даже сработать.
  4. PRNG. Не может работать, так как первая цифра четвертой части - всегда либо 8 , 9 , A или B . Это противоречит 4 для номера версии.
  5. Хэш SHA-1. Может ли даже сработать.

Пока мы исключили версию 4 как невозможную, другие как крайне маловероятные. Рассмотрим поле варианта.

Поле variant указывает некоторые битовые узоры для обратной совместимости ( x - не волнует ), а именно:

0 x x Reserved. NCS backward compatibility.
1 0 x The only pattern that currently can appear
1 1 0 Reserved, Microsoft Corporation backward compatibility
1 1 1 Reserved for future definition.

Поскольку этот образец находится в самом начале четвертой части, это означает, что для самой первой шестнадцатеричной цифры четвертой части всегда устанавливается старший бит. Это означает, что эта самая цифра никогда не может быть 1 , 2 , 3 или 5 . Конечно, не считая уже сгенерированных GUID. Но те, у кого MSB набора к 0 , бывают либо v1, либо v2. И временная метка части из них означает, что они должны быть сгенерированы несколько миллионов в будущем, чтобы это сработало.

-121--1398615-
$("#checkboxes").children("input:checked")

даст массив самих элементов. Если вам просто нужны имена:

$("#checkboxes").children("input:checked").map(function() {
    return this.name;
});
-121--605840-

Для SQL Server 2008 вы должны просмотреть Аудит SQL . Это позволяет выполнять аудит многих объектов, включая выбор в таблице и отчеты в файл или журнал событий.

3
ответ дан 24 November 2019 в 19:09
поделиться
Другие вопросы по тегам:

Похожие вопросы: