Ограничение результатов из запроса SQL - PullRequest
0 голосов
/ 13 мая 2009

Я пытаюсь ограничить результаты, возвращаемые запросом. Если пользователь имеет доступ к большему количеству сущностей, чем только те, которые перечислены для текущего пользователя, то этот пользователь не должен отображаться в списке. Используя приведенные ниже данные и предполагая, что пользователь 1 выполняет запрос, поскольку пользователь с идентификатором пользователя 2 имеет совпадения, которых нет у пользователя 1, даже если они имеют перекрывающиеся значения, пользователя 2 следует исключить из результатов запроса.

Table1
UserId   EntityId
1        100
1        101
1        102
2        100
2        101
2        102
2        200
2        201

Как мне это сделать?

Ответы [ 6 ]

3 голосов
/ 13 мая 2009

Похоже, вы пытаетесь ограничить пользователей в SQL, а не в приложении, которое взаимодействует с базой данных (например, webapp). Если это так, вам нужно ограничить доступ к таблице, используя разрешения встроенной базы данных.

Вы можете создать представление, которое фильтрует результаты на основе пользователя, запретить пользователям возможность редактировать представление и запретить пользователям доступ к таблице. Единственный способ получить результаты - использовать представление, которое отфильтрует их результаты.

1 голос
/ 13 мая 2009

В Oracle вы можете использовать Virtual Private Database для этого. Он также называется мелкозернистым контролем доступа.

Вы также можете определить представление, которое отфильтровывает строки других пользователей, и вам, вероятно, следует запретить прямой доступ к таблице. Таким образом, доступ будет прозрачным для клиентов, при этом ни один пользователь не сможет видеть строки других пользователей.

1 голос
/ 13 мая 2009

Я не уверен, какую базу данных вы используете, но в MS SQL Server вы можете определить, какой пользователь вошел в систему, и ограничить ваши результаты. Существует системная функция с именем suser_sname (), которая возвращает пользователя, который в данный момент выполняет запрос. Например, если бы я запустил «select suser_sname ()», он вернул бы «jj» (при условии, что мое имя пользователя - jj).

Таблица, которую вы предоставляете в качестве примера, похоже, использует UserID, который является просто int, поэтому вам нужно будет создать таблицу, которая свяжет вошедшего пользователя с идентификатором пользователя. Затем просто создайте представление, которое использует объединение, чтобы ограничить результаты просмотра пользователем, вошедшим в систему.

Вот пример: (Я не тестировал этот код, поэтому могут быть некоторые проблемы с синтаксисом)

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.

1 голос
/ 13 мая 2009

Попробуйте это:

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
)
1 голос
/ 13 мая 2009

Вы можете сделать это с помощью ряда вложенных запросов:

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));

Самый нижний, самый внутренний запрос дает нам EntityIds, принадлежащие UserId 1. Мы используем этот список в следующем запросе, чтобы найти все UserId, которые имеют EntityId NOT в этом списке. Вооружившись тем списком нежелательных пользовательских идентификаторов, внешний запрос сбрасывает все строки оставшихся пользовательских идентификаторов. Это будут те, у которых есть подмножество EntityIds

из UserId 1.
1 голос
/ 13 мая 2009

Возможно ли, чтобы у пользователя 1 были совпадения, а у пользователя 2 - нет, а у пользователя 2 - совпадения, когда у пользователя 1 нет совпадений? Если нет, вы можете просто использовать count, чтобы проверить, сколько привилегий имеет пользователь, и если оно выше, чем у текущего пользователя, не возвращайте их.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...