Как применить политику безопасности к таблице, информация о которой зависит от внутренней таблицы объединения?

#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. Не могли бы вы добавить некоторые дополнительные детали, чтобы помочь прояснить ваше решение для будущих читателей с аналогичной проблемой?