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