誰がストア プロシージャを呼び出したかを特定することはできますか?
たとえば、 でエラーが発生したとしproc3
ます。proc1
そのプロシージャ内から、またはによって呼び出されたかどうかを知りたいですproc2
。
誰がストア プロシージャを呼び出したかを特定することはできますか?
たとえば、 でエラーが発生したとしproc3
ます。proc1
そのプロシージャ内から、またはによって呼び出されたかどうかを知りたいですproc2
。
これがロジックにとって重要な場合は、追加の入力パラメーターを使用してソースを指定します。
これにより、プラットフォームに依存するあいまいな機能に依存しないため、データベースを別のプラットフォームに簡単に移植できます。
エラーの原因を実行時にproc3で知る必要がありますか、それともデバッグ中に知る必要がありますか?
SQL Serverプロファイラーは、デバッグ/監視中にのみ実行する必要がある場合に使用できます。
それ以外の場合、2005年には、トレースをスタックする機能がないと思います。
これを回避するには、proc3、@CallingProcなどにパラメータを追加します。
または、trycatchブロックを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 Server 2008には、プロシージャを介してデバッグする機能があります。
これを自動的に行う良い方法はありません (残念ながら)。したがって、これを実行できるようにするために、proc を (再) 作成する準備がどれだけあるかに大きく依存します。
ロギング メカニズムがあれば、ログを読んで、誰があなたに電話をかけてきたかを突き止めることができるかもしれません。
たとえば、次のようにテーブルに挿入してロギングを実装する場合:
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 )
これは再帰呼び出しでは機能しませんが、おそらく誰かがそれを修正できますか?
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