ALTER SECURITY POLICY (Transact-SQL)

Область применения: SQL Server 2016 (13.x) и более поздних версий База данных SQL Azure Управляемый экземпляр SQL Azure SQL analytics endpoint in Microsoft Fabric Warehouse in 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 в определенной таблице вы можете задать не более одного предиката безопасности. Создайте встроенную функцию табличного SCHEMABINDING значения с помощью параметра.

{ column_name | arguments }

Имя столбца или выражение, используемое в качестве параметров функции предиката безопасности. Любые столбцы в целевой таблице можно использовать как аргументы для функции предиката. Вы можете использовать выражения, которые включают литералы, встроенные объекты и выражения с арифметическими операторами.

table_schema_name.table_name

Является целевой таблицей для предиката безопасности. Для одной таблицы для конкретной операции DML могут быть предназначены несколько отключенных политик безопасности, но только одна может быть включена в любой момент времени.

<block_dml_operation>

Конкретная операция DML для примененного предиката блокирования. AFTER указывает предикат вычисляется по значениям строк после выполнения операции DML (INSERT или UPDATE). BEFORE указывает предикат вычисляется по значениям строк перед выполнением операции DML (UPDATE или DELETE). Если операция не указана, предикат будет применяться ко всем операциям.

Вы не можете изменить операцию, для которой применяется предикат блокирования, с помощью инструкции ALTER, так как эта операция используется для уникальной идентификации предиката. Вместо этого необходимо удалить предикат и добавить новый для новой операции.

WITH (STATE = {ON | OFF})

Включает или отключает политику безопасности для обеспечения применения ее предикатов безопасности в отношении целевых таблиц. Если этот аргумент не указан, создаваемая политика безопасности будет отключена.

NOT FOR REPLICATION

Указывает, что политика безопасности не должна выполняться, когда агент репликации изменяет целевой объект. Дополнительные сведения см. в статье Управление поведением триггеров и ограничений во время синхронизации (программирование репликации на языке Transact-SQL).

table_schema_name.table_name

Является целевой таблицей для примененного предиката безопасности. Для одной таблицы могут быть предназначены несколько отключенных политик безопасности, но только одна может быть включена в любой момент времени.

Замечания

Инструкция ALTER SECURITY POLICY относится к области транзакции. Если выполняется откат транзакции, происходит также откат этой инструкции.

При использовании функций предиката с оптимизированными для памяти таблицами политики безопасности должны включать SCHEMABINDING и использовать подсказку WITH NATIVE_COMPILATION компиляции. Аргумент SCHEMABINDING нельзя изменить с помощью инструкции ALTER , так как она применяется ко всем предикатам. Чтобы изменить привязку к схеме, необходимо удалить и заново создать политику безопасности.

Предикаты блокировки вычисляются после выполнения соответствующей операции DML. Таким образом, существует опасность, что запрос READ UNCOMMITTED может видеть временные значения, которые будут откатированы.

Разрешения

Требуется разрешение ALTER ANY SECURITY POLICY.

Кроме того, для каждого добавляемого предиката требуются следующие разрешения:

  • SELECT и REFERENCES разрешения для функции, используемой в качестве предиката.
  • REFERENCES разрешение на целевую таблицу, привязанную к политике.
  • REFERENCES разрешение на каждый столбец из целевой таблицы, используемой в качестве аргументов.

Примеры

В следующих примерах показано использование синтаксиса ALTER SECURITY POLICY . Пример полного сценария политики безопасности см. в разделе "Безопасность на уровне строк".

А. Добавление дополнительного предиката в политику

Следующий синтаксис изменяет политику безопасности, добавляя предикат фильтра в таблице 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;  

Д. Изменение предиката блока

Изменение функции предиката блокирования для операции с таблицей.

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