行级安全性+ Switch语句

时间:2018-05-02 08:14:20

标签: sql sql-server-2016 row-level-security

我有一张包含大量数据的大表,需要有一些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 :(得分:0)

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)