Безопасность на уровне строк не работает должным образом
У меня есть требование ограничить доступ к строкам, принадлежащим RegionID
1. Не знаете, как создать предикатную функцию для удовлетворения этого условия в предикатной функции? Я даже пробовал жестко кодировать 0 & 1 в качестве операторов возврата, но он все равно возвращает все, без какой-либо фильтрации.
Что я могу делать не так?
Тот, что ниже, даже не скомпилируется. Я пробовал оператор Case, он компилируется, но возвращает все без фильтрации.
CREATE FUNCTION RLS.fn_RegionLimit(@RegionID int)
RETURNS table
with schemabinding
AS
IF @RegionID=1
RETURN 1
ELSE
RETURN 2
create security policy rls.PatientsSecurityPolicy
ADD Filter PREDICATE RLS.fn_RegionLimit(RegionID) on dbo.TestOrder
WITH (STATE=ON)
Select * from dbo.TestOrder
1 ответ
Это только для определенных пользователей? Вы не хотите применять его только к определенным пользователям или ролям? Это звучит немного опасно.
Следует иметь в виду, что функция безопасности является табличной функцией, поэтому вы должны кодировать ее таким образом. Здесь есть еще несколько примеров.
Я разработал пример, основанный на этой функции безопасности:
CREATE FUNCTION dbo.fn_securitypredicate( @regionId INT )
RETURNS TABLE
WITH SCHEMABINDING
AS
RETURN
SELECT 1 AS fn_securitypredicate_result
WHERE @regionId = 1
OR IS_SRVROLEMEMBER( N'sysadmin' ) = 1;
GO
Это накладывает ограничение на ВСЕХ, кроме системных администраторов, которых я добавил как условие безопасности. Я выложил полный сценарий как суть, которую вы можете посмотреть здесь.