Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > MS SQL Server > Разрешить доступ только к части записей


Автор: Kostt 2.3.2006, 08:13
Здравствуйте!
Существует база, состоящая из таблицы «Пользователи» (Поля: Имя в форме “Domain name\UserName” и Ф.И.О.), таблицы («Проекты») и таблиц данных, «завязанных» на таблицу «Проект» т.е. их записи образуют непересекающиеся множества, по одному на каждый проект. «Пользователи» связаны с «Проектами» таблицей «Доступ»: (ID проекта,
ID пользователя, Уровень доступа( 0 – нет доступа, 1- чтение, 2-чтение и запись)).
Задача – сделать так, чтобы пользователь мог работать только с теми записями, которые принадлежат проектам, для которых у него установлен доступ.
Для чтения решение нашел: можно создать view, в которые выбирать данные по такому принципу:
Код


CREATE VIEW dbo.ProjectsView_R
AS
SELECT *
FROM Проекты
WHERE (ID IN
(SELECT ProjectID FROM Доступ
WHERE UserID IN
(SELECT ID FROM Пользователи
WHERE SysName = CONVERT(nvarchar(100), SYSTEM_USER)) AND Уровень доступа = 2)). 

Функция SYSTEM_USER возвращает имя пользователя сессии в форме DomainName\UserName

Но эти view невозможно использовать для записи в таблицы . Предлагайте свои решения, плиз.


Автор: boevik 2.3.2006, 08:19
Самое простое решение, для просмотра это view.
А для записи в таблице, рациональнее использовать Stored Procedure.

Автор: Kostt 2.3.2006, 09:32
Собственно, написал SP для проверки она действительно позволяет модифицировать таблицу даже если у пользователя нет прав на таблицу. Но ведь эту SP может вызвать кто угодно с любыми параметрами! Получается дыра в защите...
Пытался написать SP для модификации своего VIEW - например добавление - проблема с ID... smile

Автор: boevik 2.3.2006, 10:28
Но ты ведь знаешь кто вызвал процедуру и какие действия он может выполнять.
При этом как ты заметил, у него нет прямого доступа к таблице поэтому нет дырки.

Автор: beroal 2.3.2006, 17:58
Если это MS SQL Server, то твой view должен быть updatable. Т.е. его можно update-ить.

Автор: Vit 2.3.2006, 21:38
Цитата(beroal @ 2.3.2006, 08:58 Найти цитируемый пост)
Если это MS SQL Server, то твой view должен быть updatable. Т.е. его можно update-ить



Не обязательно, View может быть и не редактируемым, например если имеет Union или аггрегативные функции (а иногда и Join), но это обходится при помощи "Instead of" триггеров

Автор: leniviy 5.3.2006, 22:48
по-моему похожая тема уже была http://forum.vingrad.ru/index.php?showtopic=59138&hl=#

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)