sqlsugar 如何记录用户更新前数据和更新后数据,然后对比出差异 返回
SqlSugar
处理完成
14
2833
悬赏:0 飞吻
老师,像这种记录用户更新前是什么值,更新后是什么值,sqlsuagr 是如何实现的,看了一下SQLsugar教程,找到了
差异日志功能(审计), 但操作前记录和操作后记录都是所有列的数据,如何获取用户修改了哪些字段呢?
热忱回答(14)
-
fate sta VIP0
2024/1/23这个自已比较一下就行了
0 回复 -
中律十六C VIP0
2024/1/23@fate sta:老师,这个是需要存储在数据库然后比较差异还是需要怎么比较?
前后都拿出来了,值不同的不就是差异的
0 回复 -
fate sta VIP0
2024/1/23前后都有了,比较一下值不同不就是差异部分
0 回复 -
呱呱卡 VIP0
2024/1/23对比可以直接使用这个方法
/// <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 回复 -
中律十六C VIP0
2024/1/23@呱呱卡:多谢,我这边参考一下
0 回复 -
中律十六C VIP0
2024/1/23@fate sta:好的,谢谢老师,我这边看一下如何比对两个列表对象之间的差异
0 回复 -
中律十六C VIP0
2024/1/23@呱呱卡:您好,这里是不是少了变量
0 回复 -
呱呱卡 VIP0
2024/1/23IgnoreColumns
这个定义的是哪些列不用进行对比,可根据具体情况自行定义
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 回复 -
中律十六C VIP0
2024/1/23@呱呱卡:明白了,你这个有没有试过多主键的呀,因为数据库可以多个主键组合
0 回复 -
呱呱卡 VIP0
2024/1/23联合主键的话,只需要修改mianID获取就行了。
IsPrimaryKey == true的列会有多个,对应的处理就可以。
0 回复 -
中律十六C VIP0
2024/1/23感谢
0 回复 -
中律十六C VIP0
2024/1/23@呱呱卡:感谢
0 回复 -
shakugan VIP0
2025/7/15async 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 回复 -
小奶头 VIP0
2025/9/12老师,如果需要监控到数据库表的变跟,该怎么操作呢
0 回复