如何获取 SQL 调用者的 SPID

Posted

技术标签:

【中文标题】如何获取 SQL 调用者的 SPID【英文标题】:How do I get the SQL caller's SPID 【发布时间】:2017-04-13 15:18:06 【问题描述】:

我有一个多用户应用程序,它对 SQL 进行各种调用以更改各种表中的值。其中一些表上有触发器来审计更改。我在触发器中有代码,它尝试将@@SPID 返回的 SPID 值与用户在注册数据库访问(登录)时存储的 SPID 值进行匹配。

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

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

【问题讨论】:

【参考方案1】:

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

【讨论】:

嗯... TIL - ORIGINAL_LOGIN() 这对我非常有用。 +1【参考方案2】:

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

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

【讨论】:

以上是关于如何获取 SQL 调用者的 SPID的主要内容,如果未能解决你的问题,请参考以下文章

在 SQL Server 中获取触发器的调用者

如何使用inspect从Python中的被调用者那里获取调用者的信息?

如何在被调用的方法中获取调用者的方法名?

休息 - 如何获取调用者的 IP 地址

Snowflake /当存储过程作为OWNER执行时如何获取原始调用者

如何从http调用获取调用者信息到c#中的另一个api