Compartilhar via


ALTER SECURITY POLICY (Transact-SQL)

Aplica-se a: SQL Server 2016 (13.x) e versões posteriores Banco de Dados SQL do Azure Ponto de extremidade de análise de SQL da Instância Gerenciada de SQL do Azure no Microsoft Fabric Warehouse no Microsoft Fabric

Altera uma política de segurança.

Convenções de sintaxe de Transact-SQL

Sintaxe

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 } } ]  

Argumentos

security_policy_name

O nome da política de segurança. Os nomes de políticas de segurança devem cumprir as regras de identificadores e devem ser exclusivos dentro do banco de dados e em seu esquema.

schema_name

É o nome do esquema ao qual a política de segurança pertence. schema_name é obrigatório devido à associação de esquema.

[ FILTER | BLOCK ]

O tipo de predicado de segurança para a função associada à tabela de destino. Predicados FILTER filtram silenciosamente as linhas que estão disponíveis para operações de leitura. Predicados BLOCK bloqueiam explicitamente as operações de gravação que violam a função de predicado.

tvf_schema_name.security_predicate_function_name

É a função de valor de tabela embutida usada como um predicado e aplicada em consultas em uma tabela de destino. No máximo, você pode definir um predicado de segurança para uma determinada operação DML em uma tabela específica. Crie uma função de valor de tabela embutida usando a opção SCHEMABINDING.

{ column_name | arguments }

O nome da coluna ou expressão usada como parâmetros para a função de predicado de segurança. As colunas na tabela de destino podem ser usadas como argumentos para a função de predicado. Expressões que incluem literais, internos e expressões que usam operadores aritméticos podem ser usadas.

table_schema_name.table_name

É a tabela de destino para o predicado de segurança. Várias políticas de segurança desabilitadas podem ser direcionadas a uma operação DML específica, mas apenas uma pode ser habilitada em determinado momento.

<block_dml_operation>

A operação DML específica para o predicado de bloqueio aplicado. AFTER especifica que o predicado é avaliado nos valores das linhas após a execução da operação DML (INSERT ou UPDATE). BEFORE especifica que o predicado é avaliado nos valores das linhas antes da execução da operação DML (UPDATE ou DELETE). Se nenhuma operação for especificada, o predicado será aplicado a todas as operações.

Você não pode usar ALTER para alterar a operação para um predicado de bloco aplicado porque a operação é usada para identificar exclusivamente o predicado. Em vez disso, deve remover o predicado e adicionar um novo para a nova operação.

WITH ( STATE = { ON | OFF } )

Habilita ou desabilita a política de segurança ao impor seus predicados de segurança nas tabelas de destino. Se não especificado, a política de segurança que está sendo criada é habilitada.

NOT FOR REPLICATION

Indica que a política de segurança não deve ser executada quando um agente de replicação modifica o objeto de destino. Para obter mais informações, confira Controlar o comportamento de gatilhos e restrições durante a sincronização (programação Transact-SQL de replicação).

table_schema_name.table_name

É a tabela de destino para o predicado de segurança aplicado. Várias políticas de segurança desabilitadas podem direcionar uma única tabela, mas apenas uma pode ser habilitada em um determinado momento.

Comentários

A instrução ALTER SECURITY POLICY está no escopo de uma transação. Se a transação for revertida, a instrução também será revertida.

Ao usar funções de predicado com tabelas com otimização de memória, as políticas de segurança devem incluir SCHEMABINDING e usar a dica de compilação WITH NATIVE_COMPILATION. O argumento SCHEMABINDING não pode ser alterado com a instrução ALTER porque ela se aplica a todos os predicados. Para alterar a associação de esquema, você deve remover e recriar a política de segurança.

Os predicados de bloqueio são avaliados depois que a operação DML correspondente é executada. Portanto, há o perigo de que uma consulta READ UNCOMMITTED exiba valores transitórios que serão revertidos.

Permissões

Requer a permissão ALTER ANY SECURITY POLICY.

Além disso, as seguintes permissões são necessárias para cada predicado que é adicionado:

  • Permissões SELECT e REFERENCES na função que está sendo usada como um predicado.
  • Permissão REFERENCES na tabela de destino associada à política.
  • Permissão REFERENCES em cada coluna da tabela de destino usada como argumentos.

Exemplos

Os exemplos a seguir demonstram o uso da sintaxe ALTER SECURITY POLICY. Para obter um exemplo de um cenário de política de segurança completo, consulte Segurança em nível de linha.

R. Adicionar um predicado adicional a uma política

A sintaxe a seguir altera uma política de segurança, adicionando um predicado de filtro na tabela mytable.

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

B. Habilitar uma política existente

O exemplo a seguir usa a sintaxe ALTER para habilitar uma política de segurança.

ALTER SECURITY POLICY pol1 WITH ( STATE = ON );  

C. Adicionar e descartar vários predicados

A sintaxe a seguir altera uma política de segurança, adicionando predicados de filtro nas tabelas mytable1 e mytable3 e removendo o predicado de filtro na tabela 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. Alterar o predicado em uma tabela

A sintaxe a seguir altera o predicado do filtro existente na tabela myschema.mytable para a função SecPredicate2.

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

E. Alterar um predicado de bloco

Alterar a função de predicado de bloqueio para uma operação em uma tabela.

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