У меня есть таблица, структурированная так (упрощенно)
Name, EMail, LastLoggedInAt
У меня есть пользователь в SQL Server (RemoteUser), который должен видеть только данные (с помощью запроса выбора), где поле LastLoggdInAt не является нулевым.
Похоже, я могу это сделать? Является ли это возможным?
Ответы:
Модель безопасности SQL Server позволяет предоставлять доступ к представлению без предоставления доступа к базовым таблицам.
Поскольку пример кода является отличным способом показать концепцию, рассмотрим следующее с
LoginDetails
таблицей и соответствующим представлением:Мы создадим имя входа и пользователя, затем назначим этому пользователю права на выбор строк в представлении, не имея никаких прав на просмотр самой таблицы.
Теперь мы вставим две тестовые строки:
Это проверяет модель безопасности. Первый
SELECT
оператор выполняется успешно, поскольку он выбирается из представления, тогда как второйSELECT
оператор не выполняется, поскольку пользователь не имеет прямого доступа к таблице.Обратите внимание, что результаты из представления исключают строку, в которой находится
LastLoggedInAt
значениеNULL
, как требуется в вашем вопросе.Второе
SELECT
утверждение для базовой таблицы возвращает ошибку:Очистка:
С другой стороны, если у вас SQL Server 2016 или новее, вы можете использовать предикат уровня безопасности строки, чтобы некоторые пользователи не могли видеть строки со
LastLoggedInAt
значением NULL .Сначала мы создаем таблицу, логин, пользователя для этого логина и предоставляем доступ к таблице:
Далее мы вставляем пару строк образца. Одна строка с нулевым значением
LastLoggedInAt
, а другая с ненулевым значением для этого столбца.Здесь мы создаем привязанную к схеме таблицы-значной-функцию , которая возвращает строку с 0 или 1 в зависимости от значения из
@LastLoggedInAt
и@username
переменных, которые передаются в функцию. Эта функция будет использоваться фильтром-предикатом для удаления строк, которые мы хотим скрыть от определенных пользователей.Это фильтр безопасности, который удаляет строки из
SELECT
операторов, запущенных дляdbo.LoginDetails
таблицы:Фильтр выше использует
dbo.fn_LoginDetailsRemoteUserPredicate
функцию, передавая имя текущего пользователя, а также значения из каждой строки дляLastLoggedInAt
столбцаdbo.LoginDetails
таблицы.Если мы запросим таблицу как обычный пользователь:
мы видим все строки:
Тем не менее, если мы будем тестировать как
RemoteUser
:мы видим только «правильные» строки:
И мы убираем
Имейте в виду, что привязка схемы к таблице таким способом делает невозможным изменение определения таблицы без предварительного удаления предиката фильтра и
dbo.fn_LoginDetailsRemoteUserPredicate
функции.источник
LastLoggedInAt
столбца.