2009-07-17 15 views
6

Si el Proc A ejecuta el Proc B, ¿hay alguna manera para que el Proc B busque que A fue llamado por A en lugar de tener un parámetro donde A pasa B su ID?¿Puede un proceso almacenado de SQL Server determinar el nombre del proc padre?

Por solicitud: La razón por la que estoy interesado en esto es multiples veces 1) Conocimiento general, estoy seguro de que si se puede hacer esto implicaría el uso inteligente de algunas tablas/variables del sistema que pueden ayudarme a hacer otras cosas en el camino.

2) Como han mencionado otros, registro/auditoría. Me gustaría realizar un procedimiento que registre una entrada de inicio, fin y mensaje que no requiera parámetros y acepte un parámetro opcional de un mensaje especificado por el usuario. Esto permitiría simplemente colocar un ejecutivo en la parte superior e inferior de un proceso para hacerlo funcionar y el procedimiento de auditoría resolvería el resto por sí mismo.

Sé que esta información está disponible en los archivos de registro, pero analizarlos y dárselos a los usuarios no es tan sencillo, mientras que esto daría fácil acceso a esa información básica.

3) Se utiliza en conjunción con un semáforo un procedimiento generalizado de este tipo podría garantizar que los procesos relacionados no se ejecutan simultáneamente, independientemente de sesiones/transacciones etc.

Respuesta

0

¿Por qué querrías hacer eso?
AFAIK, no hay forma de que el proceso B sepa quién lo llamó.

EDITAR: Como KM muestra que es posible (según el código), estoy interesado en comprender el motivo para hacerlo. ¿Puedes publicar eso también, agregándolo a tu pregunta?

+0

He hecho esto antes para ayudar a registrar eventos. En procedimientos importantes/problemáticos, agrego una información útil en un varibale varchar (8000) ya que el procedimiento hace varias cosas. Cuando hay un error, retrotrajo e inserto esta cadena en una tabla de registro, que tiene mucha información útil en ella. A veces, saber quién llamó al procedimiento ayuda y se puede grabar con la otra información ... –

+0

Eso creía.Igual que StackTrace para el procedimiento almacenado. Gracias KM. – shahkalpesh

+0

No anoto las llamadas de procedimiento tan profundas. Utilicé esta técnica para rastrear un procedimiento que fue llamado desde numerosos lugares. Una cosa es saber que tiene parámetros incorrectos, y otra saber de dónde vienen desde –

0

Si un procedimiento almacenado necesita comportarse de manera diferente en función de quién lo llama, entonces necesita agregar un parámetro. De esta forma, si agrega el procedimiento almacenado "Z", el código seguirá funcionando, "Z" puede pasar el parámetro de la forma en que "C" lo pasó, o la forma en que "D" lo pasó. Si eso no es lo suficientemente bueno, entonces se debe agregar una nueva lógica en "B".

1

no, no se puede decir lo que sproc lo llamó. Que había necesidad de añadir un parámetro adicional en contarla que la persona que llama es

+2

Puede haber algún código extremadamente enrevesado que pueda escribir que golpee las vistas del sistema, rastreando y analizando las pilas de llamadas ... pero no sé si la información está allí o si valdría la pena el esfuerzo. –

4

uso de un prarameter así:

CREATE PROCEDURE ParentProcedure 

AS 

DECLARE @ProcID    int 

SET @[email protected]@PROCID 

EXEC ChildProcedure @ProcID 

RETURN 0 
go 

y esto ...

CREATE PROCEDURE ChildProcedure 
(
@ProcID int=null --optional 
) 
AS 

if @ProcID IS NOT NULL 
BEGIN 
    PRINT 'called by '+OBJECT_NAME(@ProcID) 
END 

RETURN 0 
go 
0

En MSSQL Server 2008 puede usar sys.dm_exec_procedures_stats, esta vista de administración dinámica puede mostrarle cuándo se ejecutó el procedimiento almacenado (consulte también sys.procedures para obtener el nombre del procedimiento), etc.

SELECT s.*, d.* 
FROM sys.procedures s 
INNER JOIN sys.dm_exec_procedure_stats d 
ON s.object_id = d.object_id 
ORDER BY [d.last_execution_time] DESC; 

El procedimiento principal se mostrará en este conjunto de resultados muy cerca, porque este procedimiento se ejecutará antes. Por supuesto, esta no es la solución completa de su problema, pero puede obtener información.

y sí, si hay simultaneidad, esta solución no funciona. Puede ayudar en el desarrollo o solo depurar.

Cuestiones relacionadas