RLS 过滤谓词

使用 Sql Server 2016+和 Azure Sql 数据库,你可以使用某个谓词自动过滤 select 语句中返回的行。此功能称为行级安全性

首先,你需要一个表值函数,其中包含一些谓词,该谓词描述了允许用户从某个表中读取数据的条件:

DROP FUNCTION IF EXISTS dbo.pUserCanAccessCompany
GO
CREATE FUNCTION

dbo.pUserCanAccessCompany(@CompanyID int)

    RETURNS TABLE
    WITH SCHEMABINDING
AS RETURN (
    SELECT 1 as canAccess WHERE 

    CAST(SESSION_CONTEXT(N'CompanyID') as int) = @CompanyID

)

在此示例中,谓词表示只有具有 SESSION_CONTEXT 值且匹配输入参数的用户才能访问公司。你可以设置任何其他条件,例如检查当前用户的数据库角色或 database_id 等。

上面的大部分代码都是你要复制粘贴的模板。这里唯一会改变的是 WHERE 子句中谓词和条件的名称和参数。现在,你创建将在某些表上应用此谓词的安全策略。

现在,你可以创建将谓词应用于某个表的安全策略:

CREATE SECURITY POLICY dbo.CompanyAccessPolicy
    ADD FILTER PREDICATE dbo.pUserCanAccessCompany(CompanyID) ON dbo.Company
    WITH (State=ON)

此安全策略将谓词分配给公司表。每当有人尝试从 Company 表读取数据时,安全策略将在每行上应用谓词,将 CompanyID 列作为谓词的参数传递,并且谓词将在 SELECT 查询的结果中返回此行进行评估。