Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
Топик располагается на нескольких страницах: [1] 2   вперед  Ctrl      все
 Помогите с запросом  [new]
sp
Member

Откуда:
Сообщений: 3947
Есть таблицы:

1) Documents
------------
doc_id int,
...
user_id

2) Branches
-------------
branch_id int
.....

3) BranchAgents
--------------------
branch_id int
agent_id int

4) Agents
----------------
agent_id int
...

5) Users
-----------------------
user_id int
user_name varchar(50)


6) Agent_users
-----------------------
agent_id int
user_id int


7) Branch_users
----------------------
branch_id int
user_id int

8) Roles
-----------------
role_id int
name varchar(50)

9) User_roles
-----------------------
user_id int
role_id


Ролей в приложении несколько
- пользоваттель Агента
- администратор Агента
- сотрудник Филиала
- администратор

Для пользователей установлены правила
- пользоваттель Агента может видеть только свои документы
- администратор Агента может видеть все документы своего Агентства
- сотрудник Филиала может видеть все документы своего филиала и агентов филиала
- администратор может видеть все документы

Мне необходимо составить запрос, отображающий документы, в соответствии с правилами доступа, если известно user_name пользователя.
Все это нужно сделать в одном запросе.

Возможно ли это?
30 июн 13, 18:27    [14502121]     Ответить | Цитировать Сообщить модератору
 Re: Помогите с запросом  [new]
qwerty112
Guest
sp
Возможно ли это?

да
30 июн 13, 21:40    [14502434]     Ответить | Цитировать Сообщить модератору
 Re: Помогите с запросом  [new]
sp
Member

Откуда:
Сообщений: 3947
qwerty112,

а расширенные варианты ответа есть?))
30 июн 13, 23:34    [14502673]     Ответить | Цитировать Сообщить модератору
 Re: Помогите с запросом  [new]
qwerty112
Guest
sp
qwerty112,

а расширенные варианты ответа есть?))

конечна ! :))
тута - 1006908 п.6 описан формат вопроса под "расширенный ответ" :)

зы
https://www.sql.ru/forum/memberinfo.aspx?mid=4121
Зарегистрирован: 22 октября 2002, 14:19
+
Картинка с другого сайта.

1 июл 13, 00:53    [14502769]     Ответить | Цитировать Сообщить модератору
 Re: Помогите с запросом  [new]
sp
Member

Откуда:
Сообщений: 3947
qwerty112,

все буквы знаю и перечитал, но не понял чего вас так коробит?
1 июл 13, 13:49    [14505037]     Ответить | Цитировать Сообщить модератору
 Re: Помогите с запросом  [new]
sp
Member

Откуда:
Сообщений: 3947
мне например, не понятно, если я введу все соединения таблиц по схеме, то кроме как владельца документа получить я не смогу
а если не вводить соединения - непонятно как составлять запрос!
1 июл 13, 13:53    [14505059]     Ответить | Цитировать Сообщить модератору
 Re: Помогите с запросом  [new]
Maxx
Member [скрыт]

Откуда:
Сообщений: 24290
left outer +case
У вас на вход вообще сотрудник передаеться ? Иили вам надо всю протынку возможных прав получить то ?
1 июл 13, 13:59    [14505111]     Ответить | Цитировать Сообщить модератору
 Re: Помогите с запросом  [new]
sp
Member

Откуда:
Сообщений: 3947
Maxx
left outer +case
У вас на вход вообще сотрудник передаеться ? Иили вам надо всю протынку возможных прав получить то ?


у меня на вход подается только имя пользователя и мне в зависимости от того какая у него роль нужно получить, соответствующий его уровню, перечень документов.

Каждое правило я спокойно описывал отдельным запросом - в этом нет проблем, но как их совместить в одном - не могу понять
1 июл 13, 14:03    [14505150]     Ответить | Цитировать Сообщить модератору
 Re: Помогите с запросом  [new]
Maxx
Member [скрыт]

Откуда:
Сообщений: 24290
ну как бы ..у вас есть пользователь , получаете его права ,от етого дальше крутите по условия соединения
в конце концов case в on тоже можно нарисовать
Да и cte, #table еще никто не отменял
1 июл 13, 14:06    [14505177]     Ответить | Цитировать Сообщить модератору
 Re: Помогите с запросом  [new]
sp
Member

Откуда:
Сообщений: 3947
Maxx,

насколько решение с одним запросом будет проигрывать в производительности и потреблению ресурсов чем если бы для каждого правила использовался бы свой запрос?

СТЕ , насколько я понял, выполняется один раз до основного запроса и держит результат где-то в буферах - большое потребление памяти, а использование case , как мне кажется, скажется на производительности запроса..?
1 июл 13, 14:13    [14505232]     Ответить | Цитировать Сообщить модератору
 Re: Помогите с запросом  [new]
