次の方法で共有


ALTER SECURITY POLICY (Transact-SQL)

適用対象: SQL Server 2016 (13.x) 以降のバージョン Azure SQL DatabaseAzure 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_namesecurity_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 } )

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

レプリケーション用ではありません

レプリケーション エージェントがターゲット オブジェクトを変更するときに、セキュリティ ポリシーを実行してはならないことを示します。 詳細については、「同期中にトリガと制約の動作を制御する方法 (レプリケーション 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;