【发布时间】:2013-11-22 20:51:28
【问题描述】:
我们目前使用的是 MS SQL Server 2005,但很快就会迁移到 2012(或 2014)。 我面临以下情况。
数据表(数据)
id | location | group | level
-----+----------+--------+---------
1 | loc1 | A | 1
2 | loc1 | B | 5
3 | loc1 | A | 9
4 | loc1 | A | 12
5 | loc2 | A | 1
6 | loc2 | B | 5
还有这个安全表(security)
user | location | group | level from | level to
-----+----------+-------+------------+----------
u1 | loc1 | A | 1 | 5
u1 | loc1 | A | 10 | 15
u1 | loc2 | | 4 | 9
逻辑是安全表中每一行的每个值都用“and”(如果不为null)连接,每一行用“or”连接。
目前我在存储过程中动态构建 where 子句作为一个简单的字符串。这适用于为单个用户定义的少量安全行,但对于 5000 多行将需要很长时间。
例子:
select id from data
where location = 'loc1' and and group='A' and level>=1 and level <=5
location = 'loc1' and group='A' and level>=10 and level <=15
or location = 'loc2' and level>=4 and level <=9
-> id: 1, 4, 5, 6
我看不到任何在 SQL 端以智能方式执行此操作的方法。 有人有什么建议吗?
【问题讨论】:
-
对于您提到的要求,这是一个非常聪明的方法。
标签: sql sql-server security filter