【问题标题】:How To create Audit table in sql server ? i need to create each audit table or can manage single table all audit如何在 sql server 中创建审计表?我需要创建每个审计表或可以管理单个表所有审计
【发布时间】:2016-07-28 08:00:27
【问题描述】:

我正在使用 MVC5。创建实体框架。我总共有 15 张桌子。现在我想在我的项目中最近的活动。我有计划使用审计表。我需要创建审核每个表或单个表可以管理吗?审计表中有哪些字段?

我有 TP_users 表

Id  int Unchecked
UserName    nvarchar(50)
UserEmail   nvarchar(50)    
DisplayName nvarchar(50)    
Password    nvarchar(50)    
RoleId      int
IsActive    bit 
ClientId    int 

现在我想创建审计表 TP_users 表。审计表中有哪些字段?如何使用审计表实体框架?

【问题讨论】:

标签: sql-server asp.net-mvc database entity-framework


【解决方案1】:

我们使用如下实体:

public class Audit
{
    [Required]
    [StringLength(6)]
    public string Action { get; set; }
    public string Changes { get; set; }
    public string PK { get; set; }
    [Required]
    public DateTime RevisionStamp { get; set; }
    [Required]
    [StringLength(50)]
    public string TableName { get; set; }
    [Required]
    [StringLength(50)]
    public string Username { get; set; }
}

我们用它来审计我们所有的表。 Action 属性表示发生了什么类型的更改,例如“更新”、“插入”或“删除”。更改前后的列值以 JSON 格式保存在 Changes 列中,如下所示:

[{"FieldName":"ID","ValueBefore":"2","ValueAfter":"2"},{"FieldName":"SettingTypeIndex","ValueBefore":"FiscalYear","ValueAfter":"FiscalYear"},{"FieldName":"Value","ValueBefore":"2015","ValueAfter":"2016"},{"FieldName":"Year","ValueBefore":"0","ValueAfter":"0"},{"FieldName":"DateInserted","ValueBefore":"2016-04-11 8:45:08 AM","ValueAfter":"2016-04-11 8:45:08 AM"},{"FieldName":"DateModified","ValueBefore":"2016-07-28 9:45:46 AM","ValueAfter":"2016-07-28 9:47:17 AM"},{"FieldName":"CreatorUserID","ValueBefore":"b44792db-1fbd-44d2-9f7d-cf05c6a2f922","ValueAfter":"b44792db-1fbd-44d2-9f7d-cf05c6a2f922"},{"FieldName":"UpdaterUserID","ValueBefore":"b44792db-1fbd-44d2-9f7d-cf05c6a2f922","ValueAfter":"b44792db-1fbd-44d2-9f7d-cf05c6a2f922"}]

这样我们就可以拥有回滚功能(如果需要)。更改记录的主键保存在PK 属性中。更改日期保存在RevisionStamp 属性中,最后表名和用户名分别保存在TableNameUsername 属性中。当然,这个实体被映射到数据库中的一个表,并且数据被持久化在那个表中。

如果您使用实体框架,您可以覆盖 DbContext.SaveChanges() 方法并获取所有 ChangeTracker.Entries().Where(e=>e.State != EntityState.Unchanged) 项目并使用这些项目创建您的审计数据。

【讨论】:

  • 我有使用存储过程。那么审计表也创建存储过程?
  • 如果您使用的是EF,那么您不需要存储过程来实现这一点,否则我认为您应该使用触发器来知道任何表何时发生更改,然后使用您的存储过程来在审计表中插入数据。
  • 我保存代码模型文件夹。我在哪里更改 DbContext.SaveChanges()?
  • 如果您使用的是模型优先,您的 dbcontext 类应该在您的 edmx 文件下,然后在 [yourcontextname].tt 文件下,就像这个链接中的 msdn.microsoft.com/en-us/data/jj205424.aspx;
【解决方案2】:

【讨论】:

    猜你喜欢
    • 2018-11-02
    • 2017-06-29
    • 2021-05-20
    • 2018-09-19
    • 1970-01-01
    • 2011-11-01
    • 2011-03-17
    • 1970-01-01
    • 2013-06-28
    相关资源
    最近更新 更多