【问题标题】:How to get the stored procedure name from a trigger when an update operation was performed? [duplicate]执行更新操作时如何从触发器中获取存储过程名称? [复制]
【发布时间】: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


    【解决方案1】:

    这并不总是 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

    【讨论】:

    • 好吧,那就是 - 残酷的。我希望 OP 不会过多地使用该触发器,因为当经常使用时,这是一个严重的性能杀手。临时表,动态sql,都在一个触发器中。哎哟。
    • 事实上,它只是用于故障排除的一次性事情。数据库中的所有表都是通过存储过程更新的,所以我确定,在这种特殊情况下,有问题的表是由存储过程更新的。该表中有一些不正确的值,我只想知道哪个存储过程可以做到这一点(是的,我已经浏览了存储过程的代码,但我看不出它们有什么问题,所以我认为有一个桌子上的临时触发器将帮助我找到问题的原因)。
    【解决方案2】:

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

    【讨论】:

    • Etiquette "不容忍粗鲁。"此外,“以你希望他们对待你的同样尊重对待他人。我们都在这里一起学习。宽容那些可能不知道你所知道的一切的人”
    • 我注意到你对“Point”这个词很感兴趣。
    • 不要在这里侮辱他人,也不要回滚使答案更具建设性的编辑。将此视为警告。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-09-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-05-13
    • 2021-07-18
    相关资源
    最近更新 更多