首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用多个表实现审计跟踪

使用多个表实现审计跟踪
EN

Stack Overflow用户
提问于 2014-10-18 01:38:00
回答 2查看 334关注 0票数 0

在我之前的应用程序中,我已经使用Paul Van Bladel's方法成功地设置了审计跟踪。他的方法工作得很完美,而且非常容易效仿。但是,他只使用一个表来存储审计过的记录。我需要做一些类似的事情,除了我需要有一个审核表,每个表,这是大约7-8表将被审计。如果我知道如何传递泛型表对象,我可能会引用Paul Van Bladel的解决方案。有没有人知道网上有没有其他我可以参考的例子?或者关于如何正确实现多个表的审计跟踪的任何建议。

附注:我试过使用Beth Massi's示例,但它似乎不打算在VS2012 Lightswitch中使用,因为它不能开箱即用?

EN

回答 2

Stack Overflow用户

发布于 2014-10-18 02:17:57

你的问题非常宽泛,可能太宽泛了。从我收集的数据来看,您有几个表,很可能包含不同的列。你正在寻找一种通用的方法,简单地根据专栏编写适当的内容,而不需要过多的代码重现。

你可以和应该做的事情:

写出那些tables.

  • Determine所需的内容,以便将这些表相互连接起来。

这通常帮助我确定内容应该抽象到什么程度。这个特定的例子可能会从控制反转或依赖注入中受益。通过这种方式,您可以将特定的审计注入特定的类。

代码语言:javascript
复制
public interface IAudit<T>
{
     void WriteToAudit(<T> model);
}

因此,这个特定的接口将实现一个泛型,它应该表示您的审计数据模型。它可以提供几种不同的模型,以更好地满足您的需求,同时提供灵活性。

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

代码语言:javascript
复制
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.
     }
}

现在这个方法的强大之处在于:

代码语言:javascript
复制
public class Stuff
{
     private IAudit audit;
     public void DoSomething(model)
     {
          audit.WriteToAudit(model);
     }
}

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

  • Constructor
  • Method

这是一个令人难以置信的粗糙的实现,我可能有几个打字错误。这篇文章写得很快,但希望这篇文章能为你指明正确的方向。关于这个问题的更多细节可以在here上找到。

票数 0
EN

Stack Overflow用户

发布于 2014-10-18 19:04:34

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

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

  1. 将更新后的实体(包含所有更改)复制到新的本地实体记录对象中。(例如,Order对象)确保ToDate字段为空,并且使用FromDate的DateTime.Now
  2. Add方法将本地实体添加到实体集合(例如,使用Orders.Add(newOrder)方法将新的Order对象添加到Orders集合。
  3. 获取到实体记录的现有副本的挂钩。(例如,获取与目标OrderID匹配的订单对象,其中ToDate为NULL)
  4. 更新实体记录的现有副本,并将ToDate设置为DateTime.Now
  5. Commit

changes

  1. ToDate

Table_Deleting():

  1. 将目标记录上的ToDate更新为DateTime.Now,而不是NULL
  2. 从changed entities
  3. Commit changes的集合中删除实体

Table_Inserting():

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

就这样。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/26430476

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档