すべてのプロダクト
Search
ドキュメントセンター

MaxCompute:行レベルのアクセス制御

最終更新日:Jan 10, 2025

MaxComputeは、行レベルのアクセス制御をサポートしており、MaxComputeテーブルの特定のデータにアクセスするためのユーザーまたはロールの権限を管理できます。 MaxComputeテーブルでユーザーとアクセスを許可されているデータとの間に一致ルールを定義して、特定のユーザーまたはロールがアクセス権限を持つデータのみを表示できるようにすることができます。 これにより、データのセキュリティとコンプライアンスが向上します。

背景情報

MaxComputeテーブルには大量のデータが含まれています。 データ共有シナリオでは、データ管理者は、特定のユーザーがアクセスする権限を持つ行のみにアクセスすることを求めます。 特定の行へのユーザーアクセスを制限するには、管理者はビューまたは抽出、変換、読み込み (ETL) タスクを作成して、ユーザーごとにデータをフィルター処理し、承認前にデータを別のテーブルに転送する必要があります。

行レベルのアクセス制御機能を使用すると、管理者は、データの移行とコピー、ビューの作成と保守を必要とせずに、特定のテーブルデータへのアクセスをユーザーに許可できます。

行レベルのアクセス制御機能は、次のシナリオに適しています。

  • SQLクエリ

  • Tunnelコマンドによるテーブルデータのダウンロード

  • SparkやFlinkなどの外部エンジンを使用したテーブルデータの読み取り

説明

MaxComputeの行レベルのアクセス制御機能をサポートしていないHologresなどのエンジンは、保護されたデータにアクセスできません。 ただし、ビューを使用するか、データを別のテーブルに転送することで、データをフィルタリングおよび共有できます。

行レベルのアクセス制御文を次の表に示します。

説明

操作プラットフォーム

作成 /交換

行レベルのアクセスポリシーを作成または変更して、指定したオブジェクト (ユーザーまたはロール) に権限を付与します。

ドロップ

テーブルからポリシーを削除します。

DESC

テーブルのポリシーの権限の詳細を照会します。

リスト

テーブルのポリシーを一覧表示します。

制限事項

  • 行レベルのアクセス制御機能には、次の制限があります。

    • 行レベルのアクセスポリシーを設定できるのは、管理者 (管理者ロールおよびテーブル所有者) のみです。

    • トランザクションテーブル、ビュー、およびマテリアライズドビューに対して行レベルのアクセスポリシーを構成することはできません。 行レベルのアクセスポリシーが構成されているテーブルのマテリアライズドビューを作成したり、マテリアライズドビューのベーステーブルに行レベルのアクセスポリシーを追加したりすることはできません。 ただし、行レベルのアクセスポリシーが設定されているテーブルに基づいてビューを作成できます。 ビューのクエリ結果は、ベーステーブルに設定された行レベルのアクセスポリシーと、ビューの所有者によって定義されたビュールールによって決定されます。

    • 行レベルのアクセスポリシーが設定されているテーブルに対して、スキーマの進化操作を実行することはできません。

    • 行レベルのアクセスポリシーが設定されているテーブルを、ユーザー定義関数 (UDF) のリソースとして追加することはできません。 UDFのリソースとして追加されたテーブルに対して、行レベルのアクセスポリシーを構成することはできません。 これらの操作を実行すると、すぐにエラーは報告されません。 ただし、関連するUDFが実行されると、エラーが報告されます。

    • 行レベルのアクセスポリシーが設定されているテーブルのフィールドにマスキングルールを追加することはできません。

    • 行レベルのアクセス制御は、パーティションプルーニングをサポートしていません。 たとえば、dsフィールドがパーティションフィールドである場合、filter_exprにds='20220101' のようなフィルタ条件が指定されている場合でも、データをフィルタリングするためにテーブル全体のスキャンを開始する必要があります。 filter_exprの詳細については、「filter_exprの制限」をご参照ください。

  • 行レベルのアクセスポリシーが設定されているテーブルへのパッケージベースのクロスプロジェクトアクセスには、次の制限があります。

    • 現在のプロジェクトに追加されていないユーザーには、行レベルのアクセスポリシーをアタッチできます。 ユーザーは、Alibaba Cloudアカウントまたは現在のテナントのRAMユーザーです。

    • 行レベルのアクセスポリシーが別のプロジェクトで構成されているテーブルを使用すると、ユーザーポリシーまたは既定のポリシーのみが満たされ、ポリシーに基づいてデータがフィルタリングされます。

    • パッケージに行レベルのアクセスポリシーが含まれているテーブルに、行レベルのアクセスポリシーを追加することはできません。

