多租户共享一张表,还有部分公共数据,如何才能现在不允许他们修改和删除公共数据? 返回

SqlSugar 沟通中
5 390
该叫什么 wesley 发布于2025/7/23
悬赏:0 飞吻

A,B,C 3个租户共享一个库,库里面有一张Materials表,Materials里面有一个TenantId字段用于区分是哪个租户的数据,表里面除了租户的数据外,还有一部分公共数据TenantId=0,这部分数据是提供给

租户看,只允许查询,不能更新和修改。

目前查询以及通过   db.QueryFilter.AddTableFilter<ITenantSpecific>(c => c.TenantId == _tenantId || c.TenantId == 0);得到解决

但是更新和修改需要怎么改才能实现? 之前考虑过在db.Aop.OnExecutingChangeSql里面修改SQL语句,但是担心不同表,需求不一样的情况下,删除和更新语句存在较大差异,导致判断错误,无法正常操作。

除了,在db.Aop.OnExecutingChangeSql改SQL 还有什么方法可以实现?

以下是配置部分代码:


 

builder.Register(c =>
 {
     _httpContextAccessor = c.Resolve<IHttpContextAccessor>();
     ICacheService _cache = c.Resolve<ICacheService>();
     var settings = c.Resolve<DatabaseSettings>();
     var log = c.Resolve<MsILogger>();
     if ((settings.Connections?.Count ?? 0) == 0)
         throw new Exception("尚未配置数据库");
     else if(settings.Connections.Any(c=>string.IsNullOrEmpty(c.ConfigId)))
         throw new Exception("数据库配置中存在未设置ConfigId的库");
     else if(settings.Connections.GroupBy(c => c.ConfigId).Select(c => new { c.Key, Count = c.Count() }).Any(c => c.Count > 1))
         throw new Exception("数据库配置中存在相同的ConfigId");
     else if(!settings.Connections.Any(c=>c.ConfigId=="0") || !settings.Connections.Any(c => c.ConfigId == "1"))
         throw new Exception("数据库配置中,必须包含ConfigId='0'和'1' 2个库");
     var configs = settings.Connections.Select(c => GetConnCfg(c, _cache)).ToList();
     return new SqlSugarScope(configs, db =>
     {
         foreach(var config in configs)
         {
             GetConfigAction(db.GetConnection(config.ConfigId), log, false);
         }
     });
 }).As<ISqlSugarClient>().InstancePerLifetimeScope();
 private ConnectionConfig GetConnCfg(DatabaseSettingItem cfg, ICacheService cache)
 {
     return new ConnectionConfig()
     {
         DbType = cfg.DbType,
         ConnectionString = cfg.ConnectionString,
         ConfigId = cfg.ConfigId,
         InitKeyType = InitKeyType.Attribute,
         IsAutoCloseConnection = true,
         MoreSettings = new ConnMoreSettings()
         {
             IsWithNoLockQuery = true,
         },
         ConfigureExternalServices = new ConfigureExternalServices()
         {
             DataInfoCacheService = cache
         }
     };
 }
private void GetConfigAction(SqlSugarProvider db,MsILogger log,bool isIsolatedDatabase)
{
    var _configId = db.CurrentConnectionConfig.ConfigId?.ToString();
    long _tenantId = 0;
    long.TryParse(_configId, out _tenantId);
    bool isSpecificTenant = _tenantId > 1 && !isIsolatedDatabase;//共享型租户   _configId不是0和1 并且 isIsolatedDatabase=false(不是独立库)
    //SQL报错
    db.Aop.OnError = (exp) =>
    {
        var sql = UtilMethods.GetNativeSql(exp.Sql, exp.Parametres as SugarParameter[]);
        log.LogError($"执行SQL失败,config={_configId},,SQL语句:{sql}");
    };
    db.Aop.OnLogExecuting = (sql, pars) =>
    {
        var _sql = UtilMethods.GetNativeSql(sql, pars);
        log.LogInformation($"租户ID:{_configId},SQ语句:{_sql}");
    };
    
    db.Aop.DataExecuting = SqlSugarDataExecuting;
    //修改SQL
    db.Aop.OnExecutingChangeSql = (sql, pars) => {
        return new KeyValuePair<string, SugarParameter[]>(sql, pars);
    };
    // 共享型租户 需要增加租户过滤
    if (isSpecificTenant)
    {
        db.QueryFilter.AddTableFilter<ITenantSpecific>(c => c.TenantId == _tenantId || c.TenantId == 0);//当前租户+公共数据
    }
}



热忱回答5

  • fate sta fate sta VIP0
    2025/7/23

    修改可以先查询在修改。

    0 回复
  • fate sta fate sta VIP0
    2025/7/23

    删除也是一样的。 先查出来

    0 回复
  • fate sta fate sta VIP0
    2025/7/23

    当然过滤器也支持删除和修改。具体用法看文档:过滤器

    0 回复
  • fate sta fate sta VIP0
    2025/7/23

    标题2

    0 回复
  • wesley wesley VIP0
    2025/7/23

    @fate sta:好的,谢谢,我先去看看

    0 回复