2011-09-14 48 views
2

该要求看起来很简单:当数据发生变化时,审核更改。EF或SQL是审计数据更改的更好选择吗?

下面是一些重要的部分公式:

  1. 数据在我的应用跨越多个表(一些交叉参考表)。
  2. 我的DTO很深,导航属性有条件地填充。
  3. 加载时,我用原始值复制原始DTO。
  4. 当请求保存时,原始DTO包含更改。
  5. 理想情况下,外键会像有用的文本一样读取而不是Id号码。

与TFS的酷历史功能不同,由于许多相关的表和有条件的子实体,我的看起来更复杂。

我看到三种可能性(到目前为止):

  1. 我可以使用C#来反映的对象和创建前/后记录。
  2. 我可以使用SQL 2008R2中的触发器捕获更改并合并前/后记录。
  3. 我可以在对象之前/之后存储原始数据,并让SQL 2008R2解析它们。

请注意:现在,我认为SQL 2008R2的CDC太过于沉重的选择了。我真的在寻找我可以建立的东西,但我承认我的想法现在对任何事情都是开放的。

我的问题

之前,我开始构建这样的: 如何其他人办理审计一个复杂的EF DTO?

是否有可用的低(ish)技术解决方案?

预先感谢您。

相关,但不是-完全相关的StackOverflow上已经问题:Implementing Audit Log/Change History with MVC & Entity FrameworkCreate Data Audit in SQL Serverhttps://stackoverflow.com/questions/5773419/how-to-audit-many-to-many-relationship-in-entity-frameworkMaintaining audit log for entities split across multiple tablesLinq to SQL Audit Trail/Audit Log: should I use triggers or doddleaudit?没有提供答案。

+1

不确定为什么不列出SQL Server的本机审计功能作为选择。 –

+0

对不起@Craig,你对我的DBA做了一个错误的假设。这仅仅是他们目前的技能组合之外,并且会给解决方案团队造成一场噩梦(并且无休止的延迟),从IT中要求它。这里只是一个现实,这就是我排除它的原因。 –

+0

那么,即使他们还不知道,至少有文件证明。 –

回答

0

,引发剂溶液,优点:

  1. 不能绕过审计

,引发剂溶液,缺点:

  1. 不能审计非SQL数据
  2. 不能审计在插入复杂的对象

实体框架,优点:

  1. 可以审核一切
  2. 可以在任何状态下

实体框架,缺点审核复杂的对象:

  1. 可以被旁路(如指示 - to-SQL)
  2. 需要原始值的副本

我的选择是实体框架。使用STE可以更轻松。

无论哪种方式,你必须推出自己的。

1

我最近在Entity Framework上实现了一个审计日志管理器。当我实例化我的审计经理时,我反映了所有的实体类,并存储了属性信息。然后在对象上下文SavingChanges事件中,我审核所有更改。它效果很好。在外键的情况下,我只是在更改之前和之后存储他们的Id。

这个解决方案的好处是它不需要任何额外的编码。一旦创建了排序日志管理器,您就不必担心添加新触发器或添加新列时修改触发器。反映类时,您的实体类的任何更改都会自动被选中。

+0

没有抱歉,@Mservidio,EF有问题。考虑一下你没有钥匙的情况。也许父记录有一个键(或者可能不是),也许有些孩子在插入后还没有由数据库分配键。问题是,您正在创建不引用记录的审计记录。让我建议第二个违约或触发价值的问题,这种方法完全错过了这个价值。 –

+0

好点@杰里 - 尼克松。我在一个月前编码了我的实体框架,并且你所说的是真实的。在我的情况下,创建新实体的Id不是必需的,所以我们可以在创建时不使用它们。修改和删除有键。但是,现在让我想到,我可以跟踪保存的实体,并在保存之后,自动生成的列和计算列已检索并记录之后执行日志记录。 – mservidio

+0

我现在可以回去重温一下,看看我能不能做到这一点。这种方法当然存在一个缺陷,即日志记录会在更改后发生,所以如果日志记录发生任何问题,它就不会成为保证日志。所以,同意,如果您需要坚实的审计流程,这不是更好的方法。如果您只需要轻量级日志记录,那么在初始创建时不需要Id即可。待续...如果在保存EF中的更改后让Id进入审计日志,我会提供更新。 – mservidio

2

IF审计是一个真正的需求我会选择引发剂溶液......因为其他方法还有许多“短板”:

  • “盲”任何修改通过其他手段,而不是你的应用程序
  • 发生
  • 如果代码做一些更改,忘记添加审计代码审计跟踪得到“盲点”

基于触发器的解决方案,可以保证只允许特定用户甚至可以看到审计数据.. 。

我通常与Oracle一起工作,但根据我在这种情况下的经验:只允许应用程序通过视图选择权限,任何插入/删除/更新都应通过存储过程完成,审计跟踪应通过触发器完成...

+1

现货。此外,触发器可以使用SUSER_SNAME()获取登录人员的用户标识,并对数据行进行更改,而SQL Server的内置审计功能奇怪地无法执行这些更改。 – HardCode

+0

没有抱歉,@HardCode(和Yahia)触发器有问题。想象一下在交叉参考表的另一侧有一个新的数据记录。它是在交叉记录之前创建的,这意味着触发器无法将插入的记录与父项关联 - 审计将是孤儿。请记住,在转换中操作非常重要,因为删除的表在范围内。你怎么解决这个问题? –

+0

@Jerry Nixon - 如果您的数据模型是相应构建的,您可以将审计条目关联得很好......如果需要的话,您可以始终使用描述的SP方法来丰富审计......我们使用上面的真实复杂模型从来没有你描述的问题(或者我只是不明白你的意思是什么?)... – Yahia

相关问题