sqlsugar 如何记录用户更新前数据和更新后数据,然后对比出差异 返回

SqlSugar 处理完成
14 2833

image.png老师,像这种记录用户更新前是什么值,更新后是什么值,sqlsuagr 是如何实现的,看了一下SQLsugar教程,找到了

差异日志功能(审计), 但操作前记录和操作后记录都是所有列的数据,如何获取用户修改了哪些字段呢?image.png


热忱回答14

  • fate sta fate sta VIP0
    2024/1/23

    这个自已比较一下就行了

    0 回复
  • @fate sta:老师,这个是需要存储在数据库然后比较差异还是需要怎么比较?

    前后都拿出来了,值不同的不就是差异的

    0 回复
  • fate sta fate sta VIP0
    2024/1/23

    前后都有了,比较一下值不同不就是差异部分

    0 回复
  • 对比可以直接使用这个方法

            /// <summary>
            /// 比较两个数据对象的修改内容
            /// </summary>
            /// <param name="beforeData"></param>
            /// <param name="afterData"></param>
            /// <returns></returns>
            public static diffLog getDiff(List<DiffLogTableInfo> beforeData, List<DiffLogTableInfo> afterData)
            {
                string mianID = null;
                if (beforeData != null)
                {
                    var keyCoulumn = beforeData[0].Columns.FirstOrDefault(p => p.IsPrimaryKey == true);
                    if (keyCoulumn != null)
                    {
                        mianID = keyCoulumn.Value.ToString();
                    }
                }
                else if (afterData != null)
                {
                    var keyCoulumn = afterData[0].Columns.FirstOrDefault(p => p.IsPrimaryKey == true);
                    if (keyCoulumn != null)
                    {
                        mianID = keyCoulumn.Value.ToString();
                    }
                }
    
                StringBuilder sb = new StringBuilder();
                if (beforeData != null && afterData != null)
                {
                    var befroeColumns = beforeData[0].Columns;
                    var afterCloums = afterData[0].Columns;
                    foreach (var item in befroeColumns)
                    {
                        if (IgnoreColumns.Contains(item.ColumnName.ToLower()))
                            continue;
                        var afterItem = afterCloums.FirstOrDefault(p => p.ColumnName == item.ColumnName && !p.Value.Equals(item.Value));
                        if (afterItem != null)
                        {
                            sb.Append($"[字段:{item.ColumnDescription},修改前:{item.Value},修改后:{afterItem.Value}]");
                        }
                    }
                }
    
                return new diffLog { ID = mianID, diffData = sb.ToString() };
            }


    0 回复
  • @呱呱卡:多谢,我这边参考一下

    0 回复
  • @fate sta:好的,谢谢老师,我这边看一下如何比对两个列表对象之间的差异

    0 回复
  • @呱呱卡:您好,这里是不是少了变量image.png

    0 回复
  • IgnoreColumns

    这个定义的是哪些列不用进行对比,可根据具体情况自行定义

            public class diffLog
            {
                public string ID { get; set; }
                public string diffData { get; set; }
            }
    
            /// <summary>
            /// 忽略的字段
            /// </summary>
            public static readonly List<string> IgnoreColumns = new List<string>()
            {
                "enable",
                "updatetime",
                "updateuserid",
                "createtime",
                "createuserid",
            };


    0 回复
  • @呱呱卡:明白了,你这个有没有试过多主键的呀,因为数据库可以多个主键组合

    0 回复
  • 联合主键的话,只需要修改mianID获取就行了。

    IsPrimaryKey == true的列会有多个,对应的处理就可以。

    0 回复
  • 感谢

    0 回复
  • @呱呱卡:感谢

    0 回复
  • shakugan shakugan VIP0
    2025/7/15
        async Task OnDiffLogEvent(DiffLogModel model, SqlSugarClient db)
        {
            foreach (var data in model.AfterData.Index())
                if (data.Item is not { TableName: "differlog" or "differlogline" })
                {
                    var After = data.Item;
                    var Before = model.BeforeData.Count >= data.Index ? model.BeforeData[data.Index] : null;
    
                    var head = new differlog { tablename = After.TableName };
                    var lines = After.Columns.Select(t => new differlogline
                    {
                        differlogid = head.id,
                        col = t.ColumnName,
                        after = t.Value.ToString(),
                        before = Before?.Columns.FirstOrDefault(k => k.ColumnName == t.ColumnName)?.Value.ToString()
                    }).Where(t => t.after != t.before).ToList();
    
                    if (lines.Count > 0)
                    {
                        await db.CopyNew().Insertable(head).ExecuteCommandAsync();
                        await db.CopyNew().Insertable(lines).ExecuteCommandAsync();
                    }
                }
        }

    自用 0.0

    0 回复
  • 老师,如果需要监控到数据库表的变跟,该怎么操作呢

    0 回复