基于多行安全性的SQL过滤器

时间:2013-11-22 11:44:32

标签: sql sql-server security filter

我们目前正在使用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

此安全表(安全性)

user | location | group | level from | level to
-----+----------+-------+------------+----------
u1   | loc1     |   A   |    1       |    5
u1   | loc1     |   A   |   10       |   15
u1   | loc2     |       |    4       |    9

逻辑是安全表中一行的每个值都与“和”连接(如果不为空),每行都带有“或”。

目前,我在存储过程中动态构建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

- &GT; id:1,4,5,6

我没有看到任何方法在SQL方面以智能方式执行此操作。 有没有人有建议?

1 个答案:

答案 0 :(得分:1)

Select distinct id from data
Inner join security on data.location = security.location 
And data.group = security.group
And data.level between security.[level from] and [level to]

不同的部分是防止从查询中提供重复的结果