遇到了一个数据权限控制上的问题。
现在有一张表A里面存储了一系列业务数据,另有一张表B记录了每个条业务数据与拥有其操作权限人员的关联关系。系统目前的查询逻辑是先在表B中查出当前登录人所拥有的所有的业务数据id,在表A中使用 select * from A where ... and id in (...) 查出最终结果。但假如存在一个用户拥有过多的数据权限时sql中 id in (...) 的部分很可能导致出现大文本sql。有什么方法能够解决这个问题吗?
select * from A where ... and exists (selec 1 from B where b.bid = a.id and B.user_id = <当前登录人id>)
select * from A left join B on B.bid = A.id where B.user_id = <当前登录人id>
您可以考虑使用数据库中的视图(View)来解决这个问题。具体做法是:
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的问题。
需要注意的是,使用视图可能会对查询性能产生一定的影响,因此需要在具体情况下进行评估和测试,以确定是否适合使用视图来解决这个问题。