【问题标题】:How to properly implement "per field history" through triggers in SQL Server (2008)如何通过 SQL Server (2008) 中的触发器正确实现“每字段历史记录”
【发布时间】:2010-10-23 01:02:26
【问题描述】:

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

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

Employees {
    EmployeeId
}

Jobs {
    JobId
}

Cookies {
    CookieId
    EmployeeId -> Employees.EmployeeId
}

所以,如您所见,我有一个 Cookies 表,应用程序使用它来验证会话,我可以从中推断出用户,但同样,如果我不能让触发器知道它想要更改Jobs 表。

非常感谢您的帮助!

【问题讨论】:

标签: sql-server triggers


【解决方案1】:

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

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 调用者锁定为受限用户。

【讨论】:

  • 我非常喜欢你的解决方案,我面临的问题是我无法弄清楚(可能是因为睡眠不足)我如何在 Linq2Sql 上下文中完成所有这些工作?然后在触发器中,如何获取之前的值,然后是更新的值?
  • 我已编辑答案以解决您的评论。让我知道结果如何。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-07-30
  • 2018-09-08
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多