Профилировщик SQL: захват записей для определенной таблицы (ов)

#sql-server-2008

#sql-server-2008

Вопрос:

Мне нужно захватить операции записи (любой запрос, который изменяет данные), но только для двух определенных таблиц. Возможно ли это настроить в профилировщике Sql? Если да, то каким образом? Я надеюсь на решение, которое не требует фильтрации текста.

Ответ №1:

Основываясь на комментариях к ответам других пользователей, используйте профилировщик SQL по своему усмотрению со следующей настройкой

 Event Selection:
-Stored Procedures
  - SP: StmtStarting
-TSQL
  - SQL:StmtStarting

Column Filters
-TextData (LIKE)
 - "insert %"
 - "update %"
 - "delete %"
  

Я не хотел фильтровать текстовые данные, но это единственный способ получить то, что я хочу.

Ответ №2:

Я согласен с другим ответом, что CDC — это правильный путь (пока вы используете Enterprise edition)

С помощью профилировщика это технически возможно, но лишь с трудом.

Вы бы начали с захвата TSQL: StmtStarting, TSQL: StmtCompleting

Затем вам нужно будет экспортировать список для дальнейшего анализа. Вам пришлось бы написать какой-нибудь анализатор, чтобы отфильтровывать инструкции, которые не соответствуют критериям. Если ваша система получает запросы ad-hoc или подключена к системе, которая генерирует большое разнообразие запросов, анализ списка быстро усложнится в геометрической прогрессии.

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

Короче говоря, было бы забавно попробовать использовать profiler таким образом, но не в сценарии «реального мира».

И это говорит парень, которому нравится смотреть гонки на газонокосилках.

Ответ №3:

Используйте сбор данных изменений, который подробно описан здесь

Если CDC не подходит для вашего выбора, рассмотрите возможность размещения триггера в таблице (таблицах). В триггере захвата данных с SQL Server встроены такие функции, как

 select App_name() as 'AppName', CURRENT_USER as 'CurrentUser', HOST_ID () as 'HostID', HOST_NAME () as 'HostName', SESSION_USER as 'SessionUser', SYSTEM_USER as 'SystemUser'
  

Затем поместите данные в таблицу истории

Комментарии:

1. Мне нужно захватить действия по изменению типа из профилировщика Sql. На самом деле меня не волнует, что будет изменено, просто было установлено некоторое соединение и внесено изменение.

2. До тех пор, пока вы используете Enterprise edition, CDC по-прежнему будет правильным решением. (это недоступно в стандартной версии)