CREATE SECURITY POLICY (Transact-SQL)

適用対象: SQL Server 2016 (13.x) 以降のバージョンAzure SQL DatabaseAzure SQL Managed InstanceMicrosoft Fabric の SQL 分析エンドポイントMicrosoft Fabric のウェアハウス

行レベルのセキュリティのセキュリティ ポリシーを作成します。

Transact-SQL 構文表記規則

構文

CREATE SECURITY POLICY [schema_name. ] security_policy_name    
    { ADD [ FILTER | BLOCK ] } PREDICATE tvf_schema_name.security_predicate_function_name   
      ( { column_name | expression } [ , ...n] ) ON table_schema_name. table_name    
      [ <block_dml_operation> ] , [ , ...n] 
    [ WITH ( STATE = { ON | OFF }  [,] [ SCHEMABINDING = { ON | OFF } ] ) ]  
    [ NOT FOR REPLICATION ] 
[;]  
  
<block_dml_operation>  
    [ { AFTER { INSERT | UPDATE } }   
    | { BEFORE { UPDATE | DELETE } } ]  

引数

security_policy_name

セキュリティ ポリシーの名前。 セキュリティ ポリシー名は識別子のルールに準拠し、データベースおよびそのスキーマで一意でなければなりません。

schema_name

セキュリティ ポリシーが属するスキーマの名前。 schema_name はスキーマのバインドのために必要です。

[ FILTER | BLOCK ]

対象のテーブルにバインドされている関数のセキュリティの述語の型。 FILTER 述語は、読み取り操作が可能な行を通知なしにフィルター処理します。 BLOCK 述語は、その述語関数に違反する書き込み操作を明示的に禁止します。

tvf_schema_name.security_predicate_function_name

述語として使用され、ターゲット テーブルに対するクエリで実施されるインライン テーブル値関数。 特定のテーブルの特定の DML 操作に対して定義できるセキュリティ述語の数は 1 つです。 インライン テーブル値関数は、SCHEMABINDING オプションを使用して作成されている必要があります。

{ column_name | expression }

セキュリティ述語関数のパラメーターとして使用される列名または式。 ターゲット テーブルの任意の列を使用できます。 expression には、定数、組み込みのスカラー関数、演算子、およびターゲット テーブルの列のみを含めることができます。 関数の各パラメーターに列名または式を指定する必要があります。

table_schema_name.table_name

セキュリティ述語の適用先となるターゲット テーブル。 セキュリティが無効になっている複数のポリシーでは、特定の DML 操作に対して、1 つのテーブルを対象にできますが、有効にできるのはどの時点でも 1 つだけです。

block_dml_operation

ブロック述語が適用される特定の DML 操作。 AFTER は、DML 操作 (INSERT または UPDATE) が実行された後に、行の値に対して述語が評価されることを指定します。 BEFORE は、DML 操作 (UPDATE または DELETE) が実行される前に、行の値に対して述語が評価されることを指定します。 操作が指定されていない場合、述語は、すべての操作に適用されます。

[ STATE = { ON | OFF } ]

セキュリティ ポリシーによるターゲット テーブルに対するセキュリティ述語の実施を有効または無効にします。 指定しないと、作成されているセキュリティ ポリシーは有効になります。

[ SCHEMABINDING = { ON | OFF } ]

ポリシー内のすべての述語関数を作成する必要があるかどうかを SCHEMABINDING オプションで示します。 既定では、この設定は ON で、SCHEMABINDING を指定してすべての関数を作成する必要があります。

NOT FOR REPLICATION

レプリケーション エージェントがターゲット オブジェクトを変更するときにセキュリティ ポリシーを実行すべきではないことを示します。 詳細については、「同期中にトリガと制約の動作を制御する方法 (レプリケーション Transact-SQL プログラミング)」を参照してください。

[table_schema_name. ] table_name

セキュリティ述語の適用先となるターゲット テーブル。 無効な複数のセキュリティ ポリシーは単一テーブルをターゲットにできますが、有効にできるのはどの時点でも 1 つだけです。

解説

メモリ最適化テーブルで述語関数を使用する場合、SCHEMABINDING を含め、コンパイル ヒント WITH NATIVE_COMPILATION を使用する必要があります。

ブロック述語は、対応する DML 操作を実行した後に評価されます。 そのため、READ UNCOMMITTED のクエリで、後でロールバックされる一時的な値を参照する危険があります。

アクセス許可

スキーマに対する ALTER ANY SECURITY POLICY 権限と ALTER 権限が必要です。

また、追加される各述語に関しては次のアクセス許可も必要になります。

  • 述語として使用している関数に関する SELECT および REFERENCES 権限。

  • ポリシーにバインドしているターゲット テーブルに対する REFERENCES 権限。

  • 引数として使用しているターゲット テーブルのすべての列に対する REFERENCES 権限。

次の例で、これらの CREATE SECURITY POLICY 構文の使い方を示します。 詳細なセキュリティ ポリシーのシナリオ例については、「行レベルのセキュリティ」をご覧ください。

A. セキュリティ ポリシーを作成する

以下の構文では、dbo.Customer テーブルにフィルター述語を含むセキュリティ ポリシーが作成され、そのセキュリティ ポリシーが無効な状態のままになります。

CREATE SECURITY POLICY [FederatedSecurityPolicy]   
ADD FILTER PREDICATE [rls].[fn_securitypredicate]([CustomerId])   
ON [dbo].[Customer];  

B. 複数のテーブルに影響を及ぼすポリシーを作成する

以下の構文は、3 つの異なるテーブルに 3 つのフィルター述部を使用してセキュリティ ポリシーを作成し、そのセキュリティ ポリシーを有効にします。

CREATE SECURITY POLICY [FederatedSecurityPolicy]   
ADD FILTER PREDICATE [rls].[fn_securitypredicate1]([CustomerId])   
    ON [dbo].[Customer],  
ADD FILTER PREDICATE [rls].[fn_securitypredicate1]([VendorId])   
    ON [dbo].[ Vendor],  
ADD FILTER PREDICATE [rls].[fn_securitypredicate2]([WingId])   
    ON [dbo].[Patient]  
WITH (STATE = ON);  

C: 複数の種類のセキュリティ述語でポリシーを作成する

フィルター述語とブロック述語の両方を dbo.Sales テーブルに追加します。

CREATE SECURITY POLICY rls.SecPol  
    ADD FILTER PREDICATE rls.tenantAccessPredicate(TenantId) ON dbo.Sales,  
    ADD BLOCK PREDICATE rls.tenantAccessPredicate(TenantId) ON dbo.Sales AFTER INSERT;