【问题标题】:SQL Filter based on Multi-Row Security基于多行安全的 SQL 过滤器
【发布时间】: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


【解决方案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]

不同的部分是为了防止从查询中给出重复的结果

【讨论】:

  • 谢谢,这适用于我最初给出的示例。然而,这让我意识到我应该添加一行。使用更新的示例,不幸的是,这将不再起作用(我认为)。
  • 添加了更多细节。我认为这应该更好地反映现在的情况。
  • 我又添加了一行代码。无论如何,我个人认为您应该为每个安全级别添加一行。更容易监控有多少人处于某个安全级别。
  • 是的,在这个例子中是有意义的。实际数据上升到 1000,但有用户可以访问 0 - 1000。我没有尝试您的示例,但这不适用于我猜的“通配符”。如果我有 10000 个位置并且我希望有人可以访问所有这些位置,我目前只是将位置列保留为空。
猜你喜欢
  • 2014-05-10
  • 1970-01-01
  • 2021-01-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-11-04
  • 1970-01-01
  • 2020-06-22
相关资源
最近更新 更多