可能重复:
Is it possible for a trigger to find the name of the stored procedure that modified data?
我有一个带触发器(更新时)的表。当执行触发器时,我想知道更新有问题的表的存储过程的名称。
答案 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没有任何关系(甚至可能不存在)。您无法在该级别使用堆栈跟踪。