多租户共享一张表,还有部分公共数据,如何才能现在不允许他们修改和删除公共数据? 返回
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 VIP0
2025/7/23修改可以先查询在修改。
0 回复 -
fate sta VIP0
2025/7/23删除也是一样的。 先查出来
0 回复 -
fate sta VIP0
2025/7/23当然过滤器也支持删除和修改。具体用法看文档:过滤器
0 回复 -
fate sta VIP0
2025/7/23标题2
0 回复 -
wesley VIP0
2025/7/23@fate sta:好的,谢谢,我先去看看
0 回复