代码之家  ›  专栏  ›  技术社区  ›  Gup3rSuR4c

如何通过SQL Server中的触发器正确实现“每字段历史记录”(2008)

  •  2
  • Gup3rSuR4c  · 技术社区  · 14 年前

    所以,我面临的挑战是必须将表中每个字段的数据都记录下来。现在我可以用触发器(我以前从来没有用过,但我可以想象,这并不难),但是我还需要能够链接执行更改的日志,而这正是问题所在。触发器不会知道是谁在执行更改,我也无法传入用户ID。

    那么,我该怎么做呢?如果说我有这些桌子:

    Employees {
        EmployeeId
    }
    
    Jobs {
        JobId
    }
    
    Cookies {
        CookieId
        EmployeeId -> Employees.EmployeeId
    }
    

    所以,正如你所看到的,我有一个 Cookies 表,应用程序使用它来验证会话,我可以从中推断用户,但同样,如果我想更改 Jobs 表。

    非常感谢您的帮助!

    1 回复  |  直到 14 年前
        1
  •  2
  •   Preet Sangha    14 年前

    我们使用 context_info 设置调用数据库的用户。然后我们的应用程序级安全性可以一直强制到数据库代码中。这看起来像是一个开销,但实际上我们没有性能问题。

    make_db_call() {
       Set context_info --some data representing the user----
       do sql incantation
    }
    

    在数据库中

      select @user = dbo.ParseContextInfo()
      ... audit/log/security etc can determine who....
    

    要获取触发器中的前一个值,请从“已删除”伪表中选择,要获取要放入的值,请从“已插入”伪表中选择。

    在发出linq2sql查询之前,请像这样发出命令。

    context.ExecuteQuery('exec some_sp_to_set_context ' + userId')
    

    或者更确切地说,我会 suggest an overloaded DataContext ,在eqch查询之前执行上述操作。见 here 例如。

    我们不使用多个SQL登录,因为我们依赖连接池,还将DB调用者锁定到有限的用户。