CREATE SECURITY POLICY (Transact-SQL)

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

Cria uma política de segurança para segurança em nível de linha.

Convenções de sintaxe de Transact-SQL

Sintaxe

CREATE SECURITY POLICY [schema_name. ] security_policy_name    
    { ADD [ FILTER | BLOCK ] } PREDICATE tvf_schema_name.security_predicate_function_name   
      ( { column_name | expression } [ , ...n] ) ON table_schema_name. table_name    
      [ <block_dml_operation> ] , [ , ...n] 
    [ WITH ( STATE = { ON | OFF }  [,] [ SCHEMABINDING = { 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. Nomes de políticas de segurança devem obedecer às 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 que está sendo 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 que será usada como um predicado e que serão aplicadas em consultas em uma tabela de destino. No máximo um predicado de segurança pode ser definido para uma determinada operação DML em uma tabela específica. A função de valor de tabela em linha deve ter sido criada usando a opção SCHEMABINDING.

{ column_name | expression }

Um nome da coluna ou expressão usada como um parâmetro para a função de predicado de segurança. Qualquer coluna na tabela de destino pode ser usada. Uma Expression pode incluir apenas constantes, funções escalares internas, operadores e colunas da tabela de destino. Um nome de coluna ou expressão precisa ser especificado para cada parâmetro da função.

table_schema_name.table_name

É a tabela de destino a qual o predicado de segurança será aplicado. 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 à qual o predicado de bloqueio será aplicado. AFTER especifica que o predicado será avaliado nos valores das linhas após a execução da operação DML (INSERT ou UPDATE). BEFORE especifica que o predicado será avaliado nos valores das linhas antes que a operação DML seja executada (UPDATE ou DELETE). Se nenhuma operação for especificada, o predicado será aplicado a todas as operações.

[ 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.

[ SCHEMABINDING = { ON | OFF } ]

Indica se todas as funções de predicado na política devem ser criadas com a opção SCHEMABINDING. Por padrão, essa configuração é ON, e todas as funções devem ser criadas com SCHEMABINDING.

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 a qual o predicado de segurança será 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

Ao usar funções de predicado com tabelas com otimização de memória, você deve incluir SCHEMABINDING e usar a dica de compilação WITH NATIVE_COMPILATION.

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

Permissões

Requer a permissão ALTER ANY SECURITY POLICY e a permissão ALTER no esquema.

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 que está sendo associada à política.

  • Permissão REFERENCES em todas as colunas da tabela de destino usada como argumentos.

Exemplos

Os exemplos a seguir demonstram o uso da sintaxe CREATE 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. Criar uma política de segurança

A sintaxe a seguir cria uma política de segurança com um predicado de filtro para a tabela dbo.Customer e deixa a política de segurança desabilitada.

CREATE SECURITY POLICY [FederatedSecurityPolicy]   
ADD FILTER PREDICATE [rls].[fn_securitypredicate]([CustomerId])   
ON [dbo].[Customer];  

B. Criar uma política que afeta várias tabelas

A sintaxe a seguir cria uma política de segurança com três predicados de filtro em três tabelas diferentes e habilita a política de segurança.

CREATE SECURITY POLICY [FederatedSecurityPolicy]   
ADD FILTER PREDICATE [rls].[fn_securitypredicate1]([CustomerId])   
    ON [dbo].[Customer],  
ADD FILTER PREDICATE [rls].[fn_securitypredicate1]([VendorId])   
    ON [dbo].[ Vendor],  
ADD FILTER PREDICATE [rls].[fn_securitypredicate2]([WingId])   
    ON [dbo].[Patient]  
WITH (STATE = ON);  

C. Criar uma política com vários tipos de predicados de segurança

Adição de um predicado de filtro e de um predicado de bloco à tabela dbo.Sales.

CREATE SECURITY POLICY rls.SecPol  
    ADD FILTER PREDICATE rls.tenantAccessPredicate(TenantId) ON dbo.Sales,  
    ADD BLOCK PREDICATE rls.tenantAccessPredicate(TenantId) ON dbo.Sales AFTER INSERT;