使用多个表实现审计跟踪

时间:2014-10-17 17:38:00

标签: visual-studio-lightswitch lightswitch-2012

在我以前的应用程序中,我已成功使用Paul Van Bladel's方法设置审计跟踪。他的方法很完美,非常容易理解。但是,他只使用一个表来存储审计记录。我需要做类似的事情,除了我需要为每个将被审计的表格有一个审计表,大约是7-8个表。如果我能弄清楚如何传递通用表格对象,我可以回避Paul Van Bladel的解决方案。是否有人知道在线我可以参考的任何其他例子?或者有关如何正确实现多个表的审计跟踪的任何建议。

p.s我尝试使用Beth Massi's示例,但似乎并不打算在VS2012 Lightswitch中使用它,因为它没有开箱即用?

2 个答案:

答案 0 :(得分:0)

您的问题非常广泛,可能过于宽泛。从我收集的内容来看,虽然你有几张桌子,但很可能有不同的栏目。您正在寻找一种通用的方法,只需根据列编写适当的内容而无需太多的代码重现。

你能做什么和应该做什么:

  • 写出那些表格。
  • 确定需要审核的内容。
  • 彼此比较这些表格。

这通常可以帮助我确定应该抽象内容的程度。此特定示例可能受益于控制反转依赖注入。这样,您可以将特定审计注入特定的

public interface IAudit<T>
{
     void WriteToAudit(<T> model);
}

因此,此特定的接口将实现 Generic ,它应代表您的审计数据模型。这可以提供多种差异化模型,以更好地满足您的需求,同时提供灵活性。

现在您需要编写继承接口的实现类。

public class Inventory : IAudit<InventoryModel>
{
     public void WriteToAudit(InventoryModel model)
     {
          // Write your database content, then pass *Properties* from the model.
          // Which will write for this particular table.
     }
}

现在这种方法的有力部分:

public class Stuff
{
     private IAudit audit;
     public void DoSomething(model)
     {
          audit.WriteToAudit(model);
     }
}

所以现在你基本上可以创建一个新的IAudit,然后你可以通过几种方法传递:

  • 构造
  • 方法

这是一个非常粗略的实现,我可能有几个错别字。这是一个快速的帖子,但希望这可以指出你正确的方向。关于此事的更多细节可以在here找到。

答案 1 :(得分:0)

您可以考虑的一个选项是更新表结构,以提供行版本控制作为外部审计表的替代方法。当您需要完整的审计跟踪和执行数据沿袭分析的能力时,此模式非常有用。报告的另一个好处是 - 您可以在给定时间点查询给定记录的状态 - 非常有助于创建事实表或在缓慢变化的维度上保留状态。我首选的方法是使用符合SCD Type 2模式的东西。 (有关一般概念,请参阅here。)

对于实现此模式的每个表,修改默认查询以仅返回活动记录 - 即DateTo IS NULL的过滤器。然后,您需要做的就是截取删除和更新的标准CRUD事件,如下所示: Table_Updating():

  1. 将更新的实体(包含所有更改)复制到新的本地实体记录对象中。 (例如Order对象)确保ToDate字段为空,FromDate为DateTime.Now
  2. 使用Add方法将本地实体添加到Entity集合中(例如,使用Orders.Add(newOrder)方法将新的Order对象添加到Orders集合。
  3. 获取实体记录的现有副本的钩子。 (即获取与ToDate为NULL的目标OrderID匹配的Order对象)
  4. 更新实体记录的现有副本,并将ToDate设置为DateTime.Now
  5. 提交更改
  6. <强> Table_Deleting():

    1. 将目标记录上的ToDate更新为DateTime.Now而不是NULL
    2. 从已更改实体集合中删除实体
    3. 提交更改
    4. <强> Table_Inserting():

      1. 确保DateFrom字段设置为DateTime.Now,DateTo字段为NULL
      2. 提交更改。
      3. 就是这样。