SQL Server 行级安全性(有异常)

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

我正在尝试使用以下函数在表上实现 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。

sql-server security permissions predicate row-level-security
1个回答
0
投票

您可以将连接更改为

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
          )
      )
);
© www.soinside.com 2019 - 2024. All rights reserved.