powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Помогите сформировать запрос
20 сообщений из 20, страница 1 из 1
Помогите сформировать запрос
    #32057689
alexu
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Есть две таблицы:
В первой - люди и права доступа к объектам (у одного человека несколько прав)
Во второй - объекты и права доступа, которые должен иметь человек, чтобы получить доступ к данному объекту.
Надо получить таблицу людей и объектов, к которым они имеют доступ

Как получить такую таблицу?
...
Рейтинг: 0 / 0
Помогите сформировать запрос
    #32057695
alexu
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Че всем впадлу помочь начинающему? А как же братство программистов? Подскажите хоть какие-нибудь мысли! Мне сказали, что без курсоров не обойтись.
...
Рейтинг: 0 / 0
Помогите сформировать запрос
    #32057701
Фотография Cat2
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Во-первых, по выходным народ отдыхает.
Во-вторых - структуру таблиц и пример заполнения на бочку.
В-третьих, начинать надо с чтения книг. 99%, что Ваш запрос

select mans.man, objects.object
from mans join objects on man.rights=objects.rights

Что является первым примером по соединению таблиц в любом учебнике по SQL.

В-четвертых, то что "в-третьих" может оказаться не тем, что надо. Тогда смотри "Во-вторых"

Братство-братсвом, но и самому думать надо.
...
Рейтинг: 0 / 0
Помогите сформировать запрос
    #32057707
alexu
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Cat! Если это было так просто я бы постыдился спрашивать и открыл книгу! Это действительно можно прочитать в первых главах любой книженцы. Запрос немного сложнее!
Пример:
man1 имеет права 1,2,3,8,10,
man2 имеет права 1,2,3,4,5
man3 имеет права 1,2,3,4,5,6,7,8

для доступа к объекту1 нужны права 3,4,5,6
для доступа к объекту2 нужны права 1,2,8

Так вот результат должен быть:
man1 имеет доступ только к объекту2
man2 не имеет доступа ни к одному объекту
man3 имеет доступ к обоим объектам

то есть надо получить таблицу:

man1 object2
man3 object1
man3 object2

Правда для тебя это наверняка легко. Я почитал твои сообщения - впечатлило, чувствуется рука мастера
...
Рейтинг: 0 / 0
Помогите сформировать запрос
    #32057712
Фотография AVL
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
неужели права для man1 перечисляются через запятую? И почему только две таблицы, как я понял здесь их должно быть не меньше четырех. И все равно запрос получиться а-ля Cat2
...
Рейтинг: 0 / 0
Помогите сформировать запрос
    #32057713
alexu
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Наверное я такой тупой, что даже не могу толково объяснить задачу.
Таблиц действительно две.
Первая таблица:
man1 1
man1 2
man1 3
man1 8
man1 10
man2 1
man2 2
man2 3
man2 4
man2 5
man3 1
man3 2
man3 3
man3 4
man3 5
man2 6
man2 7
man2 8

Вторая таблица:
Object1 3
Object1 4
Object1 5
Object1 6
Object2 1
Object2 2
Object2 8

Нужно получить:
man1 object2
man3 object1
man3 object2

А теперь что скажете господа программисты! Тут связывание таблиц при помощи JOIN уже не прокатит. Я же говорю это не так просто как кажется! А пример CAT2 не подходит - это очевидно!!!
...
Рейтинг: 0 / 0
Помогите сформировать запрос
    #32057716
Glory
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Еще как "катит" ! Просто INNER JOIN-ов чуть побольше надо

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
set nocount on
if object_id('tempdb..#man') is not null drop table #man

create table #man(man_name varchar( 20 ), man_right int)

insert #man values('man1',  1 ) 
insert #man values('man1',  2 )
insert #man values('man1',  3  )
insert #man values('man1',  8  )
insert #man values('man1',  10  )
insert #man values('man2',  1  )
insert #man values('man2',  2  )
insert #man values('man2',  3  )
insert #man values('man2',  4  )
insert #man values('man2',  5  )
insert #man values('man3',  1  )
insert #man values('man3',  2  )
insert #man values('man3',  3  )
insert #man values('man3',  4  )
insert #man values('man3',  5  )
insert #man values('man2',  6  )
insert #man values('man2',  7  )
insert #man values('man2',  8 )

 --select * from #man order by man_name
 

