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

时间:2010-10-23 01:02:27

标签: sql-server triggers

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

那么,我该怎样做我需要做的事情呢?如果有帮助我说我有这些表:

Employees {
    EmployeeId
}

Jobs {
    JobId
}

Cookies {
    CookieId
    EmployeeId -> Employees.EmployeeId
}

所以,正如你所看到的,我有一个Cookies表,应用程序用它来验证会话,我可以推断出用户,但同样,我不能让触发器知道它如果我想对Jobs表进行更改。

帮助将受到高度赞赏!

1 个答案:

答案 0 :(得分:2)

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

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

  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调用程序锁定到受限用户。