我试图限制查询返回的结果。如果用户可以访问的实体数多于仅为当前用户列出的实体数,则该用户不应显示在列表中。使用下面的数据,并假设用户1正在运行查询,因为具有UserId 2的用户具有用户1没有的匹配项,即使它们具有重叠值,也应该从查询结果中排除用户2。
Table1
UserId EntityId
1 100
1 101
1 102
2 100
2 101
2 102
2 200
2 201
我该怎么做?
答案 0 :(得分:3)
看起来您试图限制SQL中的用户而不是与数据库接口的应用程序(例如webapp)。如果是这种情况,则需要使用内置数据库权限限制对表的访问。
您可以创建一个视图,根据用户过滤结果,拒绝用户编辑视图,并拒绝用户访问该表。获得结果的唯一方法是使用视图,该视图将过滤其结果。
答案 1 :(得分:1)
用户1是否可以使用户2缺少匹配而用户2可能同时缺少用户1的匹配?如果没有,您可以使用count
来检查用户拥有多少权限,如果它高于当前用户,则不要返回它们。
答案 2 :(得分:1)
您可以使用一系列嵌套查询执行此操作:
select A.* from Table1 A where A.UserId NOT IN
(select B.UserId from Table1 B where B.EntityId NOT IN
(select C.EntityId from Table1 C where C.UserId=1));
底部的最里面的查询为我们提供了属于UserId 1的EntityIds。我们在下一个查询中使用该列表来查找此列表中具有EntityId NOT 的所有UserIds。有了我们不想要的UserIds列表,最外层的查询会转储剩余UserIds的所有行。这些将是具有UserId 1的EntityIds
集的子集的那些答案 3 :(得分:1)
试试这个:
select A.UserId, A.EntityId
from Table1 A
where not UserId in (
select B.UserId
from Table1 B
left outer join Table1 C
on C.UserId=@UserId
and C.EntityId=B.EntityId
where B.UserId is null
)
答案 4 :(得分:1)
我不确定您使用的是哪个数据库,但在MS SQL Server中,您可以确定登录的用户并限制结果。有一个名为suser_sname()的系统函数将返回当前正在运行查询的用户。例如,如果我运行“select suser_sname()”,它将返回'jj'(假设我的用户名是jj)。
您提供的表作为示例似乎使用的UserID只是一个int,因此您必须创建一个将登录用户与用户ID链接的表。然后,只需创建一个视图,该视图使用连接来限制登录用户的视图结果。
这是一个例子: (我没有测试此代码,因此可能存在一些语法问题)
UserIDSName Table:
SUser UserID
jj 1
bob 2
然后创建一个视图:
create view Table1View
as
select userid, entityId
from Table1 t1
inner join UserIDSName uid on
t1.userid = uid.userid
and uid.SUser = suser_sname()
同样,我不太确定你是否使用SQL Server,但我想你可以在其他数据库中找到类似的功能。还应该注意的是,您可以使用where子句轻松地在客户端实现此目的。
答案 5 :(得分:1)
在Oracle中,您可以使用虚拟专用数据库来完成此任务。它也被称为细粒度访问控制。
您还可以定义一个过滤掉其他用户行的视图,您可能不允许直接访问该表。这样,访问对客户端是透明的,同时确保没有用户可以看到其他用户的行。