我们的数据库中有一些表需要定期进行维护,这些维护操作由不同的系统调用一些存储过程完成,其中某些是自动化的。
其中一个表格的一列数据有时会出现错误,我们不确定发生错误的时间和原因。我想在该表上放置一个触发器,以便查看何时发生了更改,但也很有帮助知道哪个存储过程启动了修改。
是否可以从触发器获取存储过程的名称?如果不能,是否有其他方法可以确定是什么导致了修改?(我不是指用户,因为用户的名称在这种情况下没有帮助)。
我们的数据库中有一些表需要定期进行维护,这些维护操作由不同的系统调用一些存储过程完成,其中某些是自动化的。
其中一个表格的一列数据有时会出现错误,我们不确定发生错误的时间和原因。我想在该表上放置一个触发器,以便查看何时发生了更改,但也很有帮助知道哪个存储过程启动了修改。
是否可以从触发器获取存储过程的名称?如果不能,是否有其他方法可以确定是什么导致了修改?(我不是指用户,因为用户的名称在这种情况下没有帮助)。
您可以尝试使用:CONTEXT_INFO
以下是一个使用 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
CONTEXT_INFO
。现在我唯一能提供的新建议是,在 SS2016 中,您可以使用 MEMORY_OPTIMIZED
表将临时调用堆栈信息存储在内存中,或者使用 SESSION_CONTEXT
跟踪 仅 最近的 @@PROCID
热点。注意:从 SS2014-SP2 开始,您还可以使用 sys.dm_exec_input_buffer()
,而无需声明表变量并调用动态 SQL 来执行 DBCC INPUTBUFFER
。 - MikeTeeVee我没有尝试过这个,但是@@PROCID看起来可能会返回你想要的结果。