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 查詢的結果中返回此行進行評估。