如何实现隐蔽的SQL记录更改审计跟踪

本文关键字:SQL 记录 审计跟踪 何实现 实现 | 更新日期: 2023-09-27 18:13:05

我的公司想为一个SQL Server数据库实现审计。结合了在SO上找到的几个非常好的解决方案的结果,我最终得到了以下内容:

一个接口:

public interface IAuditable
{
    string CreatedBy { get; set; }
    DateTime? CreatedDate { get; set; }
    string CreatedIpAddress { get; set; }
    string ModifiedBy { get; set; }
    DateTime? ModifiedDate { get; set; }
    string ModifiedIpAddress { get; set; }
}

实现该接口的BaseClass。注释应该对设计器隐藏属性:

public abstract class BaseModel : IAuditable
{
    [Browsable(false)]
    [Bindable(false)]
    [DesignerSerializationVisibility(DesignerSerializationVisibility.Hidden)]
    [EditorBrowsable(EditorBrowsableState.Never)]
    public string CreatedBy { get; set; }
    [Browsable(false)]
    [Bindable(false)]
    [DesignerSerializationVisibility(DesignerSerializationVisibility.Hidden)]
    [EditorBrowsable(EditorBrowsableState.Never)]
    public DateTime? CreatedDate { get; set; }
    <snip>
    ...
    </snip>
}

BaseClass派生的域模型:

public class Person : BaseModel
{
    public int Id { get; set; }
    public string FirstName { get; set; }
    public string LastName { get; set; }
}

我重写SaveChanges()来填充属性。

如果我将集合绑定到datagridview,它不会显示这些列。然而,智能感知仍然在lambda表达式中提供它们。如何对智能感知隐藏这些属性?

我已经将模型暴露给UI(是的,我知道,糟糕的做法)。我想把这些隐藏在朱莉·勒曼所说的有界环境中。但我认为我的SaveChanges()覆盖将无法填充属性。或者我可能需要像使用SoftDelete那样将其推入SQL函数。

如何实现隐蔽的SQL记录更改审计跟踪

不太确定为什么要对智能感知隐藏这些,但是您可以显式地实现您的接口。

public abstract class BaseModel : IAuditable
{
    string IAuditable.CreatedBy { get; set; }
    DateTime? IAuditable.CreatedDate { get; set; }
}

这些属性仍然存在,但是只有当您显式地使用定义为IAuditable的变量或属性时,才能在代码中访问。