使用 RLS 塊謂詞防止更新

行級安全性使你可以定義一些謂詞,這些謂詞將控制誰可以更新表中的行。首先,你需要定義一些表值函式,該函式表示將控制訪問策略的謂詞。

創造功能

dbo.pUserCanAccessProduct(@CompanyID int)

RETURNS TABLE
WITH SCHEMABINDING

AS RETURN(選擇 1 作為 canAccess WHERE

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

)在此示例中,謂詞表示只有在 SESSION_CONTEXT 中具有匹配輸入引數值的使用者才能訪問該公司。你可以設定任何其他條件,例如檢查當前使用者的資料庫角色或 database_id 等。

上面的大部分程式碼都是你要複製貼上的模板。這裡唯一會改變的是 WHERE 子句中謂詞和條件的名稱和引數。現在,你建立將在某些表上應用此謂詞的安全策略。

現在,如果表中的 CompanyID 列不滿足謂詞,我們可以使用謂詞來建立安全策略,該謂詞將阻止對產品表的更新。

建立安全政策 dbo.ProductAccessPolicy ADD BLOCK PREDICATE dbo.pUserCanAccessProduct(CompanyID)ON dbo.Product

該謂詞將應用於所有操作。如果要在某些操作上應用謂詞,可以編寫如下內容:

建立安全策略 dbo.ProductAccessPolicy ADD BLOCK PREDICATE dbo.pUserCanAccessProduct(CompanyID)ON dbo.Product after INSERT

在塊謂詞定義之後可以新增的可能選項是:

[{AFTER {INSERT | 更新}}
| {在{更新|之前] 刪除}}]