Узнать вызывающую хранимую процедуру в SQL Server

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

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

Вы можете узнать имя текущего SP, получив OBJECT_NAME(@@PROCID)

Gman 08.05.2010 19:39
ReactJs | Supabase | Добавление данных в базу данных
ReactJs | Supabase | Добавление данных в базу данных
Это и есть ваш редактор таблиц в supabase.👇
Понимание Python и переход к SQL
Понимание Python и переход к SQL
Перед нами лабораторная работа по BloodOath:
19
1
32 603
4
Перейти к ответу Данный вопрос помечен как решенный

Ответы 4

Ответ принят как подходящий

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

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

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

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

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

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

ИЛИ вы можете добавить блоки try catch в 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 есть возможность выполнять отладку с помощью процедур.

Вы можете сделать так, чтобы 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

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

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

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

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 ) 

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

Другие вопросы по теме