注意事項

  • filter_exprで使用される演算子または関数の実行は、フラグパラメータの影響を受ける場合があります。 システムは、クエリ中に使用されたパラメーター設定が、ポリシー作成中に構成されたパラメーター設定と一致しているかどうかを確認します。 矛盾している場合は、次のエラーメッセージが表示されます。

    FAILED: ODPS-0130071:[0,0] Semantic analysis exception - physical plan generation failed: java.lang.IllegalArgumentException: Row access policy flag mismatch for: xxx
  • CREATE、DROP、DESC、LISTなどの行レベルのアクセス制御に関連するコマンドを実行する前に、セッションレベルで次のGUC (Grand Unified Configuration) パラメーターを設定して、行レベルのアクセス制御機能を有効にする必要があります。

    説明

    行レベルのアクセス制御機能は、将来、デフォルトでセッションレベルで有効になります。 ドキュメントの発表または指示に注意してください。

    SET odps.sql.row.policy.enabled=true;
  • SQL文を実行して、行レベルのアクセス制御が有効になっているテーブルのデータを照会する場合、行レベルのアクセス制御ではパーティションプルーニングがサポートされていないため、従量課金方式で課金される入力データの量は、データフィルタリングによって削減されません。 行レベルのアクセスポリシーがアタッチされているユーザーは、SQL式で完全なテーブルクエリを指定した場合でも、フィルタリングされた結果を取得できます。 ソーステーブル内のスキャンされたデータの量は、ユーザが結果に基づいて推定するデータの量よりも大きい可能性がある。 コストを抑えるためには、スキャンするデータ量を減らす必要があります。

  • さまざまなユーザー固有のフィルタリングルールを使用して複数のビューまたはテーブルを作成し、それらを共有する方法は、行レベルのアクセス制御を実現し、フィルタリングされたデータに対して計算を実行できるようにし、操作をより便利で直感的にします。 詳細については、「行レベルのアクセス制御の実行」をご参照ください。 ユーザーごとに共有オブジェクトを作成する方法と比較して、行レベルのアクセス制御により、元のテーブルに基づくクエリ実行プランが複雑になります。 しかしながら、各ユーザに対して個別に共有オブジェクトを作成する必要性を排除し、共有オブジェクトの冗長記憶を回避する。 また、多数のユーザーのルールを定義するのにより適しており、ニーズに応じて柔軟に使用できます。

構文

CREATE/REPLACE、DROP、DESC、およびLISTステートメントを実行して、行レベルのアクセスポリシーを作成 (または変更) 、削除、または表示できます。

