【问题标题】:Implementing audit trail using multiple tables使用多个表实施审计跟踪
【发布时间】:2014-10-17 17:38:00
【问题描述】:

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

p.s 我尝试使用 Beth Massi's 示例,但它似乎不适合在 VS2012 Lightswitch 中使用,因为它不能开箱即用?

【问题讨论】:

    标签: visual-studio-lightswitch lightswitch-2012


    【解决方案1】:

    您的问题非常广泛,可能过于广泛。从我收集的内容来看,尽管您有几张桌子,但很可能有不同的列。您正在寻找一种通用的方法,只需根据该列编写适当的内容,而无需过多的代码复制。

    你可以做什么和应该做什么:

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

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

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

    所以这个特定的Interface 将实现一个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

    【讨论】:

    • 我不得不承认,我在将它与 Lightswitch 集成时遇到了一些麻烦。部分原因是我缺乏接口和泛型的经验。您对我如何将它与 Lightswitch 一起使用有任何指导吗?
    • 对不起,我从来没有用过电灯开关。
    【解决方案2】:

    您可以考虑的一个选项是更新表结构以提供行版本控制作为外部审计表的替代方案。当您需要完整的审计跟踪和执行数据沿袭分析的能力时,此模式非常有用。这样做的另一个好处是报告 - 您可以查询给定记录在给定时间点的状态 - 对于创建事实表或在缓慢变化的维度上保留状态非常有帮助。我首选的方法是使用类似于 SCD 类型 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. 提交更改

    Table_Deleting():

    1. 将目标记录上的 ToDate 更新为 DateTime.Now 而不是 NULL
    2. 从更改的实体集合中删除实体
    3. 提交更改

    Table_Inserting():

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

    就是这样。

    【讨论】:

      猜你喜欢
      • 2011-05-12
      • 2011-08-27
      • 2021-05-21
      • 1970-01-01
      • 2010-11-07
      • 1970-01-01
      • 2018-01-31
      • 1970-01-01
      • 2010-09-13
      相关资源
      最近更新 更多