是否有可能找出谁调用了商店程序?
例如,假设我在proc3
中收到错误消息。从该proc中我想知道它是否被proc1
或proc2
调用。
答案 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 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