CREATE ROW ACCESS POLICY

Cria uma nova política de acesso a linhas no esquema atual/especificado ou substitui uma política de acesso a linhas existente.

Após criar uma política de acesso a linhas, adicione a política a uma tabela usando um comando ALTER TABLE ou a uma exibição usando um comando ALTER VIEW.

Consulte também:

DDL da política de acesso a linhas

Sintaxe

O Snowflake oferece suporte à seguinte sintaxe para criar uma política de acesso a linhas.

CREATE [ OR REPLACE ] ROW ACCESS POLICY [ IF NOT EXISTS ] <name> AS
( <arg_name> <arg_type> [ , ... ] ) RETURNS BOOLEAN -> <body>
[ COMMENT = '<string_literal>' ]
Copy

Parâmetros obrigatórios

name

Identificador para a política de acesso a linhas; deve ser único para seu esquema.

O valor do identificador deve começar com um caractere alfabético e não pode conter espaços ou caracteres especiais, a menos que toda a cadeia de caracteres do identificador esteja entre aspas duplas (por exemplo “Meu objeto”). Os identificadores delimitados por aspas duplas também diferenciam letras maiúsculas de minúsculas.

Para obter mais detalhes, consulte Requisitos para identificadores

AS ( <arg_name> <arg_type> [ , ] )

A assinatura da política de acesso a linhas.

Uma assinatura especifica um conjunto de atributos que devem ser considerados para determinar se a linha é acessível. Os valores dos atributos provêm do objeto de banco de dados (por exemplo, tabela ou exibição) a ser protegido pela política de acesso a linhas.

RETURNS BOOLEAN

Uma política de acesso a linhas deve ser avaliada como verdadeira ou falsa. Um usuário que consulta uma tabela protegida por uma política de acesso a linhas vê linhas na saída com base em como body é gravado.

body

A expressão SQL que opera nos valores de argumentos na assinatura para determinar quais linhas retornar para uma consulta em uma tabela protegida por uma política de acesso a linhas.

O body pode ser qualquer expressão SQL com valor booleano. O Snowflake oferece suporte às expressões que invocam funções de contexto, Visão geral das funções definidas pelo usuário, Como escrever funções externas e expressões que utilizam subconsultas.

Para funções de contexto na política body:

Quando a política chama a função CURRENT_DATABASE ou CURRENT_SCHEMA, a função avalia o banco de dados ou o esquema que contém a tabela ou exibição protegida, e não o banco de dados ou o esquema da sessão que você especifica com um comando USE <objeto> ou seleciona com o seletor de contexto em Snowsight.

Parâmetros opcionais

COMMENT = 'string_literal'

Especifica um comentário para a política de acesso a linhas.

Padrão: sem valor

Requisitos de controle de acesso

Uma função usada para executar este comando SQL deve ter os seguintes privilégios no mínimo:

Privilégio

Objeto

Notas

CREATE ROW ACCESS POLICY

Esquema

Observe que operar em qualquer objeto de um esquema também requer o privilégio USAGE no banco de dados e esquema principais.

Para instruções sobre como criar uma função personalizada com um conjunto específico de privilégios, consulte Criação de funções personalizadas.

Para informações gerais sobre concessões de funções e privilégios para executar ações de SQL em objetos protegíveis, consulte Visão geral do controle de acesso.

Para detalhes adicionais sobre a política de mascaramento DDL e privilégios, consulte Gerenciamento da segurança em nível de coluna.

