Несколько предикатов безопасности (FILTER | BLOCK) на одной таблице

Я реализую безопасность RBAC-RLS в моей базе данных, и у меня есть вопрос. Вот сценарий:

У меня есть функция, которая имеет один входной параметр @PermissionId который проверяет, имеет ли зарегистрированный пользователь эту привилегию. Каждая роль в базе данных связана с несколькими разрешениями, и каждый пользователь может иметь несколько ролей.

Допустим, у меня есть таблица Products и я хочу, чтобы только пользователи, имеющие разрешение ReadProducts могли просматривать содержимое таблицы.

 CREATE SECURITY POLICY ReadProducts ADD FILTER PREDICATE HasPermission('ReadProducts') ON Products 

И это нормально, но теперь у меня также есть Permission SystemAdministrator и он также должен иметь разрешения на просмотр содержимого таблицы Products .

Если я добавлю другую политику

 CREATE SECURITY POLICY ReadProducts ADD FILTER PREDICATE HasPermission('SystemAdministrator') ON Products 

Будет ли это работать так, как предполагается, или будет конфликт между двумя политиками?

Или в другой ситуации, что, если я добавлю еще один предикат фильтра в первую политику. Так что это будет похоже:

 CREATE SECURITY POLICY ReadProducts ADD FILTER PREDICATE HasPermission('ReadProducts') ON Products ADD FILTER PREDICATE HasPermission('SystemAdmin') ON Products 

Это будет хорошо? Я имею в виду, если у меня, как у пользователя, есть одна из этих двух привилегий, я смогу увидеть содержимое таблицы Products ?

Я понял. Итак, вот оно:

Вы не можете иметь 2 политики безопасности в одной таблице базы данных, это не позволит вам создать вторую. – Вы получите сообщение об ошибке.

Кроме того, у вас не может быть двух предикатов FILTER в одной таблице в той же политике безопасности. – Вы получите сообщение об ошибке

Решение. Создайте политику безопасности для каждой таблицы в базе данных с 1 фильтром и 3-4 предикатами блока следующим образом:

 CREATE SECURITY POLICY [Log] ADD FILTER PREDICATE [dbo].[HasSecurityPermission]('ReadLog') ON [dbo].[table], ADD BLOCK PREDICATE [dbo].[HasSecurityPermission]('AddLog') ON [dbo].[table] AFTER INSERT, ADD BLOCK PREDICATE [dbo].[HasSecurityPermission]('EditLog') ON [dbo].[table] BEFORE UPDATE, ADD BLOCK PREDICATE [dbo].[HasSecurityPermission]('RemoveLog') ON [dbo].[table] BEFORE DELETE 

Таким образом, вам нужно 4 Разрешения для каждой таблицы базы данных, и в конце вы создаете столько ролей, сколько они являются типами пользователей (общедоступным пользователем, демо, системным администратором, суперпользователем …) и свяжите их с разрешениями, которые вы хотите, чтобы они имели.

Это оно!

  • Перенесите таблицу MSSQL в метод OLTP в памяти без столбца временной метки
  • порядковый номер с некоторыми условиями
  • Как обрезать строку из пространства
  • SQL 2016, Недопустимое имя объекта 'STRING_SPLIT'
  • Как прочитать свойство с длинным значением из строки JSON?
  • Опускать дубликаты только в последовательном порядке
  • «Sqlservr.exe перестала работать» ошибка продолжает отображаться
  • DENSE_RANK () без дублирования
  • Альтернатива оператора «LIKE» в изначально скомпилированных хранимых процедурах
  • Как выбрать следующую строку, чтобы она вернула 3? SELECT '1 + 2'
  • SQL Sever 2016 Alter Table Valued Function - Alter Политика безопасности
  • Interesting Posts

    MSSQL – Как установить значение по умолчанию в BULK INSERT?

    Совокупные данные из нескольких строк в одну строку

    SQL: вычисление максимальной даты для нескольких таблиц

    SQL Вставка нескольких строк с использованием хранимой процедуры и параметра xml?

    Тесты и пакеты SSIS на разных решениях

    Файл журнала для базы данных заполнен

    Значит ли размер данных, хранящихся в записи, влияет на производительность кластерного индекса?

    SQL Left Join с возвратом нулевого результата 0

    Как я могу использовать стержень?

    Вызов сборки .Net из отчета служб Reporting Services SQL Server 2005?

    Записи процесса SqlDatasource перед отображением

    Аллокация распределения для определения места хранения

    Когда вы используете табличную функцию?

    Выбор общего количества дочерних записей в их соответствующих родительских записях

    SQL-головоломка очень близка к решению, но не может получить parentid

    Давайте будем гением компьютера.