powered by simpleCommunicator - 2.0.41     © 2025 Programmizd 02
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Разграничение доступа на уровне записей
11 сообщений из 11, страница 1 из 1
Разграничение доступа на уровне записей
    #40130439
JDV
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Добрый час! Подскажите как реализовать для разных пользователей доступ только к их к записям в одной таблице?
...
Рейтинг: 0 / 0
Разграничение доступа на уровне записей
    #40130440
invm
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
...
Рейтинг: 0 / 0
Разграничение доступа на уровне записей
    #40130444
JDV
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
invm, Благодарю!
...
Рейтинг: 0 / 0
Разграничение доступа на уровне записей
    #40130491
uaggster
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
На самом деле, если редакция сервера не позволяет, или лень разбираться с безопасностью на уровне строк - можно проще, и более кондовым способом.
Нужно создать View, в котором фильтровать записи, в зависимости от пользователя, соответственно встроив логику security function в запрос, лежащий в основе View.
Ну и, соответственно, закрыв везде доступ для пользователей к таблицам, и открыв - к вьюхам.

Кстати, у такого подхода есть несколько значительных преимуществ перед вариантом с row level security.
1. Производительность.
Когда вы определяете security function для какой-то таблицы она всегда применяется через nested loop к каждой строке таблицы. И если этих строк МНОГО - это влетит вам в копеечку с т.з. производительности.
Если вы определили security function с использованием каких-либо пользовательских таблиц (например - списка принадлежности пользователя к филиалу) - нужно позаботиться, чтобы эта вспомогательная таблица была правильно проиндексирована, а запрос, лежащий в основе security function - был очень, очень, очень оптимизированным.
Имейте также ввиду, что вы, скорее всего, лишитесь возможности использовать подсказки уровня запроса, типа option (hash join), поэтому ваш прикладной код может внезапно сломаться, если вы навесите секьюрность потом, на работающий код.
2. Отсутствие возможности "запретить" row level security для каких-то отдельных запросов, и оставить включенной для всех остальных.
Вам также придется не забыть прописать в security function явным образом возможность для суперпользователей просматривать всё содержимое.

Короче говоря, row level security - хороша всем, если вы навешиваете ее на небольшую табличку, максимум в пару десятков миллионов записей, ваша security function представляет из себя скалярное выражение, и вам никогда не потребуется прочитывать всю таблицу из под ограниченного пользователя. Ну и программисты у вас не криворукие рукожопы.

Я, например, вынужден был отказаться, и вернуться в вьюхам.
...
Рейтинг: 0 / 0
Разграничение доступа на уровне записей
    #40130498
Ролг Хупин
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
JDV
invm, Благодарю!


Это поспешно , вы просто не знаете еще своего счастья
...
Рейтинг: 0 / 0
Разграничение доступа на уровне записей
    #40130518
JDV
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ролг Хупин, а как лучше?)
...
Рейтинг: 0 / 0
Разграничение доступа на уровне записей
    #40130519
JDV
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
uaggster, а покажите пример кода именно фильтрации?
...
Рейтинг: 0 / 0
Разграничение доступа на уровне записей
    #40130527
Ролг Хупин
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
JDV
Ролг Хупин, а как лучше?)


Задачу обдумайте хорошо и почитайте то, чо написал uaggster. Производительность и пр.
...
Рейтинг: 0 / 0
Разграничение доступа на уровне записей
    #40130529
JDV
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ролг Хупин, я понял .... уже изучаю ...
...
Рейтинг: 0 / 0
Разграничение доступа на уровне записей
    #40130530
JDV
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
...
Рейтинг: 0 / 0
Разграничение доступа на уровне записей
    #40133028
JDV
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
JDV, Добрый час А подскажите как для это функции сделать два набора сотрудников с разными таками же уровнями но чтоб они видели друг друга не зависимо ... к примеру 2 отдела ?


Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
-- Create filter title function
CREATE FUNCTION RLSFilterDemo.fn_getTitle(@title AS varchar(20))  
    RETURNS TABLE  
WITH SCHEMABINDING  
AS  
RETURN
    SELECT 1 AS result   
    WHERE USER_NAME() IN (
    SELECT A.title 
    FROM dbo.tb_Test_ViewPermission AS A
        INNER JOIN  dbo.tb_Test_ViewPermission AS B
        ON a.level_no <= B.level_no
    WHERE B.title = @title)



Небольшое объяснение реализации кода: используйте level_no для управления уровнем доступа пользователя к данным, чем меньше значение level_no, тем выше уровень и тем выше полномочия. А именно: level_no равен 0 (соответствует пользователю CEO), вы можете просматривать level_no как 0 (соответствует самому генеральному директору), 1 (соответствует пользователю Manger) и 2 (соответствует обычному пользователю Employee); level_no равно 1 для просмотра данных о себе и сотруднике; и level_no Для 2 можно просматривать только свои собственные строки данных. Когда мы обнаруживаем, что запрошенный пользователь соответствует соответствующему заголовку, мы думаем, что этот пользователь имеет соответствующие разрешения, то есть функция возвращает значение 1, в противном случае мы думаем, что нет разрешения на доступ к соответствующей строке.
...
Рейтинг: 0 / 0
11 сообщений из 11, страница 1 из 1
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Разграничение доступа на уровне записей
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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