【发布时间】:2013-01-06 05:43:29
【问题描述】:
可能重复:
Is it possible for a trigger to find the name of the stored procedure that modified data?
我有一个带有触发器(更新时)的表。执行触发器时,我想知道更新相关表的存储过程的名称。
【问题讨论】:
标签: sql-server
可能重复:
Is it possible for a trigger to find the name of the stored procedure that modified data?
我有一个带有触发器(更新时)的表。执行触发器时,我想知道更新相关表的存储过程的名称。
【问题讨论】:
标签: sql-server
这并不总是 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
【讨论】:
这是不可能的 - 无论您的要求如何,都没有捷径可走。触发器与更新耦合,它与 SP 没有关系(甚至可能不存在)。在该级别,您无法使用堆栈跟踪。
【讨论】: