Todos os produtos
Search
Central de documentação

MaxCompute:Controle de acesso em nível de linha

Última atualização: Jul 17, 2026

Para controlar o acesso a dados específicos em tabelas do MaxCompute por usuários ou funções, o MaxCompute oferece o controle de acesso em nível de linha. Esse recurso permite definir políticas que associam usuários aos dados que eles têm permissão para acessar. A aplicação dessas políticas diretamente a uma tabela garante que usuários e funções visualizem apenas os dados autorizados, aumentando a segurança e a conformidade dos dados.

Informações gerais

As tabelas do MaxCompute podem conter grandes volumes de dados. Em cenários de compartilhamento, os administradores frequentemente precisam garantir que usuários específicos acessem apenas as linhas de dados autorizadas. Anteriormente, controlar o acesso em nível de linha exigia criar uma view separada para cada usuário ou usar uma tarefa ETL para filtrar e copiar dados para outra tabela.

O controle de acesso em nível de linha simplifica esse fluxo de trabalho. Não é necessário mover ou copiar dados, nem criar e manter views.

Esse controle aplica-se aos seguintes cenários:

  • Consultas SQL.

  • Baixe dados da tabela usando o MaxCompute Tunnel.

  • Leitura de dados da tabela por meio de um engine externo, como Spark ou Flink.

Nota

Engines que não suportam o controle de acesso em nível de linha do MaxCompute (como o Hologres) não conseguem acessar dados protegidos. Ainda é possível compartilhar dados filtrados utilizando uma view ou uma tabela copiada.

A tabela a seguir descreve os comandos para controle de acesso em nível de linha.

Ações

Descrição

Ponto de entrada

CREATE/REPLACE

Crie ou modifique uma Row Access Policy para usuários ou funções especificados.

DROP

Exclua uma política de uma tabela.

DESC

Visualize os detalhes de permissão de uma política em uma tabela.

LIST

Lista as políticas em uma tabela.

Limitações

  • As seguintes limitações aplicam-se ao controle de acesso em nível de linha:

    • Somente um administrador (um usuário com a função Admin ou proprietário da tabela) pode configure uma Row Access Policy.

    • Não é possível configure uma Row Access Policy em uma tabela transacional, view ou materialized view. Também não é permitido crie uma materialized view em uma tabela que já possua uma Row Access Policy, nem adicionar essa política à tabela base de uma materialized view. No entanto, você pode crie uma view baseada em uma tabela com Row Access Policy. Nesse caso, os resultados da consulta na view são determinados tanto pela política da tabela base quanto pelas regras definidas pelo proprietário da view.

    • Operações de evolução de schema não são suportadas em tabelas com Row Access Policy.

    • Não adicione uma tabela com Row Access Policy como resource de tabela UDF, nem configure essa política em uma tabela que já seja um resource UDF. O sistema não reporta erro durante a configuração, mas falhas ocorrerão em tempo de execução.

    • Regras de mascaramento não podem ser adicionadas a tabelas com Row Access Policy.

    • Atualmente, o controle de acesso em nível de linha não suporta partition pruning. Se ds for um campo de partição, talvez seja necessário realizar um scan completo da tabela para filtrar dados, mesmo que uma condição de filtro como ds='20220101' esteja especificada em filter_expr. Para mais informações sobre filter_expr, consulte Descrição de filter_expr.

  • Ao compartilhar uma tabela com Row Access Policy entre projetos via package, observe as seguintes restrições:

    • É possível configure permissões em nível de linha para usuários fora do projeto, como a conta Alibaba Cloud ou um usuário RAM do tenant atual.

    • No uso de tabelas com Row Access Policy entre projetos, apenas políticas de usuário ou políticas DEFAULT são aplicadas.

    • Não é permitido adicionar outra Row Access Policy a uma tabela em um package que já contenha essa política.