作成 /交換

  • 構文

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

    行レベルのアクセスポリシーを作成または変更して、指定したオブジェクト (ユーザーまたはロール) に権限を付与します。

  • パラメーター

    パラメーター

    説明

    policy_name

    行レベルのアクセスポリシーの名前。 カスタム名を指定できます。

    table_name

    操作するテーブルの名前です。

    authorized_objects

    権限が付与されるオブジェクト。 有効な値:

    • USER <user_list>: 権限が付与されているユーザーの名前。 複数のユーザー名はコンマ (,) で区切ります。

    • ROLE <role_list>: 権限が付与されているロールの名前。 複数のロール名はコンマ (,) で区切ります。

    • DEFAULT: ユーザーポリシーまたはロールポリシーが満たされていない場合のデフォルトポリシー。

    filter_expr

    フィルター式。 詳細については、「filter_exprの制限」をご参照ください。

    clause

    行レベルのアクセスポリシーの属性。 有効な値: PERMISSIVEおよびRESTRICTIVE。 詳細については、「PERMISSIVEまたはRESTRICTIVE属性の指定」をご参照ください。

    • filter_exprの制限

      このバージョンでは、filter_exprに次の制限があります。

      • filter_exprの値は、スカラー式であり、BOOLEANデータ型でなければなりません。

      • filter_exprには、SELECT、CREATE、UPDATEなどのサブクエリまたはステートメントを含めることはできません。

      • filter_exprは、許可されたテーブルの定数またはフィールドのみを参照できます。 filter_exprは他のテーブルのフィールドを参照できません。

      • filter_exprには、リレーショナル演算子、算術演算子、ビット演算子、論理演算子など、MaxComputeの組み込み演算子を含めることができます。 詳細については、「演算子」をご参照ください。

      • filter_exprには、特定の組み込みスカラー関数のみを含めることができます。 このパラメーターは、UDF、集計関数、またはウィンドウ関数を呼び出すことはできません。 filter_exprは次の関数をサポートしています。

        • 文字列関数: CONCAT、CONCAT_WS、GET_JSON_OBJECT、INSTR、LENGTH、LENGTHB、REGEXP_EXTRACT、REGEXP_REPLACE、REVERSE、SUBSTR、TOLOWER、TOUPPER、TRIM、LTRIM、RTRIM、およびREPLACE。

        • 数学関数: ABSとROUND。

        • 時間関数: DATEADD、TO_DATE、およびTO_CHAR。

        • その他の機能: サイズ、フィールド、COALESCE、IF、および分割。

    • PERMISSIVEおよびRESTRICTIVE属性の説明

      複数のポリシーが特定のユーザーに有効になる場合があります。 システムは複数のポリシーを組み合わせて、ユーザーがデータの行にアクセスできるかどうかを判断します。 行レベルのアクセスポリシーを作成する場合、AS {PERMISSIVE | RESTRICTIVE} を使用してポリシーのPERMISSIVEまたはRESTRICTIVE属性を指定できます。 属性を指定しない場合、デフォルト値はPERMISSIVEです。 例:

      複数のポリシーがユーザーに対して有効になります。

      • ポリシーの属性がPERMISSIVEの場合、ポリシー間の関係はORです。 この場合、いずれかのポリシーのfilter_exprの値がtrueの場合、ユーザーはデータ行にアクセスできます。

      • ポリシーの属性がRESTRICTIVEの場合、ポリシー間の関係はANDです。 この場合、すべてのポリシーが満たされている場合にのみ、ユーザーはデータの行にアクセスできます。

      • 特定のポリシーの属性がPERMISSIVEで、他のポリシーの属性がRESTRICTIVEである場合、ユーザーは次の2つの条件が満たされている場合にのみ、データ行にアクセスできます。

        • 属性がPERMISSIVEであるポリシーの少なくとも1つが満たされる。

        • 属性がRESTRICTIVEであるすべてのポリシーが満たされます。

      説明

      行レベルのアクセスポリシーをテーブルに追加するたびに、テーブルに対するすべての行レベルのアクセスポリシーの組み合わせの全体的な効果を評価する必要があります。 たとえば、RESTRICTIVEポリシーとPERMISSIVEポリシーが同時にユーザーに設定されている場合、PERMISSIVEポリシーも満たされている必要があります。

  • シナリオ

    • 指定したユーザーに権限を付与します。

      この例では、table01という名前のテーブルに、データ型がSTRINGで、列名がregionであるフィールドが含まれています。 regionフィールドの値がchinaであるレコードのみにアクセスできるように、特定のユーザーの行レベルのアクセスポリシーを設定します。 例:

      CREATE ROW ACCESS POLICY policy01
      ON table01
      TO USER (aliyun$odps_tes***@aliyun.com,aliyun$odps_tes***@aliyun.com)
      FILTER USING (region = "china");
    • 指定されたロールに権限を付与します。

      この例では、role1role2という2つのロールがシステムに存在します。 regionフィールドの値がchinaであるレコードにのみアクセスできるように、2つのロールに権限を付与します。 例:

      CREATE ROW ACCESS POLICY policy02
      ON table01
      TO ROLE (role1, role2)
      FILTER USING (region = "china");
    • デフォルトユーザーに権限を付与します。

      例えば、約100人の潜在的ユーザが特定のテーブルにアクセスできる。 管理者は、authorizationコマンドを使用して、いずれかのユーザーに権限を個別に付与します。 他のユーザーにもアクセス制御が必要です。 テーブルの特定のユーザーまたはロールに権限を付与すると、テーブルに対して行レベルのアクセス制御が有効になります。 他のユーザーは、テーブルに対するアクセス権限がないため、テーブル内のデータにアクセスできません。 この場合、管理者は次のステートメントを実行して、デフォルトユーザーのアクセス権限を変更できます。

      デフォルトでは、他のユーザーはテーブルにアクセスできません。 これは, デフォルトユーザーにアクセス権がないように指定した場合と同じです。

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

      regionフィールドの値がotherのレコードのみにアクセスするようにデフォルトユーザーを制限する場合は、次のステートメントを実行します。

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

      特定のユーザーのテーブルに行レベルのアクセスポリシーを追加する場合は、他のユーザーのアクセス動作を考慮する必要があります。 テーブルに他のユーザーがアクセスしている場合は、予期しないアクセス禁止エラーを回避するために、ユーザーからのアクセスを許可するポリシーも設定する必要があります。

  • 認証ロジック

    次の図は、行レベルのアクセスポリシーが設定されているテーブルにユーザーがアクセスするときの認証プロセスを示しています。

    image

