Как идентифицировать вызываемый хранимый процесс - PullRequest
3 голосов
/ 18 августа 2010

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

Я бы хотел добавить в начало вызываемого хранимого процесса что-то вроде:

вставить в значения callLog (@@ caller, getdate ())

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

Кто-нибудь может мне помочь с частью @@ caller?

Ответы [ 3 ]

0 голосов
/ 18 августа 2010

Вы могли бы потенциально идентифицировать исходные запросы, поступающие на сервер, используя DBCC INPUTBUFFER, но я не думаю, что есть что-то, что позволяет вам найти непосредственного абонента процесса.

(Пример быстрого приготовления - здесь могут быть различные проблемы с разрешениями, может потребоваться переместить часть ведения журнала в другой сохраненный процесс с другими настройками EXECUTE AS):

create table CallLog (
    EventType varchar(50) not null,
    Parameters int not null,
    EventInfo varchar(max) not null
)
go
create procedure Callee
as
    declare @Logger varchar(1000)
    set @Logger = 'dbcc inputbuffer(' + CONVERT(varchar(10),@@SPID) + ')'
    insert into CallLog(EventType,Parameters,EventInfo)
    exec(@Logger)

    --Now do the actual work for the stored proc
    select * from sysobjects
go
create procedure Caller
as
    exec Callee
go
exec Caller
go
select * from CallLog
0 голосов
/ 18 августа 2010

К сожалению, нет доступа к стеку вызовов SP из T-SQL.Если вам это нужно временно для целей отладки, вы можете использовать SQL Profiler.

В этой статье описывается обходной путь - в основном реализация собственного стека вызовов с использованием SET CONTEXT_INFO .
Однако, если вам это нужно только для одной процедуры, удобнее просто добавить дополнительный параметр.

0 голосов
/ 18 августа 2010

Попробуйте

SELECT @caller = OBJECT_NAME(@@PROCID)

РЕДАКТИРОВАТЬ: После того, как вы получили текущий proc.name, передайте его в log sp в качестве параметра, вот и все.

Это работает только внутри хранимой процедуры.

Пример использования этого

USE AdventureWorks;
GO
IF OBJECT_ID ( 'usp_FindName', 'P' ) IS NOT NULL 
DROP PROCEDURE usp_FindName;
GO
CREATE PROCEDURE usp_FindName
    @lastname varchar(40) = '%', 
    @firstname varchar(20) = '%'
AS
DECLARE @Count int;
DECLARE @ProcName nvarchar(128);
SELECT LastName, FirstName, Phone, EmailAddress
FROM Person.Contact 
WHERE FirstName LIKE @firstname AND LastName LIKE @lastname;
SET @Count = @@ROWCOUNT;
SET @ProcName = OBJECT_NAME(@@PROCID);
RAISERROR ('Stored procedure %s returned %d rows.', 16,10, @ProcName, @Count);
GO
EXECUTE dbo.usp_FindName 'P%', 'A%';

Подробнее об этом

http://msdn.microsoft.com/en-us/library/ms174408(SQL.90).aspx

Пример ведения журнала хранимых процедур.Может быть полезно

http://weblogs.sqlteam.com/brettk/archive/2006/09/21/12391.aspx

Вот еще один связанный с этим вопрос

Может ли хранимая процедура MS / Transact-SQL искать свое собственное имя?

РЕДАКТИРОВАТЬ 2: и другие связанные вопросы в SO

Найти хранимую процедуру вызова в SQL Server

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