Notas de uso

  • Diversos parâmetros de flag podem afetar o comportamento de operadores ou funções usados em filter_expr. O MaxCompute verifique se as configurações de parâmetros no momento da execução da consulta correspondem às definições feitas na criação da política. Caso haja divergência, o seguinte erro será exibido:

    FAILED: ODPS-0130071:[0,0] Semantic analysis exception - physical plan generation failed: java.lang.IllegalArgumentException: Row access policy flag mismatch for: xxx
  • Antes de execute comandos de controle de acesso em nível de linha, como CREATE, DROP, DESC ou LIST, defina o seguinte parâmetro GUC no nível de sessão para ative o recurso.

    Nota

    Em uma versão futura, esse recurso será ativado por padrão no nível de sessão. Para mais detalhes, consulte os anúncios de lançamento.

    SET odps.sql.row.policy.enabled=true;
  • Ao consultar uma tabela com controle de acesso em nível de linha, o volume de dados de entrada para faturamento no modelo pagamento conforme o uso não é reduzido pela filtragem, pois não há suporte a partition pruning. Um usuário com Row Access Policy pode receber um conjunto de resultados filtrado mesmo ao consultar a tabela inteira. A quantidade de dados lidos da tabela de source pode ser maior do que o esperado com base no tamanho do resultado. Monitore seus custos com atenção.

  • Uma alternativa é implementar o controle de acesso em nível de linha criando e compartilhando múltiplas views ou tabelas com regras de filtro para diferentes usuários. Essa abordagem permite realizar computações sobre dados já filtrados, sendo mais simples e intuitiva. Para mais informações, consulte Controle de acesso em nível de linha. Comparado à criação de objetos compartilhados individuais, o controle nativo torna o plano de execução de consultas da tabela original mais complexo. Por outro lado, elimina a necessidade de criar objetos separados, evita armazenamento redundante e é mais adequado para definir regras para muitos usuários. Escolha o método que melhor atenda às suas necessidades.

Sintaxe

Utilize os comandos CREATE/REPLACE, DROP, DESC e LIST para crie (ou modifique), exclua ou visualize uma Row Access Policy.

CREATE/REPLACE

  • Sintaxe

    CREATE [OR REPLACE] ROW ACCESS POLICY [IF NOT EXISTS] <policy_name> 
    ON <table_name> 
    TO <authorized_objects> 
    FILTER USING <filter_expr>
    [AS <clause>];
  • Descrição

    Crie ou modifique uma Row Access Policy para conceder permissões a um usuário ou função especificado.

  • Parâmetros

    Parâmetro

    Descrição

    policy_name

    Nome da Row Access Policy. Você pode personalizar este nome.

    table_name

    Nome da tabela a ser acessada.

    authorized_objects

    Objeto a ser autorizado. Valores válidos:

    • USER <user_list>: Lista de nomes de usuário a serem autorizados, separados por vírgulas.

    • ROLE <role_list>: Lista de nomes de funções a receberem permissão. Múltiplos nomes devem ser separados por vírgulas.

    • DEFAULT: Regra padrão aplicada quando nenhuma regra de usuário ou função corresponder.

    filter_expr

    Expressão de filtro. Para mais detalhes, consulte descrição de filter_expr.

    clause

    Atributo da Row Access Policy. O valor pode ser PERMISSIVE ou RESTRICTIVE. Consulte Especificação do atributo PERMISSIVE ou RESTRICTIVE.

    • Descrição de filter_expr

      A versão atual impõe restrições rigorosas a filter_expr:

      • filter_expr deve ser uma expressão escalar que resulte em um tipo BOOLEAN.

      • A expressão não pode conter subconsultas ou instruções como SELECT, CREATE ou UPDATE.

      • filter_expr só pode referenciar constantes ou colunas da tabela autorizada. Referências a colunas de outras tabelas não são permitidas.

      • É permitido usar operadores nativos do MaxCompute, incluindo relacionais, aritméticos, bit a bit e lógicos. Veja mais em Operadores.

      • Apenas um subconjunto de funções escalares nativas é permitido. Funções definidas pelo usuário (UDFs), funções de agregação e funções de janela não são suportadas. As funções aceitas incluem:

        • Funções de string: CONCAT, CONCAT_WS, GET_JSON_OBJECT, INSTR, LENGTH, LENGTHB, REGEXP_EXTRACT, REGEXP_REPLACE, REVERSE, SUBSTR, TOLOWER, TOUPPER, TRIM, LTRIM, RTRIM, REPLACE.

        • Funções matemáticas: ABS, ROUND.

        • Funções de data e hora: DATEADD, TO_DATE, TO_CHAR.

        • Outras funções: SIZE, FIELD, COALESCE, IF, SPLIT.

    • Especificação do atributo PERMISSIVE ou RESTRICTIVE

      Múltiplas políticas podem aplicar-se a um mesmo usuário. Essas políticas são combinadas para determinar se o acesso a uma linha específica de dados é permitido. Ao crie uma Row Access Policy, utilize AS {PERMISSIVE | RESTRICTIVE} para defina o atributo como PERMISSIVE ou RESTRICTIVE. Se nenhum atributo for especificado, a política será PERMISSIVE por padrão. Exemplo:

      Quando várias políticas se aplicam a um usuário:

      • Se todas forem PERMISSIVE, elas se combinam com uma relação OR. O usuário acessará a linha se o filter_expr de qualquer política for verdadeiro.

      • Se todas forem RESTRICTIVE, a combinação segue uma relação AND. O acesso à linha só ocorre se todas as políticas forem satisfeitas.

      • Caso existam políticas mistas (algumas PERMISSIVE e outras RESTRICTIVE), o usuário só acessará a linha se ambas as condições abaixo forem atendidas:

        • Pelo menos uma das políticas PERMISSIVE for satisfeita.

        • Todas as políticas RESTRICTIVE forem satisfeitas.

      Nota

      Sempre que adicionar uma nova Row Access Policy a uma tabela, avalie o efeito combinado de todas as políticas existentes. Por exemplo, se um usuário estiver sujeito a políticas RESTRICTIVE e PERMISSIVE simultaneamente, ele deverá atender às condições de todas as políticas RESTRICTIVE e de pelo menos uma PERMISSIVE.

  • Casos de uso

    • Conceder permissões a um usuário específico

      Suponha que exista uma tabela chamada table01 contendo uma coluna STRING denominada region. Uma Row Access Policy é configurada para restringir o acesso de certos usuários apenas aos registros onde o valor da coluna region seja china. Exemplo de comando:

      CREATE ROW ACCESS POLICY policy01
      ON table01
      TO USER (aliyun$odps_test01**@aliyun.com,aliyun$odps_test02**@aliyun.com)
      FILTER USING (region = "china");
    • Conceder permissões a uma função específica

      Considere que o sistema possua duas funções, role1 e role2. Autorize essas funções a acessar somente registros onde o campo region seja igual a china. O comando é:

      CREATE ROW ACCESS POLICY policy02
      ON table01
      TO ROLE (role1, role2)
      FILTER USING (region = "china");
    • Conceder permissões ao usuário padrão

      Ao adicionar a primeira Row Access Policy a uma tabela, o acesso torna-se restrito. Usuários que não corresponderem a nenhuma política perderão o acesso aos dados, pois não estarão em uma lista de permissões. Para gerenciar o acesso dos demais usuários, configure uma política padrão. O administrador pode usar os comandos abaixo para modifique as permissões do usuário padrão.

      Negar acesso a todos os outros usuários por padrão equivale a especifique que o usuário padrão não possui permissões de acesso.

      CREATE ROW ACCESS POLICY policy03 
      ON table01
      TO DEFAULT 
      FILTER USING (false);

      Para restringir o usuário Default a acessar apenas registros onde o campo region seja other, utilize:

      CREATE ROW ACCESS POLICY policy04 
      ON table01
      TO default 
      FILTER USING (region = "other");
      Importante

      Ao adicionar uma Row Access Policy a uma tabela, considere o comportamento de acesso dos usuários não abrangidos pelo controle. Se outros usuários acessavam a tabela anteriormente, defina regras explícitas para eles a fim de evitar erros inesperados de negação de acesso.

  • Lógica de autorização

    O fluxograma a seguir ilustra o processo de autorização quando um usuário acessa uma tabela com Row Access Policy.

    image

DROP

  • Exclua uma política específica de uma tabela.

    DROP ROW ACCESS POLICY <policy_name> ON <table_name>;
  • Remove todas as políticas de uma tabela.

    DROP ALL ROW ACCESS POLICY ON <table_name>;

