Partilhar via


CRIAR POLÍTICA DE SEGURANÇA (Transact-SQL)

Aplica-se a: SQL Server 2016 (13.x) e versões posteriores Azure SQL Database AzureSQL Managed InstanceSQL analytics endpoint em Microsoft FabricWarehouse em Microsoft FabricSQL database em Microsoft Fabric

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

Transact-SQL convenções de sintaxe

Syntax

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

Arguments

security_policy_name

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

schema_name

É o nome do esquema ao qual a diretiva de segurança pertence. schema_name é necessário devido à vinculação de esquema.

[ FILTRAR | BLOCO ]

O tipo de predicado de segurança para a função que está sendo vinculada à tabela de destino. FILTER Os predicados filtram silenciosamente as linhas que estão disponíveis para operações de leitura. BLOCK predicados explicitamente bloquear operações de gravação que violam a função de predicado.

tvf_schema_name.security_predicate_function_name

É a função de valor da tabela embutida que será usada como um predicado e que será imposta em consultas em uma tabela de destino. No máximo, um predicado de segurança pode ser definido para uma operação DML específica em relação a uma tabela específica. A função de valor da tabela embutida deve ter sido criada usando a SCHEMABINDING opção.

{ column_name | expressão }

Um nome de coluna ou expressão usada como parâmetro para a função de predicado de segurança. Qualquer coluna na tabela de destino pode ser usada. Uma expressão só pode incluir constantes, funções escalares incorporadas, 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 à qual o predicado de segurança será aplicado. Várias políticas de segurança desabilitadas podem direcionar uma única tabela para uma operação DML específica, mas apenas uma pode ser habilitada a qualquer momento.

block_dml_operation

A operação DML específica para a qual o predicado de bloco será aplicado. AFTER especifica que o predicado será avaliado nos valores das linhas após a operação DML ter sido executada (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.

[ ESTADO = { EM | DESLIGADO } ]

Habilita ou desabilita a diretiva de segurança de impor seus predicados de segurança contra as tabelas de destino. Se não for especificado, a diretiva de segurança que está sendo criada será habilitada.

[ SCHEMABINDING = { EM | DESLIGADO } ]

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

NÃO SE DESTINA À REPLICAÇÃO

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

[ table_schema_name. ] table_name

É a tabela de destino à qual o predicado de segurança será aplicado. Várias políticas de segurança desativadas podem ter como alvo uma única tabela, mas apenas uma pode ser habilitada a qualquer momento.

Remarks

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

Os predicados de bloco são avaliados após a execução da operação DML correspondente. Portanto, há o perigo de que uma consulta READ UNCOMMITTED possa ver valores transitórios que serão revertidos.

Permissions

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 adicionado:

  • Permissões SELECT e REFERENCES na função que está sendo usada como predicado.

  • Permissão REFERÊNCIAS na tabela de destino sendo vinculada à política.

  • Permissão REFERÊNCIAS em todas as colunas da tabela de destino usadas como argumentos.

Examples

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

A. Criar uma política de segurança

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

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

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

A sintaxe a seguir cria uma diretiva de segurança com três predicados de filtro em três tabelas diferentes e habilita a diretiva 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

Adicionar um predicado de filtro e um predicado de bloco à dbo.Sales tabela.

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;