if object_id('tempdb..#object') is not null drop table #object
create table #object(obj_name varchar( 20 ), obj_right int)
insert #object values('Object1',  3 ) 
insert #object values('Object1',  4  )
insert #object values('Object1',  5  )
insert #object values('Object1',  6  )
insert #object values('Object2',  1  )
insert #object values('Object2',  2  )
insert #object values('Object2',  8  )


select b.man_name, a.obj_name from
(select a.obj_name, count(*) as right_cnt
from #object a
group by a.obj_name
) AS a
inner join 
(select a.obj_name, b.man_name, count(*) as real_right_cnt
from #object a
inner join #man b on b.man_right = a.obj_right
group by a.obj_name, b.man_name
) AS b
on b.obj_name = a.obj_name and b.real_right_cnt = a.right_cnt
order by b.man_name, a.obj_name


PS
А объяснять лучше все-таки как можно подробнее. Вы то свои таблицы "вживую" видите, а нам их еще вообразть надо
...
Рейтинг: 0 / 0
Помогите сформировать запрос
    #32057717
alexu
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Glory? Вот это уже больше похоже на правду! Наверно правильно, проверю - скажу.
Спасибо за пример!
...
Рейтинг: 0 / 0
Помогите сформировать запрос
    #32057828
Glory
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Забыл учточнить, что предложенный запрос будет работать правильно, если комбинации man_name - man_right и obj_name - obj_right являются уникальными в соотвествующих таблицах. Если это условие не выполняется, то надо чуть модифицировать запрос

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
set nocount on
if object_id('tempdb..#man') is not null drop table #man

create table #man(man_name varchar( 20 ), man_right int)

insert #man values('man1',  1 ) 
insert #man values('man1',  2 )
insert #man values('man1',  3  )
insert #man values('man1',  8  )
insert #man values('man1',  10  )
insert #man values('man2',  1  )
insert #man values('man2',  2  )
insert #man values('man2',  3  )
insert #man values('man2',  4  )
insert #man values('man2',  5  )
insert #man values('man3',  1  )
insert #man values('man3',  2  )
insert #man values('man3',  3  )
insert #man values('man3',  4  )
insert #man values('man3',  5  )
insert #man values('man2',  6  )
insert #man values('man2',  7  )
insert #man values('man2',  8 )

 --select * from #man order by man_name
 

if object_id('tempdb..#object') is not null drop table #object
create table #object(obj_name varchar( 20 ), obj_right int)
insert #object values('Object1',  3 ) 
insert #object values('Object1',  4  )
insert #object values('Object1',  5  )
insert #object values('Object1',  6  )
insert #object values('Object2',  1  )
insert #object values('Object2',  2  )
insert #object values('Object2',  8  )


select b.man_name, a.obj_name from
(select a.obj_name, count(distinct a.obj_right) as right_cnt
from #object a
group by a.obj_name
) AS a
inner join 
(select a.obj_name, b.man_name, count(distinct b.man_right) as real_right_cnt
from #object a
inner join #man b on b.man_right = a.obj_right
group by a.obj_name, b.man_name
) AS b
on b.obj_name = a.obj_name and b.real_right_cnt = a.right_cnt
order by b.man_name, a.obj_name
...
Рейтинг: 0 / 0
Помогите сформировать запрос
    #32057847
alexu
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
2 Glory.
Еще раз СПА!

А сколько нужно времени среднему программисту, чтобы написать такой запрос. (секунд 10?). К примеру сколько Вы над ним думали, или написали "сходу"?
...
Рейтинг: 0 / 0
Помогите сформировать запрос
    #32057871
Фотография alexeyvg
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
2alexu
Начинающему - подумать 10 сек + написать
Среднему - подумать 0 сек + написать
Хорошему - 0 сек (поручить начинающему)

:-)
...
Рейтинг: 0 / 0
Помогите сформировать запрос
    #32057888
alexu
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
:-)
...
Рейтинг: 0 / 0
Помогите сформировать запрос
    #32058004
Glory
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
2alexu
После того, как вы привели последний вариант, никаких сомнениий не возникло - количество прав у пользователя должно строго равняться количеству прав у объекта.
Ну а написание скрипта взяло конечно больше 10 секунд - все-таки на курсы печатания вслепую я не ходил.
...
Рейтинг: 0 / 0
Помогите сформировать запрос
    #32058083
alexu
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
А некоторые справляются за 0 сек. Когда-нить и я буду по этой части спецом. БОЙТЕСЬ!!!
:-)
...
Рейтинг: 0 / 0
Помогите сформировать запрос
    #32058170