DESC

Visualize os detalhes de uma política específica em uma tabela.

DESC ROW ACCESS POLICY <policy_name> ON <table_name>;

LIST

  • Lista todas as políticas em uma tabela.

    LIST ROW ACCESS POLICY ON <table_name>;
  • Exibe as políticas configuradas para um usuário específico em uma tabela.

    LIST ROW ACCESS POLICY ON <table_name> TO USER <user_name>;
  • Mostra as políticas configuradas para uma função específica em uma tabela.

    LIST ROW ACCESS POLICY ON <table_name> TO ROLE <role_name>;

Dados de amostra

Crie uma tabela chamada policy_test e insira dados. Os comandos SQL são:

-- Create a table.
CREATE TABLE policy_test(a bigint, b string);

-- Insert data into the table.
INSERT overwrite TABLE policy_test VALUES(1L, "1"), (2L, "2"), (3L, "3"), (4L, "4");

-- Check the inserted data.
SELECT * FROM policy_test;
-- The following result is returned:
+------------+---+
| a          | b |
+------------+---+
| 1          | 1 |
| 2          | 2 |
| 3          | 3 |
| 4          | 4 |
+------------+---+

Exemplos

Esta seção apresenta exemplos de uso de permissões em nível de linha para o usuário padrão. Antes de começar, prepare os dados de amostra.

  • Exemplo 1: Conceder uma permissão em nível de linha na tabela policy_test para permitir que o usuário Default acesse dados onde a=2L.

    1. Crie uma Row Access Policy chamada policy01.

      CREATE row access policy policy01 ON policy_test TO default filter using (a = 2L);
    2. Visualize os detalhes da policy01 na tabela policy_test.

      DESC row access policy policy01 on policy_test;

      Resultado retornado:

      -- The Restrictive property is set to its default value of false.
      Authorization Type: Row Access Policy
      Name: policy01
      Objects: acs:odps:*:projects/clone_table_2/tables/policy_test
      FilterExpr: (a = 2L)
      NormalizedFilterExpr: (policy_test.a = 2L)
      Restrictive: false
      Settings: 
      
      OK
    3. Consulte a tabela policy_test para verifique se a autorização está efetiva.

      SELECT * FROM policy_test;

      Resultado retornado:

      -- The policy is effective, and only a subset of records is returned.
      +------------+---+
      | a          | b |
      +------------+---+
      | 2          | 2 |
      +------------+---+
    4. Se o resumo do Logview contiver as informações abaixo, a filtragem em nível de linha foi acionada.

      WARNING:[1,15]  row access policy is enabled on table xxx.xxx_xxx.policy_test
      resource cost: cpu 0.00 Core * Min, memory 0.00 GB * Min
      inputs:
          xxx.xxx_xxx.policy_test: 4 (510 bytes)
      outputs:
      ----------------------------------------JOB:SQL_0_0_0_job_0----------------------------------------
      Job run time: 1.453
      Job run mode: service job 2.0
      Job run engine: execution engine
      M1:
          bubble: 0
          instance count: 1
          run time: 1.450
          instance time:
  • Exemplo 2: Adicionar duas permissões permissivas em nível de linha a uma tabela para permitir que o usuário Default acesse dados na tabela policy_test onde a=2L ou a=3L.

    1. Crie uma Row Access Policy chamada policy02.

      CREATE row access policy policy02 ON policy_test TO default filter using (a = 3L);
    2. Liste todas as políticas na tabela policy_test.

      LIST row access policy ON policy_test;

      Resultado retornado:

      Authorization Type: Row Access Policy
      Name: policy01
      Objects: acs:odps:*:projects/clone_table_2/tables/policy_test
      FilterExpr: (a = 2L)
      NormalizedFilterExpr: (policy_test.a = 2L)
      Restrictive: false
      Settings: 
      Name: policy02
      Objects: acs:odps:*:projects/clone_table_2/tables/policy_test
      FilterExpr: (a = 3L)
      NormalizedFilterExpr: (policy_test.a = 3L)
      Restrictive: false
      Settings: 
      
      OK
    3. Consulte a tabela policy_test para confirmar que a autorização está ativa.

      SELECT * FROM policy_test;

      Resultado retornado:

      -- The two PERMISSIVE policies, policy01 and policy02, are both in effect. Two records are returned.
      +------------+---+
      | a          | b |
      +------------+---+
      | 2          | 2 |
      | 3          | 3 |
      +------------+---+
  • Exemplo 3: Adicionar duas permissões permissivas e uma restritiva em nível de linha permite que o usuário Default acesse dados na tabela policy_test que satisfaçam (a=2L || a=3L) && a<3L.

    1. Crie uma Row Access Policy chamada policy03 e defina seu atributo como RESTRICTIVE.

      CREATE row access policy policy03 ON policy_test TO default filter using (a < 3L) as restrictive;
    2. Verifique os detalhes da policy03 na tabela policy_test.

      DESC row access policy policy03 ON policy_test;

      Resultado retornado:

      -- The Restrictive property is set to true.
      Authorization Type: Row Access Policy
      Name: policy03
      Objects: acs:odps:*:projects/clone_table_2/tables/policy_test
      FilterExpr: (a < 3L)
      NormalizedFilterExpr: (policy_test.a < 3L)
      Restrictive: true
      Settings: 
      
      OK
    3. Execute uma consulta na tabela policy_test para validar a eficácia da autorização.

      select * from policy_test;

      Resultado retornado:

      -- Policies policy01, policy02, and policy03 are all in effect.
      -- policy01 and policy02 are PERMISSIVE, so only one needs to be satisfied.
      -- policy03 is RESTRICTIVE and must be satisfied.
      +------------+---+
      | a          | b |
      +------------+---+
      | 2          | 2 |
      +------------+---+
  • Exemplo 4: Adicionar uma política PERMISSIVE e uma RESTRICTIVE a uma tabela. O usuário padrão deve satisfazer ambas as condições para acessar os dados.

    1. Exclua a Row Access Policy chamada policy01.

      SET odps.sql.row.policy.enabled=true;
      DROP ROW ACCESS POLICY policy01 ON policy_test;
    2. Visualize as permissões em nível de linha na tabela policy_test.

      SET odps.sql.row.policy.enabled=true;
      LIST ROW ACCESS POLICY ON policy_test;

      Resultado retornado:

      Authorization Type: Row Access Policy
      Name: policy02
      Objects: acs:odps:*:projects/clone_table_2/tables/policy_test
      FilterExpr: (a = 3L)
      NormalizedFilterExpr: (policy_test.a = 3L)
      Restrictive: false
      Settings: 
      Name: policy03
      Objects: acs:odps:*:projects/clone_table_2/tables/policy_test
      FilterExpr: (a < 3L)
      NormalizedFilterExpr: (policy_test.a < 3L)
      Restrictive: true
      Settings: 
      
      OK
    3. Consulte a tabela policy_test para verifique o resultado da autorização.

      -- Check the data in the table.
      SELECT * FROM policy_test;

      Resultado retornado:

      -- The result is empty because the conditions a=3 and a<3 cannot both be true.
      +------------+------------+
      | a          | b          | 
      +------------+------------+
      +------------+------------+

