ALTER SECURITY POLICY (Transact-SQL)

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

セキュリティ ポリシーを変更します。

Transact-SQL 構文表記規則

構文

ALTER SECURITY POLICY schema_name.security_policy_name   
    (  
        { ADD { FILTER | BLOCK } PREDICATE tvf_schema_name.security_predicate_function_name   
           ( { column_name | arguments } [ , ...n ] ) ON table_schema_name.table_name   
           [ <block_dml_operation> ]  }   
        | { ALTER { FILTER | BLOCK } PREDICATE tvf_schema_name.new_security_predicate_function_name   
             ( { column_name | arguments } [ , ...n ] ) ON table_schema_name.table_name   
           [ <block_dml_operation> ] }  
        | { DROP { FILTER | BLOCK } PREDICATE ON table_schema_name.table_name }   
        | [ <additional_add_alter_drop_predicate_statements> [ , ...n ] ]  
    )    [ WITH ( STATE = { 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 | arguments }

セキュリティ述語関数のパラメーターとして使用される列名または式。 ターゲット テーブル上の任意の列を、述語関数の引数として使用できます。 リテラルを含む式、ビルトイン、および算術演算子を使用する式を利用できます。

table_schema_name.table_name

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

<block_dml_operation>

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

適用されたブロック述語の操作は、述語を一意に特定するために使用されるため、その操作を ALTER することはできません。 代わりに、その述語を削除して、新しい 2 つの操作用に新しい述語を追加する必要があります。

WITH ( STATE = { ON | OFF } )

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

NOT FOR REPLICATION

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

table_schema_name.table_name

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

解説

ALTER SECURITY POLICY ステートメントはトランザクションのスコープ内にあります。 トランザクションがロールバックされると、ステートメントもロールバックされます。

メモリ最適化テーブルで述語関数を使用する場合、セキュリティ ポリシーには SCHEMABINDING が含まれる必要があり、WITH NATIVE_COMPILATION コンパイル ヒントを使用する必要があります。 SCHEMABINDING の引数は、すべての述語に適用されるため、ALTER ステートメントを使用して変更できません。 スキーマ バインドを変更するには、セキュリティ ポリシーを削除して再作成する必要があります。

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

アクセス許可

ALTER ANY SECURITY POLICY アクセス許可が必要です。

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

  • SELECT アクセス許可と REFERENCES アクセス許可 (述語として使用される関数)。
  • REFERENCES アクセス許可 (ポリシーへのバインド対象となるテーブル)。
  • REFERENCES アクセス許可 (対象テーブル内の、引数として使用されるすべての列)。

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

A. ポリシーに述語を追加する

以下の構文はセキュリティ ポリシーを変更します。その際、mytable テーブルにフィルター述語を追加します。

ALTER SECURITY POLICY pol1   
    ADD FILTER PREDICATE schema_preds.SecPredicate(column1)   
    ON myschema.mytable;  

B. 既存のポリシーを有効にする

以下の例では、ALTER 構文を使用してセキュリティ ポリシーを有効にします。

ALTER SECURITY POLICY pol1 WITH ( STATE = ON );  

C: 複数の述語を追加または削除する

以下の構文ではセキュリティ ポリシーを変更します。その際、mytable1 テーブルと mytable3 テーブルにフィルター述語を追加し、mytable2 テーブルからフィルター述語を削除します。

ALTER SECURITY POLICY pol1  
ADD FILTER PREDICATE schema_preds.SecPredicate1(column1)   
    ON myschema.mytable1,  
DROP FILTER PREDICATE   
    ON myschema.mytable2,  
ADD FILTER PREDICATE schema_preds.SecPredicate2(column2, 1)   
    ON myschema.mytable3;  

D. テーブルの述語を変更する

以下の構文は、myschema.mytable テーブルの既存のフィルター述語を SecPredicate2 関数になるように変更します。

ALTER SECURITY POLICY pol1  
    ALTER FILTER PREDICATE schema_preds.SecPredicate2(column1)  
        ON myschema.mytable;  

E. ブロック述語を変更する

テーブルの操作に対するブロック述語関数を変更します。

ALTER SECURITY POLICY rls.SecPol  
    ALTER BLOCK PREDICATE rls.tenantAccessPredicate_v2(TenantId) 
    ON dbo.Sales AFTER INSERT;