ドロップ

  • テーブルから特定のポリシーを削除します。

    DROP ROW ACCESS POLICY <policy_name> ON <table_name>;
  • テーブルからすべてのポリシーを削除します。

    DROP ALL ROW ACCESS POLICY ON <table_name>;

DESC

テーブルのポリシーの権限の詳細を照会します。

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

リスト

  • テーブルのすべてのポリシーを一覧表示します。

    LIST ROW ACCESS POLICY ON <table_name>;
  • テーブル上のユーザーに対して構成されているポリシーを一覧表示します。

    LIST ROW ACCESS POLICY ON <table_name> TO USER <user_name>;
  • テーブルのロールに対して構成されているポリシーを一覧表示します。

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

サンプルコード

policy_testという名前のテーブルを作成し、テーブルにデータを挿入します。 サンプル文:

-- 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;
-- Returned result:
+------------+---+
| a          | b |
+------------+---+
| 1          | 1 |
| 2          | 2 |
| 3          | 3 |
| 4          | 4 |
+------------+---+

次の例は、既定のユーザーに行レベルのアクセス許可を付与する方法を示しています。 承認の前に、サンプルデータを準備する必要があります。

  • 例1: 行レベルのアクセスポリシーをpolicy_testテーブルに追加して、デフォルトユーザーがテーブルのa=2L行のデータにアクセスできるようにします。

    1. 行レベルのアクセスポリシーpolicy01を作成します。

      CREATE row access policy policy01 ON policy_test TO default filter using (a = 2L);
    2. policy_testテーブルのpolicy01の特定の権限を表示します。

      DESC row access policy policy01 on policy_test;

      返される結果 :

      -- The following result is returned. The value of Restrictive is false, which is the default value.
      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. policy_testテーブルのデータを照会して、承認が有効かどうかを確認します。

      SELECT * FROM policy_test;

      返される結果 :

      -- The following result is returned. The policy takes effect and only specific records are returned.
      +------------+---+
      | a          | b |
      +------------+---+
      | 2          | 2 |
      +------------+---+
  • 例2: 属性がPERMISSIVEである2つの行レベルのアクセスポリシーをテーブルに追加して、デフォルトユーザーがpolicy_testテーブルのa=2Lおよびa=3L行のデータにアクセスできるようにします。

    1. 行レベルのアクセスポリシーpolicy02を作成します。

      CREATE row access policy policy02 ON policy_test TO default filter using (a = 3L);
    2. policy_testテーブルのすべてのポリシーを一覧表示します。

      LIST row access policy ON policy_test;

      返される結果 :

      -- The following result is returned:
      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. policy_testテーブルのデータを照会して、承認が有効かどうかを確認します。

      SELECT * FROM policy_test;

      返される結果 :

      -- Two policies policy01 and policy02 take effect at the same time. The attributes of both policies are PERMISSIVE. Therefore, two records are returned.
      +------------+---+
      | a          | b |
      +------------+---+
      | 2          | 2 |
      | 3          | 3 |
      +------------+---+
  • 例3: 属性がPERMISSIVEである2つの行レベルのアクセスポリシーと属性がRESTRICTIVEである1つの行レベルのアクセスポリシーをテーブルに追加して、デフォルトユーザーがpolicy_testテーブルの (a=2L | | a=3L )&& a<3L条件を満たすデータにアクセスできるようにします。

    1. 行レベルのアクセスポリシーpolicy03を作成し、ポリシーの属性をRESTRICTIVEに設定します。

      CREATE row access policy policy03 ON policy_test TO default filter using (a < 3L) as restrictive;
    2. policy_testテーブルのpolicy03の権限を表示します。

      DESC row access policy policy03 ON policy_test;

      返される結果 :

      -- The following result is returned. The value of Restrictive is 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. policy_testテーブルのデータを照会して、承認が有効かどうかを確認します。

      select * from policy_test;

      返される結果 :

      -- The following result is returned. In this example, policy01, policy02, and policy03 take effect at the same time. 
      -- The attributes of policy01 and policy02 are PERMISSIVE. Therefore, the default user can access the table when one of the two policies is met. 
      -- The attribute of policy03 is RESTRICTIVE. Therefore, the default user can access the table only when this policy is met. 
      +------------+---+
      | a          | b |
      +------------+---+
      | 2          | 2 |
      +------------+---+
  • 例4: 属性がPERMISSIVEである行レベルのアクセスポリシーと、属性がRESTRICTIVEである行レベルのアクセスポリシーをテーブルに追加します。 デフォルトのユーザーは、2つのポリシーが満たされている場合にのみ、テーブルのデータにアクセスできます。

    1. 行レベルのアクセスポリシーpolicy01を削除します。

      SET odps.sql.row.policy.enabled=true;
      DROP ROW ACCESS POLICY policy01 ON policy_test;
    2. policy_testテーブルの行レベルのアクセスポリシーを表示します。

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

      返される結果 :

      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. policy_testテーブルのデータを照会して、承認結果を確認します。

      -- Check the inserted data.
      SELECT * FROM policy_test;

      返される結果 :

      -- The returned result is empty because policy02 and policy03 take effect at the same time. 
      +------------+------------+
      | a          | b          | 
      +------------+------------+
      +------------+------------+

