Можно ли узнать, кто вызвал процедуру магазина?
Например, скажем, я получаю сообщение об ошибке в proc3
. Изнутри этого proc я хочу знать, был ли он вызван proc1
или proc2
.
Можно ли узнать, кто вызвал процедуру магазина?
Например, скажем, я получаю сообщение об ошибке в proc3
. Изнутри этого proc я хочу знать, был ли он вызван proc1
или proc2
.
Я бы использовал дополнительный входной параметр, чтобы указать источник, если это важно для вашей логики.
Это также упростит перенос вашей базы данных на другую платформу, поскольку вы не будете зависеть от какой-то неясной зависимости от платформы.
Вам нужно знать в proc3 во время выполнения, которое вызвало ошибку, или вам просто нужно знать при отладке?
Вы можете использовать профайлер SQL Server, если вам нужно всего лишь сделать это во время отладки/мониторинга.
В противном случае в 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
У SQL Server 2008 есть возможность отлаживать процедуры.
Нет никакого хорошего автоматического способа сделать это (увы). Так что это действительно зависит от того, насколько вы готовы (запишите) свои 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 )
Это не будет работать для рекурсивных вызовов, но, возможно, кто-то может это исправить?
Вы могли бы передать proc1 и proc2 свои имена в proc3 в качестве параметра.
Например:
CREATE PROCEDURE proc3
@Caller nvarchar(128) -- Name of calling proc.
AS
BEGIN
-- Produce error message that includes caller 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