Maxx
Member [скрыт]

Откуда:
Сообщений: 24290
sp,

ответ на свой вопрос - ві узнаете только прочитав плані ввоих запросов и посмотрев в профайлер
Кроме вас никто не знает,что у вас с данніми,какие индексі..етц
1 июл 13, 14:15    [14505248]     Ответить | Цитировать Сообщить модератору
 Re: Помогите с запросом  [new]
sp
Member

Откуда:
Сообщений: 3947
Maxx,

помогите хоть схематично покажите как составить запрос , к примеру, если пользователь является Администратором Агента - я такого типа запросы не видел ни разу и не приходилось составлять...
1 июл 13, 14:18    [14505281]     Ответить | Цитировать Сообщить модератору
 Re: Помогите с запросом  [new]
Maxx
Member [скрыт]

Откуда:
Сообщений: 24290
показывайте ваши запросы :))
1 июл 13, 14:38    [14505434]     Ответить | Цитировать Сообщить модератору
 Re: Помогите с запросом  [new]
StarikNavy
Member

Откуда: Москва
Сообщений: 2396
sp
СТЕ , насколько я понял, выполняется один раз до основного запроса и держит результат где-то в буферах - большое потребление памяти, а использование case , как мне кажется, скажется на производительности запроса..?


вы вначале решите задачу, а потом оптимизацией займетесь
1 июл 13, 14:45    [14505490]     Ответить | Цитировать Сообщить модератору
 Re: Помогите с запросом  [new]
sp
Member

Откуда:
Сообщений: 3947
Maxx,

ну вот 2 запроса на разные правила

1) каждый юзер Агента должен видеть только свои документы
SELECT
	d.*
FROM 
	Documents d
	join Users u on u.UserID = d.UserID
	join User_roles ur on ur.UserID = u.UserID
	join Roles r on r.RoleID = ur.RoleID and r.name = 'Сотрудник Агента'
WHERE 
	u.UserName = 'VasjaPupkin';



2) Администратор Агента должен видеть документы всех юзеров Агента
SELECT
	distinct d.*
FROM         
	Agent_users a1
	join Documents d on d.UserID = a1.UserID

	join Agent_users a2 ON a2.AgentID = a1.AgentID
	join Users u on u.UserID = a2.UserID
	join User_roles ur on ur.UserID = u.UserID
	join Roles r on r.RoleID = ur.RoleID
where
	u.UserName = 'VasjaPupkin' and r.name = 'Администратор Агента';
1 июл 13, 16:03    [14505895]     Ответить | Цитировать Сообщить модератору
 Re: Помогите с запросом  [new]
sp
Member

Откуда:
Сообщений: 3947
как, хотябы эти 2 запроса, можно совместить в одном??
3 июл 13, 14:49    [14516844]     Ответить | Цитировать Сообщить модератору
 Re: Помогите с запросом  [new]
Mind
Member

Откуда: Лучший город на Земле
Сообщений: 2322
sp
как, хотябы эти 2 запроса, можно совместить в одном??
UNION?
3 июл 13, 19:43    [14518780]     Ответить | Цитировать Сообщить модератору
 Re: Помогите с запросом  [new]
sp
Member

Откуда:
Сообщений: 3947
Mind,

нет - union в топку - сортировки, order by и все остальное!
да и параметры этих запросов OR - а union - AND
4 июл 13, 00:48    [14519773]     Ответить | Цитировать Сообщить модератору
 Re: Помогите с запросом  [new]
qwerty112
Guest
sp
Mind,

нет - union в топку - сортировки, order by и все остальное!
да и параметры этих запросов OR - а union - AND

шо это ТС "морозит" ?

sp
как, хотябы эти 2 запроса, можно совместить в одном??


SELECT
	d.*
FROM 
	Documents d
WHERE 
-- 1.
exists (select 1 from Users u 	
	join User_roles ur on ur.UserID = u.UserID
	join Roles r on r.RoleID = ur.RoleID 	
where u.UserName = 'VasjaPupkin' and r.name = 'Сотрудник Агента' and u.UserID = d.UserID)
-- 2.
OR
exists ( select 1 from Agent_users a1
	join Agent_users a2 ON a2.AgentID = a1.AgentID
	join Users u on u.UserID = a2.UserID
	join User_roles ur on ur.UserID = u.UserID
	join Roles r on r.RoleID = ur.RoleID
where u.UserName = 'VasjaPupkin' and r.name = 'Администратор Агента' and d.UserID = a1.UserID)

на оптимальность не претендую,
думать, в связи пхзмм ТС - ломает
4 июл 13, 01:12    [14519804]     Ответить | Цитировать Сообщить модератору
 Re: Помогите с запросом  [new]
