Sql server 2005 从触发器中,如何找出是谁修改了表X上的数据,而该用户是从通用dbuser登录的,但从用户表获得了权限
我不知道该如何表述这个问题,但:Sql server 2005 从触发器中,如何找出是谁修改了表X上的数据,而该用户是从通用dbuser登录的,但从用户表获得了权限,sql-server-2005,Sql Server 2005,我不知道该如何表述这个问题,但: 你有一个网页 该网页在web.config中获得了连接字符串的特定用户/权限 在网页上,您请求连接到表的用户/通行证(id、名称、通行证) 用户通过有效的用户/通行证进行识别,现在您可以从上表中了解id 用户更改了表中的一些数据,该表就得到了一个触发器 从该触发器中,如何从步骤4检索用户id 假设用户是使用asp.net成员资格表登录的您需要在根据网页用户/密码更改的表上设置LastChgID列(或类似列),然后插入。LastChgID将告诉您。否则,你就不走运
假设用户是使用asp.net成员资格表登录的您需要在根据网页用户/密码更改的表上设置LastChgID列(或类似列),然后插入。LastChgID将告诉您。否则,你就不走运了 编辑
保存更改时,将web apps用户ID存储到表的LastChgID列中,这可能需要将其传递到存储过程中,或者只在UPDATE语句中设置该列。当触发时,INSERTED.LastChgID将具有web应用程序用户ID。在步骤4中,当您说您知道它时,您真正的意思是您的应用程序知道登录的用户ID。应用程序的身份验证与数据库身份验证是完全独立的(除了可能在SQL server上使用windows身份验证,但我认为这不是您要做的)
正如KM所提到的,您需要通过“LastUpdateUserID”列或正在更新的表上的类似内容将应用程序用户id传递给触发器。@KM,或者将您的用户移动到AD中并使用integrated auth。此处没有其他选项。使用和传递带外参数。在调用数据库之前,您的Web层必须确保在其使用的每个连接上正确设置此选项,这意味着要额外往返数据库一次。由于用户名只是数据,因此很难通过触发器捕获 选项#1与KM所说的类似,开发者必须通过查询传递用户名,并更新数据库中的审核列。触发器会在更新时抓取该列的vlue,并对其执行任何您想要的操作 选项2是以编程方式在SQL server或windows域结构中创建用户,授予该用户对应用程序的访问权限,然后在进入后模拟该用户进行后续登录。这将是一个管理维护问题,但应用程序用户随后将使用其唯一ID(而不是web.config中配置的ID)访问数据库,并且对数据库的所有更新都与该用户相同,而不是web.config中提供的通用ID
希望这能有所帮助。正如Remus Rusanu所建议的那样,使用设置上下文信息,这意味着您无需在所有存储的进程上添加参数即可完成此操作。我自己也提出了一个类似的问题:
问题出在删除触发器上,您没有该触发器information@Fredou,不删除设置要删除的状态列。但如果必须删除,请更新设置LastChgID,然后删除相同的rowhmmm,这是一个有趣的解决方案!完成后不要忘记重置,否则可能会出现误报。