带条件的 SQL Server 行级安全性

问题描述 投票:0回答:0

我正在尝试使用以下函数在表上实现 RLS。我还有另一个表

UserAccess
来控制谁可以访问数据表 (
RLS_Data
)。以下功能完美运行。

CREATE FUNCTION rls.fn_Data_Predicate
         (@DataProviderID AS INT, @TableName sysname)
RETURNS TABLE
WITH SCHEMABINDING
AS
RETURN
(
    SELECT 1 as Result
    FROM [fin].[RLS_Data] d
    INNER JOIN [stg].[UserAccess] e ON e.DataProviderId = d.DataProviderID
    WHERE d.DataProviderID = @DataProviderID
        AND e.[User Email] = CURRENT_USER
        AND e.TableName = @TableName 
        AND e.isAuthorized = 1
);

当用户将

isAdmin
设置为 True 时,我希望 JOIN 忽略任何其他列的匹配。仅当用户
isAdmin
False 时,才会发生其他列匹配。

我尝试以下

SELECT 1 as Result
FROM [fin].[RLS_Data] d
INNER JOIN [stg].[UserAccess] e ON e.DataProviderId = d.DataProviderID
WHERE e.[User Email] = CURRENT_USER 
    AND ( e.isAdmin = 1 
        OR (d.DataProviderID = @DataProviderID
            AND e.TableName = @TableName  
            AND e.isAuthorized = 1
            )
        )

如果用户由于

isAdmin
INNER JOIN [stg].[UserAccess] e ON e.DataProviderId = d.DataProviderID

设置为 true,这仍然不会返回所有数据

IsAdmin
的人可以看到 RLS_Data 中的所有行,无论提供者列如何。

还有更好的方法吗?

sql sql-server predicate row-level-security
© www.soinside.com 2019 - 2024. All rights reserved.