ALTER SECURITY POLICY (Transact-SQL)

適用対象: はいSQL Server 2016 (13.x) 以降 はいAzure SQL データベース はいAzure SQL Managed Instance

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

トピック リンク アイコン 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 操作 (INSERT または UPDATE) が実行される前に、行の値に対して述語が評価されることを指定します。 操作が指定されていない場合、述語は、すべての操作に適用されます。

適用されたブロック述語の操作は、述語を一意に特定するために使用されるため、その操作を 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. テーブルの述語を変更する

以下の構文は、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;  

参照

行レベルのセキュリティ
CREATE SECURITY POLICY (Transact-SQL)
DROP SECURITY POLICY (Transact-SQL)
sys.security_policies (Transact-SQL)
sys.security_predicates (Transact-SQL)