2017-04-13 32 views
0

我有一个多用户应用程序,它可以对SQL进行各种调用以更改各种表中的值。其中一些表格触发它们来审核更改。我在触发器中存在代码,该代码尝试匹配@@ SPID返回的SPID值与用户注册DB访问(登录)时存储的SPID值。我如何获得SQL调用者的SPID

但是,我的测试表明,至少在某些时候,触发器运行时的SPID与之前保存的SPID不同。如何获取导致触发器运行的数据库更改的连接的SPID?或者,如果不是SPID,那么可以相当可靠地标识进行更改的当前活动SQL连接的某个值?

这是用于中期调试,不打算成为永久生产代码的一部分,但必须在现场系统上运行几天到几周。

回答

1

而不是使用@@SPID您可以使用SQL Server函数ORIGINAL_LOGIN(),它返回该会话中首先连接到SQL Server实例的登录身份。

+0

呵呵... TIL - ORIGINAL_LOGIN()对我来说可能非常有用。 +1 –

0

对于整个用户会话,SPID只会与其他用户不共享的持久数据库连接相同。我不知道SPID将为审计提供多少价值,但似乎您正在寻找一种将数据库更新活动与特定用户会话实例相关联的方法。如果您使用服务凭证而不是最终用户的数据库连接,ORIGINAL_LOGIN将无助于审计。

您可以在CONTEXT_INFO或SESSION_CONTEXT()中存储会话标识符(例如guid),具体取决于您的SQL版本以供触发器代码使用。有关代码示例,请参见How to add custom attributes to SQL connection string?