SQL-сервер: есть ли эквивалент триггера для выполнения общих хранимых процедур - PullRequest
2 голосов
/ 18 мая 2010

Надеюсь, вы можете помочь.

Есть ли способ надежно определить, когда на SQL Server выполняется хранимый процесс, не изменяя сам SP?

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

У нас нет практического способа изменить части веб-страниц продукта, откуда вызываются отчеты. Мы также не можем изменить сохраненные процедуры для основных отчетов о продуктах. (Было бы тривиально добавить строку регистрации в начало / конец каждого из наших внутренних).

Поэтому я пытаюсь выяснить, есть ли способ в SQL Server (2005/2008) выполнять хранимый процесс ведения журнала всякий раз, когда выполняется любая другая хранимая процедура, без изменения самих этих хранимых процедур.

Мы имеем общий контроль над самим экземпляром SQL Server, так как он локальный, мы просто не хотим изменять сами хранимые продукты.

У кого-нибудь есть идеи? Существует ли своего рода «триггер хранимого процесса»? Существует ли модель событий для SQL Server, в которую мы можем подключить пользовательский код .Net? (Просто для того, чтобы с самого начала отказаться от него, мы хотим попробовать внести изменения в SQL Server, а не захватывать отчет, запускаемый с веб-страниц продуктов и т. Д.)

Мысли оценили
Спасибо

Ответы [ 3 ]

5 голосов
/ 18 мая 2010

Вы можете настроить фоновую трассировку, которая запускается автоматически при инициализации SQL Server. Затем в своей трассировке вы можете вывести оператор трассировки в таблицу.

Например, откройте SQL Server Profiler. Создайте желаемую трассировку, т.е. включите SP: Starting и нужные вам столбцы. Также выберите сохранение трассировки в таблицу.

Теперь, после настройки скрипта, выберите File / Export / Script Trace Definition. Это создаст инструкцию SQL, которая генерирует трассировку.

Затем создайте хранимую процедуру, которая создает эту трассировку с использованием SQL. Установите proc в базе данных master и скажите SQL Server, чтобы он запускался автоматически при запуске:

exec sp_procoption N'sp_MyProc', N'startup', N'true'

Теперь каждый раз, когда SQL Server перезапускается, он автоматически настраивает вашу трассировку, и все вызовы SP записываются в таблицу.

- РЕДАКТИРОВАТЬ -

Также обратите внимание, что существуют некоторые динамические административные представления (DMV), полезные для мониторинга хранимых процедур. Два вас могут заинтересовать:

Например, sys.dm_exec_procedure_stats сообщит вам, когда процесс был запущен в последний раз, сколько раз он был запущен, самое длительное время выполнения и т. Д. Обратите внимание, что эти представления влияют только на хранимые процедуры, которые в настоящее время находятся в кэше базы данных. Если процедура выгружена, то информация будет тоже.

2 голосов
/ 18 мая 2010

Вы можете только надежно использовать SQL Profiler : нет хука выполнения или «триггера выполнения».

Сказав это, вы можете косвенно, но не на 100% надежно следить за кэшем плана. Смотрите эту ссылку . Однако, если у вас есть OPTION RECOMPILE, то он удаляется из кэша после использования. Кроме того, статистика сбрасывается после запуска сервера, и вам нужно запустить dmv, чтобы посмотреть, что находится в кеше.

Зависит от того, насколько тщательно вы должны быть ...

0 голосов
/ 18 мая 2010

Вы можете использовать такой инструмент, как SQL Log Rescue (бесплатно) для запроса файлов журнала SQL. http://www.red -gate.com / Продукты / SQL_Log_Rescue / index.htm Он может сказать вам, какие хранимые процедуры были запущены и когда. Это самый простой метод, поскольку он не предусматривает изменение существующего кода и не увеличивает накладные расходы приложений и сервера.

...