我不确定如何制定这个问题但是:
从该触发器,如何从步骤4中检索用户ID
假设使用asp.net成员资格表记录用户
使用SET CONTEXT_INFO
和CONTEXT_INFO()
传递带外参数。您的Web层必须确保在调用数据库之前在其使用的每个连接上正确设置此值,这意味着对数据库进行额外的额外往返。
在步骤4中,当您说您知道它时,您的真正含义是您的应用程序知道登录了哪个用户ID。您的应用程序的身份验证与您的数据库身份验证完全分开(除了可能使用SQL身份验证与SQL服务器,但我不要以为那是你正在做的事情。
正如KM提到的那样,您需要通过“LastUpdatedUserID”列或正在更新的表上的某些内容将应用程序用户ID传递给触发器。
@KM,或将您的用户移动到AD并使用集成的身份验证。这里别无选择。
你需要在他们根据网页用户/密码更改的表上有一个LastChgID列(或类似的),然后INSERTED.LastChgID会告诉你。否则,你运气不好。
编辑保存更改时,将Web应用程序用户ID存储到表的LastChgID列中,这可能需要将其传递到存储过程,或者只是在UPDATE语句中设置该列。触发器触发时,INSERTED.LastChgID将具有Web应用程序用户ID。
由于用户名只是数据,因此很难通过触发器捕获。
选项#1类似于KM所说的,您的开发人员必须通过查询传递用户名并更新数据库中的审计列。并且触发器会在更新时获取该列vlue并使用它执行您想要的任何操作。
选项#2将以编程方式在SQL Server或您的Windows域结构中创建用户,授予其访问应用程序的权限,然后在进入后续登录时模拟该用户。这将是一个管理维护问题,但应用程序用户将使用其唯一ID而不是web.config中配置的ID来访问数据库,并且对数据库的所有更新都是该用户而不是web.config中提供的通用用户。 。
希望这可以帮助。
正如已经建议(由Remus Rusanu使用SET CONTEXT_INFO)这意味着您不必在所有存储过程中添加参数来执行此操作。我可以在这里找到类似的问题:
SQL Server: Modifying the "Application Name" property for auditing purposes