Is it possible for a trigger to find the name of the stored procedure that modified data?

前端 未结 3 562
忘了有多久
忘了有多久 2020-12-31 10:27

There are a few stored procedures that routinely get called by a few different systems to do maintenance on a few tables in our database. Some are automated, some aren\'t.

相关标签:
3条回答
  • 2020-12-31 11:07

    you can try: CONTEXT_INFO

    here is a CONTEXT_INFO usage example:

    in every procedure doing the insert/delete/update that you want to track, add this:

    DECLARE @string        varchar(128)
           ,@CONTEXT_INFO  varbinary(128)
    SET @string=ISNULL(OBJECT_NAME(@@PROCID),'none')
    SET @CONTEXT_INFO =cast('Procedure='+@string+REPLICATE(' ',128) as varbinary(128))
    SET CONTEXT_INFO @CONTEXT_INFO
    
    --do insert/delete/update that will fire the trigger
    
    SET CONTEXT_INFO 0x0 --clears out the CONTEXT_INFO value
    

    here is the portion of the trigger to retrieve the value:

    DECLARE @string         varchar(128)
           ,@sCONTEXT_INFO  varchar(128)
    SELECT @sCONTEXT_INFO=CAST(CONTEXT_INFO() AS VARCHAR) FROM master.dbo.SYSPROCESSES WHERE SPID=@@SPID
    
    IF LEFT(@sCONTEXT_INFO,9)='Procedure'
    BEGIN
        SET @string=RIGHT(RTRIM(@sCONTEXT_INFO),LEN(RTRIM(@sCONTEXT_INFO))-10)
    END
    ELSE
    BEGIN --optional failure code
        RAISERROR('string was not specified',16,1)
        ROLLBACK TRAN
        RETURN
    END
    
    ..use the @string
    
    0 讨论(0)
  • 2020-12-31 11:18

    I've not tried this but @@PROCID looks like it might return what you want.

    0 讨论(0)
  • 2020-12-31 11:25

    Our system is already using the CONTEXT_INFO variable for another purpose so that is not available. I also tried the DBCC INPUTBUFFER solution which almost worked. The draw back to the inputbuffer is that it returns only the outside calling procedure. Ex: procA calls procB which fires a trigger. The trigger runs DBCC INPUTBUFFER which only shows procA. Since my trigger was looking for procB, this approach failed.

    What I have done in the meantime is to create a staging table. Now procA calls procB. procB inserts a line in the staging table then fires the trigger. The trigger checks the staging table and finds the procB entry. Upon return procB deletes its entry from the staging table. It's a shell game but it works. I would be interested in any feedback on this.

    0 讨论(0)
提交回复
热议问题