审核Db行

时间:2015-07-28 11:37:32

标签: c# .net database design-patterns

方案:

我有一个数据库表,为了进行比较,需要对此表的任何列的数据进行任何更改以进行审核。

我尝试过的内容:

我有一个与父表具有相同值列的历史表,并且使用触发器将对数据库的任何更改记录到新表中,并最终达到我想要的效果。

问题

问题是多方面的:

  • 我正在使用我不想使用的触发器。
  • 如果我必须对另外n个表进行审计比较,那么我需要为每个父表创建一个历史表,这只会使我的数据库膨胀,并使这么多表变得笨重。

有没有更好的方法来实现这一目标,请提出建议?

1 个答案:

答案 0 :(得分:2)

答案与业务逻辑所处的位置密切相关。

如果您的业务逻辑在您的数据库(stored procedurestriggers)内,那么我觉得您的方法是正确的,让数据库triggers写入相关的审计表。< / p>

  

我正在使用我不想使用的触发器。

审核Appoach:

如果您的域逻辑位于c#代码中的域层中,那么您说您不希望审核进入triggers。在域层数据库之间混合业务逻辑可能会导致维护噩梦o_O

假设您的逻辑位于域层中:一个想法是为您的域或服务设置一个base class来处理写入审计跟踪:

public class DomainBase<T>
{
    public DomainBase(bool isAuditEnabled)
    {
        this.IsAuditEnabled = isAuditEnabled;
    }
    public bool IsAuditEnabled { get; set; }

    public void AddNew(T newEntity)
    {
        // default code for adding an entity
        this.Audit_Create(newEntity);
    }

    public void Audit_Create(T newEntity)
    {
        if (IsAuditEnabled)
        {
            // ...
        }
    }
}

您的base class可以使用标准的AddNewUpdateDelete方法,这些方法又可以调用相关的审核方法。然后您还可以考虑使用IsAuditEnabled开关,以便轻松打开/关闭特定审核。这样,您只能审核您关注的更改,而不会审核其他内容。

每个自定义方法都可以选择是否写入审计跟踪。这也是为什么在您的方案中将审计跟踪放在DAL(数据访问层)中的好主意,因为业务逻辑决定如果必须审核哪些DAL不应该做出这些类型的逻辑决策。

  

如果我需要对更多表进行审核比较,那么我需要   每个父表有一个历史表,只是膨胀我的   数据库,并使这么多表格变得笨重。

数据库关注的大小

  1. 如上所述,只审核您需要的内容会减少 审计数据。
  2. 如果审核数据过多或增长过快,您可以选择单独的审核数据库。这样,您的生产数据库保持轻量级和优化,您只能罕见的案例(希望)查询审计数据库。通过这种方式,您可以 BIG 并审核所有移动的生活,而不用担心性能(甚至不要在审计数据库中包含indexes以允许快速有效的写入)。
  3. 此外,如果您并不真正关心表格中的所有数据,您可以创建仅包含重要字段的审核表。因此,您最终可能会得到一个包含50列的表格,只能审核5或10列,这对于历史目的而言至关重要。