如何在执行更新操作时从触发器获取存储过程名称?

时间:2013-01-22 21:05:00

标签: sql-server

  

可能重复:
  Is it possible for a trigger to find the name of the stored procedure that modified data?

我有一个带触发器(更新时)的表。当执行触发器时,我想知道更新有问题的表的存储过程的名称。

2 个答案:

答案 0 :(得分:17)

这并不总是100%可靠,它有时会捕获外部过程调用,即使该过程称为内部过程。但是你至少可以了解用户在触发器中调用的内容。

ALTER TRIGGER dbo.whatever
ON dbo.something
FOR UPDATE
AS
BEGIN
    ... other trigger logic

    DECLARE @ExecStr varchar(50), @Qry nvarchar(255)

    CREATE TABLE #inputbuffer 
    (
      EventType nvarchar(30), 
      Parameters int, 
      EventInfo nvarchar(255)
    )

    SET @ExecStr = 'DBCC INPUTBUFFER(' + STR(@@SPID) + ')'

    INSERT INTO #inputbuffer 
    EXEC (@ExecStr)

    SET @Qry = (SELECT EventInfo FROM #inputbuffer)

    SELECT @Qry AS 'Query that fired the trigger', 
     SYSTEM_USER as LoginName, 
     USER AS UserName, 
     CURRENT_TIMESTAMP AS CurrentTime

   -- of course you can store this somewhere instead of select
END

从Vyas K被盗:http://vyaskn.tripod.com/tracking_sql_statements_by_triggers.htm

您可能还想查看此问题,其中包含与使用sys.dm_exec_query_stats相关的答案 - 您可以使用sys.dm_exec_sql_text公开的对象ID跟踪回程序名称,并且您可以限制为最近使用GETDATE()作为“最近”的指南进行调用。还有一个使用扩展事件的冗长示例。

Create Trigger to log SQL that affected table?

或者使用CONTEXT_INFO的那些(但这需要更改更新表的所有存储过程):

Find query that fired a trigger

Is it possible for a trigger to find the name of the stored procedure that modified data?

最后,您可以查看这些帖子以获取一些想法:

http://www.thecodepage.com/post/TIP-A-Call-Stack-in-SQL-Server.aspx

答案 1 :(得分:-5)

这是不可能的 - 无论你的要求如何,都没有快速的方法。触发器耦合到更新,它与SP没有任何关系(甚至可能不存在)。您无法在该级别使用堆栈跟踪。