Безопасность на уровне строк + оператор Switch - PullRequest
0 голосов
/ 02 мая 2018

У меня есть большая таблица с большим количеством данных, которым требуется защита RLS.

RLS основан на другой таблице (логины пользователей с номером профиля).

Я должен сделать другую логику фильтрации в зависимости от номера профиля ...

Скажем, если userProfile равен 1, он может видеть все данные. Если в профиле пользователя 2, он может видеть только данные, основанные на colA, если он 3, то colB должны быть проверены.

Пример:

Profile | login               Data | colA |  colB
   2    |  toto               data | toto |  tutu
   3    |  tutu               data | tata |  tutu

Я пытался создать оператор Switch на основе profileType, но он не работает. И я не знаю, сможем ли мы вернуть фильтр в коммутаторе.

Моя попытка:

CREATE FUNCTION [dbo].[fn_rls_users](@username AS VARCHAR(50))
RETURNS TABLE 
with schemabinding
AS 
RETURN (
    SELECT Department,ProfileType, 
        CASE 
           WHEN ProfileType = 1 THEN 
           RETURN (
              SELECT 1 AS [fn_rls_users] 
              FROM BIG_TABLE
           )
           WHEN ProfileType = 2 THEN 
           RETURN (
              SELECT 1 AS [fn_rls_users] 
              FROM BIG_TABLE
              WHERE Department = Department
           )
           ELSE (
              SELECT 0 AS [fn_rls_users] 
              FROM BIG_TABLE
           )
        END
    FROM dbo.UserProfiles WHERE UserLogin = @username
)

GO

Любая помощь приветствуется

1 Ответ

0 голосов
/ 02 мая 2018
DECLARE @ProfileType date = (SELECT ProfileType FROM dbo.UserProfiles WHERE UserLogin = @username)

if @ProfileType = 1
select isnull(Data, 'NaN') from BIG_TABLE

else if @ProfileType = 2
select isnull(Data, 'NaN') from BIG_TABLE where colA = @username

else
select isnull(Data, 'NaN') from BIG_TABLE where colB = @username

End

Или, если вам нравится str exec

DECLARE @ProfileType date = (SELECT ProfileType FROM dbo.UserProfiles WHERE UserLogin = @username)

declare @str_sql varchar(1000)

set @str_sql = 'select isnull(Data, "NaN") from BIG_TABLE'

if @ProfileType = 2
set @str_sql += ' where colA = ' + @username

else if @ProfileType = 3
set @str_sql += ' where colB = ' + @username
exec(@str_sql)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...