Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/sql-server-2005/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql server 2005 从触发器中,如何找出是谁修改了表X上的数据,而该用户是从通用dbuser登录的,但从用户表获得了权限_Sql Server 2005 - Fatal编程技术网

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将告诉您。否则,你就不走运

我不知道该如何表述这个问题,但:

  • 你有一个网页

  • 该网页在web.config中获得了连接字符串的特定用户/权限

  • 在网页上,您请求连接到表的用户/通行证(id、名称、通行证)

  • 用户通过有效的用户/通行证进行识别,现在您可以从上表中了解id

  • 用户更改了表中的一些数据,该表就得到了一个触发器

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


    假设用户是使用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,这是一个有趣的解决方案!完成后不要忘记重置,否则可能会出现误报。