Mnior
Member

Откуда: Кишинёв
Сообщений: 6723
Сортировки поручают клиенту, а на скуле они для топов. Скуль нужен для отбора данных, а не для рисования на клиенте.
Ваш Distinct просто умиляет, как причиной возникновения так и последующим аргументом с сортировками.
"параметры запросов OR/AND" - на это никак не влияют.

Всё это делается для оптимизации запроса, а не "лишь бы работало".
Параметры запросов могут быть ещё более вескими (больше селективность) что может ещё больше породить UNION-ов.

По сути возможно роли взаимо-покрываемы - т.е. нет такого что свои документы в одном агентстве, а сам менеджер в другом.
Тут даже разделяют что текущая рабочая роль может быть только одна. Не морочит голову и пользователю.
Поэтому всё сведётся к UNION ALL (и без никаких Distinct-ов) - т.е. "сработает" только один блок (спасибо startup filter-ам).

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

Отбор прав по названию?!
Всегда у элемента справочника есть логический код.

Это всё базовые патерны проектирования.
4 июл 13, 01:12    [14519806]     Ответить | Цитировать Сообщить модератору
 Re: Помогите с запросом  [new]
Mnior
Member

Откуда: Кишинёв
Сообщений: 6723
qwerty112
на оптимальность не претендую,
думать, в связи пхзмм ТС - ломает
Так нафига тут время наше общее тратите?
4 июл 13, 01:14    [14519810]     Ответить | Цитировать Сообщить модератору
 Re: Помогите с запросом  [new]
qwerty112
Guest
Mnior
qwerty112
на оптимальность не претендую,
думать, в связи пхзмм ТС - ломает
Так нафига тут время наше общее тратите?

нуу, не знаю как цените Вы своё время,
но ТС своё - точно не ценит : 4-ый день "башкой об стену объётся", но скриптами так и не "разродился" ... :)
4 июл 13, 01:25    [14519825]     Ответить | Цитировать Сообщить модератору
 Re: Помогите с запросом  [new]
sp
Member

Откуда:
Сообщений: 3947
qwerty112
нуу, не знаю как цените Вы своё время,
но ТС своё - точно не ценит : 4-ый день "башкой об стену объётся", но скриптами так и не "разродился" ... :)


Какими скриптами? о чем речь?
4 июл 13, 13:04    [14521798]     Ответить | Цитировать Сообщить модератору
 Re: Помогите с запросом  [new]
Glory
Member

Откуда:
Сообщений: 104760
sp
Какими скриптами? о чем речь?

о Рекомендациях по оформлению сообщений
4 июл 13, 13:05    [14521811]     Ответить | Цитировать Сообщить модератору
 Re: Помогите с запросом  [new]
sp
Member

Откуда:
Сообщений: 3947
Mnior
Сортировки поручают клиенту, а на скуле они для топов. Скуль нужен для отбора данных, а не для рисования на клиенте.
Ваш Distinct просто умиляет, как причиной возникновения так и последующим аргументом с сортировками.
"параметры запросов OR/AND" - на это никак не влияют.


Сортировки делае именно скуль потому какя я задаю из какой части таблицы что выбрать да TOP тут же! поэтому и Distinct

Mnior
Всё это делается для оптимизации запроса, а не "лишь бы работало".
Параметры запросов могут быть ещё более вескими (больше селективность) что может ещё больше породить UNION-ов.

По сути возможно роли взаимо-покрываемы - т.е. нет такого что свои документы в одном агентстве, а сам менеджер в другом.
Тут даже разделяют что текущая рабочая роль может быть только одна. Не морочит голову и пользователю.
Поэтому всё сведётся к UNION ALL (и без никаких Distinct-ов) - т.е. "сработает" только один блок (спасибо startup filter-ам).


ролей в реальной жизни, как показывает практика, может быть несколько - по разным причинам, отпуски, болезни, просто некому работать..

Mnior
Система прав - это узкое место (чуть ли не самое). Вы должны были позаботится чтобы не было перелопачивания кучи таблиц каждый раз, а бац и всегда готовые под рукой.


Согласен, я б с удовольствием бы уменьшил бы их - но вопрос как?

Mnior
Отбор прав по названию?!
Всегда у элемента справочника есть логический код.


Согласен, но код тут приведен для понимания общей ситуации - еслиб я привел тут коды вместо названий - посыпалось бы кучу вопросов и оскорблений...
4 июл 13, 13:11    [14521852]     Ответить | Цитировать Сообщить модератору
Топик располагается на нескольких страницах: [1] 2   вперед  Ctrl      все
Все форумы / Microsoft SQL Server Ответить