找出SQL Server中的调用存储过程

时间:2008-09-29 08:56:14

标签: sql sql-server database stored-procedures sql-server-2005

是否有可能找出谁调用了商店程序?

例如,假设我在proc3中收到错误消息。从该proc中我想知道它是否被proc1proc2调用。

4 个答案:

答案 0 :(得分:9)

如果这对您的逻辑很重要,我会使用额外的输入参数来指定源。

这也可以让您更轻松地将数据库移植到另一个平台,因为您不依赖于某些模糊的平台相关功能。

答案 1 :(得分:3)

您是否需要在运行时知道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 Server 2008确实能够通过程序进行调试。

答案 2 :(得分:3)

没有好的自动方式来做到这一点(唉)。所以它真的取决于你准备多少(重新)编写你的触发器以便能够做到这一点。

如果您有日志记录机制,您可以阅读日志并找出谁给您打电话。

例如,如果通过插入表来实现日志记录,例如:

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 ) 

这不适用于递归调用,但也许有人可以解决这个问题?

答案 3 :(得分: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