Czy można dowiedzieć się, kto nazwał procedurę sklepu?Dowiedz się, wywołując procedura składowana w SQL Server
Załóżmy na przykład, że pojawia się błąd w proc3
. Z tego procesu chcę wiedzieć, czy został wywołany przez proc1
lub proc2
.
Czy można dowiedzieć się, kto nazwał procedurę sklepu?Dowiedz się, wywołując procedura składowana w SQL Server
Załóżmy na przykład, że pojawia się błąd w proc3
. Z tego procesu chcę wiedzieć, czy został wywołany przez proc1
lub proc2
.
Chciałbym użyć dodatkowego parametru wejściowego, aby określić źródło, jeśli jest to ważne dla twojej logiki.
Ułatwi to również przeniesienie bazy danych na inną platformę, ponieważ nie zależy to od funkcji zależnej od niejasnej platformy.
Czy musisz wiedzieć w proc3 w czasie wykonywania, który spowodował błąd, czy po prostu musisz wiedzieć podczas debugowania?
Możesz użyć SQL Server profiler, jeśli potrzebujesz tego tylko podczas debugowania/monitorowania.
W przeciwnym razie w 2005 r. Nie wierzę, że masz możliwość śledzenia stosu.
Do obejścia tego można dodać i dodać dodatkowy parametr do proc3, @CallingProc lub coś w tym stylu.
ALBO możesz dodać try catch blocks do proc1 i proc2.
BEGIN TRY
EXEC Proc3
END TRY
BEGIN CATCH
SELECT 'Error Caught'
SELECT
ERROR_PROCEDURE()
END CATCH
dobre referencje tutaj: http://searchsqlserver.techtarget.com/tip/1,289483,sid87_gci1189087,00.html
i oczywiście zawsze SQL Server Books Online
SQL Server 2008 ma możliwość debugowania poprzez procedury jednak.
Możesz mieć proc1 i proc2 przekazać swoje nazwy do proc3 jako parametr.
Na przykład:
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
Nie ma ładny automatyczny sposób to zrobić (niestety). To naprawdę zależy od tego, ile jesteś przygotowany (ponownie) napisać swoje proci, aby móc to zrobić.
Jeśli masz mechanizm rejestrowania, możesz przeczytać dziennik i ustalić, kto do Ciebie zadzwonił.
Na przykład, jeśli wdrożenie rejestrowanie poprzez wstawienie do tabeli, na przykład:
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)
To nie będzie działać dla wywołań rekurencyjnych, ale być może ktoś może naprawić?
Możesz znać nazwę bieżącego SP, otrzymując 'OBJECT_NAME (@@ PROCID)' – Gman