Apêndice

Verificação de comportamento de compatibilidade

Ao avaliar uma expressão de filtro, o comportamento do MaxCompute pode ser afetado por parâmetros de flag. Se um usuário defina uma Row Access Policy sob um comportamento de compatibilidade e depois crie outras políticas sob um comportamento diferente, poderá ocorrer vazamento de dados devido a resultados inesperados. Portanto, quando o controle de acesso em nível de linha é aplicado, o sistema verifique o comportamento de compatibilidade vigente no momento da definição. Se as configurações forem inconsistentes, um erro será reportado e o acesso negado.

Exemplo: Este exemplo utiliza os dados de amostra para demonstrar como as políticas são aplicadas sob diferentes comportamentos de compatibilidade.

  1. O modo de compatibilidade com Hive influencia o comportamento da função SUBSTR quando seu segundo parâmetro é 0. Para mais detalhes, consulte SUBSTR.

    • No modo de compatibilidade com Hive, uma posição inicial 0 para a função SUBSTR produz o mesmo resultado que a posição inicial 1.

      SET odps.sql.hive.compatible=true;
      SELECT substr('abc', 0);
      -- In Hive compatibility mode, a start position of 0 is treated the same as a start position of 1.
      +-----+
      | _c0 |
      +-----+
      | abc |
      +-----+
    • Fora do modo de compatibilidade com Hive, uma posição inicial 0 retorna uma string vazia.

      SET odps.sql.hive.compatible=false;
      SELECT substr('abc', 0);
      -- Outside of Hive compatibility mode, a start position of 0 returns an empty string.
      +-----+
      | _c0 |
      +-----+
      |     |
      +-----+
  2. Durante a criação de uma Row Access Policy, o sistema verifique os operadores e funções usados em filter_expr. Se o comportamento deles depender de certos parâmetros de Flag, esses parâmetros serão registrados em Settings. Utilize o comando DESC para visualize os parâmetros de Flag relevantes.

    -- Delete all policies on the table.
    DROP ALL row access policy ON policy_test;
    
    -- Configure a policy in Hive compatibility mode, using the SUBSTR function in filter_expr.
    SET odps.sql.hive.compatible=true;
    CREATE row access policy policy04 ON policy_test TO default filter using(substr(b, 0)='1');
    
    -- View the details of the policy configured on the policy_test table.
    DESC row access policy policy04 on policy_test;

    Resultado retornado: O campo Settings exibe o valor do parâmetro odps.sql.hive.compatible.

    Authorization Type: Row Access Policy
    Name: policy04
    Objects: acs:odps:*:projects/sql_optimizer/tables/policy_test
    FilterExpr: substr(b, 0) = '1'
    NormalizedFilterExpr: ::substr(policy_test.b, 0) = '1'
    Restrictive: false
    Settings: odps.sql.hive.compatible=true
  3. Na aplicação subsequente da política, o sistema verifique se os Settings do ambiente atual são consistentes com os Settings vigentes na criação da política. Em caso de inconsistência, um erro é reportado.

    • Aplique a política no modo de compatibilidade com Hive.

      SET odps.sql.hive.compatible=true;
      SELECT * FROM policy_test;

      Resultado retornado:

      +------------+---+
      | a          | b |
      +------------+---+
      | 1          | 1 |
      +------------+---+
    • No modo não compatível com Hive, a consulta falha porque o valor do parâmetro odps.sql.hive.compatible difere daquele especificado na criação da política.

      SET odps.sql.hive.compatible=false;
      SELECT * FROM policy_test;

      Resultado retornado:

      FAILED: ODPS-0130071:[0,0] Semantic analysis exception - physical plan generation failed: java.lang.IllegalArgumentException: Row access policy flag mismatch for: odps.sql.hive.compatible, flag value when grant this policy is true, while at runtime is false. please set odps.sql.hive.compatible = true or contact your project manager.

Comportamento de baixe do MaxCompute Tunnel

Ao baixe dados de uma tabela com Row Access Policy usando o MaxCompute Tunnel, as regras de controle de acesso em nível de linha ainda devem ser seguidas. Contudo, o Tunnel não execute a lógica de filtragem diretamente. Em vez disso, ele inicia uma tarefa SQL para filtrar os dados e, em seguida, realiza o baixe do resultado.

Portanto, ao usar comandos do Tunnel ou o Tunnel SDK para baixe dados de uma tabela do MaxCompute com Row Access Policy, haverá um período de espera enquanto a tarefa SQL é executada.

Desativação da criação de Row Access Policies

Para impedir a criação de novas Row Access Policies em um projeto, o administrador pode execute o comando abaixo para modifique as propriedades do projeto:

Importante

Somente administradores podem usar o comando setproject para modifique este parâmetro no nível do Projeto. Usuários não podem alterar o valor do parâmetro no nível de Sessão.

setproject odps.sql.create.row.policy.disable=true;

Valores válidos:

  • false (padrão): Permite a criação de novas Row Access Policies.

  • true: Proíbe a criação de novas Row Access Policies, mas permite modifique e exclua políticas existentes.