我正在尝试使用以下函数在表上实现 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] = System_USER
AND e.TableName = @TableName
AND e.isAuthorized = 1
);
但是我希望当用户是管理员用户时完全跳过内部联接。为此,我在
isAdmin
表中存在 UserAccess
列。
内连接仅适用于对数据表具有只读访问权限的人类用户
UserAccess
任何建议,当用户是
UserAccess
表中的管理员用户时,如何跳过 INNER JOIN。
您可以将连接更改为
EXISTS
或 IN
,然后将其与 OR
组合到您的 IsAdmin
列上。
CREATE OR ALTER FUNCTION rls.fn_Data_Predicate (
@DataProviderID INT,
@TableName sysname
)
RETURNS TABLE
WITH SCHEMABINDING
AS RETURN
(
SELECT 1 AS Result
FROM stg.UserAccess e
WHERE e.[User Email] = System_USER
AND e.TableName = @TableName
AND e.isAuthorized = 1
AND (
e.IsAdmin = 1
OR e.DataProviderId IN (
SELECT d.DataProviderID
FROM fin.RLS_Data d
WHERE d.DataProviderID = @DataProviderID
)
)
);