Tous les produits
Search
Centre de documentation

MaxCompute:Contrôle d'accès au niveau des lignes

Dernière mise à jour :Aug 10, 2026

MaxCompute propose le contrôle d'accès au niveau des lignes pour restreindre l'accès de certains utilisateurs ou rôles à des données spécifiques dans les tables. Cette fonctionnalité vous permet de définir des politiques associant les utilisateurs aux données qu'ils sont autorisés à consulter. L'application directe de ces politiques à une table garantit que les utilisateurs et les rôles ne voient que les données autorisées, ce qui renforce la sécurité et la conformité des données.

Informations générales

Les tables MaxCompute peuvent contenir de grandes quantités de données. Dans les scénarios de partage de données, les administrateurs doivent souvent s'assurer que certains utilisateurs n'accèdent qu'aux lignes de données pour lesquelles ils disposent d'une autorisation. Auparavant, le contrôle d'accès au niveau des lignes nécessitait la création d'une vue distincte pour chaque utilisateur ou l'utilisation d'une tâche ETL pour filtrer et copier les données vers une autre table.

Le contrôle d'accès au niveau des lignes simplifie ce flux de travail : nul besoin de déplacer ou de copier les données, ni de créer et de maintenir des vues.

Le contrôle d'accès au niveau des lignes s'applique aux scénarios suivants :

  • Requêtes SQL.

  • Téléchargement des données de table via MaxCompute Tunnel.

  • Lecture des données de table à l'aide d'un moteur externe, tel que Spark ou Flink.

Remarque

Les moteurs qui ne prennent pas en charge le contrôle d'accès au niveau des lignes de MaxCompute (tels que Hologres) ne peuvent pas accéder aux données protégées. Vous pouvez toujours partager des données filtrées en utilisant une vue ou une table copiée.

Le tableau suivant décrit les commandes relatives au contrôle d'accès au niveau des lignes.

Actions

Description

Point d'entrée

CREATE/REPLACE

Crée ou modifie une politique d'accès aux lignes pour des utilisateurs ou des rôles spécifiés.

DROP

Supprime une politique d'une table.

DESC

Consulte les détails des autorisations d'une politique sur une table.

LIST

Répertorie les politiques appliquées à une table.

Limites

  • Les limites suivantes s'appliquent au contrôle d'accès au niveau des lignes :

    • Seul un administrateur (un utilisateur disposant du rôle Admin ou le propriétaire de la table) peut configurer une politique d'accès aux lignes.

    • Vous ne pouvez pas configurer de politique d'accès aux lignes sur une table transactionnelle, une vue ou une vue matérialisée. Vous ne pouvez pas créer de vue matérialisée sur une table dotée d'une politique d'accès aux lignes, ni ajouter une telle politique à la table de base d'une vue matérialisée. En revanche, vous pouvez créer une vue basée sur une table associée à une politique d'accès aux lignes. Dans ce cas, les résultats de requête issus de la vue sont déterminés à la fois par la politique d'accès aux lignes de la table de base et par les règles définies par le propriétaire de la vue.

    • Vous ne pouvez pas effectuer d'opérations d'évolution de schéma sur une table dotée d'une politique d'accès aux lignes.

    • Vous ne pouvez pas ajouter une table dotée d'une politique d'accès aux lignes en tant que ressource de table UDF, ni configurer une politique d'accès aux lignes sur une table qui sert de ressource de table UDF. Aucune erreur n'est signalée lors de la configuration, mais une erreur se produit à l'exécution.

    • Vous ne pouvez pas ajouter de règle de masquage à une table dotée d'une politique d'accès aux lignes.

    • Le contrôle d'accès au niveau des lignes ne prend pas actuellement en charge l'élimination des partitions (partition pruning). Si ds est un champ de partition, une analyse complète de la table peut être nécessaire pour filtrer les données, même si une condition de filtre telle que ds='20220101' est spécifiée dans filter_expr. Pour plus d'informations sur filter_expr, consultez la section Description de filter_expr.

  • Les limites suivantes s'appliquent lorsque vous partagez une table dotée d'une politique d'accès aux lignes entre plusieurs projets à l'aide d'un package :

    • Vous pouvez configurer des autorisations au niveau des lignes pour des utilisateurs qui ne font pas partie du projet, tels que le compte Alibaba Cloud ou un utilisateur RAM du locataire actuel.

    • Lorsque vous utilisez une table dotée d'une politique d'accès aux lignes entre plusieurs projets, seules les politiques utilisateur ou les politiques DEFAULT s'appliquent.

    • Vous ne pouvez pas ajouter une autre politique d'accès aux lignes à une table figurant dans un package déjà associé à une politique d'accès aux lignes.

