数据权限控制导致大文本sql

遇到了一个数据权限控制上的问题。
现在有一张表A里面存储了一系列业务数据,另有一张表B记录了每个条业务数据与拥有其操作权限人员的关联关系。系统目前的查询逻辑是先在表B中查出当前登录人所拥有的所有的业务数据id,在表A中使用 select * from A where ... and id in (...) 查出最终结果。但假如存在一个用户拥有过多的数据权限时sql中 id in (...) 的部分很可能导致出现大文本sql。有什么方法能够解决这个问题吗?

  1. 可以使用子查询,大量数据的情况下,推荐使用这种方式
select * from A where ... and exists (selec 1 from B where b.bid = a.id and B.user_id = <当前登录人id>)
  1. 可以使用join查询
select * from A left join B on B.bid = A.id where B.user_id = <当前登录人id>

您可以考虑使用数据库中的视图(View)来解决这个问题。具体做法是:

  • 创建一个视图,将表A和表B进行关联,并筛选出当前登录人所拥有的业务数据id。例如:
CREATE VIEW my_view AS
SELECT A.*
FROM A
INNER JOIN B ON A.id = B.id
WHERE B.user_id = <当前登录人id>;


其中,<当前登录人id>是当前登录人的用户id。

  • 在程序中使用视图进行查询。例如:
SELECT * FROM my_view WHERE ...;

这样,就可以避免在SQL语句中使用id in (...)的方式,而是直接在视图中进行筛选,从而避免大文本SQL的问题。

需要注意的是,使用视图可能会对查询性能产生一定的影响,因此需要在具体情况下进行评估和测试,以确定是否适合使用视图来解决这个问题。