2015-04-24 4 views
1

Как вы индивидуально регистрируете информацию о вложенных хранимых процедурах, которые выполняются родительской хранимой процедурой?Регистрация вложенных хранимых процедур в SQL Server

Пример:

CREATE PROCEDURE dbo.usp_ParentProcedure 
AS 
BEGIN 
    EXEC dbo.usp_ChildProcedure1 
    EXEC dbo.usp_ChildProcedure2 
    EXEC dbo.usp_ChildProcedure3 
END 
GO 

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

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

Aaron Bertrand поделился своим решением для сохранения единственного хранимой процедуры здесь http://www.mssqltips.com/sqlservertip/2003/simple-process-to-track-and-log-sql-server-stored-procedure-use/

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

Благодаря

Нила

+0

Почему бы не просто создать триггер DDL, который предотвращает создание или изменение любой процедуры, в которой тело не содержит * не * содержит общие обработчики ведения журнала? Они не могут обходить ваши правила, если система их не допускает. Если это не вариант, вы можете легко обернуть вызовы в родительскую процедуру и время захвата (легко) и другие ресурсы (возможно, немного более жесткие) для каждого вызова. Но тьфу. И вы по-прежнему полагаетесь на людей, чтобы обернуть новые вызовы битом регистрации - не так сильно, как ожидалось, что они добавят обработчики протоколирования к дочерним процедурам. –

+0

Вау, какая привилегия получить ответ от старшего консультанта в SQL Sentry. Спасибо, что нашли время, чтобы ответить на мой запрос. Я буду запускать DDL-идею мимо моего начальника и сказать им, что Аарон Бертран отправил меня;) –

+0

Г-н Бертран, вы имеете в виду настройку политики SQL Server, которая обеспечит ее соблюдение? Как бы вы установили триггер ddl, который будет проверять proc? –

ответ

0

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

SELECT 
    DB_NAME (s.database_id), 
    s.[object_id], 
    p.name, 
    s.sql_handle, 
    s.plan_handle, 
    s.last_worker_time, 
    s.last_elapsed_time, 
    s.last_physical_reads, 
    s.last_logical_writes, 
    s.last_logical_reads, 
    p2.name, 
    p2.[object_id] 
FROM sys.dm_exec_procedure_stats s 
INNER JOIN sys.procedures p 
ON s.[object_id] = p.[object_id] 
LEFT JOIN sys.procedures p2 --join to identify parent procedure from results 
ON p2.[object_id] = (
    select top 1 s.[object_id] 
    from sys.dm_exec_procedure_stats s 
    inner join sys.procedures p 
    ON s.[object_id] = p.[object_id] 
    order by s.total_worker_time desc 
) 
WHERE s.[object_id] <> p2.[object_id] 
AND s.[object_id] <> @@PROCID 
Смежные вопросы