Sql server 如何将带外(当前用户Id)数据传递到SQL Server 2008

Sql server 如何将带外(当前用户Id)数据传递到SQL Server 2008,sql-server,security,forms-authentication,Sql Server,Security,Forms Authentication,我们有一个web应用程序,它使用表单身份验证根据数据库中的用户表对用户进行身份验证。(即,此处不涉及active directory或SQL server用户帐户)。web应用程序使用服务帐户访问SQL server。但是,出于审核、授权和其他目的,我们的存储过程需要知道任何给定操作是为哪个用户执行的 在以前的生活中,我使用Oracle数据库处理过类似的情况。在这个场景中,每次打开连接时,我们首先调用一个Oracle内置过程来设置一个连接范围的上下文变量。此变量包含将使用连接的用户的用户id。然

我们有一个web应用程序,它使用表单身份验证根据数据库中的用户表对用户进行身份验证。(即,此处不涉及active directory或SQL server用户帐户)。web应用程序使用服务帐户访问SQL server。但是,出于审核、授权和其他目的,我们的存储过程需要知道任何给定操作是为哪个用户执行的

在以前的生活中,我使用Oracle数据库处理过类似的情况。在这个场景中,每次打开连接时,我们首先调用一个Oracle内置过程来设置一个连接范围的上下文变量。此变量包含将使用连接的用户的用户id。然后,所有需要知道当前用户的存储过程都将检查上下文变量

从概念上讲,这非常类似于在进行远程调用之前将用户信息推送到CallContext上

我的问题是,Microsoft SQL server中是否有类似的机制


显然,如果必须的话,我可以将UserId作为参数传递给每个存储过程,但这正是我试图避免的。

您可以做的是在数据库中创建用户(无需服务器登录)并给他们适当的权限。在这之后,您要做的是一个“executeas”语句,然后数据库调用的用户上下文就好像用户调用了它一样。例如:

EXECUTE AS USER = 'user2';
EXECUTE usp_insert_stuff @params;
REVERT;
缺点:您必须设置SQL安全性并管理用户 好处:用户无法直接连接到SQL Server,您将得到审核

此处参考:

请参阅页面底部的示例。

使用和。看