从一个触发器,如何找出谁修改了表X上的数据,同时该用户从一个通用的dbuser登录,但从用户表获得了权利

问题描述 投票:1回答:6

我不确定如何制定这个问题但是:

  1. 你有一个网页
  2. 网页在web.config中获得了连接字符串的特定用户/传递
  3. 在网页上,您要求连接到表格的用户/通行证(身份证,姓名,通行证)
  4. 使用有效的用户/通行证识别用户,现在您知道上表中的ID
  5. 用户更改表中的某些数据,并且该表获得了触发器

从该触发器,如何从步骤4中检索用户ID

假设使用asp.net成员资格表记录用户

sql-server-2005
6个回答
2
投票

使用SET CONTEXT_INFOCONTEXT_INFO()传递带外参数。您的Web层必须确保在调用数据库之前在其使用的每个连接上正确设置此值,这意味着对数据库进行额外的额外往返。


0
投票

在步骤4中,当您说您知道它时,您的真正含义是您的应用程序知道登录了哪个用户ID。您的应用程序的身份验证与您的数据库身份验证完全分开(除了可能使用SQL身份验证与SQL服务器,但我不要以为那是你正在做的事情。

正如KM提到的那样,您需要通过“LastUpdatedUserID”列或正在更新的表上的某些内容将应用程序用户ID传递给触发器。


0
投票

@KM,或将您的用户移动到AD并使用集成的身份验证。这里别无选择。


0
投票

你需要在他们根据网页用户/密码更改的表上有一个LastChgID列(或类似的),然后INSERTED.LastChgID会告诉你。否则,你运气不好。

编辑保存更改时,将Web应用程序用户ID存储到表的LastChgID列中,这可能需要将其传递到存储过程,或者只是在UPDATE语句中设置该列。触发器触发时,INSERTED.LastChgID将具有Web应用程序用户ID。


0
投票

由于用户名只是数据,因此很难通过触发器捕获。

选项#1类似于KM所说的,您的开发人员必须通过查询传递用户名并更新数据库中的审计列。并且触发器会在更新时获取该列vlue并使用它执行您想要的任何操作。

选项#2将以编程方式在SQL Server或您的Windows域结构中创建用户,授予其访问应用程序的权限,然后在进入后续登录时模拟该用户。这将是一个管理维护问题,但应用程序用户将使用其唯一ID而不是web.config中配置的ID来访问数据库,并且对数据库的所有更新都是该用户而不是web.config中提供的通用用户。 。

希望这可以帮助。


0
投票

正如已经建议(由Remus Rusanu使用SET CONTEXT_INFO)这意味着您不必在所有存储过程中添加参数来执行此操作。我可以在这里找到类似的问题:

SQL Server: Modifying the "Application Name" property for auditing purposes

© www.soinside.com 2019 - 2024. All rights reserved.