¿Es posible averiguar quién llamó a un procedimiento de tienda?Averigüe el procedimiento almacenado de llamada en SQL Server
Por ejemplo, supongo que aparece un error en proc3
. Desde ese proceso, quiero saber si fue llamado por proc1
o proc2
.
¿Es posible averiguar quién llamó a un procedimiento de tienda?Averigüe el procedimiento almacenado de llamada en SQL Server
Por ejemplo, supongo que aparece un error en proc3
. Desde ese proceso, quiero saber si fue llamado por proc1
o proc2
.
Utilizaría un parámetro de entrada adicional, para especificar la fuente, si esto es importante para su lógica.
Esto también hará que sea más fácil transportar su base de datos a otra plataforma, ya que no depende de alguna función oscura dependiente de la plataforma.
¿Necesita saber en proc3 durante el tiempo de ejecución cuál fue el error o simplemente debe saberlo durante la depuración?
Puede usar SQL Server profiler si solo necesita hacerlo durante la depuración/supervisión.
De lo contrario, en 2005 no creo que tenga la capacidad de acumular trazas.
Para solucionarlo, puede agregar un parámetro extra a proc3, @CallingProc o algo así.
O podría agregar try catch blocks a proc1 y proc2.
BEGIN TRY
EXEC Proc3
END TRY
BEGIN CATCH
SELECT 'Error Caught'
SELECT
ERROR_PROCEDURE()
END CATCH
buena referencia aquí: http://searchsqlserver.techtarget.com/tip/1,289483,sid87_gci1189087,00.html
y por supuesto siempre SQL Server Books Online
SQL Server 2008 tiene la capacidad para depurar a través de procedimientos de embargo.
Puede hacer que proc1 y proc2 pasen sus nombres a proc3 como parámetro.
Por ejemplo:
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
No hay manera automática agradable de hacer esto (por desgracia). Por lo tanto, realmente depende de cuánto esté preparado para (re) escribir sus procesos para poder hacer esto.
Si tiene un mecanismo de registro, es posible que pueda leer el registro y averiguar quién lo llamó.
Por ejemplo, si se implementa el registro mediante la inserción de una mesa, por ejemplo:
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)
Esto no funcionaría para las llamadas recursivas, pero tal vez alguien puede arreglar eso?
Puede conocer el nombre del SP actual obteniendo 'OBJECT_NAME (@@ PROCID)' – Gman