サーチ…


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問合せの結果でこの行が戻されると評価します。

RLSセキュリティポリシーの変更

セキュリティポリシーは、一緒に管理できるテーブルに関連付けられた述語のグループです。述部を追加または削除したり、ポリシー全体をオン/オフにすることができます。

既存のセキュリティポリシーのテーブルに述語を追加できます。

ALTER SECURITY POLICY dbo.CompanyAccessPolicy
    ADD FILTER PREDICATE dbo.pUserCanAccessCompany(CompanyID) ON dbo.Company

セキュリティポリシーからいくつかの述部を削除できます。

ALTER SECURITY POLICY dbo.CompanyAccessPolicy
    DROP FILTER PREDICATE ON dbo.Company

セキュリティポリシーを無効にすることができます

ALTER SECURITY POLICY dbo.CompanyAccessPolicy WITH ( STATE = OFF );  

無効にされたセキュリティポリシーを有効にすることができます。

ALTER SECURITY POLICY dbo.CompanyAccessPolicy WITH ( STATE = ON );  

RLSブロック述語を使用した更新の防止

行レベルのセキュリティでは、表の行を更新できるユーザーを制御する述部を定義できます。最初に、アクセス・ポリシーを制御する述語を表すいくつかの表/表関数を定義する必要があります。

CREATE FUNCTION

dbo.pUserCanAccessProduct(@ CompanyID int)

RETURNS TABLE
WITH SCHEMABINDING

AS RETURN(1をcanAccessとしてSELECTを選択します。

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)をオンにするdbo.ProductをONにする

ブロック述部定義の後に追加できるオプションは次のとおりです。

[{AFTER {INSERT |更新}}
| {BEFORE {UPDATE | DELETE}}]



Modified text is an extract of the original Stack Overflow Documentation
ライセンスを受けた CC BY-SA 3.0
所属していない Stack Overflow