Dmitro
Дата: 07.10.2003 19:36:32
Подскажите, пожалуйста.
Каким образом можно реализовать права пользователя для отдельной записи таблицы на Insert, Delete, Update, Edit данных
Dimitri KOH
Дата: 07.10.2003 19:49:48
Prisoedinyayusj k voprosu.
ustasw
Дата: 07.10.2003 21:09:00
Может быть нужно ввести в таблицу дополнительное поле - "Роль". В это поле записывать имя роли которая реализует различные уровни доступа. А в триггерах на Insert, Delete, Update сверяться соответствует ли запись в поле "Роль" соответствуещей роли.
Denis A.
Дата: 07.10.2003 21:44:48
update и edit это одно и то же =)
создавать группы пользователей в БД, включить в них каких надо пользователей, а в триггерах проверять функцией is_member на принадлежность текущего юзера группе:
if is_member('GENERAL_DIRECTOR')=1 begin --запретить генеральному директору удалять
rollback transaction
raiserror('ути пути, а нильзя', 16,1)
end |
|
Гость2
Дата: 08.10.2003 10:23:05
Используйте таблицы собственные с ACL, устанавливающие соответствия ID ресурса, ID пользователя или роли и ID типа прав доступа
Dmitro
Дата: 08.10.2003 15:31:59
Дело в том, что нужно например для какой-то из записей таблици установить разным пользователям разные прова доступа....
Создатель записи имеет полные права.....и назначает уровни доступа для других груп и отдельных пользователей......
Latuk
Дата: 08.10.2003 19:00:03
Я сделал таблицу ID <=> ID Пользователя&Права
Сделал функцию возвращающую права по ID строки PL_Prava_F
Сделал вьюху селективную относительно пользователя
ALTER VIEW dbo.PL_Edit_v
WITH VIEW_METADATA --обязательно указать чтоб можно было редактировать без Select на таблицу
AS
SELECT dbo.PL_Plateg.*
FROM dbo.PL_Plateg
WHERE (dbo.PL_Prava_F(ID) =2) --2 имеет право редактировать
--Если нет прав пользователь не увидит строку даже через QA
сделал процедуру возвращающую редактируемый или не редактируемый набор (чтоб в принципе не могли если не положено)
ALTER PROCEDURE dbo.PL_Vvod_p
(
@CurDoc int
)
AS
SET NOCOUNT ON
DECLARE @Prava tinyint
SET @Prava =dbo.PL_Edit_F(@CurDoc)
IF @Prava =0 Return -- Не имеет прав на просмотр
IF @Prava=2-Имеет право редактировать
SELECT dbo.PL_Edit_v.*
FROM dbo.PL_Edit_v
WHERE (ID = @CurDoc)
ELSE --Просто смотрит
SELECT dbo.PL_Plateg_v.*
FROM dbo.PL_Plateg_v
WHERE (ID = @CurDoc)
PS Логику прав в функции + процедуре можеш навертеть какую хочеш.
Чтоб не мучится с распределением прав
организована иерархия(дерево) где права родительского узла распространяются на подчиненные.
Таким образом достигается контроль за видимостью и редактируемостью
строк таблицы относительно пользователя(группы пользователей)
Правда приходится отказатся от прямого редактировани таблицы
(по умолчанию ADO клиент вычисляет обновляемую таблицу и редактирует ее напрямую)
что немного медленнее
Таким образом у меня организован доступ менеджеров к справочнику клиентов.
Менеджер может смотреть и редактировать своих клиентов.
Начальник подразделения может смотреть всех клиентов своего подразделения.
Разводящий может смотреть и редактировать несколько подразделений.
и т.д.