Notas de uso

  • Incluir uma ou mais subconsultas no corpo da política pode causar erros. Quando possível, limite o número de subconsultas, limite o número de operações JOIN e simplifique as condições da cláusula WHERE.

  • Se um objeto de banco de dados tiver uma política de acesso a linhas e uma ou mais políticas de mascaramento, a política de acesso a linhas é avaliada primeiro.

    Para obter mais informações sobre as políticas de acesso a linhas durante a execução da consulta, consulte Explicação de políticas de acesso a linhas.

  • Uma determinada coluna de tabela ou exibição pode ser especificada em uma assinatura de política de mascaramento ou em uma assinatura de política de acesso a linhas. Em outras palavras, a mesma coluna não pode ser especificada tanto em uma assinatura de política de mascaramento quanto em uma assinatura de política de acesso a linhas ao mesmo tempo.

    Para obter mais informações, consulte CREATE MASKING POLICY.

  • Não é possível alterar a assinatura da política (isto é, nome do argumento ou tipo de dados de entrada/saída) usando CREATE OR REPLACE ROW ACCESS POLICY se a política for anexada a uma tabela ou exibição, ou usando ALTER ROW ACCESS POLICY. Se você precisar mudar a assinatura, execute uma instrução DROP ROW ACCESS POLICY na política e crie uma nova política de acesso a linhas.

  • Um provedor de compartilhamento de dados não pode criar uma política de acesso a linhas em uma conta de leitor.

  • Em relação aos metadados:

    Atenção

    Os clientes devem garantir que nenhum dado pessoal (exceto para um objeto do usuário), dados sensíveis, dados controlados por exportação ou outros dados regulamentados sejam inseridos como metadados ao usar o serviço Snowflake. Para obter mais informações, consulte Campos de metadados no Snowflake.

  • Instruções CREATE OR REPLACE <object> são atômicas. Ou seja, quando um objeto é substituído, o objeto antigo é excluído e o novo objeto é criado em uma única transação.

Exemplos

Estes exemplos utilizam a função de contexto CURRENT_ROLE. Se a ativação e a hierarquia de funções for necessária nas condições da política, use IS_ROLE_IN_SESSION.

A seguinte política de acesso a linhas permite aos usuários cujo CURRENT_ROLE é a função personalizada it_admin para ver linhas que contêm o número da ID do funcionário (isso é, empl_id) no resultado da consulta.

create or replace row access policy rap_it as (empl_id varchar) returns boolean ->
  case
      when 'it_admin' = current_role() then true
      else false
  end
;
Copy

A seguinte política de acesso a linhas permite que os usuários visualizem linhas no resultado da consulta se uma das condições a seguir for verdadeira:

  1. A função atual é a função personalizada sales_executive_role. Chame a função CURRENT_ROLE para determinar a função atual.

  2. A função atual é a função personalizada sales_manager e a consulta especifica um sales_region que corresponde à tabela de mapeamento salesmanageregions.

use role securityadmin;

create or replace row access policy rap_sales_manager_regions_1 as (sales_region varchar) returns boolean ->
  'sales_executive_role' = current_role()
      or exists (
            select 1 from salesmanagerregions
              where sales_manager = current_role()
                and region = sales_region
          )
;
Copy

Onde:

rap_sales_manager_regions_1

O nome da política de acesso a linhas.

as (sales_region varchar)

A assinatura da política de acesso a linhas.

Uma assinatura especifica um conjunto de atributos que devem ser considerados para determinar se a linha é acessível. Os valores dos atributos provêm da tabela a ser protegida pela política de acesso a linhas.

returns boolean ->

Especifica a aplicação da política de acesso a linhas.

Observe que o <expression> da política de acesso a linhas segue imediatamente a linha da direita (isto é, ->).

A expressão pode ser qualquer expressão SQL com valor booleano. O Snowflake oferece suporte às expressões que invocam UDFs, funções externas e expressões que utilizam subconsultas.

'sales_executive_role' = current_role()

A primeira condição da expressão da política de acesso a linhas que permite aos usuários com a função personalizada de sales_executive_role visualizar os dados.

or exists (select 1 from salesmanagerregions where sales_manager = current_role() and region = sales_region)

A segunda condição da expressão da política de acesso a linhas que utiliza uma subconsulta.

A subconsulta exige que o CURRENT_ROLE seja a função personalizada de sales_manager com a consulta executada nos dados para especificar uma região listada na tabela de mapeamento salesmanagerregions.

A política de acesso a linhas a seguir especifica dois atributos na assinatura da política:

create or replace row access policy rap_test2 as (n number, v varchar)
  returns boolean -> true;
Copy

Onde:

rap_test2

O nome da política de acesso a linhas.

(n number, v varchar)

A assinatura da política de acesso a linhas.

Uma assinatura especifica um conjunto de atributos que devem ser considerados para determinar se a linha é acessível. Os valores dos atributos provêm da tabela a ser protegida pela política de acesso a linhas.

returns boolean -> true

Determina a aplicação da política de acesso a linhas.

O valor retornado determina se o usuário tem acesso a uma determinada linha no objeto de banco de dados ao qual a política de acesso a linhas é adicionada.

Para exemplos adicionais, consulte Uso de políticas de acesso a linhas.