使用 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 | 更新}}
| {在{更新|之前] 刪除}}]