Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Помогите сформировать запрос / 20 сообщений из 20, страница 1 из 1
12.10.2002, 17:11:05
    #32057689
alexu
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помогите сформировать запрос
Есть две таблицы:
В первой - люди и права доступа к объектам (у одного человека несколько прав)
Во второй - объекты и права доступа, которые должен иметь человек, чтобы получить доступ к данному объекту.
Надо получить таблицу людей и объектов, к которым они имеют доступ

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

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

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

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

Братство-братсвом, но и самому думать надо.
...
Рейтинг: 0 / 0
12.10.2002, 21:33:37
    #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
12.10.2002, 22:06:08
    #32057712
AVL
AVL
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помогите сформировать запрос
неужели права для man1 перечисляются через запятую? И почему только две таблицы, как я понял здесь их должно быть не меньше четырех. И все равно запрос получиться а-ля Cat2
...
Рейтинг: 0 / 0
12.10.2002, 22:16:48
    #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
12.10.2002, 23:09:08
    #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
12.10.2002, 23:26:36
    #32057717
alexu
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помогите сформировать запрос
Glory? Вот это уже больше похоже на правду! Наверно правильно, проверю - скажу.
Спасибо за пример!
...
Рейтинг: 0 / 0
14.10.2002, 10:26:04
    #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
14.10.2002, 11:01:29
    #32057847
alexu
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помогите сформировать запрос
2 Glory.
Еще раз СПА!

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

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

ИМХО, должно быть не две таблицы, а три. В одной - юзеры, в другой - объекты. В третьей - на пересечении двух первых - (отношение "многие-ко-многим") - права доступа. В такой системе можно будет давать разные права доступа разным юзерам на один объект, и одному юзеру иметь разные права доступа к разным объектам.
...
Рейтинг: 0 / 0
14.10.2002, 20:04:11
    #32058176
alexu
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помогите сформировать запрос
2 Garya.
Согласен система куцая, если ее применять к данной области (юзеры, права, объекты). Но мне нужно было знать как составить такой запрос. Пример чисто теоретический.
...
Рейтинг: 0 / 0
17.10.2002, 20:16:00
    #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
18.10.2002, 07:47:53
    #32059461
MarchCat
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помогите сформировать запрос
Полностью согласен с Garyaй и Котом2!
Надуманная структура!
В идеале tabUsers, TabObjects, TabRights. Все стройно и гладко, а главное для всех понятно. Не мудрено что при недостатке условий даже Кот2 запутался.

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

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

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

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


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