可能重复:
触发器是否可以找到修改数据的存储过程的名称?
我有一个带有触发器(更新时)的表。执行触发器时,我想知道更新相关表的存储过程的名称。
这并不总是 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()
为“最近”的指南。还有一个使用扩展事件来完成它的冗长示例。
或者这些使用CONTEXT_INFO
(但这需要更改所有更新表的存储过程):
最后,您可以查看这些帖子以获取一些想法:
http://www.thecodepage.com/post/TIP-A-Call-Stack-in-SQL-Server.aspx
这是不可能的 - 无论您的要求如何,都没有快速的解决方法。触发器与更新耦合,它与 SP 没有关系(甚至可能不存在)。在该级别,您无法使用堆栈跟踪。