如何实施隐蔽的 SQL 记录变更审计追踪
How to implement covert SQL Records Change Audit-Trail
我的公司想要对 SQL 服务器数据库实施审计。结合在 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(是的,我知道,不好的做法)。我正在考虑尝试将这些隐藏在 Julie Lerman 所说的有界上下文中。但我认为我的 SaveChanges()
覆盖将无法填充属性。或者我可能需要像使用 SoftDelete 一样将其推送到 SQL 函数。任何帮助将不胜感激。
不太清楚为什么要对 Intellisense 隐藏这些,但您可以显式实现您的界面。
public abstract class BaseModel : IAuditable
{
string IAuditable.CreatedBy { get; set; }
DateTime? IAuditable.CreatedDate { get; set; }
}
这些属性仍然存在,但只有在您明确使用变量或 属性 定义为 IAuditable
.
时才能在代码中访问
我的公司想要对 SQL 服务器数据库实施审计。结合在 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(是的,我知道,不好的做法)。我正在考虑尝试将这些隐藏在 Julie Lerman 所说的有界上下文中。但我认为我的 SaveChanges()
覆盖将无法填充属性。或者我可能需要像使用 SoftDelete 一样将其推送到 SQL 函数。任何帮助将不胜感激。
不太清楚为什么要对 Intellisense 隐藏这些,但您可以显式实现您的界面。
public abstract class BaseModel : IAuditable
{
string IAuditable.CreatedBy { get; set; }
DateTime? IAuditable.CreatedDate { get; set; }
}
这些属性仍然存在,但只有在您明确使用变量或 属性 定义为 IAuditable
.