9

可能重复:
触发器是否可以找到修改数据的存储过程的名称?

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

4

2 回答 2

19

这并不总是 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- 您可以使用 公开的对象 id 追溯过程名称sys.dm_exec_sql_text,并且可以将最近的调用限制GETDATE()为“最近”的指南。还有一个使用扩展事件来完成它的冗长示例。

创建触发器以记录影响表的 SQL?

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

查找触发触发器的查询

触发器是否可以找到修改数据的存储过程的名称?

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

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

于 2013-01-22T21:21:04.360 回答
-5

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

于 2013-01-22T21:09:21.660 回答