#sql #sql-server
Вопрос:
Я хочу внедрить безопасность на уровне строк в свою базу данных. В моей базе данных есть 2 таблицы. Первая таблица состоит из столбца идентификатора,имени и статуса. Столбец состояния используется для определения уровня записи. Вторая таблица состоит из столбца заработной платы,времени и идентификатора пользователя.
Таблица Пользователей
ID | Имя | Статус |
---|---|---|
10 | Джеймс | не vip |
11 | отметка | VIP |
12 | Эдвард | не vip |
Примечание: идентификатор уникален
Таблица Заработной платы
идентификатор пользователя | заработная плата | месяц |
---|---|---|
10 | 100 | янв. |
11 | 500 | янв. |
12 | 250 | янв. |
Обычно, когда я запускаю этот запрос «выберите * из таблицы ставок, где заработная плата > 200», он возвращает записи 11 и 12. Однако я хочу, чтобы зарплата vip-персон не была видна кадровым аналитикам. Для выполнения этой задачи я создам политику безопасности в таблице заработной платы, но в таблице заработной платы у меня нет информации о статусе. У меня есть только пользовательский код. Как я могу преодолеть эту проблему ?
Комментарии:
1. Создайте представление с защитой на уровне строк; это представление объединяет таблицы и отфильтровывает строки в соответствии с вашей логикой. Вам, конечно, потребуется удалить доступ для чтения к базовым таблицам. Новое представление может даже находиться в другой схеме.
Ответ №1:
Я решил эту проблему.Создав представление и применив к нему политику.
Во-первых, я создал представление, которое соединяет таблицу заработной платы с таблицей пользователей, чтобы получить информацию о статусе пользователя.
Во-вторых, я определил функцию
CREATE FUNCTION [dbo].[fn_RowLevelSecurity] (@status varchar(50))
RETURNS TABLE
WITH SCHEMABINDING
AS
RETURN SELECT 1 as fn_SecureData
Where @status = user_name()
И, наконец, я применил политику безопасности, используя функцию для своего представления.
CREATE SECURITY POLICY RowFilter
ADD FILTER PREDICATE dbo.fn_RowLevelSecurity(status)
ON dbo.MyView
WITH (STATE = ON);
Комментарии:
1. Не могли бы вы добавить некоторые дополнительные детали, чтобы помочь прояснить ваше решение для будущих читателей с аналогичной проблемой?