前置条件
有3个角色,系统管理员、租户管理员、普通用户查看广告。
系统管理员只能查询自己的广告
租户管理员可以查询自己租户和系统的广告
租户下的普通用户只能查询自己租户下的广告
方案
在表中添加一个字段tenantId。
如果系统管理员添加广告时置空,租户管理员添加广告设置为租户自己的id
系统管理员查看自己的广告时,条件过滤时只要tenantId is null 就可以查询出所要系统级的广告
租户管理员查询自己租户和系统的广告是过滤条件时,过滤条件只要 tenantId = ‘租户自己的ID’ or tenantId is null
租户下的普通用户只能查询自己租户下的广告时,过滤条件只要设置为 tenantId=‘普通用户的租户ID’
SELECT *
FROM table
WHERE 1 = 1
AND (
(:tenant IS NOT NULL AND (tenantid = '10002' or tenantid is null)) OR
(:agent IS NOT NULL AND (tenantid = '10002')) OR
(:admin IS NOT NULL AND (tenantid is null))
)
不管PL/SQL可以拼接sql语句,oracle也提供拼接sql语句,根据你的角色拼接不同的查询条件如果tenant不为空,则拼接and后面的sql,其他以此类推。
而且此sql语句性能很好。不过可以进行不同角色查询的过滤,还可以支持其他场景拼接。