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