所以,我面临的挑战是必须记录表中每个字段的更改数据。现在我可以使用触发器(我之前从未使用过,但我可以想象并不难),但我还需要能够链接执行更改的日志,这就是问题所在。触发器不会知道谁正在执行更改,我也无法传入用户ID。
那么,我该怎样做我需要做的事情呢?如果有帮助我说我有这些表:
Employees {
EmployeeId
}
Jobs {
JobId
}
Cookies {
CookieId
EmployeeId -> Employees.EmployeeId
}
所以,正如你所看到的,我有一个Cookies
表,应用程序用它来验证会话,我可以推断出用户,但同样,我不能让触发器知道它如果我想对Jobs
表进行更改。
帮助将受到高度赞赏!
答案 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调用程序锁定到受限用户。