我有一张包含大量数据的大表,需要有一些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
任何帮助表示赞赏
答案 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)