Может ли хранимый процесс SQL Server определить имя родительского процесса? - PullRequest
7 голосов
/ 17 июля 2009

Если Proc A выполняет Proc B, есть ли способ для Proc B найти, что он был вызван A, вместо того, чтобы иметь параметр, где A передает B свой идентификатор?

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

2) Как уже упоминалось, ведение журнала / аудит. Я хотел бы сделать процедуру, которая регистрирует начало, конец и запись сообщения, которая не требует параметров, и принимает один необязательный параметр указанного пользователем сообщения. Это позволило бы просто добавить exec в верхнюю и нижнюю часть процедуры, чтобы заставить его работать, а процедура аудита выяснит все остальное самостоятельно.

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

3) Такая обобщенная процедура, используемая совместно с семафором, может гарантировать, что связанные процессы не будут выполняться одновременно, независимо от сеансов / транзакций и т. Д.

Ответы [ 5 ]

5 голосов
/ 17 июля 2009

используйте следующий праметр:

CREATE PROCEDURE ParentProcedure

AS

DECLARE @ProcID             int

SET @ProcID=@@PROCID

EXEC ChildProcedure @ProcID

RETURN 0
go

и это ...

CREATE PROCEDURE ChildProcedure
(
@ProcID   int=null --optional
)
AS

if @ProcID IS NOT NULL
BEGIN
    PRINT 'called by '+OBJECT_NAME(@ProcID)
END

RETURN 0
go
1 голос
/ 17 июля 2009

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

0 голосов
/ 17 июля 2009

В MSSQL Server 2008 вы можете использовать sys.dm_exec_procedures_stats, это динамическое представление управления может показать вам, когда была выполнена хранимая процедура (см. Также sys.procedures для получения имени процедуры) и так далее.

SELECT s.*, d.*
FROM sys.procedures s
INNER JOIN sys.dm_exec_procedure_stats d
ON s.object_id = d.object_id
ORDER BY [d.last_execution_time] DESC;

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

и да, если есть параллелизм, это решение не работает. Это может помочь только в разработке или отладке.

0 голосов
/ 17 июля 2009

Если хранимая процедура должна вести себя по-разному в зависимости от того, кто ее вызывает, то ей нужно добавить параметр. Таким образом, если вы добавите хранимую процедуру «Z», код все равно будет работать - «Z» может передавать параметр так, как его передавал «C», или как «D». Если этого недостаточно, нужно добавить новую логику в "B".

0 голосов
/ 17 июля 2009

Зачем вам это нужно?
AFAIK, у proc B нет возможности узнать, кто его вызвал.

РЕДАКТИРОВАТЬ: Поскольку KM показывает, что это возможно (в соответствии с кодом), мне интересно понять причину этого. Можете ли вы также опубликовать это, добавив его в свой вопрос?

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