Фотография Garya
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Что-то какая-то куцая система прав доступа получается... Выходит, что ежели объект Obj1 в своем описании полей содержит право, к примеру, № 8, то это право имеют все юзеры, в свойствах которых сие право прописано? А если объект Obj2 содержит точно такое же право (№ 8)? Выходит, мы можем дать только схожие права доступа к разным объектам! Не можем одному юзеру дать право №8 на объект Obj1, одновременно запретив иметь его для объекта Obj2, если на объект Obj2 имеет право №8 какой-то другой пользователь...

ИМХО, должно быть не две таблицы, а три. В одной - юзеры, в другой - объекты. В третьей - на пересечении двух первых - (отношение "многие-ко-многим") - права доступа. В такой системе можно будет давать разные права доступа разным юзерам на один объект, и одному юзеру иметь разные права доступа к разным объектам.
...
Рейтинг: 0 / 0
Помогите сформировать запрос
    #32058176
alexu
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
2 Garya.
Согласен система куцая, если ее применять к данной области (юзеры, права, объекты). Но мне нужно было знать как составить такой запрос. Пример чисто теоретический.
...
Рейтинг: 0 / 0
Помогите сформировать запрос
    #32059427
Фотография Cat2
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Наконец-то я весьма запоздало собрался ответить
Мне конечно далеко до Glory в соревновании на сборку-разборку запросов с завязанными глазами, я больше архитектурой интересуюсь.

Структура базы мне сразу не понравилась.
Если мы преобразуем права в побитовые маски, то задача решается в два притопа, три прихлопа.
Правда, это конкретное решение будет работать, если число прав in (1-32). Преодолеть это ограничение можно, но возни несколько больше.

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
set nocount on
create table mans (man char( 1 ), Rights int)
insert into mans values ('a', 1 )
insert into mans values ('a', 2 )
insert into mans values ('a', 3 )
insert into mans values ('a', 8 )
insert into mans values ('a', 10 )

insert into mans values ('b', 1 )
insert into mans values ('b', 2 )
insert into mans values ('b', 3 )
insert into mans values ('b', 4 )
insert into mans values ('b', 5 )

insert into mans values ('c', 1 )
insert into mans values ('c', 2 )
insert into mans values ('c', 3 )
insert into mans values ('c', 4 )
insert into mans values ('c', 5 )
insert into mans values ('c', 6 )
insert into mans values ('c', 7 )
insert into mans values ('c', 8 )
go
create table objects (obj char( 1 ), Rights int)
insert into objects values ('x', 3 )
insert into objects values ('x', 4 )
insert into objects values ('x', 5 )
insert into objects values ('x', 6 )

insert into objects values ('y', 1 )
insert into objects values ('y', 2 )
insert into objects values ('y', 8 )

go
 --Преобразование таблиц
 
select man, sum(power( 2 ,Rights- 1 )) as Rb into mb from mans
group by man

select obj as obj, sum(power( 2 ,Rights- 1 )) as Rb into ob from objects
group by obj

 --Выборка
 
select *,mb.rb | ob.rb from mb,ob 
where (mb.rb | ob.rb)= mb.rb


go
drop table ob
go
drop table mb
go
drop table mans
go
drop table objects
go

...
Рейтинг: 0 / 0
Помогите сформировать запрос
    #32059461
Фотография MarchCat
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Полностью согласен с Garyaй и Котом2!
Надуманная структура!
В идеале tabUsers, TabObjects, TabRights. Все стройно и гладко, а главное для всех понятно. Не мудрено что при недостатке условий даже Кот2 запутался.

PS Все гениальное просто.

ЗЫ Нашли среднего программиста (G)
...
Рейтинг: 0 / 0
Помогите сформировать запрос
    #32059914
Фотография Cat2
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ну вот, Garya все расставил по полочкам. Я в эту проблему не вникал.

Кто-то из великих авиоконструкторов, кажется Туполев, говорил: "Некрасивая машина не может летать".
Я со своей стороны добавлю: "Некрасивая база не будет работать".

Который раз убеждаюсь, что всякие хитрозадые запросы нужны в неверно спроектированных базах.
...
Рейтинг: 0 / 0
Помогите сформировать запрос
    #32059920
Фотография Cat2
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Или это MarchCat во всем разобрался? По пятницам у меня всякие view бывают.
...
Рейтинг: 0 / 0
20 сообщений из 20, страница 1 из 1
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Помогите сформировать запрос
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]