Remarques relatives à l'utilisation

  • Le comportement des opérateurs ou des fonctions utilisés dans filter_expr peut être influencé par divers paramètres de type flag. MaxCompute vérifie si les paramètres définis au moment de l'exécution de la requête correspondent à ceux en vigueur lors de la création de la politique. En cas de divergence, l'erreur suivante se produit.

    FAILED: ODPS-0130071:[0,0] Semantic analysis exception - physical plan generation failed: java.lang.IllegalArgumentException: Row access policy flag mismatch for: xxx
  • Avant d'exécuter des commandes de contrôle d'accès au niveau des lignes telles que CREATE, DROP, DESC ou LIST, définissez le paramètre GUC suivant au niveau de la session pour activer cette fonctionnalité.

    Remarque

    Cette fonctionnalité sera activée par défaut au niveau de la session dans une prochaine version. Pour plus d'informations, consultez les annonces de publication.

    SET odps.sql.row.policy.enabled=true;
  • Lorsque vous interrogez une table dotée d'un contrôle d'accès au niveau des lignes, le volume de données d'entrée utilisé pour la facturation au paiement à l'utilisation n'est pas réduit par le filtrage, car le contrôle d'accès au niveau des lignes ne prend pas en charge l'élimination des partitions. Un utilisateur soumis à une politique d'accès aux lignes peut obtenir un jeu de résultats filtré même lorsqu'il interroge la table entière. La quantité de données analysées depuis la table source peut être supérieure à celle attendue en fonction de la taille du résultat. Surveillez attentivement vos coûts.

  • Vous pouvez également mettre en œuvre un contrôle d'accès au niveau des lignes en créant et en partageant plusieurs vues ou tables assorties de règles de filtrage pour différents utilisateurs. Cette approche permet d'effectuer des calculs sur des données déjà filtrées et s'avère plus simple et intuitive. Pour plus d'informations, consultez la rubrique Contrôle d'accès au niveau des lignes. Par rapport à la création d'objets partagés pour les utilisateurs, le contrôle d'accès au niveau des lignes complexifie le plan d'exécution des requêtes sur la table d'origine. Toutefois, il élimine la nécessité de créer des objets partagés individuels, évite le stockage redondant et convient mieux à la définition de règles pour un grand nombre d'utilisateurs. Choisissez la méthode la mieux adaptée à vos besoins.

Syntaxe

Utilisez les commandes CREATE/REPLACE, DROP, DESC et LIST pour créer (ou modifier), supprimer ou consulter une politique d'accès aux lignes.

