20

誰がストア プロシージャを呼び出したかを特定することはできますか?

たとえば、 でエラーが発生したとしproc3ます。proc1そのプロシージャ内から、またはによって呼び出されたかどうかを知りたいですproc2

4

4 に答える 4

11

これがロジックにとって重要な場合は、追加の入力パラメーターを使用してソースを指定します。

これにより、プラットフォームに依存するあいまいな機能に依存しないため、データベースを別のプラットフォームに簡単に移植できます。

于 2008-09-29T09:06:28.550 に答える
3

エラーの原因を実行時に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には、プロシージャを介してデバッグする機能があります。

于 2008-09-29T09:15:41.540 に答える
3

これを自動的に行う良い方法はありません (残念ながら)。したがって、これを実行できるようにするために、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 ) 

これは再帰呼び出しでは機能しませんが、おそらく誰かがそれを修正できますか?

于 2008-09-29T11:09:59.877 に答える
2

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
于 2008-09-29T09:16:14.360 に答える