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 查询的结果中返回此行进行评估。