CREATE/REPLACE

  • Syntaxe

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

    Crée ou modifie une politique d'accès aux lignes afin d'accorder des autorisations à un utilisateur ou à un rôle spécifié.

  • Paramètres

    Paramètre

    Description

    policy_name

    Nom de la politique d'accès aux lignes. Vous pouvez personnaliser ce nom.

    table_name

    Nom de la table à laquelle accéder.

    authorized_objects

    Objet à autoriser. Valeurs possibles :

    • USER <user_list> : liste des noms d'utilisateur à autoriser, séparés par des virgules.

    • ROLE <role_list> : liste des noms de rôle à autoriser. Plusieurs noms de rôle sont séparés par des virgules.

    • DEFAULT : règle par défaut appliquée lorsqu'aucune règle utilisateur ni aucune règle de rôle ne correspond.

    filter_expr

    Expression de filtre. Pour plus d'informations, consultez la section description de filter_expr.

    clause

    Attribut de la politique d'accès aux lignes. La valeur peut être PERMISSIVE ou RESTRICTIVE. Pour plus d'informations, consultez la section Spécification de l'attribut PERMISSIVE ou RESTRICTIVE.

    • Description de filter_expr

      La version actuelle impose des contraintes strictes sur filter_expr :

      • filter_expr doit être une expression scalaire qui renvoie une valeur de type BOOLEAN.

      • L'expression ne peut pas contenir de sous-requêtes ni d'instructions telles que SELECT, CREATE ou UPDATE.

      • filter_expr ne peut faire référence qu'à des constantes ou à des colonnes de la table autorisée. Elle ne peut pas référencer de colonnes provenant d'autres tables.

      • Vous pouvez utiliser les opérateurs intégrés de MaxCompute, notamment les opérateurs relationnels, arithmétiques, binaires et logiques. Pour plus d'informations, consultez la rubrique Opérateurs.

      • Seul un sous-ensemble de fonctions scalaires intégrées est autorisé. Les fonctions définies par l'utilisateur (UDF), les fonctions d'agrégation et les fonctions de fenêtrage ne sont pas prises en charge. Les fonctions prises en charge sont les suivantes :

        • Fonctions de chaîne : CONCAT, CONCAT_WS, GET_JSON_OBJECT, INSTR, LENGTH, LENGTHB, REGEXP_EXTRACT, REGEXP_REPLACE, REVERSE, SUBSTR, TOLOWER, TOUPPER, TRIM, LTRIM, RTRIM, REPLACE.

        • Fonctions mathématiques : ABS, ROUND.

        • Fonctions de date et d'heure : DATEADD, TO_DATE, TO_CHAR.

        • Autres fonctions : SIZE, FIELD, COALESCE, IF, SPLIT.

    • Spécification de l'attribut PERMISSIVE ou RESTRICTIVE

      Plusieurs politiques peuvent s'appliquer à un utilisateur donné. Ces politiques sont alors combinées pour déterminer si l'utilisateur peut finalement accéder à une ligne de données spécifique. Lors de la création d'une politique d'accès aux lignes, vous pouvez utiliser AS {PERMISSIVE | RESTRICTIVE} pour spécifier l'attribut de la politique comme étant PERMISSIVE ou RESTRICTIVE. Si vous ne spécifiez aucun attribut, la politique est définie sur PERMISSIVE par défaut. Voici un exemple :

      Si plusieurs politiques s'appliquent à un utilisateur :

      • Si toutes les politiques sont PERMISSIVE, elles se combinent selon une relation OU. Un utilisateur peut accéder à une ligne si l'expression filter_expr d'au moins une politique est évaluée à vrai.

      • Si toutes les politiques sont RESTRICTIVE, elles se combinent selon une relation ET. Un utilisateur ne peut accéder à une ligne que si toutes les politiques sont satisfaites.

      • Si certaines politiques sont PERMISSIVE et d'autres RESTRICTIVE, un utilisateur ne peut accéder à une ligne que si les deux conditions suivantes sont remplies pour cette ligne :

        • Au moins une des politiques PERMISSIVE est satisfaite.

        • Toutes les politiques RESTRICTIVE sont satisfaites.

      Remarque

      Chaque fois que vous ajoutez une nouvelle politique d'accès aux lignes à une table, vous devez évaluer l'effet combiné de toutes les politiques appliquées à cette table. Par exemple, si un utilisateur est soumis à des politiques RESTRICTIVE et PERMISSIVE, il doit satisfaire aux conditions de toutes les politiques RESTRICTIVE et d'au moins une politique PERMISSIVE.

  • Cas d'utilisation

    • Accorder des autorisations à un utilisateur spécifique

      Supposons qu'une table soit nommée table01 et contienne une colonne STRING nommée region. Une politique d'accès aux lignes est configurée pour certains utilisateurs afin de restreindre leur accès aux seuls enregistrements dont la valeur de la colonne region est china. Voici un exemple de commande :

      CREATE ROW ACCESS POLICY policy01
      ON table01
      TO USER (aliyun$odps_test01**@aliyun.com,aliyun$odps_test02**@aliyun.com)
      FILTER USING (region = "china");
    • Accorder des autorisations à un rôle spécifique

      Supposons que le système comporte deux rôles, role1 et role2. Vous pouvez autoriser ces deux rôles à accéder uniquement aux enregistrements dont le champ region a la valeur china. La commande est la suivante :

      CREATE ROW ACCESS POLICY policy02
      ON table01
      TO ROLE (role1, role2)
      FILTER USING (region = "china");
    • Accorder des autorisations à l'utilisateur par défaut

      Lorsque vous ajoutez la première politique d'accès aux lignes à une table, l'accès devient restreint. Les utilisateurs qui ne correspondent à aucune politique perdent l'accès aux données, car ils ne figurent pas sur une liste d'autorisation. Pour contrôler l'accès des autres utilisateurs, vous pouvez configurer une politique par défaut. À ce stade, l'administrateur peut utiliser les commandes suivantes pour modifier les autorisations d'accès de l'utilisateur par défaut.

      Refuser l'accès à tous les autres utilisateurs par défaut revient à spécifier que l'utilisateur par défaut ne dispose d'aucune autorisation d'accès.

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

      Si vous souhaitez limiter l'utilisateur par défaut à l'accès aux seuls enregistrements dont le champ region a la valeur other, la commande est la suivante :

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

      Lors de l'ajout d'une politique d'accès aux lignes à une table, tenez compte du comportement d'accès des utilisateurs autres que ceux ciblés par le contrôle. Si d'autres utilisateurs ont précédemment accédé à la table, vous devez définir des règles explicites pour eux afin d'éviter des erreurs de refus d'accès inattendues.

  • Logique d'autorisation

    Le diagramme de flux suivant illustre le processus d'autorisation lorsqu'un utilisateur accède à une table dotée d'une politique d'accès aux lignes.

    image