付録

互換動作のチェック

MaxComputeがフィルター式に基づいて計算を実行する場合、結果はフラグパラメーターの影響を受ける可能性があります。 ユーザーが互換性のある動作の下で行レベルのアクセスポリシーを定義し、別の互換性のある動作の下で他の行レベルのアクセスポリシーを定義すると、結果が期待を満たさない場合にデータリークが発生する可能性があります。 したがって、MaxComputeが行レベルのアクセス制御を実行すると、行レベルのアクセスポリシーが定義されているときに実行される互換動作がチェックされます。 互換性のある動作に矛盾がある場合、エラーが報告され、アクセスが禁止されます。

: この例は、サンプルデータに基づいて異なる互換性のある動作の下でのポリシーの適用を示しています。

  1. SUBSTR関数の2番目のパラメーターが0に設定されている場合の動作は、Hive互換データ型エディションで影響を受けます。 詳細については、「SUBSTR」をご参照ください。

    • Hive対応のデータ型エディションを有効にした場合、SUBSTR関数の開始位置が0のときの結果は、SUBSTR関数の開始位置が1のときの結果と同じになります。

      SET odps.sql.hive.compatible=true;
      SELECT substr('abc', 0);
      -- If the Hive-compatible data type edition is enabled, the result obtained when the start position of the SUBSTR function is 0 is the same as the result obtained when the start position of the SUBSTR function is 1. 
      +-----+
      | _c0 |
      +-----+
      | abc |
      +-----+
    • Hive対応データ型エディションが無効の場合, SUBSTR関数の開始位置が0のとき, 戻り値は空の文字列になります。

      SET odps.sql.hive.compatible=false;
      SELECT substr('abc', 0);
      -- If the Hive-compatible data type edition is disabled, the return value is an empty string when the start position of the SUBSTR function is 0.
      +-----+
      | _c0 |
      +-----+
      |     |
      +-----+
  2. 行レベルのアクセスポリシーを作成すると、filter_exprで使用されている演算子と関数がチェックされます。 演算子と関数の動作が特定のフラグパラメーターに依存する場合、システムはこれらのフラグパラメーターを [設定] に記録します。 DESCステートメントを実行して、フラグパラメーターを表示できます。

    -- Drop all policies that are configured for a table.
    DROP ALL row access policy ON policy_test;
    
    -- Configure a policy in the Hive-compatible data type edition. The SUBSTR function is used 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 policy details on the policy_test table.
    DESC row access policy policy04 on policy_test;

    次の結果が返されます。 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. ポリシーが適用されると、現在の環境の設定がポリシーの作成時に設定された設定と一致しているかどうかが判断されます。 矛盾している場合は、エラーが報告されます。

    • Hive互換データ型エディションでは、ポリシーが適用されます。

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

      返される結果 :

      +------------+---+
      | a          | b |
      +------------+---+
      | 1          | 1 |
      +------------+---+
    • Hive互換データ型エディション以外のエディションでは、odps.sql.hive.comのpatibleパラメーターの値がポリシーの作成時に指定された値と異なるため、クエリは失敗します。

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

      返される結果 :

      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.

