如何实现隐蔽的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函数。
不太确定为什么要对智能感知隐藏这些,但是您可以显式地实现您的接口。
public abstract class BaseModel : IAuditable
{
string IAuditable.CreatedBy { get; set; }
DateTime? IAuditable.CreatedDate { get; set; }
}
这些属性仍然存在,但是只有当您显式地使用定义为IAuditable
的变量或属性时,才能在代码中访问。