Форум: "Базы";
Текущий архив: 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