0

我有一张大表,里面有很多数据,需要一些 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但它不起作用的语句。而且我不知道我们是否可以在 switch 中返回过滤。

我的尝试:

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

任何帮助表示赞赏

4

1 回答 1

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)
于 2018-05-02T08:43:27.543 回答