2009-05-12 2 views
0

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

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

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

+0

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

+0

Вы имеете в виду, что если UserID = 3 может видеть только EntityID 100 и 101, тогда UserID = 3 строки должны быть указаны, когда UserID = 1 выбирает данные? –

ответ

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

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

+0

Это то, что мне нужно. Спасибо, Пол! И спасибо всем, кто ответил. – Scott

3

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

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

1

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

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 [email protected] 
     and C.EntityId=B.EntityId 
    where B.UserId is null 
) 
1

Я не уверен, какую базу данных вы используете, но в 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

В Oracle вы можете использовать виртуальную частную базу данных для этого. Он также называется тонкозернистым контролем доступа.

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

+0

+1 для VPD: функция чрезвычайно прочная и может обрабатывать довольно интенсивную логику без заметных накладных расходов. Очень круто. – davek