누가 저장 프로 시저를 호출했는지 확인할 수 있습니까?SQL Server에서 호출 저장 프로 시저 찾아보기
예를 들어 proc3
에 오류가 발생한다고 가정 해 보겠습니다. 해당 proc 내에서 proc1
또는 proc2
에 의해 호출되었는지 알고 싶습니다.
누가 저장 프로 시저를 호출했는지 확인할 수 있습니까?SQL Server에서 호출 저장 프로 시저 찾아보기
예를 들어 proc3
에 오류가 발생한다고 가정 해 보겠습니다. 해당 proc 내에서 proc1
또는 proc2
에 의해 호출되었는지 알고 싶습니다.
논리가 중요 할 경우 추가 입력 매개 변수를 사용하여 소스를 지정합니다.
이렇게하면 일부 플랫폼에 종속 된 기능에 의존하지 않으므로 데이터베이스를 다른 플랫폼으로 쉽게 이식 할 수 있습니다.
런타임시 오류가 발생하는 proc3을 알아야합니까, 아니면 디버깅하는 동안 알아야합니까?
디버그/모니터링 중에 만 수행해야하는 경우 SQL Server profiler을 사용할 수 있습니다.
그렇지 않으면 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 Books Online
SQL 서버 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
없습니다. 그래서 당신이 procs를 작성할 수 있도록하기 위해 얼마나 많은 양의 준비가되어 있는지에 달려 있습니다.
로깅 메커니즘이있는 경우 로그를 읽고 전화를 걸어 볼 수 있습니다. 예를 들어
, 당신은 예를 들어, 테이블에 삽입하여 로깅을 구현하는 경우 :
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)
이 재귀 호출을 위해 작동하지 않을 것입니다, 그러나 아마 누군가가 그것을 해결할 수 있습니까?
'OBJECT_NAME (@@ PROCID)'를 가져 와서 현재 SP의 이름을 알 수 있습니다. – Gman