DROP

  • Supprime une politique spécifique d'une table.

    DROP ROW ACCESS POLICY <policy_name> ON <table_name>;
  • Supprime toutes les politiques d'une table.

    DROP ALL ROW ACCESS POLICY ON <table_name>;

DESC

Consulte les détails d'une politique spécifique sur une table.

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

LIST

  • Répertorie toutes les politiques appliquées à une table.

    LIST ROW ACCESS POLICY ON <table_name>;
  • Consulte les politiques configurées pour un utilisateur spécifique sur une table.

    LIST ROW ACCESS POLICY ON <table_name> TO USER <user_name>;
  • Consulte les politiques configurées pour un rôle spécifique sur une table.

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

Exemple de données

Créez une table nommée policy_test et insérez-y des données. Les commandes SQL sont les suivantes :

-- 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 |
+------------+---+

Exemples

Cette section fournit des exemples d'utilisation des autorisations au niveau des lignes pour l'utilisateur par défaut. Avant de commencer, préparez les données d'exemple.

  • Exemple 1 : accordez une autorisation au niveau des lignes sur la table policy_test pour permettre à l'utilisateur par défaut d'accéder aux données où a=2L.

    1. Créez une politique d'accès aux lignes nommée policy01.

      CREATE row access policy policy01 ON policy_test TO default filter using (a = 2L);
    2. Consultez les détails de la politique policy01 sur la table policy_test.

      DESC row access policy policy01 on policy_test;

      Le résultat suivant est renvoyé :

      -- 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. Interrogez la table policy_test pour vérifier que l'autorisation est effective.

      SELECT * FROM policy_test;

      Le résultat suivant est renvoyé :

      -- The policy is effective, and only a subset of records is returned.
      +------------+---+
      | a          | b |
      +------------+---+
      | 2          | 2 |
      +------------+---+
    4. Si le résumé Logview contient les informations suivantes, le filtrage au niveau des lignes a été déclenché.

      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:
  • Exemple 2 : ajoutez deux autorisations permissives au niveau des lignes à une table pour permettre à l'utilisateur par défaut d'accéder aux données de la table policy_test où a=2L ou a=3L.

    1. Créez une politique d'accès aux lignes nommée policy02.

      CREATE row access policy policy02 ON policy_test TO default filter using (a = 3L);
    2. Répertoriez toutes les politiques appliquées à la table policy_test.

      LIST row access policy ON policy_test;

      Le résultat suivant est renvoyé :

      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. Interrogez la table policy_test pour vérifier que l'autorisation est effective.

      SELECT * FROM policy_test;

      Le résultat suivant est renvoyé :

      -- The two PERMISSIVE policies, policy01 and policy02, are both in effect. Two records are returned.
      +------------+---+
      | a          | b |
      +------------+---+
      | 2          | 2 |
      | 3          | 3 |
      +------------+---+
  • Exemple 3 : l'ajout de deux autorisations permissives et d'une autorisation restrictive au niveau des lignes à une table permet à l'utilisateur par défaut d'accéder aux données de la table policy_test qui satisfont la condition (a=2L || a=3L) && a<3L.

    1. Créez une politique d'accès aux lignes nommée policy03 et définissez son attribut sur RESTRICTIVE.

      CREATE row access policy policy03 ON policy_test TO default filter using (a < 3L) as restrictive;
    2. Consultez les détails de la politique policy03 sur la table policy_test.

      DESC row access policy policy03 ON policy_test;

      Le résultat suivant est renvoyé :

      -- 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. Interrogez la table policy_test pour vérifier que l'autorisation est effective.

      select * from policy_test;

      Le résultat suivant est renvoyé :

      -- 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 |
      +------------+---+
  • Exemple 4 : ajoutez une politique PERMISSIVE et une politique RESTRICTIVE à une table. L'utilisateur par défaut doit satisfaire aux deux conditions pour accéder aux données de la table.

    1. Supprimez la politique d'accès aux lignes nommée policy01.

      SET odps.sql.row.policy.enabled=true;
      DROP ROW ACCESS POLICY policy01 ON policy_test;
    2. Consultez les autorisations au niveau des lignes sur la table policy_test.

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

      Le résultat suivant est renvoyé :

      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. Interrogez la table policy_test pour vérifier le résultat de l'autorisation.

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

      Le résultat suivant est renvoyé :

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

