ALTER SECURITY POLICY (Transact-SQL)
適用対象: SQL Server 2016 (13.x) 以降のバージョン Azure SQL Database Azure SQL Managed Instance Microsoft Fabric のSQL 分析エンドポイント Microsoft Fabric のウェアハウス
セキュリティ ポリシーを変更します。
構文
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;