トンネルのダウンロード動作

行レベルのアクセスポリシーが設定されているテーブルの場合、Tunnelコマンドを使用してテーブルデータをダウンロードする場合は、行レベルのアクセスポリシーに従う必要があります。 ただし、MaxCompute Tunnelには、行レベルのアクセス制御フィルタリングロジックを実行するコンピューティング機能がありません。 システムはSQLタスクを開始してルールに基づいてデータをフィルタリングし、タスクの計算結果をダウンロードします。

したがって、TunnelコマンドまたはTunnel SDKを使用して、行レベルのアクセスポリシーが設定されているMaxComputeテーブルからデータをダウンロードする場合、SQLタスクの実行を待機するために時間が必要になります。

行レベルのアクセスポリシーの作成禁止

プロジェクト管理者がプロジェクトでの新しい行レベルのアクセスポリシーの作成を禁止する場合、プロジェクト管理者は次のコマンドを実行してプロジェクトのプロパティを変更できます。

重要

setprojectコマンドを使用して、プロジェクトレベルでodps.sql.create.row.policy.disableパラメーターの値を変更できるのは管理者だけです。 ユーザーはセッションレベルでこのパラメーターの値を変更できません。

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

有効な値:

  • false: 行レベルのアクセスポリシーを作成できます。 デフォルト値です。

  • true: 行レベルのアクセスポリシーを作成することはできません。 既存のポリシーを変更または削除できます。