Annexe

Vérification du comportement de compatibilité

Lorsque MaxCompute évalue une expression de filtre, son comportement peut être influencé par des paramètres de type flag. Si un utilisateur définit une politique d'accès aux lignes selon un comportement de compatibilité donné, puis définit d'autres politiques selon un comportement différent, des fuites de données peuvent survenir en raison de résultats inattendus. Par conséquent, lorsque le contrôle d'accès au niveau des lignes est appliqué, le système vérifie le comportement de compatibilité au moment de la définition. En cas d'incohérence des paramètres, une erreur est signalée et l'accès est refusé.

Exemple : cet exemple utilise les données d'exemple pour montrer comment les politiques sont appliquées selon différents comportements de compatibilité.

  1. Le comportement de la fonction SUBSTR lorsque son deuxième paramètre est 0 dépend du mode de compatibilité Hive. Pour plus d'informations, consultez la rubrique SUBSTR.

    • En mode de compatibilité Hive, une position de départ égale à 0 pour la fonction SUBSTR produit le même résultat qu'une position de départ égale à 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 |
      +-----+
    • Hors du mode de compatibilité Hive, une position de départ égale à 0 renvoie une chaîne vide.

      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. Lors de la création d'une politique d'accès aux lignes, le système vérifie les opérateurs et les fonctions utilisés dans filter_expr. Si leur comportement dépend de certains paramètres Flag, ces paramètres sont enregistrés dans Settings. Vous pouvez utiliser la commande DESC pour consulter les paramètres Flag concernés.

    -- 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;

    Le résultat suivant est renvoyé : le champ Settings affiche la valeur du paramètre 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. Lors de l'application ultérieure de la politique, le système vérifie si les Settings de l'environnement actuel correspondent aux Settings en vigueur lors de la création de la politique. En cas d'incohérence, une erreur est signalée.

    • Appliquez la politique en mode de compatibilité Hive.

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

      Le résultat suivant est renvoyé :

      +------------+---+
      | a          | b |
      +------------+---+
      | 1          | 1 |
      +------------+---+
    • En mode non compatible avec Hive, la requête échoue car la valeur du paramètre odps.sql.hive.compatible est incohérente avec celle spécifiée lors de la création de la politique.

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

      Le résultat suivant est renvoyé :

      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.

Comportement de téléchargement via MaxCompute Tunnel

Lorsque vous téléchargez des données depuis une table dotée d'une politique d'accès aux lignes à l'aide de MaxCompute Tunnel, les règles de contrôle d'accès au niveau des lignes doivent toujours être respectées. Toutefois, Tunnel ne peut pas exécuter lui-même la logique de filtrage. Il lance donc une tâche SQL pour filtrer les données, puis télécharge le résultat.

Par conséquent, lorsque vous utilisez des commandes Tunnel ou le SDK Tunnel pour télécharger des données depuis une table MaxCompute dotée d'une politique d'accès aux lignes, un délai d'attente survient pendant l'exécution de la tâche SQL.

Désactivation de la création de politiques d'accès aux lignes

Pour empêcher la création de nouvelles politiques d'accès aux lignes dans un projet, un administrateur de projet peut exécuter la commande suivante afin de modifier les propriétés du projet :

Important

Seuls les administrateurs peuvent utiliser la commande setproject pour modifier ce paramètre au niveau du projet. Les utilisateurs ne peuvent pas modifier la valeur du paramètre au niveau de la session.

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

Les valeurs possibles sont les suivantes :

  • false (par défaut) : autorise la création de nouvelles politiques d'accès aux lignes.

  • true : interdit la création de nouvelles politiques d'accès aux lignes, mais permet la modification et la suppression des politiques existantes.