代码之家  ›  专栏  ›  技术社区  ›  Brandon

触发器是否可以找到修改数据的存储过程的名称?

  •  10
  • Brandon  · 技术社区  · 14 年前

    有几个存储过程通常由几个不同的系统调用,以对数据库中的几个表进行维护。有些是自动化的,有些不是。

    其中一个表有一列,其中的数字有时是关闭的,我们不确定这是什么时候发生的,也不知道为什么会发生。我想在表上放置一个触发器,这样我就可以看到什么正在被更改以及何时更改,但是了解哪个过程启动了修改也很有帮助。

    是否可以从触发器中获取存储过程的名称?如果没有,有没有其他方法来判断是什么导致了某些东西被修改?(我也不是在谈论用户,在这种情况下,用户的名称没有帮助)。

    3 回复  |  直到 11 年前
        1
  •  3
  •   KM.    14 年前

    CONTEXT_INFO

    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
    

    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
    
        2
  •  2
  •   Community CDub    7 年前
        3
  •  -4
  •   HLGEM    14 年前