Microsoft SQL Server
行レベルのセキュリティ
サーチ…
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}}]