方案:
我有一个数据库表,为了进行比较,需要对此表的任何列的数据进行任何更改以进行审核。
我尝试过的内容:
我有一个与父表具有相同值列的历史表,并且使用触发器将对数据库的任何更改记录到新表中,并最终达到我想要的效果。
问题
问题是多方面的:
有没有更好的方法来实现这一目标,请提出建议?
答案 0 :(得分:2)
答案与业务或域逻辑所处的位置密切相关。
如果您的业务逻辑在您的数据库(stored procedures
和triggers
)内,那么我觉得您的方法是正确的,让数据库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
可以使用标准的AddNew
,Update
,Delete
方法,这些方法又可以调用相关的审核方法。然后您还可以考虑使用IsAuditEnabled
开关,以便轻松打开/关闭特定审核。这样,您只能审核您关注的更改,而不会审核其他内容。
每个自定义域方法都可以选择是否写入审计跟踪。这也是为什么在您的方案中不将审计跟踪放在DAL
(数据访问层)中的好主意,因为业务逻辑决定如果和必须审核哪些,DAL
不应该做出这些类型的逻辑决策。
如果我需要对更多表进行审核比较,那么我需要 每个父表有一个历史表,只是膨胀我的 数据库,并使这么多表格变得笨重。
数据库关注的大小
indexes
以允许快速有效的写入)。