Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Базы";
Текущий архив: 2003.10.16;
Скачать: [xml.tar.bz2];

Вниз

Разделение прав на строки таблицы   Найти похожие ветки 

 
AndrewK   (2003-09-24 13:00) [0]

Доброго времени суток, господа!

Есть такой вопрос:

Существует таблица, к примеру список личных дел. Одна строка - одно личное дело. Имеется задача сделать программу, которая бы хранила эти личные дела. С этим все в порядке. Следующее требование, чтобы доступ к каждой карточке различался для пользователей. Например карточку №1 пользователь 1 может только читать, а пользователь 2 может читать и исправлять.

Пробую решить так: Создал табличку где перечисляются номера карточек, номера пользователей и их уровни доступа к карточкам.

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

Наконец вопрос:

Есть выборка полученныя запросом

select
ID,
Name,
LastName
from
Cards
where
City = "Москва"
order by
Name


Есть список карт, которые доступны пользователю на просмотр
(1,2,3,4)

Как сделать так, чтобы на сервере получив выборку по указанному запросу перед тем как передать результат клиенту провелась фильтрация вида ID in (1,2,3,4)

Встраивать конструкцию ... where ID in (1,2,3,4) ... в пользовательский запрос нежелательно.

В работе использую MS SQL 2000

Заранее благодарен.


 
Alex_Raider   (2003-09-24 13:06) [1]

А!

Вот интег`есненький вопг`осец... (Тут, вероятно, Zacho тоже бы засуетился и оживился).

Вероятно, нужно создать VIEW? Как ты думаешь?
Неплохо бы иметь табличку USERS, и в VIEW
джойниться с ее записями по условию USER.
Мы даже одно время имели с Zacho под Interbase имена юзеров в виде int-числа и cast`или текущего юзера к int`у, но было неудобно работать с SYSDBA... (впрочем, это решаемо все)).


 
Sandman25   (2003-09-24 13:07) [2]

(1,2,3,4) получается как результат какого-то запроса?
Тогда нужно написать
... and id in (этот самый запрос)


 
Владислав   (2003-09-24 13:19) [3]

> AndrewK © (24.09.03 13:00)

Добавь в таблицу поле с именем пользователя, который имеет право просматривать эту запись.
Сделай хранимку, в которой определяй имя пользователя, запустившего ее. Это тебе условие выборки (и вычисляться оно будет самостоятельно).
Дай права для пользователей на эту хранимку. Забери права на таблицу.


 
AndrewK   (2003-09-24 13:25) [4]

>Sandman25: я не могу встраивать конструкцию ... and id in (этот самый запрос) в запрос, так как не знаю заранее структуры пользовательского запроса.

>Alex_Raider: можно попробовать с видами. Но для товарища, который потом будет настраивать представления, должна быть прозрачна система разделения прав. Проще говоря он вообще не должен на нее как-либо влиять. Только через штатные средства программы для обеспечения доступа к карточкам.


 
AndrewK   (2003-09-24 13:35) [5]

>Владислав: к карточке право на просмотр может иметь несколько пользователей, поэтому поле с пользователем вводить нельзя. Да и опять же эти пользовательские запросы, структуру которых я не знаю.

Может быть можно составить вид или еще чего-нить, который на запрос select * from (Что-то) выдавал только те строки, которые, которые доступны пользователю, который вызвал этот запрос.


 
Alex_Raider   (2003-09-24 13:37) [6]

Да, придется писать свой менеджер прав,
как это делал ZACHO.

---------
ЗАЧАН, вылазь в аську!
:-)


 
Владислав   (2003-09-24 13:42) [7]

Чудес не бывает.

> AndrewK © (24.09.03 13:35) [5]

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

Дополнительная таблица со списками пользователей. Связь многие к одному.
Пользователи будут делать выборку из хранимки.

> Alex_Raider © (24.09.03 13:37) [6]

"Да, придется писать свой менеджер прав,"

Да. Придется.


 
paul_k   (2003-09-24 13:47) [8]

В таблицу кладеш в одно поле (nums) список номеров через запятую "1,2,4" а в поле User - логин
в процедуре пишеш
declare @st varchar(255)
set @st = (select nums from table where login = suser_sname()
exec ("select что тебе надо
where id in ("+ @st+")")
Можно хранить еще и имя таблицы и проверять и его....


 
Владислав   (2003-09-24 13:52) [9]

> paul_k © (24.09.03 13:47) [8]

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


 
paul_k   (2003-09-24 13:55) [10]


> Владислав ©

Много.. но это "следующий вопрос"...
естественно тогда делить карточки на типы, или группы прописывать идентификаторы групп. тоже самое с пользователямии. Но это уже и есть менеджер прав.


 
MOA   (2003-09-24 14:02) [11]

Вам помогут системные ф-ции
USER_NAME()
USER
USER_ID()
посмотрите похожие по ссылкам в BOL. А лучше давать права ролям. См. IS_MEMBER, IS_SRVROLEMEMBER, sp_helprolemember и прочее. Делаем дополнительную таблицу с ИД записи Вашей, ролью, и правами роли. Затем пишем VIEW или функцию. Закрываем всем доступ к целевой таблице и таблице прав, даём права на VIEW или функцию. Придётся ещё, фидимо, писать процедуры на запись-модификацию-удаление из целевой таблицы.
Удачи!


 
AndrewK   (2003-09-24 16:17) [12]

А вообще есть какие-нибудь методы фильтрации на сервере готового набора по условию перед тем как передать набор клиенту?


 
slgeo   (2003-09-24 17:19) [13]

не знаю как в MSSQL, но в Oracle прокатывает вот такая конструкция:
select *
from (seleсt ... фильтруемый набор)
where <твои условия>


 
ЮЮ   (2003-09-25 03:07) [14]

Если MS SQL 2000, то в нем есть UDF(функции), возвращающие НД, который можно использовать в звпросе, т.е.
where ID in dbo.SomeFunction

Остается написать ряд функций, возвращающих нужные набор строк и использовать их во View, одном для таблицы, но возвращающем разные наборы записей для разных пользователей (ролей)


 
AndrewK   (2003-09-25 10:55) [15]

Спасибо всем.
Сделал так:
1) создал функцию CardList(), которая возвращает все записи из таблицы карточек, у которых ID разрешены для просмотра текущему пользователю.
2) закрыл доступ на чтение таблицы карточек
3) в запросах, которые возвращают результирующие наборы для доступа осталась доступна только функция CardList().

Получилось так.

select
ID,
Name,
LastName
from
CardList()
where
City = "Москва"
order by
Name


Пользователь делает простой запрос как бы на всех данных, а получает только те, которые ему разрешены.

Еще раз всем спасибо.

С уважением, AndrewK



Страницы: 1 вся ветка

Форум: "Базы";
Текущий архив: 2003.10.16;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.49 MB
Время: 0.011 c
14-51406
HolACost!
2003-09-26 17:28
2003.10.16
Не в тему, но как в gdb посмотреть стек вызова


14-51511
Zevsus
2003-09-24 13:37
2003.10.16
быстро сменить рабочую группу и ip адрес


1-51205
User_OKA
2003-10-07 10:15
2003.10.16
IntToHex


1-51212
Shoorik
2003-10-04 11:28
2003.10.16
О месте Delphi, среди систем разработки приложений.


1-51311
sash2
2003-10-06 09:08
2003.10.16
Как автоматически запустить процесс?





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский