Узнайте хранимую процедуру вызова в SQL Server - PullRequest
18 голосов
/ 29 сентября 2008

Можно ли узнать, кто вызвал процедуру магазина?

Например, скажем, я получил ошибку в proc3. Из этого процесса я хочу знать, был ли он вызван proc1 или proc2.

Ответы [ 4 ]

9 голосов
/ 29 сентября 2008

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

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

3 голосов
/ 29 сентября 2008

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

Если у вас есть механизм ведения журнала, вы можете прочитать журнал и выяснить, кто вам звонил.

Например, если вы осуществляете ведение журнала, вставляя в таблицу, например:

CREATE TABLE Log
(timestamp dattime, 
spid       int, 
procname   varchar(255), 
message    varchar(255) )

... text of proc ... 
INSERT INTO Log
SELECT get_date(), @@spid, @currentproc, 'doing something' 
-- you have to define @currentproc in each proc

-- get name of caller
SELECT @caller = procname 
FROM   Log
WHERE  spid = @@spid 
AND    timestamp = (SELECT max(timestamp) 
                    FROM   Log 
                    WHERE  timestamp < get_date() 
                    AND    procname != @currentproc ) 

Это не сработает для рекурсивных вызовов, но, возможно, кто-то может это исправить?

3 голосов
/ 29 сентября 2008

Вам нужно знать в proc3 во время выполнения, что вызвало ошибку, или вам просто нужно знать во время отладки?

Вы можете использовать Профилировщик SQL Server , если вам нужно сделать это только во время отладки / мониторинга.

В противном случае в 2005 году я не верю, что у вас есть возможность составлять трассировку.

Чтобы обойти это, вы можете добавить и дополнительный параметр в proc3, @CallingProc или что-то в этом роде.

ИЛИ вы можете добавить блоки try try к proc1 и proc2.

BEGIN TRY
EXEC Proc3
END TRY
BEGIN CATCH
SELECT 'Error Caught'
SELECT
    ERROR_PROCEDURE()
END CATCH

Хорошая ссылка здесь: http://searchsqlserver.techtarget.com/tip/1,289483,sid87_gci1189087,00.html

и, конечно, всегда Электронная документация по SQL Server

SQL Server 2008, однако, имеет возможность отладки с помощью процедур.

2 голосов
/ 29 сентября 2008

Вы могли бы, чтобы proc1 и proc2 передавали свои имена в proc3 в качестве параметра.

Например:

CREATE PROCEDURE proc3
  @Caller nvarchar(128) -- Name of calling proc.
  AS
  BEGIN
    -- Produce error message that includes caller's name.
    RAISERROR ('Caller was %s.', 16,10, @Caller);
  END
  GO

  CREATE PROCEDURE proc1
  AS
  BEGIN
    -- Get the name of this proc.
    DECLARE @ProcName nvarchar(128);
    SET @ProcName = OBJECT_NAME(@@PROCID);
    -- Pass it to proc3.
    EXEC proc3 @ProcName
  END
  GO

  CREATE PROCEDURE proc2
  AS
  BEGIN
    -- Get the name of this proc.
    DECLARE @ProcName nvarchar(128);
    SET @ProcName = OBJECT_NAME(@@PROCID);
    -- Pass it to proc3.
    EXEC proc3 @ProcName
  END
  GO
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...